레거시/트러블슈팅

[kubernetes] docker desktop에서 구성된 kubernetes 클러스터에서 metrics-server가 정상적으로 동작하지 않을 때

Gurumee 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
반응형