Amazon EKS 클러스터에서 Container Insights 지표를 켜려면 어떻게 해야 하나요?

6분 분량
0

내 Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터 지표를 볼 수 있도록 Amazon CloudWatch Container Insights를 구성하고 싶습니다.

간략한 설명


Amazon EKS와 함께 Container Insights를 사용하면 Container Insights는 CloudWatch 에이전트의 컨테이너화된 버전을 사용하여 클러스터에서 실행 중인 모든 컨테이너를 찾습니다. Container Insights는 또한 AWS Distro for OpenTelemetry(ADOT) Collector를 사용하여 클러스터에서 컨테이너를 찾습니다. 그런 다음 Container Insights는 성능 스택의 모든 계층에서 내장 지표 형식을 사용하는 성능 로그 이벤트와 같은 성능 데이터를 수집합니다. 이후 Container Insights는 CloudWatch가 클러스터, 노드, 포드 수준에서 집계한 지표를 생성하는 /aws/containerinsights/cluster-name/performance 로그 그룹의 CloudWatch 로그로 이 데이터를 전송합니다. Container Insights는 AWS Fargate for Amazon EKS에 배포된 클러스터에서의 지표 수집도 지원합니다. 자세한 내용은 Container Insights 사용을 참조하세요.

참고: Container Insights는 Linux 인스턴스에서만 지원됩니다. Amazon은 Amazon Elastic Container Registry(Amazon ECR)에서 CloudWatch 에이전트 컨테이너 이미지를 제공합니다. 자세한 내용은 Amazon ECR의 cloudwatch-agent/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를 호출할 수 있도록 허용해야 합니다. 예를 들어 IAM 역할은 Amazon ECR에서 컨테이너 이미지를 가져올 수 있어야 합니다.

CloudWatch 에이전트를 사용하여 EC2 클러스터에서 Container Insights 지표 설정

CloudWatch 에이전트 또는 ADOT는 먼저 aws/containerinsights/Cluster_Name/performance라는 이름의 로그 그룹을 생성한 다음 해당 로그 그룹에 성능 로그 이벤트를 전송합니다. 지표를 수집하도록 Container Insights를 설정하는 경우 CloudWatch 에이전트 컨테이너 이미지를 도커 허브에서 대몬(daemon)셋으로 배포해야 합니다. 이 작업은 기본적으로 익명 사용자로 수행됩니다. 이 가져오기에는 속도 제한이 적용될 수 있습니다.

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 에이전트에 대한 ConfigMap 생성을 참조하세요.

4.    cloudwatch-agent 대몬(daemon)셋을 배포합니다.

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 대몬(daemon)셋을 패치하세요.

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를 사용하여 EC2 클러스터에서 Container Insights 지표 설정

1.    ADOT Collector를 대몬(daemon)셋으로 배포하려면 다음 명령을 실행합니다.

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 이미지는 도커 허브에서 익명 사용자로 가져옵니다. 이 가져오기에는 속도 제한이 적용될 수 있습니다. Amazon ECR의 aws-otel-collector 도커 이미지를 가져오려면 aws-otel-eks-ci 대몬(daemon)셋을 패치하세요.

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를 참조하세요.

4.    (선택 사항) 서비스 계정에 대한 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 Collector는 먼저 Kubernetes API 서버를 호출하여 워커 노드의 kubelet에 대한 연결을 프록시합니다. 그런 다음 해당 노드의 워크로드에 대한 kubelet의 어드바이저 지표를 수집합니다.

ADOT Collector는 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/bashCLUSTER_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 Collector를 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을 클러스터가 위치한 AWS 리전으로 바꾸세요.

3.    ADOT Collector 포드가 실행 중인지 확인하려면 다음 명령을 실행합니다.

kubectl get pods -n fargate-container-insights

4.    (선택 사항) 기본적으로 aws-otel-collector 이미지는 도커 허브에서 익명 사용자로 가져옵니다. 이 가져오기에는 속도 제한이 적용될 수 있습니다. 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 -
AWS 공식
AWS 공식업데이트됨 6달 전