Monitor
k8s의 Monitoring 지표들은 다양하다. 다음의 k8s는 다음과 같은 지표들을 확인할 수 있다.
- 노드 레벨의 통계: 클러스터를 구성하는 노드의 개수 및 상태
- 성능지표: CPU, 메모리 사용량, 디스크, 네트워크 I/O
- Pod 레벨지표: Pod의 개수, Pod의 자원 사용량 등
이처럼 다양한 성능지표들을 모니터링 할 수 있으나 중앙화된 관리와 해당 정보를 가공할 수 있는 솔루션이 필요하다.
k8s에는 default로 탑재되는 모니터링 솔루션이 없지만 오픈소스로 공개된 다양한 솔루션들으 있으며 사용할 수 있다. 예를들면 Prometheus, Elastic Stack, Datadog, dynatrace등이 있다.
HEAPSTER
힙스터는 k8s의 모니터링 솔루션을 위한 초기 프로젝트였다. 하지만 현재는 deprecated 되었고 MetricsServer
라는 간소화된 구조가 만들어졌다.
Metrics Server
metrics server는 cluster 당 1개가 존재한다. metrics server는 in-memory DB이며 pod들의 metric들을 모아 메모리로 저장하고 있으며 디스크에 저장하지 않는다. 따라서 예전 데이터들을 볼 수 없는 한계가 있다.
Metrics Server 동작
k8s의 각 노드는 kubelet 을 통해 api-server와 통신한다. kubelet에는 cAdvisor(Container Advisor)라는 내부 구성요소를 포함하고 있다. cAdvisor는 Pod의 metric들을 수집하고 metrics server와 통신하는 역할을 담당한다.

Metrics Server 설치
k8s vanilla를 설치했으면 다음과 같이 수동으로 설치할 수 있다.
설치
$ kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
설치하면 readiness failure로 metrics server가 정상적으로 실행되지 않는다. 이는 인증서 오류로 기본적으로 TLS 사용 옵션이 켜져있기 때문에 발생한다. 나의 경우에는 private 망이고 테스트 목적이므로 TLS를 사용하지 않고 disable한 후 사용했다. 설정 은 다음을 참고한다.
spec:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=10250
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls # <--- 추가
image: registry.k8s.io/metric
--kubelet-insecure-tls
옵션을 metrics-server의 deployment에 추가하면 정상동작을 확인할 수 있다.
Metrics Server 사용법
$ kubectl get po -n kube-system | grep metric
metrics-server-98bc7f888-mcfrx 1/1 Running 0 2m31s
$ kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master 328m 8% 2027Mi 54%
worker1 97m 2% 724Mi 19%
worker2 99m 2% 753Mi 20%
worker3 109m 2% 747Mi 20%
다음과 같이 Pod, container의 정보들도 확인할 수 있다.
hugh@master:~/components $ kubectl top pod
NAME CPU(cores) MEMORY(bytes)
nginx 0m 4Mi
hugh@master:~/components $ kubectl top pod --containers
POD NAME CPU(cores) MEMORY(bytes)
nginx nginx 0m 4Mi
Application Logs
kubernetes log 확인 방법은 docker의 docker log와 유사하다
kubectl logs <pod-name>
Sample
kodekloud/event-simulator
container를 Pod로 kubernetes에 배치해보자. 해당 container는 랜덤한 이벤트를 발생시키는 컨테이너다.
apiVersion: v1
kind: Pod
metadata:
name: event-simulator-pod
spec:
containers:
- name: event-simulator
image: kodekloud/event-simulator
- name: nginx
image: nginx
Pod에 container두개를 동작시키도록 해서 배치했다.
hugh@master:~/yaml/logging $ k apply -f log.yaml
pod/event-simulator-pod created
hugh@master:~/yaml/logging $
사용자의 현재 namespace에서 pod-name의 로그를 출력한다.
-f 옵션(streaming)
Pod의 로그를 실시간 스트리밍으로 확인한다. 사용자가 취소하기 전까지 계속 로그를 출력한다.
kubectl logs -f <pod-name>
-c 옵션(container)
Pod는 여러개의 container로 구성될 수 있다. -c
옵션은 container를 선택하는 옵션이며, 여러 container가 있고 -c 옵션이 없다면 첫 번째 container가 기본으로 선택된다.
kubectl logs <pod-name> -c <container-name>
example
hugh@master:~/yaml/logging $ k logs -f event-simulator-pod -c nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh