<1> 모니터링 도구 cloudformation 서울리전 # 터미널 1 wa # 터미널 2 watch -d kubectl top node # 터미널 3 cat < eks-public-setup.yaml apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: free-vpc-cluster region: ap-northeast-2 version: "1.34" vpc: clusterEndpoints: publicAccess: true privateAccess: true # --- 비용 절감 핵심: NAT Gateway를 생성하지 않음 --- nat: gateway: Disable managedNodeGroups: - name: standard-nodes instanceType: t3.small minSize: 1 maxSize: 6 desiredCapacity: 4 # --- 핵심 변경 사항: Public 서브넷에 노드 배치 --- privateNetworking: false iam: withAddonPolicies: imageBuilder: true autoScaler: true cloudWatch: true # EFS 사용을 위해 필요한 정책 추가 efs: true addons: - name: vpc-cni - name: coredns - name: kube-proxy - name: aws-efs-csi-driver # EFS 사용을 위한 드라이버 미리 추가 EOF # 클러스터 생성 시작 eksctl create cluster -f eks-public-setup.yaml (15분) https://vclock.kr/timer/#countdown=00:10:00&date=2026-02-25T18:55:40&sound=xylophone&loop=1 # 노드 수를 5대로 늘리기 (Desired Capacity를 5으로 변경) eksctl scale nodegroup --cluster=free-vpc-cluster --name=standard-nodes --nodes=4 --nodes-min=1 --nodes-max=5 --region ap-northeast-2 <2> 프로메테우스 1 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update 2 kubectl create namespace monitoring 3 helm install prometheus-stack prometheus-community/kube-prometheus-stack \ --namespace monitoring \ --set grafana.adminPassword=admin 4 # 그라파나 서비스 이름을 찾아 3000번 포트로 연결 kubectl port-forward -n monitoring service/prometheus-stack-grafana 3000:80 --address 0.0.0.0 5 # monitoring 네임스페이스의 모든 자원 확인 kubectl get all -n monitoring 6 # 노드 부족하면 증설 # 노드 그룹 이름을 확인 (standard-nodes 또는 public-nodes) eksctl get nodegroup --cluster free-vpc-cluster # 원하는 개수(예: 3대)로 증설 eksctl scale nodegroup --cluster=free-vpc-cluster --name=<노드그룹_이름> --nodes=3 --nodes-min=1 --nodes-max=4 7 eksctl get nodegroup --cluster free-vpc-cluster --region ap-northeast-2 # 노드 수를 3대로 늘리기 (Desired Capacity를 3으로 변경) eksctl scale nodegroup --cluster=free-vpc-cluster --name=standard-nodes --nodes=3 --nodes-min=1 --nodes-max=4 --region ap-northeast-2 8 helm list -n monitoring for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator. (ssss@free-vpc-cluster:monitoring) [root@kops-ec2 ~]# helm list -n monitoring NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION prometheus-stack monitoring 1 2026-02-19 00:05:16.942098615 +0900 KST deployed kube-prometheus-stack-82.1.0 v0.89.0 9 # 트라블 슈팅 # 1. 기존 차트 삭제 helm uninstall prometheus-stack -n monitoring # 2. (선택) 남아있는 설정값(CRD) 삭제 - 보통은 생략해도 되지만 에러 지속 시 필요 # kubectl delete crd $(kubectl get crd | grep coreos.com | awk '{print $1}') # 3. 다시 설치 실행 helm install prometheus-stack prometheus-community/kube-prometheus-stack \ --namespace monitoring \ --set grafana.adminPassword=admin 10 k ns monitoring # Prometheus 인스턴스 확인 kubectl get prometheus -n monitoring # Alertmanager 인스턴스 확인 kubectl get alertmanager -n monitoring # 관련 Pod들이 모두 떴는지 최종 확인 kubectl get pods -n monitoring 11 --------------------- 트러블 슈팅 # 인스턴스 보안 그룹 확인 콘솔에서 인스턴스 id 확인 # 아래에 인스턴스 id 변경 - i-xxxxxxxxxxxxxxx aws ec2 describe-instances \ --instance-ids i-0d7b4c55d7fe6c536 \ --query "Reservations[*].Instances[*].SecurityGroups[*].{Name:GroupName, ID:GroupId}" \ --output table sg-038d0e747d29d0594 curl ifconfig.me 43.200.254.197 12 로드 밸런서로 변경 kubectl patch svc prometheus-stack-grafana -n monitoring -p '{"spec": {"type": "LoadBalancer"}}' 보안그룹 업데이트 aws ec2 authorize-security-group-ingress \ --group-id sg-038d0e747d29d0594 \ --protocol tcp \ --port 80 \ --cidr 0.0.0.0/0 admin / admin # 암호 확인 kubectl get secret -n monitoring prometheus-stack-grafana \ -o jsonpath="{.data.admin-password}" | base64 --decode ; echo ---------------------------------- <3> 프로메테우스와 얼렛매니저, 슬랙 1 wa 2 # 기존 배포 제거 kubectl delete deployment php-apache kubectl delete service php-apache # 다시 배포 (표준 예제 사용) kubectl apply -f https://k8s.io/examples/application/php-apache.yaml 3 # 수정 필요 - api_url: 'https://hooks.slack.com/services/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' cat < alertmanager.yml global: resolve_timeout: 5m route: receiver: 'slack-notifications' # 모든 알림을 슬랙으로 고정 group_by: ['alertname'] group_wait: 10s group_interval: 1m repeat_interval: 1h receivers: - name: 'slack-notifications' slack_configs: - api_url: 'https://hooks.slack.com/services/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' channel: '#monitoring' send_resolved: true title: "[{{ .Status | toUpper }}] 모니터링 알림" text: "알림명: {{ (index .Alerts 0).Labels.alertname }}\n내용: {{ (index .Alerts 0).Annotations.summary }}" EOF 4 # 1. 시크릿 업데이트 kubectl create secret generic alertmanager-prometheus-stack-kube-prom-alertmanager \ --from-file=alertmanager.yaml=alertmanager.yml \ -n monitoring --dry-run=client -o yaml | kubectl apply -f - # 2. Alertmanager 포드 재시작 (새 설정 로드) kubectl rollout restart statefulset alertmanager-prometheus-stack-kube-prom-alertmanager -n monitoring # 3. 포드가 Running 상태가 될 때까지 약 30초 대기 kubectl get pod -l app.kubernetes.io/name=alertmanager -n monitoring 5 cat < cpu-test-rule.yaml apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: cpu-usage-test namespace: monitoring labels: release: prometheus-stack spec: groups: - name: cpu-test.rules rules: - alert: NodeCPUUsageVeryHighTest expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 0.1 for: 30s labels: severity: critical annotations: summary: "CPU 사용량 0.1% 초과 감지" EOF kubectl apply -f cpu-test-rule.yaml 6 app.slack.com # 네트워크망(NAT Gateway) 직접 확인 kubectl run net-test --rm -it --image=curlimages/curl --restart=Never -n monitoring -- \ curl -sI https://www.google.com # slack web hook https://api.slack.com/apps https://hooks.slack.com/services/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 https://hooks.slack.com/services/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 kubectl run net-test-final --rm -it --image=curlimages/curl --restart=Never -n monitoring -- \ curl -v -X POST -H 'Content-type: application/json' \ --data '{"text":"EKS -> Slack 연결 성공! 🚀\n현재 시각: '$(date +%H:%M:%S)'"}' \ "https://hooks.slack.com/services/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" kubectl run net-test-success --rm -it --image=curlimages/curl --restart=Never -n monitoring -- \ curl -X POST -H 'Content-type: application/json' \ --data '{"text":"[EKS 알림] 슬랙 웹훅 연결에 성공했습니다! 🚀"}' \ "https://hooks.slack.com/services/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" 7 # 60초 동안 CPU 부하 발생 kubectl run cpu-stress --rm -it --image=polinux/stress-ng --restart=Never -- \ stress-ng --cpu 1 --cpu-method matrixprod --timeout 60s ------------- 8 # 재 테스트 # 9090 포트를 사용 중인 프로세스 종료 fuser -k 9090/tcp 9 kubectl port-forward svc/prometheus-stack-kube-prom-prometheus 9090:9090 -n monitoring & 10 # 2초 대기 후 알람 리스트 조회 sleep 2 curl -s http://localhost:9090/api/v1/alerts | jq '.data.alerts[] | {alertname: .labels.alertname, state: .state}' 11 -------------------- kubectl logs -l app.kubernetes.io/name=alertmanager -n monitoring -f --tail=20 12 # 다른 터미널에서 실행 (포트 포워딩 9093이 살아있어야 함) curl -X POST http://localhost:9093/api/v2/alerts \ -H "Content-Type: application/json" \ -d '[{ "labels": { "alertname": "Realtime_Log_Trace", "severity": "critical" }, "annotations": { "summary": "로그 추적용 테스트" } }]' 13 kubectl port-forward -n monitoring service/prometheus-stack-kube-prom-alertmanager 9093:9093 --address 0.0.0.0 # 기존 잔재 프로세스 종료 fuser -k 9093/tcp 2>/dev/null # 새로운 Alertmanager 서비스에 다시 포트 포워딩 kubectl port-forward svc/prometheus-stack-kube-prom-alertmanager 9093:9093 -n monitoring & 14 sleep 2 curl -X POST http://localhost:9093/api/v2/alerts \ -H "Content-Type: application/json" \ -d '[{ "labels": { "alertname": "Restart_Success_Check", "severity": "critical" }, "annotations": { "summary": "포드 재시작 후 연결 성공! 🚀" } }]' ------------ # 모든 가용 CPU 코어에 100% 부하를 1분간 발생시킵니다. kubectl run final-stress-test --rm -it --image=polinux/stress-ng --restart=Never -- \ stress-ng --cpu 0 --cpu-method matrixprod --timeout 60s # 5초마다 알람 상태를 갱신해서 보여줍니다. watch -n 5 "curl -s http://localhost:9090/api/v1/alerts | jq '.data.alerts[] | select(.labels.alertname==\"NodeCPUUsageVeryHighTest\") | {state: .state}'" --------- 얼럿매니저(Alertmanager)에 curl로 데이터를 보냈는데 슬랙으로 알람이 오지 않는다면, Alertmanager 설정(Config) 내부에 슬랙 웹훅 URL이 등록되지 않았거나, 매칭 규칙(Route)이 맞지 않기 때문일 확률이 99%입니다. # 트라블 슈팅 kubectl get secret -n monitoring alertmanager-prometheus-stack-kube-prom-alertmanager -o jsonpath='{.data.alertmanager\.yaml}' | base64 --decode > alertmanager.yaml # sed 명령어로 한 번에 바꾸기 sed -i 's|https://hooks.slack.com/services/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|https://hooks.slack.com/services/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|g' alertmanager.yaml kubectl create secret generic alertmanager-prometheus-stack-kube-prom-alertmanager \ -n monitoring --from-file=alertmanager.yaml=alertmanager.yaml \ --dry-run=client -o yaml | kubectl apply -f - kubectl rollout restart statefulset alertmanager-prometheus-stack-kube-prom-alertmanager -n monitoring kubectl port-forward -n monitoring service/prometheus-stack-kube-prom-alertmanager 9093:9093 --address 0.0.0.0 curl -X POST http://localhost:9093/api/v2/alerts \ -H "Content-Type: application/json" \ -d '[{ "labels": { "alertname": "Slack_Link_Test", "severity": "critical" }, "annotations": { "summary": "새로운 웹훅 주소로 보내는 테스트입니다!" } }]'