본문 바로가기

Cloud/Oracle Cloud Infrastructure

OCI를 이용한 쿠버네티스, Wercker 쉬운 샘플 - 8. OKE 모니터링

쿠버네티스에 대한 모니터링은 크게 ①쿠버네티스 클러스터에 대한 모니터링, ②클러스터를 구성하는 노드들에 대한 모니터링, ③컨테이너에 대한 모니터링, ④컨테이너 안에서 구동되는 어플리케이션에 대한 모니터링 등으로 구분할 수가 있다.

중에서 쿠버네티스 클러스터와 해당 노드들에 대한 모니터링은 OKE에서 제공하는 Built-in 모니터링으로도 확인할 있는 내용들이 있다. 먼저 OKE Built-in 모니터링에 대해 살펴본다.

그리고 오픈 소스 Prometheus, Grafana 이용하여 쿠버네티스 클러스터, 해당 노드, 컨테이너(파드) 모니터링하는 방법에 대해 살펴볼 것이다.

OKE 관리 콘솔에서 클러스터에 대한 자체 모니터링 기능을 제공한다.

클러스터 상세 화면 하단에 보면 아래와 같이 “API Server Requests”, “API Server Responses”, “Unreachable Pods (파드를 배포하려고 자원 부족으로 인해 대기 중인 상태를 확인할 있는 지표로서, Node Pool 스케일링을 위한 판단 지표로 사용할 있음) ” 같은 메트릭을 그래프로 있다.

 

노드에 대한 모니터링은 클러스터 상세화면에서 왼쪽 하단의 Resource Node  Pools 선택한다. Node Pools에서 확인하고자 하는 노드 풀을 선택한다.

 

노드 풀에 대해 Active 노드 , 쿠버네티스 API 서버가 인식하는 Ready 상태의 노드 정보를 확인할 있다. 그리고 오른쪽 하단 Resource Nodes 화면으로 이동하면 워커 노드들에 대한 정보를 있다.

 

워커 노드에서 오른쪽 상단의 “View Metrics” 클릭하면, 노드의 자원 사용 현황을 확인할 있다.

 

워커 노드의 CPU, Memory, 네트웍 등의 자원 사용을 확인한다.

 

이번에는 Prometheus, Grafana 이용한 OKE 클러스터 모니터링을 살펴본다.

Prometheus 2015 공식 발표된 Go 언어로 개발된 오픈 소스 모니터링 솔루션이다. (Wikipedia - Prometheus) 쿠버네티스 모니터링 뿐만 아니라 애플리케이션이나 서버, OS  다양한 대상으로 부터 지표를 수집하여 모니터링할  있는 범용 솔루션으로 메트릭을 수집, 모니터링 서비스 디스커버리, 시각화, 알림 등의 기능을 제공한다.

 

Prometheus Grafana 구성하는 방식은 여러가지가 있을  있다. 예를 들어 Prometheus 쿠버네티스 클러스터에 설치하고 Granfana 별도 서브넷이나 VCN( 경우 Local Peering Gateway) 구성하여 연동하게   있다. (참조. Monitoring OKE with Prometheus and Grafana)

또는 쿠버테티스 클러스터를 Oracle Management Cloud 같은 클라우드 벤더 제공 솔루션으로 모니터링  수도 있다. (참조. Oracle Management Cloud 사용하여 Kubernetes 배치된 애플리케이션 모니터링)

여기서는 Promethus Grafana OKE 클러스터에 설치하여 쿠버네티스 메트릭을 수집하고 이를 시각화할 것이다. Grafana 대한 접근은 퍼블릭 로드밸런서를 통해 이루어지도록 구성한다.

 

먼저 클러스터에 Prometheus 설치를 위해 헬름(Helm) 리포지토리를 추가하는 것인데,  전에 헬름에 대해 간략히 먼저 살펴본다. (도서 도커/쿠버네티스를 활용한 컨테이너 개발 실전 입문 (위키북스) 참고)

헬름은 쿠버네티스의 하위 프로젝트로 관리되는 공식 툴로서 여러개의 클러스터에 어플리케이션을 배포할  사용하는 패키지 관리 도구이다. 예를 들어 운영과 개발  여러개의 쿠버네티스 클러스터를 운영하는 경우,  배포마다 API 환경이나 데이터베이스 주소 등이 서로 다르게 가져가야 하는데 이를 수동으로  매니페스트 파일을 작성하는 경우, 관리의 어려움이나 사용자 실수 등이 발생하기 쉽다. 따라서 배포 환경에 따라 달라지는 설정값만 정의를   다음 이를 배포하는 매커니즘이 필요한데 헬름이  역할을 수행한다.

 

 

헬름은 차트(Chart)라는 사전에 구성된 쿠버네티스 자원을 묶은 패키지로 패니패스트 파일을 생성하고 이를 통해 쿠버네티스 자원을 관리한다. 차트를 통해 매니페스트 파일을   쉽게   있다. 쿠버네티스의 메니페스트 파일을 생성하는 템플릿이라고 이해할  있다.

헬름은 V2까지 클라이언트와 서버로 구성되어 있었고, 서버에 해당하는 것을 틸러(Tiller)라고 했다. 클라이언트는 서버에 명령을 전달하는 역할을 하고, 서버는 클라이언트에서 전달받은 명령에 따라 쿠버네티스 클러스터에 패키지를 설치하고, 업데이트, 삭제 등의 작업을 수행했다. 하지만 V3 들어서면서 Tiller 없어지고, 대신 클라이언트에서 Kubernetes API 서버에서 정보를 가져 와서 필요한 정보를 변경하고 쿠버네티스에 설치 기록을 저장하는 방식으로 바뀌었다.

헬름의 패키지(차트) 저장하는 장소를 헬름 리포지토리라고 하는데 헬름 리포지토리를 헬름 클라이언트가 읽어서 쿠버네티스 클러스터에게 요청을 보내는 구조이다. 로컬 리포지토리인 local, 안정화된 버전이 존재하는 stable, stable 요건에 만족하지 못하는 차트가 존재하는 incubator 등의 리포지토리 종류가 있다.

 

우선 헬름 설치 스크립트를 다운로드 받아서 실행 권한 부여  실행한다. 여기에서는 최신 버전인 Helm V3 설치한다. 헬름은 kubectl 사용하는 것과 동일한 kubeconfig 파일 (일반적으로 $HOME/.kube/config 위치) 사용한다. 헬름 설치  버전을 확인한다.

[opc@inst-public ~]$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
[opc@inst-public ~]$ chmod 700 get_helm.sh
[opc@inst-public ~]$ ./get_helm.sh
Downloading https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz
Verifying checksum... Done.
Preparing to install helm into /usr/local/bin
helm installed into /usr/local/bin/helm
[opc@inst-public ~]$ helm version
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /home/opc/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /home/opc/.kube/config
version.BuildInfo{Version:"v3.5.2", GitCommit:"167aac70832d3a384f65f9745335e9fb40169dc2", GitTreeState:"dirty", GoVersion:"go1.15.7"}

 

헬름 차트 리포지토리를 추가하고 helm repo update 명령으로 로컬에 차크를 업데이트한다.

[opc@inst-public ~]$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /home/opc/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /home/opc/.kube/config
"prometheus-community" has been added to your repositories
[opc@inst-public ~]$ helm repo update
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /home/opc/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /home/opc/.kube/config
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "prometheus-community" chart repository
Update Complete. Happy Helming!

 

차트 리포지토리 추가 , prometheus 검색해 보면 관련 차트들을 확인할  있다.

[opc@inst-public ~]$ helm search repo prometheus
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /home/opc/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /home/opc/.kube/config
NAME                                                    CHART VERSION   APP VERSION     DESCRIPTION
prometheus-community/kube-prometheus-stack              14.0.1          0.46.0          kube-prometheus-stack collects Kubernetes manif...
prometheus-community/prometheus                         13.5.0          2.24.0          Prometheus is a monitoring system and time seri...
prometheus-community/prometheus-adapter                 2.12.1          v0.8.3          A Helm chart for k8s prometheus adapter

prometheus-community/alertmanager                       0.6.0           v0.21.0         The Alertmanager handles alerts sent by client ...

 

이제 helm install 명령으로 차트를 쿠버네티스에 배포한다. 위에서 추가한 리포지토리  prometheus 설치는 kube-prometheus-stack 차트로 수행한다.

[opc@inst-public ~]$ helm install prometheus-community/kube-prometheus-stack --generate-name
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /home/opc/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /home/opc/.kube/config
NAME: kube-prometheus-stack-1615278411
LAST DEPLOYED: Tue Mar  9 08:26:54 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
  kubectl --namespace default get pods -l "release=kube-prometheus-stack-1615278411"
 
Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.

 

차트에 대한 배포가 끝나면 클러스터에 Proemtheus Grafana 배포된 것을 확인   있다.

[opc@inst-public ~]$ kubectl get deploy,po,svc
NAME                                                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/get-ip                                                1/1     1            1           71m
deployment.apps/kube-prometheus-stack-1615-operator                   1/1     1            1           70s
deployment.apps/kube-prometheus-stack-1615278411-grafana              1/1     1            1           70s
deployment.apps/kube-prometheus-stack-1615278411-kube-state-metrics   1/1     1            1           70s
 
NAME                                                                  READY   STATUS    RESTARTS   AGE
pod/alertmanager-kube-prometheus-stack-1615-alertmanager-0            2/2     Running   0          65s
pod/get-ip-bfbc84c6b-74fbt                                            1/1     Running   0          71m
pod/kube-prometheus-stack-1615-operator-8c96c8899-jwptx               1/1     Running   0          70s
pod/kube-prometheus-stack-1615278411-grafana-7db8b8f9c9-z4cvl         2/2     Running   0          70s
pod/kube-prometheus-stack-1615278411-kube-state-metrics-5748d8bws6d   1/1     Running   0          70s
pod/kube-prometheus-stack-1615278411-prometheus-node-exporter-dmjd2   1/1     Running   0          70s
pod/kube-prometheus-stack-1615278411-prometheus-node-exporter-llhx4   1/1     Running   0          69s
pod/kube-prometheus-stack-1615278411-prometheus-node-exporter-w2gd5   1/1     Running   0          69s
pod/prometheus-kube-prometheus-stack-1615-prometheus-0                2/2     Running   1          64s
 
NAME                                                                TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                      AGE
service/alertmanager-operated                                       ClusterIP      None            <none>           9093/TCP,9094/TCP,9094/UDP   65s
service/get-ip                                                      LoadBalancer   10.96.191.180   193.122.202.94   80:31893/TCP                 71m
service/kube-prometheus-stack-1615-alertmanager                     ClusterIP      10.96.135.78    <none>           9093/TCP                     70s
service/kube-prometheus-stack-1615-operator                         ClusterIP      10.96.189.52    <none>           443/TCP                      70s
service/kube-prometheus-stack-1615-prometheus                       ClusterIP      10.96.116.235   <none>           9090/TCP                     70s
service/kube-prometheus-stack-1615278411-grafana                    ClusterIP      10.96.158.32    <none>           80/TCP             70s

 

배포된 서비스를 살펴보면 현재 Grafana 서비스 “kube-prometheus-stack-1615278411-grafana” 경우, 서비스 타입이 ClusterIP 클러스터 외부에서 접속이 불가하다. Grafana 엔드포이트를 외부로 노출시키기 위해 여기서는 로드밸런서를 이용할 것이다.

아래 kubectl 서비스 수정 명령으로 Grafana 서비스 매니페스트 파일을 열어서 annotation 부분과 타입 부분을 아래와 같이 수정한다. 아래 # 주석 처리된 부분이 기존 내용이다.

[opc@inst-public ~]$ kubectl edit svc kube-prometheus-stack-1615278411-grafana

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Service
metadata:
#  annotations:
#    meta.helm.sh/release-name: kube-prometheus-stack-1615278411
#    meta.helm.sh/release-namespace: default
annotations:
    service.beta.kubernetes.io/oci-load-balancer-backend-protocol: HTTP
    service.beta.kubernetes.io/oci-load-balancer-shape: 100Mbps
  creationTimestamp: "2021-03-09T08:27:06Z"
  labels:
    app.kubernetes.io/instance: kube-prometheus-stack-1615278411
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: grafana
    app.kubernetes.io/version: 7.4.2
    helm.sh/chart: grafana-6.4.8
  name: kube-prometheus-stack-1615278411-grafana
  namespace: default
  resourceVersion: "41641"
  selfLink: /api/v1/namespaces/default/services/kube-prometheus-stack-1615278411-grafana
  uid: ff455193-9e9b-4eed-9de8-f71be1df442f
spec:
  clusterIP: 10.96.158.32
  ports:
  - name: service
    port: 80
    protocol: TCP
    targetPort: 3000
  selector:
    app.kubernetes.io/instance: kube-prometheus-stack-1615278411
    app.kubernetes.io/name: grafana
  sessionAffinity: None
# type: ClusterIP
  type: LoadBalancer
status:
  loadBalancer: {}

 

Grafana 서비스 수정 , 잠시 기다리면 서비스 타입이 ClusterIP에서 LoadBalancer 변경되었고, EXTERNAL-IP 잠시 <pending> 이었다가 IP 추가된 것을   있다. OCI 로드밸런서가 배포되어야 IP 얻을  있다. 80포트에 대한 포트포워딩도 추가되었다.

[opc@inst-public ~]$ kubectl get services
NAME                                                        TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)                      AGE
alertmanager-operated                                       ClusterIP      None            <none>            9093/TCP,9094/TCP,9094/UDP   22h
get-ip                                                      LoadBalancer   10.96.191.180   193.122.202.94    80:31893/TCP                 23h
kube-prometheus-stack-1615-alertmanager                     ClusterIP      10.96.135.78    <none>            9093/TCP                     22h
kube-prometheus-stack-1615-operator                         ClusterIP      10.96.189.52    <none>            443/TCP                      22h
kube-prometheus-stack-1615-prometheus                       ClusterIP      10.96.116.235   <none>            9090/TCP                     22h
kube-prometheus-stack-1615278411-grafana                    LoadBalancer   10.96.158.32    129.159.113.215   80:30638/TCP                 22h
kube-prometheus-stack-1615278411-kube-state-metrics         ClusterIP      10.96.124.21    <none>            8080/TCP                     22h
kube-prometheus-stack-1615278411-prometheus-node-exporter   ClusterIP      10.96.36.128    <none>            9100/TCP                     22h
kubernetes                                                  ClusterIP      10.96.0.1       <none>            443/TCP                      25h
prometheus-operated                                         ClusterIP      None            <none>            9090/TCP                     22h

 

이제 Grafana서비스의 EXTERNAL IP 웹브라우저를 열어서 접속하면 Grafana  UI 접속할  있다.

Grafana  UI 유저명은 admin 이다. 패스워드는 Prometheus, Grafana 설치와 함께 생성된 Grafana 시크릿으로부터 얻어와야 하는데, 아래 명령으로 패스워드를 가져온다.

[opc@inst-public ~]$ kubectl get secrets | grep grafana
kube-prometheus-stack-1615278411-grafana                          Opaque                                3      27h
kube-prometheus-stack-1615278411-grafana-test-token-nk4sb         kubernetes.io/service-account-token   3      27h
kube-prometheus-stack-1615278411-grafana-token-74f5z              kubernetes.io/service-account-token   3      27h
[opc@inst-public ~]$ kubectl get secret kube-prometheus-stack-1615278411-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
prom-operator

 

Grafana 서비스 EXTERNAL-IP  UI 접속한 다음, 유저명 “admin”, 패스워드는 위에서 “kubectl get secret” 명령으로 얻어온 값으로 로그인한다.

 

kube-prometheus-stack 차트로 설치하여 Grafana 접속하면 이미 Prometheus Grafana 연동이 이루어져있다. Grafana에서는 Prometheus에서 수집한 정보를 대쉬보드로 구성만 하면 된다.

 

오른쪽 대쉬보드 메뉴 아래 Manage 화면으로 이동하면 prometheus 수집한 다양한 쿠버네티스 메트릭에 대한 대쉬보드들을 확인할  있다. 아래는 클러스터 노드의 자원 사용 현황 화면이다.

 

아래는 파드에 대한 메트릭 정보에 대한 대쉬보드이다. 앞서 Wercker 배포한 파드 “get-ip” 포함하여 파드들의 CPU, Memory, 네트웍(화면 하단) 자원 사용에 대한 모니터링을   있다.

 

Grafana에서는 Prometheus에서 수집한 메트릭을 이용하여 사용자가 대쉬보드를 만들어서 사용할  있으나, 이미 다른 사용자가 만들어서 Grafana 홈페이지에 올린 대쉬보드를 임포트하혀 사용할 수도 있다. 사용 방법은 먼저 Grafan 홈페이지 대쉬보드 화면 (https://grafana.com/grafana/dashboards)으로 이동한다.

 

대쉬보드 화면 하단의 필터 조건에 “kubernetes”라고 입력하면 다른 사용자가 업롣한 쿠버네티스 모니터링 대쉬보드들을   있다.   임포트하고자하는 대쉬보드를 클릭한다.

 

임포트 대상 대쉬보드 화면 오른쪽에 하단에 대쉬보드 ID 있고,  아래 “Copy ID to Clipboard” 버튼이 있다. 이를 클릭하여 대쉬보드 ID 복사한다.

 

Grafana  UI 돌아와서 오른쪽 “+” 클릭하면 나오는 Create 메뉴의 Import 클릭한다. 임포트 화면에서 복사한 대쉬볻 ID 입력 , 오른쪽의 Load 클릭한다.

 

위에서 Load 버튼을 클릭하면 화면 하단에 데이터 소스를 선택하는 부분이 나오는데, 데이터 소스 선택 박스에서 “Prometheus” 선택  Import 클릭하면 대쉬보드가 로딩된다.

 

글 순서

1. Introduction

2.쿠버네티스  OCI 쿠버네티스(OKE) 개요

3. OCI 쿠버네티스 배포, 사용 환경 설정

4. OKE 클러스터에 샘플 웹서버 배포

5. OCI 레지스트리에 이미지 업로드 & 다운로드 설정

6. Wercker 이용한 어플리케이션 빌드

7. Wercker 이용한 어플리케이션 배포

8. OKE 모니터링

여기에 정리한 내용은 오라클 제품을 다루고 있지만, 이는 개인적인 정리 및 테스트 결과일 뿐입니다. 오라클의 공식 문서는 오라클이 제공하는 매뉴얼과 기타 기술문서를 참조하셔야 합니다.