Kubernetes API 서버는 http 를 통해서 쿠버네티스에 대한 연산을 제공해 준다. kubectl 명령어로 실행되는 것들은 모두 API 서버를 거쳐서 이루어진다. 하지만 API 서버는 인증서를 기반으로 통신이 이루어지는데, 이 인증서에 기재된 도메인이나 IP가 아니면 통신이 이루어지지 않는다.
19mWarning listen tcp4:30754:bind:address already inusenode/kworker3.systemv.localcan'topen port"nodePort for istio-system/istio-ingressgateway:status-port"(:30754/tcp4),skipping it
19mWarning listen tcp4:32315:bind:address already inusenode/kworker3.systemv.localcan'topen port"nodePort for istio-system/istio-ingressgateway:https"(:32315/tcp4),skipping it
19mWarning listen tcp4:31159:bind:address already inusenode/kworker3.systemv.localcan'topen port"nodePort for istio-system/istio-ingressgateway:tcp"(:31159/tcp4),skipping it
19mWarning listen tcp4:31078:bind:address already inusenode/kworker3.systemv.localcan'topen port"nodePort for istio-system/istio-ingressgateway:http2"(:31078/tcp4),skipping it
19mWarning listen tcp4:31384:bind:address already inusenode/kworker3.systemv.localcan'topen port"nodePort for istio-system/istio-ingressgateway:tls"(:31384/tcp4),skipping it
8m58sWarning listen tcp4:30051:bind:address already inusenode/kworker3.systemv.localcan'topen port"nodePort for istio-system/istiod:http-monitoring"(:30051/tcp4),skipping it
8m58sWarning listen tcp4:31601:bind:address already inusenode/kworker3.systemv.localcan'topen port"nodePort for istio-system/istiod:https-dns"(:31601/tcp4),skipping it
8m58sWarning listen tcp4:30751:bind:address already inusenode/kworker3.systemv.localcan'topen port"nodePort for istio-system/istiod:https-webhook"(:30751/tcp4),skipping it
8m58sWarning listen tcp4:30761:bind:address already inusenode/kworker3.systemv.localcan'topen port"nodePort for istio-system/istiod:grpc-xds"(:30761/tcp4),skipping it
Calico-kube-controllers 의 Pods 를 찾기 위해서 셀렉터 k8s-app: calico-kube-controllers 지정해 준다. 그리고 ServiceMonitor 에서 찾을 수 있도록 Labels 를 설정해 줬다.
Prometheus ServiceMonitor 생성
나는 프로메테우스를 Operator 로 설치했다. Prometheus-Operator 설치를 할 경우에 메트릭 수집은 ServiceMonitor 를 통해서 이루어진다. 이 ServiceMonitor 는 Prometheus 의 설정을 함께 적용하면서 동작한다. Prometheus 의 Scape 을 ServiceMonitor 가 대신하는 것이라고 생각하면 쉽다.
프로메테우스(Prometheus)는 모니터링 시스템을 말한다. 프로메테우스는 파일 기반의 타임시리즈(Time-Series) 데이터베이스다. 시스템의 메트릭스들을 수집하기 위해서는 익스포터(Exportor) 를 설치해야 한다. 이외에도 알람을 전달해주는 AlertManager 도 있는데, 전체적인 아키텍쳐는 다음과 같다.
프로메테우스 아키텍쳐
프로메테우스는 쿠버네티스에서도 설치가 가능한데, 이글은 쿠버네티스에 프로메테우스 설치에 대한 글이다.
환경
환경은 다음과 같다.
Kubernetes 버전: 1.20
Kubernetes Nodes: Master 3개, Worker 3개
Prometheus 설치 방법: Helm Operator
설치
프로메테우스(Prometheus) 설치는 매우 다양한데, 검색을 해보면 Helm 을 이용한 방법 그중에서도 오퍼레이터(Operator) 를 이용한 방법이 많이 소개 되어 있다. 여기서도 이 오퍼레이터를 이용한 방법을 사용하고자 한다.
Prometheus Operator 로 검색을 해보면 github 저장소를 찾을 수 있다.
중간에 보면 Prometheus Operator vs kube-prometheus vs community helm chart 가 보인다. 자세히 읽어보면 쿠버네티스에 설치할 수 있는 방법이 세 가지로 나뉜다는 것을 알수 있다.
이중에서 나는 Helm chart 를 이용한 방법을 이용할 생각이다.
노드 레이블 설정
노드에 레이블을 설정하게 되면 쿠버네티스에 앱을 배포할때에 레이블을 지정함으로써 특정 노드에 생성되도록 강제할 수 있다. 프로메테우스 오퍼레이터 설치를 특정 노드에 하기 위해서 레이블을 부여할 생각이다. 대상 노드는 kworker3.systemv.local 노드이며 다음과 같이 레이블을 할당해 줬다.
많은 챠트가 존재하는데, 여기서 설치 대상은 kube-prometheus-stack 이다.
설정을 하기위해서 프로메테우스 오퍼레이터의 구성을 살펴볼 필요가 있다.
Prometheus – 프로메테우스 리소스 정의가 되어 있다. 프로메테우스를 위한 파드(Pod) 의 리플리카(Replica) 갯수, 퍼시스턴스 볼륨 구성등이다. 프로메테이스 오퍼레이터는 파드를 StatefulSet 으로 배포 한다. 그리고 어떤 애플리케이션, 혹은 리소스를 모니터링할 것이지를 지정하는 것인데, 이것은 ServiceMonitor 로 설정이 이루어 진다.
ServiceMonitor – 프로메테우스 오퍼레이터는 어노테이션 기반의 서비스 디스커버리를 지원하지 않으며 대신 PodMonitor, ServiceMonitor 를 이용한다. ServiceMonitor는 애플리케이션이나 서비스의 리소스를 모니터링할 것인지를 지정한다. 쿠버네티스의 NodeSelector 처럼 LableSelector 로 서비스의 리소스를 선택할 수 있고, 엔드포인트(EndPoint) 를 통해서 애플리케이션의 메트릭을 수집할 수 있다. ServiceMonitor 는 rule 을 기반으로 Prometheus의 모니터링 대상이 되는 ServiceMonitor를 scan하여 해당 정보를 Secret으로 배포한다. 그리고 이 Secret을 Prometheus StatefulSet에 마운트한다. 이런 방식으로 Prometheus 팟은 자신이 모니터링할 Service가 무엇인지 알 수 있다.
Altermanager – 알람 매니저 이다. 프로메테우스 컴포넌트중에 하나다.
PodMonitor – 파드에 대한 모니터다. 역시나 LabelSelector 를 통해서 모니터링하고자 하는 파드를 지정할 수 있다.
위 내용을 잘 알야하는 이유는 kube-prometheus-stack 디렉토리에 values.yaml 파일에 구조와 연관이 있다.
values.yaml 파일 편집
프로메테우스 오퍼레이터를 Helm 으로 설치할 때에는 values.yaml 파일의 설정을 참고하도록 되어 있다. values.yaml 에는 altermanager, Grafana, Prometheus 등에 대한 설정 값들이 들어가 있다. 앞에서 특정 노드에 배포하도록 하기 위해서 worker3.systemv.local 노드에 레이블링을 해줬기 때문에 이들 컴포넌트의 NodeSeletor 를 지정해 줘야 한다.
kube-prometheus-stack has been installed.Check its status by running:
kubectl--namespacemonitoring get pods-l"release=promethus"
Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.
확인
이제 확인을 해보자.
프로메테우스 설치 확인
ZSH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$kubectl get pod-nmonitoring-owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES