Amazon Web Services 한국 블로그

Prometheus를 활용한 Amazon EKS 제어 영역의 통계 처리

Prometheus + Amazon EKSKubernetes의 코어 구성 요소는 제어 영역(Control Plane)에서 처리되는 일들의 확인에 사용될 수 있는 다양한 통계 지표 세트를 제공합니다. 지표를 통해 API 서버의 각 리소스에 있는 감시 프로그램의 수, 감사 추적 이벤트의 수, API 서버로의 요청 지연 시간 등의 다양한 정보를 확인할 수 있습니다. 이러한 지표는 Kubernetes API 서버, Kubelet, 클라우드 컨트롤러 관리자 및 스케줄러를 통해 제공됩니다. 이러한 구성 요소들은 /metrics에 있는 text/plain 콘텐츠 유형에서 “지표” 엔드포인트(HTTP를 통해 응답)들을 노출합니다. 이 게시물에서는 Amazon Elastic Container Service for Kubernetes(EKS) 클러스터에서 API 서버 지표를 가져오는 방법을 설명합니다.

사전 조건

먼저 Amazon EKS 클러스터를 설정해야 합니다. 이 데모에서는 eksctl의 ClusterConfig 파일 메커니즘을 사용하겠습니다. 먼저 사전 조건으로 다음과 같은 툴을 다운로드합니다.

필수 도구를 모두 설치했으면 EKS 클러스터 실행을 시작할 수 있습니다. 이 예에서는 AWS의 오하이오 리전인 us-east-2에 클러스터를 구축합니다만 필요에 따라 AWS_REGIONAmazon EKS 지원 리전 중 하나로 대체할 수 있습니다. (현재 서울 리전에서도 Amazon EKS를 사용 가능합니다.)

클러스터 구축

export AWS_REGION=us-east-2

리전을 내보냈으면 다음과 같이 ClusterConfig를 생성할 수 있습니다.

cat >cluster.yaml <<EOF
apiVersion: eksctl.io/v1alpha4
kind: ClusterConfig
metadata:
  name: control-plane-metrics
  region: us-east-2

nodeGroups:
  - name: ng-1
    desiredCapacity: 2
EOF

파일이 생성 이후 eksctl create cluster 명령을 사용하여 클러스터를 생성합니다.

eksctl create cluster -f cluster.yaml

이 작업은 완료하는 데 약 10~15분이 소요되며, 작업이 완료되면 Amazon EKS 클러스터를 사용할 수 있습니다.

미가공 자료 확인하기

지표를 시각화, 모니터링 및 알림 설정하기 전에, 이러한 지표 엔드포인트가 어떻게 출력 되는지 볼 수 있습니다.

kubectl get --raw /metrics

이러한 지표는 Prometheus 형식으로 출력됩니다. PrometheusCNCF(Cloud Native Computing Foundation) 등급 프로젝트로서, 클러스터 내의 지표 엔드포인트를 스캔 및 스크레이핑할 수 있으며 자체 엔드포인트까지도 스캔할 수 있습니다. Prometheus 지표를 위한 구문은 다음과 같습니다.

metric_name {[ "tag" = "value" ]*} value

이렇게 하면 metric_name을 설정하고, 쿼리에 사용되는 지표 tags를 정의하고, value를 설정할 수 있습니다. apiserver_request_count에 대한 관련 설정의 예는 다음과 같습니다.

apiserver_request_count{client="kube-apiserver/v1.11.8 (linux/amd64) kubernetes/7c34c0d",code="200",contentType="application/vnd.kubernetes.protobuf",resource="pods",scope="cluster",subresource="",verb="LIST"} 7

이는 LISTpods 리소스에 대한 요청이 7번 있었음을 나타냅니다.

다음으로 helm을 사용하여 Prometheus를 설정하겠습니다.

Helm 구성하기

클러스터가 생성되고 나면 로컬에서 helm을 설정할 수 있습니다. 이렇게 하면 클러스터 내에서 tiller를 실행할 필요가 없습니다. Helm구성을 위해 게시물 Using Helm with Amazon EKS에 있는 단계를 따릅니다.

다음 단계를 통해 Prometheus를 구축합니다.

Prometheus 배포하기

먼저 Kubernetes 네임스페이스를 생성하고 helm을 사용하여 stable/prometheus 패키지를 배포합니다.

kubectl create namespace prometheus
helm install stable/prometheus \ 
             --name prometheus \
             --namespace prometheus \
             --set alertmanager.persistentVolume.storageClass="gp2",server.persistentVolume.storageClass="gp2",server.service.type=LoadBalancer

패키지가 설치 되었으면 서비스 리스트를 표시하여 로드 밸런서의 주소를 가져올 수 있습니다.

kubectl get svc -o wide —namespace prometheus

브라우저를 통해 이 로드 밸런서 주소로 이동하면 Prometheus UI가 로드됩니다. 여기에서 [Status] → [Targets]로 이동하면 페이지에 제어 평면 노드가 표시됩니다.

노드를 볼 수 있게 되면 해당 노드로 이동하여 일부 지표를 확인할 수 있습니다. [Graph]로 이동하여 [– insert metric at cursor –] 드롭다운에서 apiserver_로 시작하는 지표 중 하나를 선택하고 [Execute ]를 클릭합니다. 이렇게 하면 API 서버에서 마지막으로 동기화된 데이터가 로드됩니다.

이제 [Console] 뷰에서 지표를 볼 수 있으므로, [Graph]로 전환하여 이 데이터를 시각화합니다.

Teardown 수행하기

특별히 이 테스트를 실행하기 위해 클러스터를 구축했으며 teardown을 수행하려는 경우, 먼저 prometheus 네임스페이스를 삭제한 다음 클러스터를 삭제합니다.

kubectl delete namespace prometheus
eksctl delete cluster -f cluster.yaml

Prometheus를 사용하면 Kubernetes API 서버 내에 어떤 일이 진행되는지 볼 수 있으며 시간의 흐름에 따른 이러한 지표의 변화를 그래프로 표시할 수 있습니다. 또한 Prometheus를 사용하여 [Alerts] 탭에 추가될 알림 규칙을 설정할 수 있습니다. 이 helm 차트를 사용하면 사용자가 정의한 알림 규칙을 기반으로 알림을 구성할 수 있게 해 주는 Alertmanager도 배포할 수 있습니다. prometheus-server configmap을 수정하여 직접 일부 규칙을 설정해 봅니다.

kubectl get configmap -n prometheus prometheus-server -o yaml

Kubernetes API에서와 같이 자체 애플리케이션에서 지표를 사용할 수 있는 방법에 대한 자세한 내용은 KubeCon CloudNativeCon North America 2018Monitor the World: Meaningful 지표 for Containerized Apps & Clusters(발표자: Nicholas TurnerNic Cope)를 참조하십시오.

Chris Hein

Chris Hein은 Amazon Web Services의 Kubernetes/EKS담당 Developer Advocate입니다. Amazon 이전에는, Chris는 GoPro, Sproutling, Mattel 등의 크고 작은 기업에서 근무했습니다 .  Christ의 글을 더 읽어보고 @christopherhein 을 팔로우하십시오.

이 글은 AWS Open Source 블로그 Amazon EKS Control Plane Metrics with Prometheus의 한국어 번역입니다.