
쿠버네티스는 현시점에서 Devops의 목적을 가장 잘 실현할 수 있는 툴이다.
서비스의 개발 및 검증, 배포를 위한 여러 개의 S/W와 리소스들을 지원하고 이를 사용자가 쉽게 사용할 수 있도록 커뮤니티 등을 통해 계속해서 발전하고 있기 때문이다.
하지만 이렇게 열심히 만들어서 배포한 서비스가 갑자기 동작하지 않는다면 난처할 것이다.
잘 동작하던 서비스가 왜? 갑자기 문제가 발생하는지에 대해서는 서비스의 소스코드, 사용하는 DB, 서버 OS, 네트워크 환경 등 정말 다양한 원인들이 복잡하게 얽혀있기 때문에 원인을 바로 찾아내는 건 쉽지 않다.
그럼 이러한 문제점들에 대해 할 수 있는 일은 뭐가있을까?
가장 좋은 것은 장애가 발생하기 전에 현재 상태에 대해 명확하게 인지하고 앞으로 발생할 수 있는 문제점들에 대해 사전에 대책을 세우는 것이다.
이를 위해 운영에서 꼭 필요한 것이 모니터링이다.
모니터링의 목적은 서비스, 클러스터, 비용 등 여러 가지가 있을 수 있고 해당 목적에 맞는 여러가지 툴들이 존재한다.
이 중에서 쿠버네티스에서는 클러스터의 상태를 모니터링할 수 있는 기본적인 대시보드 서비스를 제공하고 있다.
오늘은 이 쿠버네티스 대시보드를 이용하여 클러스터와 배포된 서비스들을 모니터링해보려고 한다.
대시보드 설치하기
사실 쿠버네티스 대시보드 자체는 수집되어 있는 정보를 받아서 사용자가 보기 편하게끔 시각화해주는 역할만 하기 때문에 혼자만으로는 모니터링 서비스로서 역할을 수행할 수 없다. 때문에 대시보드에서 참조할 정보들을 수집하는 메트릭 서버와 수집된 정보를 그래프 등 유의미한 형태로 출력해 주는 메트릭 스크래퍼를 같이 설치해야 한다.
해당 글에서는 helm으로 설치를 진행하기 때문에 대시보드, 메트릭 서버, 메트릭 스크래퍼를 한 번에 묶어서 설치해 본다.
- 네임스페이스 생성
$ kubectl create ns kubernetes-dashboard
- Helm repo 추가
$ helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
$ helm repo update
- Helm chart 다운
$ helm pull kubernetes-dashboard/kubernetes-dashboard --version=7.0.0-alpha1
$ tar -xvf kubernetes-dashboard-7.0.0-alpha1.tgz
- values.yaml 작성
쿠버네티스 대시보드 helm chart는 v7부터 구조가 새롭게 바뀌어서 이전과 구성이 많이 달라졌다. 기존에 대시보드에 통합되어 있던 api 기능이 별도의 pod로 분리되었으며 nginx ingress와 cert manager가 기본 패키지로 구성되어 있다.
만약 기존에 사용하던 ingress나 cert 툴이 있다면 values.yaml에서 설치 옵션을 비활성화하는 것이 좋다.
클러스터에 이미 nginx ingress controller
가 설치되어 있기 때문에 cert manager
와 같이 enabled을 false
로 설정한다.
또한 외부 접속을 가능하도록 하기 위해 ingress를 활성화하고 도메인을 설정한다.
app:
scaling:
replicas: 1
ingress:
enabled: true
hosts:
- kubernetes-dashboard.hokka.com
ingressClassName: nginx
pathType: ImplementationSpecific
secretName: kubernetes-dashboard-certs
issuer:
name: selfsigned
scope: disabled
paths:
web: /
api: /api
api:
role: api
image:
repository: docker.io/kubernetesui/dashboard-api
tag: v1.0.0
containers:
ports:
- name: api
containerPort: 9000
protocol: TCP
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 200m
memory: 256Mi
web:
role: web
image:
repository: docker.io/kubernetesui/dashboard-web
tag: v1.0.0
containers:
ports:
- name: web
containerPort: 8000
protocol: TCP
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 100m
memory: 128Mi
metricsScraper:
enabled: true
role: metrics-scraper
image:
repository: docker.io/kubernetesui/metrics-scraper
tag: v1.0.9
containers:
ports:
- containerPort: 8000
protocol: TCP
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 100m
memory: 128Mi
livenessProbe:
httpGet:
scheme: HTTP
path: /
port: 8000
initialDelaySeconds: 30
timeoutSeconds: 30
metrics-server:
enabled: true
args:
- --kubelet-preferred-address-types=InternalIP
- --kubelet-insecure-tls
cert-manager:
enabled: false
nginx:
enabled: false
- Helm install
$ helm install -n kubernetes-dashboard kubernetes-dashboard kubernetes-dashboard -f values.yaml
이후 설치된 Pod 목록을 확인해 본다.
$ kubectl get pod -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
kubernetes-dashboard-api-f646c5675-25mbs 1/1 Running 0 2m
kubernetes-dashboard-metrics-scraper-5585db49d-zlrgq 1/1 Running 0 2m
kubernetes-dashboard-metrics-server-86486b5696-tf28d 1/1 Running 0 2m
kubernetes-dashboard-web-5bff757cfd-44wpg 1/1 Running 0 2m
정상적으로 대시보드(api, web)와 메트릭 서버, 메트릭 스크래퍼가 설치된 것을 확인할 수 있다.
대시보드 접속하기
쿠버네티스 대시보드는 접속할 때 2가지 인증 방식을 지원한다.
하나는 Service account의 토큰이고, 다른 하나는 클러스터의 정보가 담긴 Kubeconfig 파일을 사용하는 것이다.
개발이나 테스트 환경이 아니라면 Kubeconfig는 보안적으로 좋지 못하므로 Service account의 토큰을 발급하여 로그인해본다.
- 대시보드용 Service account 생성
admin-user
라는 Service account를 생성하고 클러스터의 모든 권한을 허용하는 cluster-admin
clusterrole을 매칭시켜 준다.
이후 admin-user
의 Secret token을 생성하여 대시보드 로그인에 사용한다.
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: v1
kind: Secret
metadata:
name: admin-user-secret
namespace: kubernetes-dashboard
annotations:
kubernetes.io/service-account.name: "admin-user"
type: kubernetes.io/service-account-token
- Secret token 확인
$ kubectl describe secret -n kubernetes-dashboard admin-user-secret
아래와 같이 토큰 정보가 출력되는 것을 확인할 수 있다.
Name: admin-user-secret
Namespace: kubernetes-dashboard
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin-user
kubernetes.io/service-account.uid: 82da9dc2-8034-48b8-af7a-5401b91779fc
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1099 bytes
namespace: 20 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IkF4QzhJc0tUNlA1YWJHVmxqaF9IN29naUo0OEJWXzB4WVBQVVltY1ZYalEifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXNlY3JldCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhZG1pbi11c2VyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiODJkYTlkYzItFDAzNC00OGI4LWFmN2EtNTQwMWI5MTc3OWZjIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmFkbWluLXVzZXIifQ.PG_clhp5clTvLWESb4Yi7_wXxlhyKetXCJ7XTpMc80tnkx4PZjrquY1OMoW8BIZpjmJdu_MIRs9NBVntsx3v3RAiZVxV-tnYmoCDwXav-sAu98dVEWPmAFhDEjsp8ncv1-767RbFkKfdtKRjmVlIgX7FaMChxRCKjhxQ2IkIq92VTusM-wdXFixCegfbEyQU6fCb05hNPXS6tpB3jAu2zrCBI0_KY5ZtCnS4Nko8Lda2bjK7Av7A0FK-PQ84uXT7Edv0lbbJP9msIYI3q9CqY2L20yrKaXNpd95kSoY8wVNTCnIPimskva38sLCjFdnigwFLDecQtF1erNx19U9YLg
- 대시보드 접속 후 토큰으로 로그인
네임스페이스를 All namespaces
로 변경하면 전체 클러스터 리소스에 대한 워크로드 페이지가 출력된다.
대시보드 기능 활용하기
- 기본 구성
왼쪽 메뉴바를 통해 클러스터에 배포된 리소스 종류를 선택할 수 있으며 상단에는 해당 리소스 종류의 전체 자원 사용량, 하단에는 개별 리소스의 정보(Label, 상태, 노드 등)와 자원 사용량을 한눈에 확인할 수 있다.
- Pod 제어 기능
Pod의 실시간 로그 확인, Exec
로 쉘 접속, Edit
으로 매니페스트 수정 가능, Pod 삭제가 가능하다.
아래는 Exec
기능을 이용해 Pod의 쉘로 접속한 화면이다. 웹을 통해 터미널에 명령을 전달하고 결과를 받을 수 있다.
- Deployment 제어 기능
Scale
을 통해 Replicas 수정, Edit
으로 매니페스트 수정 가능, Restart
로 Pod 재시작 가능, Deployment 삭제가 가능하다.
대시보드에서 Scale
기능을 이용해 Replicas를 1
에서 2
로 늘려본다.
Pod의 개수가 2
개로 증가된 것을 확인할 수 있다.
- 클러스터 이벤트 감시
Events 탭에서는 클러스터에서 일어나는 전체 이벤트(리소스 배포, Scale 조정, Volume mount 등)에 대해 확인이 가능하다.
- CRD 정보 확인
쿠버네티스에서 기본으로 제공하는 리소스가 아닌 배포되는 서비스에 맞춰서 제작되는 커스텀 리소스(CRD)에 대해서도 간단하게 정보를 확인할 수 있다.
참고자료
GitHub - kubernetes/dashboard: General-purpose web UI for Kubernetes clusters
General-purpose web UI for Kubernetes clusters. Contribute to kubernetes/dashboard development by creating an account on GitHub.
github.com
'Kubernetes' 카테고리의 다른 글
무중단 배포를 위한 배포 전략 알아보기 (0) | 2024.02.17 |
---|---|
쿠버네티스 볼륨 알아보기 (0) | 2024.02.03 |
Kubeadm으로 쿠버네티스 설치하기 (0) | 2024.01.14 |
Ingress를 활용하여 웹 트래픽 제어하기 (0) | 2024.01.06 |
Helm 알아보기 (0) | 2023.12.31 |