EKS 클러스터에서 Container Insights 지표를 활성화하려면 어떻게 해야 하나요?
Amazon CloudWatch Container Insights를 구성하여 Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터 지표를 보려고 합니다.
간략한 설명
Amazon EKS와 함께 사용할 경우 Container Insights는 컨테이너화된 버전의 CloudWatch 에이전트를 사용하여 클러스터에서 실행 중인 모든 컨테이너를 찾습니다. 또한 Container Insights는 AWS Distro for OpenTelemetry(ADOT) Collector를 사용하여 클러스터에서 컨테이너를 찾습니다. 그런 다음 내장 지표 형식을 사용하는 성능 로그 이벤트와 같은 성능 스택의 모든 계층에서 성능 데이터를 수집합니다. 그런 다음 이 데이터를 /aws/containerinsights/cluster-name/performance 로그 그룹 아래의 CloudWatch Logs로 전송하면 CloudWatch는 클러스터, 노드 및 포드 수준에서 집계된 지표를 생성합니다. Container Insights는 Amazon EKS용 AWS Fargate에 배포된 클러스터에서 지표를 수집하는 기능도 지원합니다. 자세한 내용은 Container Insights 사용을 참조하세요.
참고: Container Insights는 Linux 인스턴스에서만 지원됩니다. Amazon은 Amazon Elastic Container Registry(Amazon ECR)에서 CloudWatch 에이전트 컨테이너 이미지를 제공합니다. 자세한 내용은 Amazon ECR의 cloudwatch-agent를 참조하세요.
해결 방법
사전 요구 사항
시작하기 전에 다음 사전 요구 사항을 검토하세요.
- Amazon EKS 클러스터가 준비 상태의 노드로 실행 중이고 kubectl 명령이 설치되어 실행 중인지 확인합니다.
- AWS Identity and Access Management(IAM) 관리형 CloudWatchAgentServerPolicy가 Amazon EKS 워커 노드를 활성화하여 지표와 로그를 CloudWatch로 전송하는지 확인합니다. 워커 노드를 활성화하려면 워커 노드의 IAM 역할에 정책을 연결합니다. 또는 클러스터의 서비스 계정에 IAM 역할을 사용하고 정책을 이 역할에 연결합니다. 자세한 내용은 서비스 계정용 IAM 역할을 참조하세요.
- Kubernetes 버전 1.18 이상을 지원하는 클러스터를 실행하고 있는지 확인하세요. 이는 EKS Fargate용 Container Insights 요구 사항입니다. 또한 Fargate에서 포드를 예약하려면 Fargate 프로필을 정의해야 합니다.
- Amazon EKS 포드 실행 IAM 역할이 Fargate 인프라에서 실행되는 구성 요소가 사용자를 대신하여 AWS API를 호출하도록 허용해야 합니다. 예를 들어 Amazon ECR에서 컨테이너 이미지를 가져옵니다.
CloudWatch 에이전트를 사용하여 EKS EC2 클러스터에서 Container Insights 지표 설정
CloudWatch 에이전트 또는 ADOT는 aws/containerinsights/Cluster_Name/performance라는 이름의 로그 그룹을 생성하고 이 로그 그룹에 성능 로그 이벤트를 전송합니다.
Container Insights를 설정하여 지표를 수집할 때는 CloudWatch 에이전트 컨테이너 이미지를 Docker Hub에서 DaemonSet으로 배포해야 합니다. 기본적으로 이 작업은 익명 사용자로 수행됩니다. 이 풀에는 속도 제한이 적용될 수 있습니다.
1. amazon-cloudwatch라는 네임스페이스가 없는 경우 이 네임스페이스를 생성합니다.
kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml
2. 다음과 같이 cloudwatch-agent라는 이름의 CloudWatch 에이전트에 대한 서비스 계정을 생성합니다.
kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-serviceaccount.yaml
3. CloudWatch 에이전트에 대한 구성 파일로 configmap을 생성합니다.
ClusterName=<my-cluster-name> curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-configmap.yaml | sed 's/cluster_name/'${ClusterName}'/' | kubectl apply -f -
참고: my-cluster-name을 EKS 클러스터의 이름으로 바꿉니다. CloudWatch 에이전트 구성을 추가로 사용자 지정하려면 CloudWatch 에이전트에 대한 ConfigMap 생성을 참조하세요.
4. cloudwatch-agent DaemonSet을 배포합니다.
kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-daemonset.yaml
선택 사항: Amazon Elastic Container Registry에서 CloudWatch 에이전트를 가져오려면 cloudwatch-agent DaemonSet을 패치합니다.
kubectl patch ds cloudwatch-agent -n amazon-cloudwatch -p \ '{"spec":{"template":{"spec":{"containers":[{"name":"cloudwatch-agent","image":"public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest"}]}}}}'
참고: Amazon ECR의 Cloudwatch-agent 도커 이미지는 ARM 및 AMD64 아키텍처를 지원합니다. 이미지 버전 및 아키텍처를 기반으로 최신 이미지 태그를 교체합니다. 자세한 내용은 Amazon ECR의 이미지 태그 cloudwatch-agent를 참조하십시오.
5. 서비스 계정에 대한 IAM 역할의 경우 OIDC 공급자와 IAM 역할 및 정책을 생성합니다. 그런 다음 IAM 역할을 cloudwatch-agent 서비스 계정에 연결합니다.
kubectl annotate serviceaccounts cloudwatch-agent -n amazon-cloudwatch "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"
참고: ACCOUNT_ID를 계정 ID로, IAM_ROLE_NAME을 서비스 계정에 사용하는 IAM 역할로 바꿉니다.
CloudWatch 에이전트 문제 해결
1. 다음 명령을 실행하여 포드의 목록을 검색합니다.
kubectl get pods -n amazon-cloudwatch
2. 다음 명령을 실행하여 출력 하단에서 이벤트를 확인합니다.
kubectl describe pod pod-name -n amazon-cloudwatch
3. 다음 명령을 실행하여 로그를 확인합니다.
kubectl logs pod-name -n amazon-cloudwatch
4. CloudWatch 에이전트에 대해 CrashLoopBackOff 오류가 표시되는 경우 IAM 권한이 올바르게 설정되었는지 확인합니다.
자세한 내용은 사전 조건 확인을 참조하세요.
CloudWatch 에이전트 삭제
Cloudwatch 에이전트를 삭제하려면 다음 명령을 실행합니다.
kubectl delete -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml
참고: 네임스페이스를 삭제하면 연결된 리소스도 삭제됩니다.
ADOT를 사용하여 EKS EC2 클러스터에서 Container Insights 지표 설정
1. ADOT 수집기를 DaemonSet으로 배포하려면 다음 명령을 실행합니다.
curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-container-insights-infra.yaml | kubectl apply -f -
추가 사용자 지정은 Container Insights EKS 인프라 지표를 참조하세요.
2. 다음 명령을 실행하여 수집기가 실행 중인지 확인합니다.
kubectl get pods -l name=aws-otel-eks-ci -n aws-otel-eks
3. 선택 사항: 기본적으로 aws-otel-collector 이미지는 Docker Hub에서 익명 사용자로 가져옵니다. 이 풀에는 속도 제한이 적용될 수 있습니다. Amazon ECR에서 aws-otel-collector 도커 이미지를 가져오려면 aws-otel-eks-ci DaemonSet을 패치합니다.
kubectl patch ds aws-otel-eks-ci -n aws-otel-eks -p \ '{"spec":{"template":{"spec":{"containers":[{"name":"aws-otel-collector","image":"public.ecr.aws/aws-observability/aws-otel-collector:latest"}]}}}}'
참고: Amazon ECR의 Cloudwatch-agent 도커 이미지는 ARM 및 AMD64 아키텍처를 지원합니다. 이미지 버전 및 아키텍처를 기반으로 최신 이미지 태그를 교체합니다. 자세한 내용은 Amazon ECR의 이미지 태그 cloudwatch-agent를 참조하십시오.
5. 선택 사항: 서비스 계정에 대한 IAM 역할의 경우 OIDC 공급자와 IAM 역할 및 정책을 생성합니다. 그런 다음 IAM 역할을 aws-otel-sa 서비스 계정에 연결합니다.
kubectl annotate serviceaccounts aws-otel-sa -n aws-otel-eks "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"
참고: ACCOUNT_ID를 계정 ID로, IAM_ROLE_NAME을 서비스 계정에 사용하는 IAM 역할로 바꿉니다.
ADOT 삭제
ADOT를 삭제하려면 다음 명령을 실행합니다.
curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-container-insights-infra.yaml | kubectl delete -f -
ADOT를 사용하여 EKS Fargate 클러스터에서 Container Insights 지표 설정
Amazon EKS 및 AWS Fargate에서 실행되는 애플리케이션의 경우 ADOT를 사용하여 Container Insights를 설정할 수 있습니다. EKS Fargate 네트워킹 아키텍처는 포드가 워커의 kubelet에 직접 도달하여 리소스 지표를 검색하는 것을 허용하지 않습니다. ADOT 수집기는 Kubernetes API 서버를 호출하여 작업자 노드의 kubelet에 대한 연결을 프록시합니다. 그런 다음 해당 노드의 워크로드에 대한 kubelet의 어드바이저 지표를 수집합니다.
참고: ADOT 수집기의 단일 인스턴스로는 클러스터의 모든 노드에서 리소스 지표를 수집하기에 충분하지 않습니다.
ADOT 수집기는 EKS Fargate에서 실행되는 모든 워크로드에 대해 다음과 같은 지표를 CloudWatch로 전송합니다.
- pod_cpu_utilization_over_pod_limit
- pod_cpu_usage_total
- pod_cpu_limit
- pod_memory_utilization_over_pod_limit
- pod_memory_working_set
- pod_memory_limit
- pod_network_rx_bytes
- pod_network_tx_bytes
각 지표는 다음 차원 집합과 연결되며 ContainerInsights라는 CloudWatch 네임스페이스에서 수집됩니다.
- ClusterName, LaunchType
- ClusterName, Namespace, LaunchType
- ClusterName, Namespace, PodName, LaunchType
자세한 내용은 Container Insights EKS Fargate를 참조하세요.
EKS Fargate에 ADOT를 배포하려면 다음 단계를 완료합니다.
1. Kubernetes 서비스 계정을 IAM 역할과 연결합니다. adot-collector라는 이름의 Kubernetes 서비스 계정과 연결된 EKS-ADOT-ServiceAccount-Role이라는 이름의 IAM 역할을 생성합니다. 다음 헬퍼 스크립트에는 eksctl이 필요합니다.
#!/bin/bash CLUSTER_NAME=YOUR-EKS-CLUSTER-NAME REGION=YOUR-EKS-CLUSTER-REGION SERVICE_ACCOUNT_NAMESPACE=fargate-container-insights SERVICE_ACCOUNT_NAME=adot-collector SERVICE_ACCOUNT_IAM_ROLE=EKS-Fargate-ADOT-ServiceAccount-Role SERVICE_ACCOUNT_IAM_POLICY=arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy eksctl utils associate-iam-oidc-provider \ --cluster=$CLUSTER_NAME \ --approve eksctl create iamserviceaccount \ --cluster=$CLUSTER_NAME \ --region=$REGION \ --name=$SERVICE_ACCOUNT_NAME \ --namespace=$SERVICE_ACCOUNT_NAMESPACE \ --role-name=$SERVICE_ACCOUNT_IAM_ROLE \ --attach-policy-arn=$SERVICE_ACCOUNT_IAM_POLICY \ --approve
참고: CLUSTER_NAME을 클러스터 이름으로 바꾸고 REGION을 AWS 리전으로 바꿉니다.
2. 다음 명령을 실행하여 ADOT 수집기를 Kubernetes StatefulSet으로 배포합니다.
ClusterName=<my-cluster-name> Region=<my-cluster-region> curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-fargate-container-insights.yaml | sed 's/YOUR-EKS-CLUSTER-NAME/'${ClusterName}'/;s/us-east-1/'${Region}'/' | kubectl apply -f -
참고: AWS Fargate에서 StatefulSet 포드를 프로비저닝하려면 일치하는 Fargate 프로필이 있어야 합니다. my-cluster-name을 클러스터의 이름으로 바꾸고 my-cluster-region을 클러스터가 위치한 리전으로 바꿉니다.
3. 다음 명령을 실행하여 ADOT 수집기 포드가 실행 중인지 확인합니다.
kubectl get pods -n fargate-container-insights
4. 선택 사항: 기본적으로 aws-otel-collector 이미지는 Docker Hub에서 익명 사용자로 가져옵니다. 이 풀에는 속도 제한이 적용될 수 있습니다. Amazon ECR에서 aws-otel-collector 도커 이미지를 가져오려면 adot-collector StatefulSet을 패치합니다.
kubectl patch sts adot-collector -n fargate-container-insights -p \ '{"spec":{"template":{"spec":{"containers":[{"name":"adot-collector","image":"public.ecr.aws/aws-observability/aws-otel-collector:latest"}]}}}}'
ADOT 삭제
ADOT를 삭제하려면 다음 명령을 실행합니다.
eksctl delete iamserviceaccount —cluster CLUSTER_NAME —name adot-collector
ClusterName=<my-cluster-name> Region=<my-cluster-region> curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-fargate-container-insights.yaml | sed 's/YOUR-EKS-CLUSTER-NAME/'${ClusterName}'/;s/us-east-1/'${Region}'/' | kubectl delete -f -
관련 정보

관련 콘텐츠
- 질문됨 2달 전lg...
- 질문됨 4달 전lg...
- 질문됨 2달 전lg...
- AWS 공식업데이트됨 6달 전