ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kubernetes] Metrics Server 알아보기
    Kubernetes 2023. 5. 9. 06:57
    728x90
    반응형

    - 목차

     

    관련된 글.

    https://westlife0615.tistory.com/688

     

    [Kubernetes] HPA 알아보기 ( Horizontal Pod Autoscaler )

    - 목차 들어가며. 이번 글에서는 Kubernetes 의 HPA (Horizontal Pod Autoscaler) 에 대해서 알아보는 시간을 가지려고 합니다. ReplicaSet 또는 Deployment 로 여러 개의 Pod 를 손쉽게 운용할 수 있습니다. 이는 HA

    westlife0615.tistory.com

     

    들어가며.

    이번 글에서는 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
Designed by Tistory.