kube-state-metrics(KSM)는 Kubernetes API 서버를 수신하고 객체 상태에 대한 지표를 생성하는 간단한 서비스입니다. (아래 측정항목 섹션의 예를 참조하세요.) 개별 Kubernetes 구성 요소의 상태가 아니라 배포, 노드, Pod와 같은 내부의 다양한 개체의 상태에 중점을 둡니다.
kube-state-metrics는 수정 없이 Kubernetes API 객체에서 메트릭을 생성하는 것입니다. 이를 통해 kube-state-metrics에서 제공하는 기능은 Kubernetes API 객체 자체와 동일한 수준의 안정성을 갖습니다. 이는 kubectl이 이해 가능한 메시지를 표시하기 위해 특정 휴리스틱을 적용하므로 특정 상황에서 kube-state-metrics가 kubectl과 정확히 동일한 값을 표시하지 않을 수 있음을 의미합니다. kube-state-metrics는 Kubernetes API에서 수정되지 않은 원시 데이터를 노출하므로 사용자는 필요한 모든 데이터를 확보하고 적절하다고 판단되는 휴리스틱을 수행할 수 있습니다.
메트릭은 수신 포트(기본값 8080)의 HTTP 엔드포인트 /metrics
로 내보내집니다. 일반 텍스트로 제공됩니다. 이는 Prometheus 자체 또는 Prometheus 클라이언트 엔드포인트 스크랩과 호환되는 스크레이퍼에서 사용되도록 설계되었습니다. 브라우저에서 /metrics
열어 원시 측정항목을 볼 수도 있습니다. /metrics
엔드포인트에 노출된 지표는 Kubernetes 클러스터의 현재 상태를 반영합니다. Kubernetes 객체가 삭제되면 더 이상 /metrics
엔드포인트에 표시되지 않습니다.
메모
이 README는 템플릿에서 생성됩니다. 거기에서 변경하고 make generate-template
실행하세요.
버전 관리
쿠버네티스 버전
호환성 매트릭스
리소스 그룹 버전 호환성
컨테이너 이미지
측정항목 문서
라벨 이름의 충돌 해결
Kube-state-metrics 자체 메트릭
리소스 추천
숨어 있음
비용 관련 참고사항
kube-state-metrics 대 메트릭-서버
kube-state-metrics 확장
자동화된 샤딩
리소스 추천
수평 샤딩
포드 지표를 위한 데몬셋 샤딩
설정
Docker 컨테이너 빌드
용법
쿠버네티스 배포
제한된 권한 환경
투구 차트
개발
개발자 기여
지역 사회
kube-state-metrics는 client-go
사용하여 Kubernetes 클러스터와 통신합니다. 지원되는 Kubernetes 클러스터 버전은 client-go
에 의해 결정됩니다. client-go 및 Kubernetes 클러스터의 호환성 매트릭스는 여기에서 확인할 수 있습니다. 모든 추가 호환성은 최선의 노력일 뿐이거나 여전히/이미 지원됩니다.
최대 5개의 kube-state-metrics 및 5개의 kubernetes 릴리스가 아래에 기록됩니다. 일반적으로 kube-state-metrics의 최신 릴리스를 사용하는 것이 좋습니다. 최신 버전의 Kubernetes를 실행하는 경우 출시되지 않은 버전을 사용하여 지원되는 모든 리소스를 확보할 수 있습니다. 이전 버전의 Kubernetes를 실행하는 경우 모든 리소스를 완벽하게 지원하려면 이전 버전을 실행해야 할 수도 있습니다. 관리자는 최신 릴리스만 지원한다는 점에 유의하세요. 관심 있는 커뮤니티 사용자는 이전 버전을 지원할 수도 있습니다.
kube-상태-메트릭 | Kubernetes 클라이언트 이동 버전 |
---|---|
v2.10.1 | v1.27 |
v2.11.0 | v1.28 |
v2.12.0 | v1.29 |
v2.13.0 | v1.30 |
v2.14.0 | v1.31 |
기본 | v1.31 |
Kubernetes의 리소스는 발전할 수 있습니다. 즉, 리소스의 그룹 버전이 알파에서 베타로 변경될 수 있으며 최종적으로는 다른 Kubernetes 버전에서 GA로 변경될 수 있습니다. 현재 kube-state-metrics는 최신 릴리스에서 사용 가능한 가장 오래된 API만 사용합니다.
최신 컨테이너 이미지는 다음에서 찾을 수 있습니다.
registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.14.0
(아키텍처: amd64
, arm
, arm64
, ppc64le
및 s390x
)
여기에서 모든 다중 아키텍처 이미지를 확인하세요.
알파 Kubernetes API를 기반으로 하는 모든 리소스 및 측정항목은 특정 릴리스에서 변경될 수 있는 안정성 보장에서 제외됩니다.
노출된 측정항목에 대한 자세한 내용은 docs
디렉터리를 참조하세요.
*_labels
측정항목 계열은 Kubernetes 라벨을 Prometheus 라벨로 노출합니다. Kubernetes는 레이블 이름에 허용되는 문자 측면에서 Prometheus보다 더 자유롭기 때문에 지원되지 않는 문자를 자동으로 밑줄로 변환합니다. 예를 들어 app.kubernetes.io/name
label_app_kubernetes_io_name
됩니다.
이 변환은 foo-bar
및 foo_bar
와 같은 여러 Kubernetes 레이블이 동일한 Prometheus 레이블 label_foo_bar
로 변환될 때 충돌을 일으킬 수 있습니다.
Kube-state-metrics는 이 충돌을 해결하기 위해 접미사 _conflictN
자동으로 추가하므로 위의 라벨을 label_foo_bar_conflict1
및 label_foo_bar_conflict2
로 변환합니다.
이 충돌을 해결하는 방법을 더 효과적으로 제어하려면 스택의 다른 수준에서 이 문제를 해결하는 것이 좋습니다. 예를 들어 충돌 가능성이 없도록 허용 웹후크를 사용하여 Kubernetes 레이블을 표준화하는 방법이 있습니다.
kube-state-metrics는 --telemetry-host
및 --telemetry-port
(기본값 8081) 아래에 자체 일반 프로세스 측정항목을 노출합니다.
kube-state-metrics는 목록과 감시 성공 및 오류 지표도 공개합니다. 이는 목록 또는 감시 리소스의 오류율을 계산하는 데 사용할 수 있습니다. 측정항목에서 이러한 오류가 발생하면 구성 또는 권한 문제일 가능성이 높으며 다음으로 조사할 작업은 kube-state-metrics의 로그를 살펴보는 것입니다.
위에 언급된 측정항목의 예:
kube_state_metrics_list_total{resource="*v1.Node",result="success"} 1 kube_state_metrics_list_total{resource="*v1.Node",result="error"} 52 kube_state_metrics_watch_total{resource="*v1beta1.Ingress",result="success"} 1
kube-state-metrics는 일부 http 요청 측정항목도 공개합니다. 그 예는 다음과 같습니다.
http_request_duration_seconds_bucket{handler="metrics",method="get",le="2.5"} 30 http_request_duration_seconds_bucket{handler="metrics",method="get",le="5"} 30 http_request_duration_seconds_bucket{handler="metrics",method="get",le="10"} 30 http_request_duration_seconds_bucket{handler="metrics",method="get",le="+Inf"} 30 http_request_duration_seconds_sum{handler="metrics",method="get"} 0.021113919999999998 http_request_duration_seconds_count{handler="metrics",method="get"} 30
kube-state-metrics는 빌드 및 구성 측정항목도 공개합니다.
kube_state_metrics_build_info{branch="main",goversion="go1.15.3",revision="6c9d775d",version="v2.0.0-beta"} 1 kube_state_metrics_shard_ordinal{shard_ordinal="0"} 0 kube_state_metrics_total_shards 1
kube_state_metrics_build_info
는 버전 및 기타 빌드 정보를 노출하는 데 사용됩니다. 정보 패턴에 대한 자세한 사용법은 여기 블로그 게시물을 확인하세요. 샤딩 측정항목은 --shard
및 --total-shards
플래그를 노출하고 런타임 구성을 검증하는 데 사용할 수 있습니다. /examples/prometheus-alerting-rules
참조하세요.
kube-state-metrics는 또한 구성 파일과 사용자 정의 리소스 상태 구성 파일에 대한 측정항목을 노출합니다.
kube_state_metrics_config_hash{filename="crs.yml",type="customresourceconfig"} 2.38272279311849e+14 kube_state_metrics_config_hash{filename="config.yml",type="config"} 2.65285922340846e+14 kube_state_metrics_last_config_reload_success_timestamp_seconds{filename="crs.yml",type="customresourceconfig"} 1.6704882592037103e+09 kube_state_metrics_last_config_reload_success_timestamp_seconds{filename="config.yml",type="config"} 1.6704882592035313e+09 kube_state_metrics_last_config_reload_successful{filename="crs.yml",type="customresourceconfig"} 1 kube_state_metrics_last_config_reload_successful{filename="config.yml",type="config"} 1
kube-state-metrics의 리소스 사용량은 클러스터의 Kubernetes 객체(Pod/노드/배포/비밀 등) 크기에 따라 변경됩니다. 클러스터의 Kubernetes 개체는 어느 정도 클러스터의 노드 수에 정비례합니다.
일반적으로 다음을 할당해야 합니다.
250MiB 메모리
0.1 코어
CPU 한도를 너무 낮게 설정하면 kube-state-metrics의 내부 큐를 충분히 빠르게 처리할 수 없으므로 큐 길이가 늘어남에 따라 메모리 소비가 증가합니다. 높은 메모리 할당이나 CPU 제한으로 인해 문제가 발생하는 경우 CPU 제한을 늘려보세요.
100개 노드 클러스터 확장 테스트에서 지연 시간 수치는 다음과 같습니다.
"Perc50": 259615384 ns, "Perc90": 475000000 ns, "Perc99": 906666666 ns.
기본적으로 kube-state-metrics는 클러스터 전체의 이벤트에 대한 여러 지표를 노출합니다. 클러스터에 자주 업데이트되는 리소스가 많은 경우 이러한 지표에 많은 양의 데이터가 수집되는 것을 확인할 수 있습니다. 이로 인해 일부 클라우드 제공업체에서는 높은 비용이 발생할 수 있습니다. 예상치 못한 높은 비용을 방지하려면 잠시 시간을 내어 공개할 측정항목을 구성하고 Kubernetes 환경에 대한 설명서를 참조하세요.
Metrics-Server는 Heapster에서 영감을 받은 프로젝트이며 Kubernetes 모니터링 아키텍처의 핵심 메트릭 파이프라인의 목표를 달성하기 위해 구현되었습니다. 이는 Metrics API를 통해 Kubelet에서 제공하는 모든 Kubernetes 노드에서 정기적으로 메트릭을 스크랩하는 클러스터 수준 구성 요소입니다. 측정항목은 집계되어 메모리에 저장되며 측정항목 API 형식으로 제공됩니다. 메트릭 서버는 최신 값만 저장하며 메트릭을 타사 대상으로 전달하는 작업을 담당하지 않습니다.
kube-state-metrics는 Kubernetes의 객체 상태에서 완전히 새로운 메트릭(예: 배포, 복제본 세트 등을 기반으로 한 메트릭)을 생성하는 데 중점을 둡니다. Kubernetes 상태의 전체 스냅샷을 메모리에 보관하고 이를 기반으로 새로운 측정항목을 지속적으로 생성합니다. 그리고 Metrics-Server와 마찬가지로 이 서버 역시 메트릭을 어디로든 내보낼 책임이 없습니다.
kube-state-metrics를 별도의 프로젝트로 사용하면 Prometheus와 같은 모니터링 시스템에서 이러한 측정항목에 액세스할 수도 있습니다.
kube-state-metrics를 수평으로 샤딩하기 위해 일부 자동화된 샤딩 기능이 구현되었습니다. 이는 다음 플래그로 구성됩니다.
--shard
(0 인덱스)
--total-shards
샤딩은 Kubernetes 객체 UID의 md5 합계를 취하고 총 샤드 수에 대해 모듈로 연산을 수행하여 수행됩니다. 각 샤드는 객체가 kube-state-metrics의 해당 인스턴스에 의해 처리되는지 여부를 결정합니다. 이는 샤딩된 경우에도 kube-state-metrics의 모든 인스턴스가 자신이 담당하는 객체뿐만 아니라 모든 객체에 대해 객체 언마샬링을 위한 네트워크 트래픽과 리소스 소비를 갖게 된다는 것을 의미합니다. 이를 더욱 최적화하려면 Kubernetes API가 분할된 목록/감시 기능을 지원해야 합니다. 최적의 경우 각 샤드의 메모리 소비는 샤딩되지 않은 설정에 비해 1/n입니다. 일반적으로 kube-state-metrics는 측정항목을 Prometheus에 신속하게 반환하기 위해 메모리와 지연 시간을 최적화해야 합니다. kube-state-metrics와 kube-apiserver 간의 지연 시간을 줄이는 한 가지 방법은 --use-apiserver-cache
플래그를 사용하여 KSM을 실행하는 것입니다. 이 옵션은 대기 시간을 줄이는 것 외에도 etcd의 로드도 줄여줍니다.
샤딩은 신중하게 사용해야 하며 샤딩이 예상대로 설정되고 작동하는지 확인하기 위해 추가 모니터링을 설정해야 합니다(예: 전체 샤드 중 각 샤드에 대한 인스턴스가 구성됨).
자동 샤딩을 사용하면 샤딩을 자동으로 구성하는 데 유용한 StatefulSet에 배포될 때 각 샤드가 명목 위치를 검색할 수 있습니다. 이는 실험적인 기능이므로 예고 없이 중단되거나 제거될 수 있습니다.
자동화된 샤딩을 활성화하려면 kube-state-metrics가 StatefulSet
에 의해 실행되어야 하며 포드 이름과 네임스페이스가 --pod
및 --pod-namespace
플래그를 통해 kube-state-metrics 프로세스에 전달되어야 합니다. 자동 샤딩 기능을 보여주는 매니페스트 예시는 /examples/autosharding
에서 찾을 수 있습니다.
샤드를 배포하는 이 방법은 샤드당 하나의 Deployment
갖는 대신 단일 Kubernetes 리소스(이 경우 단일 StatefulSet
)를 통해 KSM 샤드를 관리하려는 경우에 유용합니다. 많은 수의 샤드를 배포할 때 이점이 특히 중요할 수 있습니다.
자동 샤딩 설정 사용의 단점은 StatefulSet
이 지원하는 롤아웃 전략에서 비롯됩니다. StatefulSet
으로 관리할 때 Pod는 한 번에 하나씩 교체되며 각 Pod는 먼저 종료된 다음 다시 생성됩니다. 이러한 롤아웃은 속도가 느려질 뿐만 아니라 각 샤드의 가동 중지 시간도 짧아집니다. 롤아웃 중에 Prometheus 스크레이핑이 발생하면 kube-state-metrics에서 내보낸 측정항목 중 일부가 누락될 수 있습니다.
포드 지표의 경우 다음 플래그를 사용하여 노드별로 샤딩될 수 있습니다.
--node=$(NODE_NAME)
각 kube-state-metrics Pod는 FieldSelector(spec.nodeName)를 사용하여 동일한 노드에서만 Pod 메트릭을 감시/나열합니다.
데몬셋 kube-state-metrics 예시:
apiVersion: apps/v1 kind: DaemonSet spec: template: spec: containers: - image: registry.k8s.io/kube-state-metrics/kube-state-metrics:IMAGE_TAG name: kube-state-metrics args: - --resource=pods - --node=$(NODE_NAME) env: - name: NODE_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.nodeName
할당되지 않은 Pod에 대한 지표를 추적하려면 다음 예와 같이 추가 배포를 추가하고 --track-unscheduled-pods
설정해야 합니다.
apiVersion: apps/v1 kind: Deployment spec: template: spec: containers: - image: registry.k8s.io/kube-state-metrics/kube-state-metrics:IMAGE_TAG name: kube-state-metrics args: - --resources=pods - --track-unscheduled-pods
다른 측정항목은 수평 샤딩을 통해 샤딩될 수 있습니다.
go get
사용하여 $GOPATH
에 이 프로젝트를 설치합니다.
go get k8s.io/kube-state-metrics
이 루트 폴더에서 다음 명령을 실행하면 자체 포함된 정적으로 연결된 바이너리가 생성되고 Docker 이미지가 빌드됩니다.
make container
Kubernetes 클러스터에 대한 읽기 전용 액세스 권한이 있는 서비스 계정 토큰이 있는 Kubernetes Pod 내에서 kube-state-metrics를 구축하고 실행하기만 하면 됩니다.
( kube-prometheus
) 스택은 kube-state-metrics를 해당 구성 요소 중 하나로 설치합니다. kube-prometheus 스택을 사용하는 경우 kube-state-metrics를 설치할 필요가 없습니다.
예를 들어 기본이 아닌 지표를 활성화하기 위해 kube-prometheus의 기본 구성을 수정하려면 Kube-Prometheus 사용자 정의를 살펴보세요.
이 프로젝트를 배포하려면 kubectl apply -f examples/standard
실행하면 됩니다. 그러면 Kubernetes 서비스와 배포가 생성됩니다. (참고: kubernetes 클러스터 버전이 1.8+가 아닌 경우 일부 리소스의 apiVersion을 조정하세요. 자세한 내용은 yaml 파일을 확인하세요.)
Prometheus가 kube-state-metrics 인스턴스를 발견하도록 하려면 두 메트릭 엔드포인트를 모두 선택하는 kube-state-metrics에 대한 특정 Prometheus 스크레이프 구성을 생성하는 것이 좋습니다. 엔드포인트 중 하나만 선택할 수 있으므로 주석 기반 검색은 권장되지 않으며, 대부분의 경우 kube-state-metrics에는 메트릭 엔드포인트를 통해 사용 가능한 대부분의 정보에 대한 읽기 액세스 권한을 기본적으로 부여하므로 특별한 인증 및 권한 부여 요구 사항이 있습니다.
참고: Google Kubernetes Engine(GKE) 사용자 - GKE에는 kube-state-metrics 역할 및 역할 결합이 생성되지 않도록 하는 엄격한 역할 권한이 있습니다. 이 문제를 해결하려면 다음 한 줄을 실행하여 GCP ID에 클러스터 관리자 역할을 부여할 수 있습니다.
kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=$(gcloud info --format='value(config.account)')
GCP ID는 대소문자를 구분하지만 Google Cloud SDK 221.0.0부터는 gcloud info
그렇지 않습니다. 즉, IAM 구성원에 대문자가 포함되어 있으면 위의 한 줄 내용이 작동하지 않을 수 있습니다. 위 명령과 kubectl apply -f examples/standard
실행한 후 403 금지된 응답이 있는 경우 https://console.cloud.google.com/iam-admin/iam?project=PROJECT_ID에서 계정과 연결된 IAM 구성원을 확인하세요. . 대문자가 포함된 경우 위 명령의 --user 플래그를 https://console.cloud.google.com/iam-admin/iam?project=PROJECT_ID에 나열된 대소문자 구분 역할로 설정해야 할 수도 있습니다.
위를 실행한 후 Clusterrolebinding "cluster-admin-binding" created
표시되면 이 서비스 설정을 계속할 수 있습니다.
다음 상태 확인 엔드포인트를 사용할 수 있습니다( self
원격 측정 포트를 나타내고, main
노출 포트를 나타냄).
/healthz
( main
에 노출됨): 애플리케이션이 실행 중인 경우 200 상태 코드를 반환합니다. 시작 프로브에 이를 사용하는 것이 좋습니다.
/livez
( main
에 노출됨): Kubernetes API 서버 중단으로 인해 애플리케이션이 영향을 받지 않는 경우 200 상태 코드를 반환합니다. 활동성 프로브에 이를 사용하는 것이 좋습니다.
/readyz
( self
에 노출됨): 애플리케이션이 요청을 수락하고 지표를 노출할 준비가 되면 200 상태 코드를 반환합니다. 준비 상태 프로브에 이를 사용하는 것이 좋습니다.
설명 데이터를 프록시할 때 모든 프로브에 대해 원격 측정 지표 엔드포인트를 사용하는 것은 권장되지 않습니다.
클러스터 리더 역할이 없는 환경에서 kube-state-metrics를 실행하려면 다음을 수행할 수 있습니다.
서비스 계정 만들기
apiVersion: v1kind: ServiceAccountmetadata: 이름: kube-state-metrics 네임스페이스: your-namespace-where-kube-state-metrics-will-deployed
특정 네임스페이스에 대한 view
권한을 부여합니다(roleBinding 사용)( 참고: 서비스 계정이 액세스할 모든 NS에 이 roleBinding을 추가할 수 있음 ).
apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: 이름: kube-state-metrics 네임스페이스: project1roleRef: apiGroup: rbac.authorization.k8s.io 종류: ClusterRole 이름: 뷰주제: - 종류: ServiceAccountname: kube-state-metricsnamespace: your-namespace-where-kube-state-metrics-will-deployed
그런 다음 서비스 계정이 kube-state-metrics
배포 구성에서 액세스할 수 있는 네임스페이스 세트( --namespaces
옵션 사용) 및 kubernetes 객체 세트( --resources
사용)를 지정합니다.
사양: 템플릿:사양: 컨테이너: - 이름: kube-state-metricsargs: - '--resources=pods' - '--namespaces=project1'
사용 가능한 전체 인수 목록은 docs/developer/cli-arguments.md의 문서를 참조하세요.
kube-state-metrics 차트 v2.13.3
(kube-state-metrics 이미지 v1.9.8
)부터 공식 Helm 차트는 prometheus-community/helm-charts에서 유지관리됩니다. kube-state-metrics 차트 v3.0.0
부터 v2.0.0 +
kube-state-metrics 이미지만 지원됩니다.
개발 시 다음을 실행하여 로컬 Kubernetes 클러스터에 대한 지표 덤프를 테스트하세요.
사용자는
--apiserver
명령줄을 사용하여 KUBE-CONFIG 파일의 apiserver 주소를 재정의할 수 있습니다.
go install kube-state-metrics --port=8080 --telemetry-port=8081 --kubeconfig=<KUBE-CONFIG> --apiserver=<APISERVER>
그런 다음 측정항목 끝점을 컬링합니다.
curl localhost:8080/metrics
e2e 테스트를 로컬에서 실행하려면 테스트/README.md의 설명서를 참조하세요.
개발할 때 더 나은 기여 경험과 e2e 및 기타 ci 테스트 통과 가능성을 높이기 위해 따라야 할 특정 코드 패턴이 있습니다. 이에 대해 자세히 알아보려면 docs/developer/guide.md의 설명서를 참조하세요.
이 프로젝트는 SIG Instrumentation의 후원을 받습니다.
Kubernetes의 Slack에는 #kube-state-metrics 채널도 있습니다.
SIG Instrumentation 메일링 리스트에 가입할 수도 있습니다. 그러면 일반적으로 kube-state-metrics 관련 주제를 논의할 수 있는 다음 회의에 대한 초대가 캘린더에 추가됩니다.
정기 SIG 회의: 목요일 오전 9시 30분(태평양 표준시)(격주). 귀하의 시간대로 변환하십시오.
정기 분류 회의: 목요일 오전 9시 30분(태평양 표준시)(격주 - 정기 회의와 교대로). 귀하의 시간대로 변환하십시오.