<1> 모니터링 도구 # 터미널 1 wa # 터미널 2 watch -d kubectl top node # 터미널 3 # 노드 수를 4대로 늘리기 (Desired Capacity를 4으로 변경) 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 (ssss@free-vpc-cluster:monitoring) [root@kops-ec2 ~]# 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 # Prometheus 인스턴스 확인 kubectl get prometheus -n monitoring # Alertmanager 인스턴스 확인 kubectl get alertmanager -n monitoring # 관련 Pod들이 모두 떴는지 최종 확인 kubectl get pods -n monitoring 11 그라파나 접속: http://3.36.103.152:3000에 접속하여 데이터가 그래프로 그려지는지 보세요. admin / admin kubectl port-forward -n monitoring service/prometheus-stack-grafana 3000:80 --address 0.0.0.0 (ssss@free-vpc-cluster:N/A) [root@kops-ec2 ~]# curl ifconfig.me 3.36.103.152 14 aws ec2 authorize-security-group-ingress \ --group-id sg-00fc0136d8986dfcc \ --protocol tcp \ --port 3000 \ --cidr 0.0.0.0/0 aws ec2 describe-security-groups \ --group-ids sg-00fc0136d8986dfcc \ --query "SecurityGroups[0].IpPermissions[?ToPort==\`3000\`]" 그라파나 접속: http://3.36.103.152:3000에 접속하여 데이터가 그래프로 그려지는지 보세요. admin / admin <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 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 # 네트워크망(NAT Gateway) 직접 확인 kubectl run net-test --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 # 기존 잔재 프로세스 종료 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}'"