Prometheus를 활용한 Amazon EKS 제어 영역의 통계 처리
감시 프로그램
의 수, 감사 추적 이벤트의 수, 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_REGION
을 Amazon 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 형식으로 출력됩니다. Prometheus는 CNCF(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
이는 LIST
할 pods
리소스에 대한 요청이 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 2018 – Monitor the World: Meaningful 지표 for Containerized Apps & Clusters(발표자: Nicholas Turner 및 Nic Cope)를 참조하십시오.