[kubernetes] docker desktop에서 구성된 kubernetes 클러스터에서 metrics-server가 정상적으로 동작하지 않을 때
개요
현재 개인적으로 진행하는 작업이 있어서, 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-server
와 kube-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
모두 정상 수행되는 것을 확인할 수 있습니다.