쿠버네티스 prometheus 설정
Helm 을 이용해 kube-prometheus-stack 을 설치하게 되면, Grafana 를 통해서 통계 그래프를 볼 수 있다. 그런데, 몇몇 대쉬보드는 나타나지 않는데 여기서는 이 문제를 해결하는 방법을 알아본다.
Prometheus
프로메테스에서 Status > Target health 에서 상태를 같이 보면서 해결하면 좋다. 어떻게 스크랩이 설정되어 있는데, 상태가 DOWN 인 부분을 잘 살펴보면 된다.
CoreDNS
CoreDNS 대쉬보드가 아무것도 나오지 않는다. Service 에 kube-dns 혹은 Helm 으로 설치할 경우에 coredns 로 나오는데, describe 를 한번 해본다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
]$ kubectl describe svc/coredns -n kube-system Name: coredns Namespace: kube-system Labels: app.kubernetes.io/instance=coredns app.kubernetes.io/managed-by=Helm app.kubernetes.io/name=coredns helm.sh/chart=coredns-1.39.2 k8s-app=coredns kubernetes.io/cluster-service=true kubernetes.io/name=CoreDNS Annotations: meta.helm.sh/release-name: coredns meta.helm.sh/release-namespace: kube-system Selector: app.kubernetes.io/instance=coredns,app.kubernetes.io/name=coredns,k8s-app=coredns Type: ClusterIP IP Family Policy: SingleStack IP Families: IPv4 IP: 10.96.0.10 IPs: 10.96.0.10 Port: udp-53 53/UDP TargetPort: 53/UDP Endpoints: 10.42.217.130:53 Port: tcp-53 53/TCP TargetPort: 53/TCP Endpoints: 10.42.217.130:53 Session Affinity: None Events: <none> |
위에 내용을 보면 k8s-app=coredns 가 보인다. 이제 Service 에 prometheus-coredns 를 한번 보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
]$ kubectl describe svc/prometheus-kube-prometheus-coredns -n kube-system Name: prometheus-kube-prometheus-coredns Namespace: kube-system Labels: app=kube-prometheus-stack-coredns app.kubernetes.io/instance=prometheus app.kubernetes.io/managed-by=Helm app.kubernetes.io/part-of=kube-prometheus-stack app.kubernetes.io/version=70.4.1 chart=kube-prometheus-stack-70.4.1 heritage=Helm jobLabel=coredns release=prometheus Annotations: meta.helm.sh/release-name: prometheus meta.helm.sh/release-namespace: monitoring Selector: k8s-app=kube-dns Type: ClusterIP IP Family Policy: SingleStack IP Families: IPv4 IP: None IPs: None Port: http-metrics 9153/TCP TargetPort: 9153/TCP Endpoints: <none> Session Affinity: None Events: <none> |
Selector 를 보면 k8s-app=kube-dns 로 보인다. 이것이 맞지 않아서 관련 내용을 가지고 오지 못하는 원인다. 이것을 k8s-app=coredns 로 바꿔 준다.
이렇게 하고 Prometheus 에 Status > Target health 에서 coredns 를 보면 스크랩이 잘되는 것으로 바뀐다.
Etcd
Prometheus 에서 Status > Target health 에서 ‘http://192.168.96.60:2381/metrics‘ 로 EndPoint 로 설정되어 있다. curl 로 긁어보면 다음과 같이 나온다.
1 2 |
]$ curl http://192.168.96.60:2381/metrics curl: (7) Failed to connect to 192.168.96.60 port 2381: 연결이 거부됨 |
Etcd 의 경우에는 상태 모니터링을 위한 파라메터 설정을 해줘야 한다. 하지만 kubeadm 으로 K8S 를 설치한 경우에 etcd 는 Master Controll Plane 으로 동작하기 때문에 파라메터 수정을 위해서는 manifest 파일을 수정으로 해야 한다.
1 2 3 4 |
]$ vim /etc/kubernetes/manifests/etcd.yaml - --listen-client-urls=https://127.0.0.1:2379,https://192.168.96.60:2379 - --listen-metrics-urls=http://127.0.0.1:2381 - --listen-peer-urls=https://192.168.96.60:2380 |
2381 포트를 보면, 127.0.0.1 만 엔드포인트로 되어 있다. 192.168.96.60 을 추가해 준다. 그러면 정상화 된다.
Controller Manager
Prometheus 에서 Status > Target health 에서 ‘dial tcp 192.168.96.60:10257: connect: connection refused’ 에러 메시지가 나타난다.
Controller Manager 또한 Master Controller Plane 이기 때문에 manifest 파일을 수정해줘야 한다.
1 2 3 4 |
]$ vim /etc/kubernetes/manifest/kube-controller-manager.yaml - --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf - --bind-address=127.0.0.1 - --client-ca-file=/etc/kubernetes/pki/ca.crt |
bind-address 주소가 localhost 로 되어 있기 때문에 refused 된 것으로 보인다. 0.0.0.0 으로 바꾼다.
kube-scheduler
kube-scheduler 도 위에 controller manager 처럼 bind-address 가 localhost 로 되어 있다. 0.0.0.0 으로 바꾼다.
kube-proxy
kube-proxy 는 DaemonSet 오브젝트다. 설정 파일이 있는 것처럼 나오지만 설정파일은 없고, 대신 ConfigMap 으로 존재한다. 이 ConfigMap 에 metricsBindAddress 값이 없다.
1 2 |
]$ kubectl edit cm kube-proxy -n kube-system metricsBindAddress: 0.0.0.0 |
DaemonSet 은 자동으로 재시작되지 않는다. Rollout 업데이트를 해준다.
1 2 |
]$ kubectl rollout restart ds/kube-proxy -n kube-system daemonset.apps/kube-proxy restarted |