metric server 설치

2025. 9. 2. 17:57k8s

설치방법
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