본문 바로가기

DevOps

[AWS EKS] Observability (1) Control-plane

CloudNet@팀의 EKS 스터디 AEWS 2기에 작성된 자료를 토대로 작성합니다.

 

모니터링?

옵저버 빌리티?

 

위 단어에 대해서 차이점이 무엇일까?

과거에는 모니터링이라는 단어만 사용했던것 같은데 클러스터와 어플리케이션 레벨을 접하고 부터는 해당 단어를 심심찮게 들었다.

 

옵저버빌리티는 크게 5가지 영역으로 나뉜다. 우리가 가장 먼저 떠올리는 모니터링부터 로깅.. 알람 .. 트레이싱 까지 

    1. Monitoring(모니터링):
      • 클러스터 및 애플리케이션의 상태와 성능을 실시간으로 추적하고 관찰
      • AWS CloudWatch 및 Prometheus를 사용하여 EKS 클러스터의 메트릭을 수집하고 모니터링
    2. Logging(로깅):
      • 애플리케이션 및 시스템에서 발생하는 로그를 수집하고 분석하여 문제를 식별
      • CloudWatch Logs 및 Fluentd와 같은 도구를 사용하여 EKS 클러스터의 로그를 수집하고 저장
    3. Alerting(경고):
      • 정의된 임계값을 초과하는 경우 운영자에게 경고를 발송하여 잠재적인 문제를 신속하게 파악하고 조치
      • AWS CloudWatch 경보 및 Prometheus 경보 규칙을 설정하여 이러한 경고를 구성
    4. Tracing(추적):
      • 애플리케이션의 요청 경로와 실행 경로를 추적하여 복잡한 시스템에서 문제를 식별
      • AWS X-Ray와 같은 서비스를 사용하여 애플리케이션의 추적 데이터를 수집하고 시각화
    5. Distributed Tracing(분산 추적):
      • 여러 마이크로서비스 간의 통신을 추적하여 전체 시스템의 동작을 이해
      • Jaeger나 Zipkin과 같은 오픈 소스 도구 또는 AWS X-Ray와 같은 서비스를 사용하여 분산 추적을 수행

위 5가지 영역에 대해서 이번 시간에 다뤄보도록 하겠다.

그중에서 먼저, AWS 관리 책임 영역에 있는 Control Plane의 로깅 설정은 어떻게 설정하는지에 대해서부터 시작해보자.

 

 

 

✅   EKS 컨트롤 플레인 Logging                                                                                                                      

Amazon EKS는 관리형 서비스로 AWS에서 관리하는 Contol Plane과 사용자가 관리하는 Data Plane이 있습니다. Data Plane일 경우 다양한 모니터링 시스템을 적용하여 logging을 할 수 있는 반면, Control Plane은 AWS에서 관리하기 때문에 사용자가 직접 Logging하기 쉽지 않은데요. 특별한 옵션 설정으로 Logging이 가능합니다.

 

😍 Addon 으로 ClusterWatch를  EKS와 함께 사용 할 수 있습니다.

  • 로그는 CloudWatch의 각 Amazon EKS 클러스터에 대한 로그 스트림으로 그룹으로 전송
  • AWS 관리 콘솔, AWS CLI(버전 1.16.139 이상) 또는 Amazon EKS API를 사용하여 클러스터별로 각 로그 유형을 활성화 또는 비활성화
  • Amazon EKS 컨트롤 플레인 로깅을 사용하는 경우, 실행하는 각 클러스터에 대한 표준 Amazon EKS 요금과 클러스터에서 CloudWatch Logs로 전송되는 모든 로그에 대한 표준 CloudWatch Logs 데이터 수집 및 저장 비용이 청구
  • 클러스터 제어 플레인 로그 유형.
    • Kubernetes API server component logs (api)
    • Audit (audit) 
    • Authenticator (authenticator)
    • Controller manager (controllerManager)
    • Scheduler (scheduler)

✅   EKS with Cloudwatch 실습하기                                                                                                                                             

  • 설치 정보 확인
# 이미지 정보 확인
kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" | tr -s '[[:space:]]' '\n' | sort | uniq -c

# eksctl 설치/업데이트 addon 확인
eksctl get addon --cluster $CLUSTER_NAME

# IRSA 확인
eksctl get iamserviceaccount --cluster $CLUSTER_NAME

# EC2 Instance Profile에 IAM Role 정보 확인
cat myeks.yaml | grep managedNodeGroups -A20 | yh
managedNodeGroups: 
- amiFamily: AmazonLinux2
  desiredCapacity: 3
  disableIMDSv1: true
  disablePodIMDS: false
  iam: 
    withAddonPolicies: 
      albIngress: false
      appMesh: false
      appMeshPreview: false
      autoScaler: false
      awsLoadBalancerController: false  >> IRSA 사용
      certManager: true
      cloudWatch: true
      ebs: true
      efs: false
      externalDNS: true
      fsx: false
      imageBuilder: true
      xRay: true
  • Bastion 노드에 접속하여 리소스 및정보를 확인
  • 클러스터 ARN 정보 확인
#
kubectl get ClusterRole | grep eks
eks:addon-manager                                                      2023-05-08T04:22:45Z
eks:az-poller                                                          2023-05-08T04:22:42Z
eks:certificate-controller-approver                                    2023-05-08T04:22:42Z
...
eks:cloudwatch-agent-role                                              2024-03-30T10:17:26Z

...

 

  • 모든 로깅 활성화 

# 모든 로깅 활성화
aws eks update-cluster-config --region $AWS_DEFAULT_REGION --name $CLUSTER_NAME \
    --logging '{"clusterLogging":[{"types":["api","audit","authenticator","controllerManager","scheduler"],"enabled":true}]}'

  • 로그 확인 및 출력
# 로그 그룹 확인
aws logs describe-log-groups | jq

# 로그 tail 확인 : aws logs tail help
aws logs tail /aws/eks/$CLUSTER_NAME/cluster | more

# 신규 로그를 바로 출력
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --follow

# 필터 패턴
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --filter-pattern <필터 패턴>

# 로그 스트림이름
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --log-stream-name-prefix <로그 스트림 prefix> --follow
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --log-stream-name-prefix kube-controller-manager --follow
kubectl scale deployment -n kube-system coredns --replicas=1
kubectl scale deployment -n kube-system coredns --replicas=2

# 시간 지정: 1초(s) 1분(m) 1시간(h) 하루(d) 한주(w)
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --since 1h30m

# 짧게 출력
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --since 1h30m --format short

  • 그룹에 여러 개의 로그 스트림이 표시

로그 스트림 중 하나를 선택하면 EKS 제어 플레인에서 CloudWatch Logs로 전송되는 항목 확인

 

✅    Cloudwatch Log insight 실습하기                                                                                                                                            

  • CloudWatch 로그 인사이트를 사용하면 CloudWatch 로그에서 로그 데이터를 대화형으로 검색하고 분석
  • 쿼리를 수행하여 운영 문제에 보다 효율적이고 효과적으로 
  • 문제가 발생하면 CloudWatch 로그 인사이트를 사용하여 잠재적인 원인을 파악하고 배포된 수정 사항을 검증

# kube-apiserver-audit 로그에서 userAgent 정렬해서 아래 4개 필드 정보 검색
fields userAgent, requestURI, @timestamp, @message
| filter @logStream ~= "kube-apiserver-audit"
| stats count(userAgent) as count by userAgent
| sort count desc
  1. fields userAgent, requestURI, @timestamp, @message:
    • 반환할 필드를 지정하는 부분
    • 사용자 에이전트(UserAgent), 요청 URI(requestURI), 타임스탬프(@timestamp), 및 로그 메시지(@message)를 선택
  2. | filter @logStream ~= "kube-apiserver-audit":
    • 로그 스트림 필터링을 수행하는 부분
    • 로그 스트림 이름에 "kube-apiserver-audit"가 포함된 로그만 필터링하여 해당 로그만을 분석
  3. | stats count(userAgent) as count by userAgent:
    • 사용자 에이전트별로 요청 횟수를 계산하는 부분
    • count(userAgent)는 각 사용자 에이전트의 등장 횟수를 세는 것을 의미하며, as count를 사용하여 이를 count라는 이름으로 별칭을 지정
    • by userAgent는 사용자 에이전트별로 결과를 그룹화하는 것을 의미
  4. | sort count desc:
    • 결과를 요청 횟수(count)에 따라 내림차순으로 정렬
    • 가장 많이 사용된 사용자 에이전트가 상단에 나열