이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

Kubernetes/Monitoring

Kubernetes 모니터링 : kube-state-metrics 란?

이쿠우우 2024. 9. 5. 21:26
반응형
 

kube-state-metrics(KSM)

 

kube-state-metrics(KSM)란?

kubernetes에서 공식적으로 제공하는 서비스로
kubernetes 클러스터 내부의 Pod가 사용 중인 리소스 metric과 네트워크 I/O, Deployments 수, Pod 수 등의 다양한 정보를 수집함.
 
 

수집하는 metrics 계층

=  Service Metrics : kubernetes
Container를 컨트롤 하는 Kubernetes 자체에 대한 모니터링 
(Kubernetes의 자원인 Service, POD, Namespace 등)
 

수집하는 metrics 정보 확인 링크

 
 

수집한 metrics 정보를 전달하는 방식

=  Pull 방식
HTTP 통신을 통해 Prometheus Server와 같은 metrics server가 kube-state-metrics가 수집한 Metric Data를 가져갈 수 있게 
/metrics 라는 HTTP 엔드포인트를 제공함.
exporter가 해당 엔드포인트를 제공하고 있어서 Server가 exporter의 엔드포인트로 HTTP GET 요청을 날려 Metric Data를 Pull방식으로 수집함.
 
 

 

kube-state-metrics가 수집한 metrics 정보 확인하는 방법

kube-state-metrics는 모든 node에 접근하여 해당 node의 metric을 직접 수집하는 node-exporter와는 달리,
kube-state-metrics는 kubernetes가 이미 갖고 있는 데이터를 kubernetes api 서버로부터 요청하여 가져오기 때문에
cluster 내에 단 하나의 component만 배포함.
 

yaml

2023.01.30 기준 최신 version = v2.7.0
더보기


---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    app.kubernetes.io/component: exporter
    app.kubernetes.io/name: kube-state-metrics
    app.kubernetes.io/version: 2.8.2
  name: kube-state-metrics
rules:
- apiGroups:
  - ""
  resources:
  - configmaps
  - secrets
  - nodes
  - pods
  - services
  - serviceaccounts
  - resourcequotas
  - replicationcontrollers
  - limitranges
  - persistentvolumeclaims
  - persistentvolumes
  - namespaces
  - endpoints
  verbs:
  - list
  - watch
- apiGroups:
  - apps
  resources:
  - statefulsets
  - daemonsets
  - deployments
  - replicasets
  verbs:
  - list
  - watch
- apiGroups:
  - batch
  resources:
  - cronjobs
  - jobs
  verbs:
  - list
  - watch
- apiGroups:
  - autoscaling
  resources:
  - horizontalpodautoscalers
  verbs:
  - list
  - watch
- apiGroups:
  - authentication.k8s.io
  resources:
  - tokenreviews
  verbs:
  - create
- apiGroups:
  - authorization.k8s.io
  resources:
  - subjectaccessreviews
  verbs:
  - create
- apiGroups:
  - policy
  resources:
  - poddisruptionbudgets
  verbs:
  - list
  - watch
- apiGroups:
  - certificates.k8s.io
  resources:
  - certificatesigningrequests
  verbs:
  - list
  - watch
- apiGroups:
  - discovery.k8s.io
  resources:
  - endpointslices
  verbs:
  - list
  - watch
- apiGroups:
  - storage.k8s.io
  resources:
  - storageclasses
  - volumeattachments
  verbs:
  - list
  - watch
- apiGroups:
  - admissionregistration.k8s.io
  resources:
  - mutatingwebhookconfigurations
  - validatingwebhookconfigurations
  verbs:
  - list
  - watch
- apiGroups:
  - networking.k8s.io
  resources:
  - networkpolicies
  - ingressclasses
  - ingresses
  verbs:
  - list
  - watch
- apiGroups:
  - coordination.k8s.io
  resources:
  - leases
  verbs:
  - list
  - watch
- apiGroups:
  - rbac.authorization.k8s.io
  resources:
  - clusterrolebindings
  - clusterroles
  - rolebindings
  - roles
  verbs:
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kube-state-metrics
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kube-state-metrics
subjects:
  - kind: ServiceAccount
    name: kube-state-metrics-account
    namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kube-state-metrics-account
  namespace: kube-system

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: kube-state-metrics
  name: kube-state-metrics
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kube-state-metrics
  template:
    metadata:
      labels:
        app: kube-state-metrics
    spec:
      containers:
        - name: kube-state-metrics
          image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.7.0
          resources:
            requests:
              cpu: 500m
              memory: 2Gi
            limits:
              cpu: 500m
              memory: 2Gi
          livenessProbe:
            httpGet:
              path: /healthz
              port: 8080
            initialDelaySeconds: 5
            timeoutSeconds: 5
          ports:
            - containerPort: 8080
              name: scrape
            - containerPort: 8081
              name: telemetry
          readinessProbe:
            httpGet:
              path: /
              port: 8081
            initialDelaySeconds: 5
            timeoutSeconds: 5
      nodeSelector:
        kubernetes.io/os: linux
      serviceAccountName: kube-state-metrics-account
---
apiVersion: v1 
kind: Service 
metadata: 
  labels: 
    app: kube-state-metrics
  name: kube-state-http-metrics-nodeport 
  namespace: kube-system 
spec: 
  type: NodePort 
  selector: 
    app: kube-state-metrics
  ports: 
    - protocol: TCP 
      port: 8080 
      targetPort: 8080 
      nodePort: 30001
--- 
apiVersion: v1 
kind: Service 
metadata: 
  labels: 
    app: kube-state-metrics
  name: kube-state-telemetry-nodeport 
  namespace: kube-system 
spec: 
  type: NodePort 
  selector: 
    app: kube-state-metrics
  ports: 
    - protocol: TCP 
      port: 8081 
      targetPort: 8081 
      nodePort: 30002

 

KSM port

8080 port : KSM으로 부터 metrics 정보를 확인하는 용도
8081 port : self metrics로 metrics 정보 수집 시도 시 성공, 실패 상태를 확인할 수 있음.
 

KSM의 metrics 수집 결과 확인

curl {IP}:8080/metrics

[kube-state-metrics의 metrics list 정보]
 
[참고]
반응형