-
[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-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
모두 정상 수행되는 것을 확인할 수 있습니다.
728x90'레거시 > 트러블슈팅' 카테고리의 다른 글