2025. 9. 2. 17:57ㆍk8s
설치방법
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
설치방법은 명령어 한 줄이면 간단하게 된다.
하지만 이것만 하게 되면 metric-server 파드가 안 뜨는 경우가 대부분일 것이라 예상된다.
Trouble Shooting1
# 파드에서의 event log:
Warning Unhealthy 2s (x9 over 79s) kubelet Readiness probe failed: HTTP probe failed with statuscode: 500
# 파드 내 log:
I0902 07:17:06.198231 1 server.go:192] "Failed probe" probe="metric-storage-ready" err="no metrics to serve"
E0902 07:17:15.154041 1 scraper.go:149] "Failed to scrape node" err="Get \"https://10.0.2.13:10250/metrics/resource\": tls: failed to verify certificate: x509: cannot validate certificate for 10.0.2.13 because it doesn't contain any IP SANs" node="k8s-compute2"
E0902 07:17:15.155305 1 scraper.go:149] "Failed to scrape node" err="Get \"https://10.0.2.12:10250/metrics/resource\": tls: failed to verify certificate: x509: cannot validate certificate for 10.0.2.12 because it doesn't contain any IP SANs" node="k8s-compute1"
E0902 07:17:15.160969 1 scraper.go:149] "Failed to scrape node" err="Get \"https://10.0.2.11:10250/metrics/resource\": tls: failed to verify certificate: x509: cannot validate certificate for 10.0.2.11 because it doesn't contain any IP SANs" node="k8s-compute3"
# 원인:
Metrics Server가 kubelet의 /metrics/resource 엔드포인트에 HTTPS로 접근하려고 시도
하지만 kubelet 인증서에 해당 노드 IP가 SAN(Subject Alternative Name)으로 포함되어 있지 않음
그래서 TLS 검증 실패 → metric scrape 실패
# 조치방법 첫번째:
가장 간단하지만 TLS 통신을 포기하는 방법으로 아래와 같이 metric-server deploy 의 설정에
--kubelet-insecure-tls 를 포함시키는 것이다.
[root@k8s-control manifests]# k edit deploy 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
# 조치방법 두번째:
아래와 같이 인증서의 SAN을 확인 시 DNS와 host명만 확인되므로 args 부분을 수정한다.
#SAN 확인
[root@k8s-control ~]# openssl x509 -in /var/lib/kubelet/pki/kubelet.crt -text -noout | grep -A2 "Subject Alternative Name"
X509v3 Subject Alternative Name:
DNS:k8s-control
Signature Algorithm: sha256WithRSAEncryption
#metric-server yaml 설정
spec:
containers:
- args:
- --kubelet-preferred-address-types=Hostname,DNS
또한 노드명을 resolve 못하여 metric-server deployment yaml 설정을 아래와 같이 수정했다.(CoreDNS로 도전도 가능)
#error log
E0903 04:18:22.483010 1 scraper.go:149] "Failed to scrape node" err="Get \"https://k8s-control:10250/metrics/resource\": dial tcp: lookup k8s-control on 10.96.0.10:53: server misbehaving" node="k8s-control"
E0903 04:18:22.492805 1 scraper.go:149] "Failed to scrape node" err="Get \"https://k8s-compute1:10250/metrics/resource\": dial tcp: lookup k8s-compute1 on 10.96.0.10:53: server misbehaving" node="k8s-compute1"
E0903 04:18:22.495197 1 scraper.go:149] "Failed to scrape node" err="Get \"https://k8s-compute2:10250/metrics/resource\": dial tcp: lookup k8s-compute2 on 10.96.0.10:53: server misbehaving" node="k8s-compute2"
#metric-server yaml 설정
spec:
hostAliases:
- ip: "10.0.2.11"
hostnames:
- "k8s-control"
- ip: "10.0.2.12"
hostnames:
- "k8s-compute1"
- ip: "10.0.2.13"
hostnames:
- "k8s-compute2"
마지막으로 아래 로그에서 확인할 수 있는 것과 같이 CA 인증서를 metric-server가 사용할 수 있도록 설정한다.
#error log
E0903 04:27:48.862433 1 scraper.go:149] "Failed to scrape node" err="Get \"https://k8s-compute1:10250/metrics/resource\": tls: failed to verify certificate: x509: certificate signed by unknown authority" node="k8s-compute1"
E0903 04:27:48.867397 1 scraper.go:149] "Failed to scrape node" err="Get \"https://k8s-compute2:10250/metrics/resource\": tls: failed to verify certificate: x509: certificate signed by unknown authority" node="k8s-compute2"
E0903 04:27:48.870998 1 scraper.go:149] "Failed to scrape node" err="Get \"https://k8s-control:10250/metrics/resource\": tls: failed to verify certificate: x509: certificate signed by unknown authority" node="k8s-control"
#metric-server yaml 설정
args:
- --kubelet-certificate-authority=/etc/kubernetes/pki/ca.crt
volumeMounts:
- mountPath: /etc/kubernetes/pki
name: kube-ca
readOnly: true
volumes:
- hostPath:
path: /etc/kubernetes/pki
type: DirectoryOrCreate
name: kube-ca
문제는 나의 클러스터 같은 경우 아래와 같이 CA 인증서가 kubelet 인증서에 서명을 한 주체가 아니여서 결국 실패했다.
추후 CN=k8s-control-ca@1756879908 인 CA 인증서를 찾아서 시도하려고 한다.
[root@k8s-control ~]# openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -subject
subject=CN=kubernetes
[root@k8s-control ~]# openssl x509 -in /var/lib/kubelet/pki/kubelet.crt -noout -issuer
issuer=CN=k8s-control-ca@1756879908
Trouble Shooting2
kubelet 인증서를 CN=kubernetes 인 CA 인증서로 서명하려다가 각 노드를 모두 다시 조인하게되었다.
그에 따라 pod들에 ip가 할당이 안 되는 문제가 발생했다.
즉, CNI가 할당했던 ip를 다시 할당하려니 문제가 생겨 조치한 내용을 남긴다.
#pod 생성 시 error log
Warning FailedCreatePodSandBox 18s kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to create pod network sandbox k8s_metrics-server-56fb9 Warning FailedCreatePodSandBox 18s kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to create pod network sandbox k8s_metrics-server-56fb9549f4-4h77l_kube-system_786a7ce0-0079-4be4-ad35-77383de9f56a_0(efa4417882a7be866f95edc3efea396b3a56c1209adcb2669367727d09f8cc72): error adding pod kube-system_metrics-server-56fb9549f4-4h77l to CNI network "cbr0": plugin type="flannel" failed (add): failed to set bridge addr: "cni0" already has an IP address different from 10.50.2.1/24 549f4-4h77l_kube-system_786a7ce0-0079-4be4-ad35-77383de9f56a_0(efa4417882a7be866f95edc3efea396b3a56c1209adcb2669367727d09f8cc72): error adding pod kube-system_metrics-server-56fb9549f4-4h77l to CNI network "cbr0": plugin type="flannel" failed (add): failed to set bridge addr: "cni0" already has an IP address different from 10.50.2.1/24
#조치 1단계: 인터페이스 비활성화
ip link set cni0 down
ip link set flannel.1 down
#조치 2단계: 인터페이스 삭제
ip link delete cni0
ip link delete flannel.1
#조치 3단계: kubelet 및 crio 재시작
systemctl restart crio
systemctl restart kubelet
이후 cni0와 flannel.1 인터페이스가 제대로 동작하는 지 ip link 로 확인해야 한다.
문제가 있다면 문제되는 인터페이스를 다시 비활성화 및 삭제 후 kubelet과 crio를 재시작하면 된다.
flannel이 모두 조치된 후, metric-server 파드를 조치방법 첫번째를 통해 잘 띄웠다.
하지만 아래와 같이 metric 수집이 안 되어 metric-server를 master node에 띄우니 성공된 것을 남긴다.
#error message
[root@k8s-control ~]# k top node
error: Metrics API not available
#metric-server yaml 설정
spec:
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
nodeSelector:
kubernetes.io/hostname: k8s-control
#metric 확인
[root@k8s-control ~]# k top node
NAME CPU(cores) CPU(%) MEMORY(bytes) MEMORY(%)
k8s-compute1 27m 0% 726Mi 9%
k8s-compute2 21m 0% 494Mi 6%
k8s-control 103m 2% 1328Mi 17%'k8s' 카테고리의 다른 글
| node join 및 delete (0) | 2025.08.28 |
|---|---|
| ansible 을 활용한 k8s 클러스터 구축 (0) | 2025.08.01 |
| PV 테스트 (0) | 2025.07.15 |
| Prometheus 와 Grafana 설치 (1) | 2025.07.11 |
| Pod Garbage Collector (3) | 2025.07.10 |