...
...
Table of Contents |
---|
Deploy metrics-server
...
따라서, 다음과 같이 metrics-server를 설치 한다.
그러고 나면, metrics-server pod
는 master node 포함하여 각 worker node의 Kubelet API를 통해 관련 metrics를 수집한다.
Note |
---|
Dashboard와 마찬가지로 metrics-server master node 內 pod → worker node routing: (O) |
단, metrics-server는 모니터링을 위한 도구로는 사용하기 않기를 공식적으로 권고하고 있으며, 주 용도는 k8s에서 pod auto-scaling에서 사용된다.
Code Block | ||
---|---|---|
| ||
$ wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml && mv components.yaml metrics-server.yaml # Dashboard와 마찬가지로 metrics-server pod는 master node에 상주해야 한다. # 따라서, metrics-server.yaml의 Deployment object 명세에 아래 내용을 추가한다. $ vim metrics-server.yaml ... --- apiVersion: apps/v1 kind: Deployment ... spec: ... containers: - name: metrics-server image: k8s.gcr.io/metrics-server/metrics-server:v0.3.7 imagePullPolicy: IfNotPresent args: - --cert-dir=/tmp - --secure-port=4443 - --kubelet-preferred-address-types=InternalIP # coredns에서는 node의 domain은 관리하지 않는다. 따라서 InternalIP로 지정하도록 한다. - --kubelet-insecure-tls # insecure option도 추가. ... nodeSelector: kubernetes.io/os: linux kubernetes.io/arch: "amd64" kubernetes.io/hostname: k8s-01 # 노드 지정 tolerations: # master node에 안착할 수 있도록 백신 접종. - key: node-role.kubernetes.io/master effect: NoSchedule ... $ kubectl apply -f metrics-server.yaml ... $ kubectl get pod -n kube-system metrics-server-77ffddc74-7z7j4 -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES metrics-server-77ffddc74-7z7j4 1/1 Running 0 15m 10.244.0.6 k8s-01 <none> <none> |
Troubleshoot
가끔 pod내에서 node로의 routing이 꼬여있는 버그가 있을 수 있는데, 이런 경우 아래와 같은 에러가 발생할 수 있다.
현상: local node 內 pod → remote node port connection: (X)
Warning |
---|
아래 pod 내부에서 ping은 전달되는 것으로 봐서, routing 문제는 아닌 듯 하다. 다음과 같이 모든 트래픽에 대해 허용 정책을 걸어도, 마찬가지다. 따라서, 아래와 같이 따라해도 잘 되지 않을 수 있으며, 잘 된다 하더라도, reboot 시 다시 불통 될 것이다. 아직 명확한 원인은 불명이며, 차차 알아보아야 하겠다. |
Code Block | ||
---|---|---|
| ||
# Label k8s-app: metrics-server인 pod의 로그를 확인하는 명령어. $ kubectl logs --tail=20 -n kube-system -l k8s-app=metrics-server ... E0811 02:12:20.843207 1 manager.go:111] unable to fully collect metrics: unable to fully scrape metrics from source kubelet_summary:k8s-02: unable to fetch metrics from Kubelet k8s-02 (10.0.2.6): Get https://10.0.2.6:10250/stats/summary?only_cpu_and_memory=true: dial tcp 10.0.2.6:10250: connect: no route to host E0811 02:13:16.345348 1 reststorage.go:135] unable to fetch node metrics for node "k8s-02": no metrics known for node E0811 02:13:16.352394 1 reststorage.go:160] unable to fetch pod metrics for pod kube-system/netbox-86cdd5bdc6-jsbhn: no metrics known for pod E0811 02:13:16.352406 1 reststorage.go:160] unable to fetch pod metrics for pod kube-system/kube-proxy-cmp85: no metrics known for pod E0811 02:13:16.352411 1 reststorage.go:160] unable to fetch pod metrics for pod kube-system/kube-flannel-ds-amd64-5nktb: no metrics known for pod E0811 05:23:16.347050 1 reststorage.go:160] unable to fetch pod metrics for pod kube-system/netbox-z6nbz: no metrics known for pod |
...
Deploy netbox
(위의 문제가 해결되지 않더라도, 아래 내용은 앞으로도 도움이 될 것이다.)
보통 일반적인 container의 경우 bash로 container내부에 접속한다 하더라도, networking 관련하여 확인할 수 있는 util이 포함되어 있지 않은 경우가 대부분이다.(ping도 없는 경우가 많다.)
...
Code Block | ||
---|---|---|
| ||
# 편의상, metrics-server와 같은 namespace 및 serviceAccount로 지정하였다. # 이렇게 하면, metrics-server가 사용하는 role 및 token을 사용할 수 있다. $ vim netbox.yaml apiVersion: apps/v1 kind: DaemonSet metadata: labels: app: netbox name: netbox namespace: kube-system spec: selector: matchLabels: app: netbox updateStrategy: type: RollingUpdate template: metadata: labels: app: netbox spec: serviceAccountName: metrics-server serviceAccount: metrics-server containers: - image: quay.io/gravitational/netbox:latest imagePullPolicy: Always name: netbox securityContext: runAsUser: 0 terminationGracePeriodSeconds: 30 tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule $ kubectl apply -f netbox.yaml |
Code Block | ||
---|---|---|
| ||
$ kubectl get pods -A -owide NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ... kube-system netbox-kvlsf 1/1 Running 0 3m16s 10.244.0.21 k8s-01 <none> <none> kube-system netbox-svqdr 1/1 Running 0 3m16s 10.244.1.40 k8s-02 <none> <none> ... # netbox-kvlsf 내부 진입. $ kubectl exec -n kube-system -it netbox-kvlsf -- /bin/bash # netbox-kvlsf 내부 # telnet같은 툴은 설치되어 있지 않으므로, 간단한 python 스크립트를 작성하여 port 접속을 테스트 한다. $ python Python 3.3.6 (default, Sep 14 2017, 23:28:12) [GCC 4.9.2] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import socket >>> socket.create_connection(('10.0.2.5', 10250)) <socket.socket object, fd=3, family=2, type=1, proto=6> # 성공! >>> >>> socket.create_connection(('10.0.2.6', 10250)) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.3/socket.py", line 435, in create_connection raise err File "/usr/local/lib/python3.3/socket.py", line 426, in create_connection sock.connect(sa) OSError: [Errno 113] No route to host # 실패! # 접속이 잘 된다면, 아래와 같이 실제 kubelet api도 호출하여 본다. # metrics-server가 사용하는 token이 아래 경로에 마운트되어 있을 것이다. $ cat /run/secrets/kubernetes.io/serviceaccount/token eyJhbGciOiJSUzI1NiIsImtpZCI6IjNqSm8xaXJ0MDZsaGxjdzVndWozY1A5VXBGbTdwX3VDUzBpd0J2a3ItR0EifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJtZXRyaWNzLXNlcnZlci10b2tlbi01bTdtdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJtZXRyaWNzLXNlcnZlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImI4NGZjMmRjLTQ1MDItNGJhNi1iNWE5LWEwMjA0NmVhOTdjNiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTptZXRyaWNzLXNlcnZlciJ9.LPzyvfQiT294NE-53AaVDkR9SV-AKJhs62g0LAX3iril2H3wvqfF2w6h0vz5SpZhVSLC9rKEHClbDSF1w88rdGr6bn3R4dlmogzb6nw2N1dcCHR8LnDlA2AbZsSBYAYrIWpYIV1mxu4r60HFPoGE3JbpnRxKeC3KKXEfhnOILDulox_xNyvLd46_T4wZqglwqJvo-Ogkl8GBlw8-kRr04_TXB1hrTuDCGfRnNpb7RGcBVHlsIq_qZFXMsWEGp_pGf24_nYQ5w-dOWlKPMeoZ44BfVS_mas6ZFdraFoiCdPXlNC3GeeN0t1n4fbix1VTxxJtsLCcwcY8aG3THCC0PHw $ curl -k https://10.0.2.5:10250/stats/summary?only_cpu_and_memory=true -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjNqSm8xaXJ0MDZsaGxjdzVndWozY1A5VXBGbTdwX3VDUzBpd0J2a3ItR0EifQ.eyJpc3MiOiJdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJtZXRyaWNzLXNlcnZlci10b2tlbi01bTdtdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJtZXRyaWNzLXNlcnZlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImI4NGZjMmRjLTQ1MDItNGJhNi1iNWE5LWEwMjA0NmVhOTdjNiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTptZXRyaWNzLXNlcnZlciJ9.LPzyvfQiT294NE-53AaVDkR9SV-AKJhs62g0LAX3iril2H3wvqfF2w6h0vz5SpZhVSLC9rKEHClbDSF1w88rdGr6bn3R4dlmogzb6nw2N1dcCHR8LnDlA2AbZsSBYAYrIWpYIV1mxu4r60HFPoGE3JbpnRxKeC3KKXEfhnOILDulox_xNyvLd46_T4wZqglwqJvo-Ogkl8GBlw8-kRr04_TXB1hrTuDCGfRnNpb7RGcBVHlsIq_qZFXMsWEGp_pGf24_nYQ5w-dOWlKPMeoZ44BfVS_mas6ZFdraFoiCdPXlNC3GeeN0t1n4fbix1VTxxJtsLCcwcY8aG3THCC0PHw' { "node": { "nodeName": "k8s-01", "systemContainers": [ { "name": "pods", "startTime": "2020-08-06T23:38:19Z", "cpu": { "time": "2020-08-11T06:07:17Z", "usageNanoCores": 66319281, "usageCoreNanoSeconds": 34786278186285 }, "memory": { "time": "2020-08-11T06:07:17Z", "availableBytes": 3032084480, ... # 이렇게 출력되면 정상이다. | ||
Info | ||
이 경우는 netbox 만 배포해도 routing이 정상적으로 되는 것을 확인하였다.(물론 netbox 를 다시 지워도 무방함.) |
아래 그림과 같이 모든 node
내 pod
들의 cpu, memory 그래프가 출력되면 정상이다.
...