-
[Kubernetes] Metrics Server 알아보기Kubernetes 2023. 5. 9. 06:57728x90반응형
- 목차
관련된 글.
https://westlife0615.tistory.com/688
들어가며.
이번 글에서는 Kubernetes 의 Metrics Server 에 대해서 알아보려고 합니다.
Metrics Server 는 Pod 의 자동 확장을 위해서 사용되는 Kubernetes 의 리소스입니다.
그래서 HPA (Horizontal Pod Autoscaling), VPA (Vertical Pod Autoscaling) 을 구현하기 위해서
Metrics Server 는 필수적으로 사용되어야 합니다.
Metrics Server 는 Pod 의 여러 메트릭들을 수집합니다.
CPU 사용량, 메모리 사용량 등의 대표적인 Pod 의 Metrics 입니다.
cAdvisor 과 kubelet.
kubelet 은 Kubernetes 의 Node 에 하나씩 존재하는 구성요소입니다.
아래의 이미지처럼 하나의 Worker Node 에 하나의 kubelet 이 존재합니다.
kubelet 은 Pod 를 관리하고 Pod 의 정의대로 컨테이너를 생성하고 실행합니다.
cAdvisor 는 Container Advisor 의 약자입니다.
cAdvisor 는 kubelet 의 하위프로세스인데, 위치적으로 kubelet 에 속하다보니
특정 Node 로 스케줄링된 Pod 의 모든 컨테이너들의 정보를 관리하게 됩니다.
특히, cAdvisor 는 컨테이너의 리소스 사용 정보를 수집 및 처리하는 프로세스입니다.
Metrics Server 설치하기.
cAdvisor 는 Worker Node 에 스케줄링된 컨테이너들의 기본적인 리소스 사용량을 수집합니다.
기본적인 리소스라 함은 CPU, Memory, Network, Disk 를 의미합니다.
그리고 이러한 정보를 활용하기 위해서 외부의 저장소나 데이터 처리 프로세서 과정이 필요한데요.
Prometheus 가 대표적인 메트릭 수집 및 처리 파이프라인에 해당합니다.
그리고 이번 글의 주제인 Metrics Server 도 cAdvisor 로부터 컨테이너의 리소스 사용량 정보를 획득하여 여러 작업을 처리합니다.
대표적으로 Pod Autoscaling 입니다.
아래 링크는 Kubernetes 에서 Metrics Server 를 설치하는 YAML 이 포함된 페이지의 주소입니다.
https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
하지만 TLS 인증과 관련된 문제과 Kubernetes 버전 호환성으로 인해서 여러 리소스에 대한 YAML 들을 매뉴얼하게 관리하는 것이 좋습니다.
아래 YAML 파일에서 저는 metrics-server Deployment 에 --kubelet-insecure-tls 설정을 추가하여 인증/인가와 관련된 부분을 제거하였습니다.
apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: metrics-server name: metrics-server namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: k8s-app: metrics-server rbac.authorization.k8s.io/aggregate-to-admin: "true" rbac.authorization.k8s.io/aggregate-to-edit: "true" rbac.authorization.k8s.io/aggregate-to-view: "true" name: system:aggregated-metrics-reader rules: - apiGroups: - metrics.k8s.io resources: - pods - nodes verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: k8s-app: metrics-server name: system:metrics-server rules: - apiGroups: - "" resources: - nodes/metrics verbs: - get - apiGroups: - "" resources: - pods - nodes verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: labels: k8s-app: metrics-server name: metrics-server-auth-reader namespace: kube-system roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: extension-apiserver-authentication-reader subjects: - kind: ServiceAccount name: metrics-server namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: k8s-app: metrics-server name: metrics-server:system:auth-delegator roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:auth-delegator subjects: - kind: ServiceAccount name: metrics-server namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: k8s-app: metrics-server name: system:metrics-server roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:metrics-server subjects: - kind: ServiceAccount name: metrics-server namespace: kube-system --- apiVersion: v1 kind: Service metadata: labels: k8s-app: metrics-server name: metrics-server namespace: kube-system spec: ports: - name: https port: 443 protocol: TCP targetPort: https selector: k8s-app: metrics-server --- apiVersion: apps/v1 kind: Deployment metadata: labels: k8s-app: metrics-server name: metrics-server namespace: kube-system spec: selector: matchLabels: k8s-app: metrics-server strategy: rollingUpdate: maxUnavailable: 0 template: metadata: labels: k8s-app: metrics-server spec: containers: - args: - --cert-dir=/tmp - --secure-port=10250 - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname - --kubelet-use-node-status-port - --metric-resolution=15s - --kubelet-insecure-tls image: registry.k8s.io/metrics-server/metrics-server:v0.7.0 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 3 httpGet: path: /livez port: https scheme: HTTPS periodSeconds: 10 name: metrics-server ports: - containerPort: 10250 name: https protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /readyz port: https scheme: HTTPS initialDelaySeconds: 20 periodSeconds: 10 resources: requests: cpu: 100m memory: 200Mi securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL readOnlyRootFilesystem: true runAsNonRoot: true runAsUser: 1000 seccompProfile: type: RuntimeDefault volumeMounts: - mountPath: /tmp name: tmp-dir nodeSelector: kubernetes.io/os: linux priorityClassName: system-cluster-critical serviceAccountName: metrics-server volumes: - emptyDir: {} name: tmp-dir --- apiVersion: apiregistration.k8s.io/v1 kind: APIService metadata: labels: k8s-app: metrics-server name: v1beta1.metrics.k8s.io spec: group: metrics.k8s.io groupPriorityMinimum: 100 insecureSkipTLSVerify: true service: name: metrics-server namespace: kube-system version: v1beta1 versionPriority: 100
아래 이미지와 같이 Pod 와 Service 등이 생성됩니다.
반응형'Kubernetes' 카테고리의 다른 글
Kubernetes Ephemeral Volume (0) 2023.08.09 [Kubernetes] Service 이해하기 (0) 2023.08.01 Kubernetes Pod 이해하기 (0) 2023.07.26 [Kubernetes] ReadinessProbe 알아보기 (0) 2023.06.16 Kubernetes Event 이해하기 (0) 2023.06.16