ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [kubernetes] docker desktop에서 구성된 kubernetes 클러스터에서 metrics-server가 정상적으로 동작하지 않을 때
    레거시/트러블슈팅 2022. 8. 21. 20:44
    반응형

    개요

    현재 개인적으로 진행하는 작업이 있어서, docker desktop에서 활성화한 kubernetes에서 pod/node 등의 메트릭 지표를 얻기 위해서 metrics-server를 설치했습니다. 이 때 만났던 문제들에 대해서 트러블슈팅하는 방법을 기록합니다.

    환경:

    • docker v20.10.17
    • 맥북 정보:
      • cpu: 2.3 GHz 쿼드 코어 Intel Core i7
      • mem: 32GB 3733 MHz LPDDR4X

    metrics-server 설치 명령어:

    $ kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

     

    설치 이후 kubectl top 명령어 실행 결과:

    $ kubectl top no
    Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io)
    
    $ kubectl top po
    Error from server (ServiceUnavailable): the server is currently unable to handle the request (get pods.metrics.k8s.io)

    문제 #1 Error from server (ServiceUnavailable): the server is currently unable to handle the request 

    해당 문제는 metrics-server 파드의 로그를 보면 왜 에러가 나는지 알 수 있습니다.

    $ kubectl logs -n kube-system metrics-server-678f4bf65b-lg5n6
    ...
    I0821 11:32:44.142448       1 server.go:187] "Failed probe" probe="metric-storage-ready" err="no metrics to serve"
    E0821 11:32:51.407435       1 scraper.go:140] "Failed to scrape node" err="Get \"https://192.168.65.4:10250/metrics/resource\": x509: cannot validate certificate for 192.168.65.4 because it doesn't contain any IP SANs" node="docker-desktop"

    현재 로그에 따르면 metrics-serverkube-api-server와 https 통신이 원활하게 이루어지지 않고 있음을 확인할 수 있습니다. 이 문제를 해결하는 가장 쉬운 방법은 metrics-server를 실행할 때 --kubelet-insecure-tls 플래그를 추가하는 것입니다.

     

    터미널에 다음을 입력하여 metrics-server 디플로이먼트를 수정합니다.

    $ kubectl edit deployments.apps -n kube-system metrics-server

     

    그 후 아래 그림처럼 해당 플래그를 추가해줍니다.

     

    이제 kubectl top 명령어를 입력해봅시다.

     

    kubectl top 명령어 실행 결과:

    $ kubectl top no
    NAME             CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
    docker-desktop   242m         6%     1567Mi          26%
    
    $ kubectl top po -n kube-system
    error: Metrics not available for pod kube-system/coredns-6d4b75cb6d-5db2z, age: 49m3.256834s

     

    노드 단위는 정상 수행되지만 파드 단위에서 새로운 에러가 발생됩니다.

    문제 #2 error: Metrics not available for pod

    이 에러는 다음 이슈에서 해결 방법을 찾을 수 있었습니다. 이 문제의 근본적인 원인은 기본적으로 mac OS docker desktop이 설치되면 cri-dockerd v2.1.0이 도커 엔진으로 사용하는데 이 버전에서 버그가 있기 때문입니다.

     

    따라서 그 버그가 해결된 v2.3.0으로 변경해줍니다. 아래 명령어를 잘 따라하면 됩니다. 먼저 로컬 Docker VM에 로그인합니다.

    $ docker run -it --privileged --pid=host ubuntu nsenter -t 1 -m -u -n -i sh
    Unable to find image 'ubuntu:latest' locally
    latest: Pulling from library/ubuntu
    d19f32bd9e41: Pull complete
    Digest: sha256:34fea4f31bf187bc915536831fd0afc9d214755bf700b5cdb1336c82516d154e
    Status: Downloaded newer image for ubuntu:latest
    # ---- 여기서부터 docker vm 컨테이너에 접속됩니다.
    # ---- (위치) # 으로 표시됩니다.
    / #

     

    그 후 다음 명령어들을 이용해서 cri-dockerd v2.3.0를 설치합니다.

    # ---- tmp로 이동
    / # cd /tmp/
    
    # ---- cri-dockerd v2.3.0 다운로드
    /tmp # wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.3/cri-dockerd-0.2.3.arm64.tgz
    
    # ---- cri-dockerd v2.3.0 압축 해제
    /tmp # tar zxvf cri-dockerd-0.2.3.arm64.tgz
    cri-dockerd/
    cri-dockerd/cri-dockerd

     

    설치된 cri-dockerd(v2.1.0) 바이너리 파일의 위치를 찾습니다.

    /tmp # cd /
    / # find . -name "cri-dockerd"
    ./var/lib/kube-binary-cache-debian/cri-dockerd
    ./var/lib/docker/overlay2/057ad611e25d8e23d4d8f5b1dfe105f4bcb0dc2b784ef6f251cd11d91daa06c8/diff/binaries/cri-dockerd
    ./var/lib/docker/overlay2/a2b982b647747b7e3f29db8cfb5668279e47402b24ed0cbe8ddec256b3a112cc/diff/binaries/cri-dockerd
    ./var/lib/mount-services-cache/entries/services.tar/cfaf2b3b5d8c80d1fd63ca0acaa230bb7f027982b7783d8a9029e7c5fc0023be/containers/services/docker/rootfs/usr/bin/cri-dockerd
    ./var/lib/mount-services-cache/entries/services.tar/cfaf2b3b5d8c80d1fd63ca0acaa230bb7f027982b7783d8a9029e7c5fc0023be/containers/services/docker/tmp/upper/usr/bin/cri-dockerd
    ./var/lib/cri-dockerd
    ./tmp/cri-dockerd
    ./tmp/cri-dockerd/cri-dockerd
    ./containers/services/docker/rootfs/usr/bin/cri-dockerd             # --- 이부분
    ./containers/services/docker/tmp/upper/usr/bin/cri-dockerd          # --- 이부분

     

    해당 위치가 찾고 있는  cri-dockerd(v2.1.0) 바이너리 파일이 맞는지 확인합니다.

    / # ./containers/services/docker/tmp/upper/usr/bin/cri-dockerd --version
    cri-dockerd 0.2.1 (HEAD)

     

    이제 cri-dockerd(v2.3.0)으로 대체합니다.

    / # cp /tmp/cri-dockerd/cri-dockerd /containers/services/docker/rootfs/usr/bin
    / # cp /tmp/cri-dockerd/cri-dockerd /var/lib/kube-binary-cache-debian/cri-dockerd
    ...

     

    그 후 docker desktop을 재시작합니다. 그 후 kubectl top 명령어를 입력합니다.

     

    kubectl top 명령어 실행 결과:

    $ kubectl top no
    NAME             CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
    docker-desktop   341m         8%     1480Mi          25%
    
    $ kubectl top po -n kube-system
    NAME                                     CPU(cores)   MEMORY(bytes)
    coredns-6d4b75cb6d-5db2z                 4m           11Mi
    coredns-6d4b75cb6d-nwbqv                 4m           45Mi
    etcd-docker-desktop                      36m          73Mi
    kube-apiserver-docker-desktop            65m          390Mi
    kube-controller-manager-docker-desktop   38m          115Mi
    kube-proxy-x4fsh                         1m           50Mi
    kube-scheduler-docker-desktop            7m           52Mi
    kube-state-metrics-5b8455d88b-j57kx      1m           40Mi
    metrics-server-658867cdb7-wzq2c          8m           54Mi
    storage-provisioner                      3m           9Mi
    vpnkit-controller                        0m           24Mi

     

    모두 정상 수행되는 것을 확인할 수 있습니다.

    728x90
Designed by Tistory.