Logging
- 기본 로그 관리 - kubectl logs
- Pod 내 모든 컨테이너의 로그가 조회 가능하지만 Pod가 삭제되면 해당 로그도 삭제된다.
# 특정 컨테이너 로그 조회
$ kubectl logs my-pod -c my-container
# 모든 컨테이너의 로그 조회
$ kubectl logs my-pod --all-contaiers=true
# 실시간 log stream 확인 (-f)
$ kubectl logs -f my-pod
- Multiple container의 경우 특정 container name을 명시
$ kubectl logs -f <pod_name> <container_name>
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
webapp-2 2/2 Running 0 2m18s # 2개의 container 존재
$ kubectl logs webapp-2 simple-webapp
[2025-01-07 12:47:53,499] INFO in event-simulator: USER2 is viewing page2
[2025-01-07 12:47:54,499] INFO in event-simulator: USER2 logged in
[2025-01-07 12:47:55,500] INFO in event-simulator: USER1 logged in
[2025-01-07 12:47:56,502] INFO in event-simulator: USER3 is viewing page1
[2025-01-07 12:47:57,502] INFO in event-simulator: USER4 is viewing page1
[2025-01-07 12:47:58,504] WARNING in event-simulator: USER5 Failed to Login as the account is locked due to MANY FAILED ATTEMPTS.
[2025-01-07 12:47:58,504] INFO in event-simulator: USER4 is viewing page2
[2025-01-07 12:47:59,505] INFO in event-simulator: USER3 logged in
[2025-01-07 12:48:00,506] INFO in event-simulator: USER3 logged out
[2025-01-07 12:48:01,507] WARNING in event-simulator: USER30 Order failed as the item is OUT OF STOCK.
# Pod가 재시작되었을 때 이전 컨테이너의 로그 조회(--previous 또는 -p)
$ kubectl logs webapp-2 simple-webapp --previous
- 표준 출력(STDOUT) - 정상 동작을 하면서 생성하는 출력 스트림
# 실시간 로그 확인
controlplane ~ ➜ kubectl get pods
NAME READY STATUS RESTARTS AGE
webapp-1 1/1 Running 0 79s
controlplane ~ ➜ kubectl logs -f webapp-1
[2024-04-26 06:42:27,701] INFO in event-simulator: USER3 is viewing page1
[2024-04-26 06:42:28,702] INFO in event-simulator: USER4 is viewing page3
[2024-04-26 06:42:29,704] INFO in event-simulator: USER2 logged out
[2024-04-26 06:42:30,705] INFO in event-simulator: USER1 is viewing page2
[2024-04-26 06:42:31,706] INFO in event-simulator: USER4 is viewing page1
[2024-04-26 06:42:32,708] WARNING in event-simulator: USER5 Failed to Login as the account is locked due to MANY FAILED ATTEMPTS.
[2024-04-26 06:42:32,708] INFO in event-simulator: USER1 is viewing page3
[2024-04-26 06:42:33,709] INFO in event-simulator: USER4 is viewing page3
controlplane ~ ➜ kubectl get pods
NAME READY STATUS RESTARTS AGE
webapp-1 1/1 Running 0 5m42s
webapp-2 2/2 Running 0 3m33s
# webapp-2와 같이 multiple container라면, 어떤 contianer를 사용할 지 명시해주어야 한다.
controlplane ~ ➜ kubectl logs webapp-2 simple-webapp
- 표준 에러(STDERR) - 컨테이너가 오류나 경고 메시지 출력시에 사용되는 스트림
- --previous 옵션을 사용하면, 이전에 종료된 컨테이너의 로그를 조회 가능
→ 이 기능을 통해 컨테이너 충돌(CrashLoopBackOff) 문제를 분석 가능하다.
- --previous 옵션을 사용하면, 이전에 종료된 컨테이너의 로그를 조회 가능
controlplane:~$ kubectl logs my-pod -c my-container --previous
[ERROR] Database connection failed: timeout
[ERROR] Unable to locate configuration file
Monitoring
📑 Pod 상태 기반 로그 분석
Running | 정상 실행 중 | kubectl logs -f <pod> |
Pending | 스케줄링 대기 중 | kubectl describe pod <pod> |
CrashLoopBackOff | 컨테이너 반복 충돌 | kubectl logs --previous <pod> |
Completed | 정상 종료됨 | kubectl logs <pod> |
📑 Metrics Server
우리는 node-level metrics를 모니터링해야 할 필요가 있다.
ex) number of nodes in the cluster, how many nodes are healthy, resource perfomance..
쿠버네티스는 built-in 된 monitoring solution을 제공하지 않는 대신, Metrics server, Prometheus, Elastic Stack과 같은 open source 들이 제공된다.
Metrics Server ? Kubernetes 클러스터에서 리소스 사용량 데이터(메트릭)를 수집하고 API로 제공하는 경량화된 구성 요소
- CPU, 메모리 사용량 등의 실시간 메트릭을 제공
- API 경로: /apis/metrics.k8s.io/
- metrics-server는 별도의 add-on으로 설치해야 한다.
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
- Metrics Server는 단순히 실시간 데이터를 제공하기 때문에, 장기 데이터를 수집하거나 상세 모니터링이 필요하면 Prometheus, Grafana, Loki 같은 별도의 모니터링/로깅 솔루션을 사용하는 것이 적합하다.
Heapster (구버전)
Kubernetes의 초기 메트릭 수집 도구
- 확장성이 낮고 복잡하며, 자원 소모가 많아 단순 모니터링용으로 적합하지 않다.
- 외부 저장소 필요 (InfluxDB 등)
☞ Kubernetes 1.11부터 공식적으로 폐기
[실습 - Metrics Server]
K8S cluster당 하나의 Metrics server를 가지고 있다.
kubernetes-metrics-server를 clone받고, top 명령으로 확인해준다.
# metrics-server deploy하기.
# CKA 강의에서 실습하기 위해 만들어진 코드로 실제 환경(Production Usecase)에서는 적합하지 않다.
$ git clone https://github.com/kodekloudhub/kubernetes-metrics-server.git
Cloning into 'kubernetes-metrics-server'...
remote: Enumerating objects: 31, done.
remote: Counting objects: 100% (19/19), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 31 (delta 8), reused 0 (delta 0), pack-reused 12
Receiving objects: 100% (31/31), 8.08 KiB | 8.08 MiB/s, done.
Resolving deltas: 100% (10/10), done.
$ cd kubernetes-metrics-server/
controlplane ~ ➜ git clone https://github.com/kodekloudhub/kubernetes-metrics-server.git
Cloning into 'kubernetes-metrics-server'...
remote: Enumerating objects: 31, done.
remote: Counting objects: 100% (19/19), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 31 (delta 8), reused 0 (delta 0), pack-reused 12
Receiving objects: 100% (31/31), 8.08 KiB | 8.08 MiB/s, done.
Resolving deltas: 100% (10/10), done.
controlplane ~ ➜ 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
controlplane ~ ➜ cd kubernetes-metrics-server/
kubernetes-metrics-server/ $ ls
aggregated-metrics-reader.yaml metrics-server-deployment.yaml
auth-delegator.yaml metrics-server-service.yaml
auth-reader.yaml README.md
metrics-apiservice.yaml resource-reader.yaml
kubernetes-metrics-server/ $ kubectl create -f .
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
serviceaccount/metrics-server created
deployment.apps/metrics-server created
service/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
# 아니면 하기 command 실행
kubernetes-metrics-server/ $ kubectl create -f .
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
serviceaccount/metrics-server created
deployment.apps/metrics-server created
service/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
controlplane kubernetes-metrics-server/ $ ls
aggregated-metrics-reader.yaml metrics-server-deployment.yaml
auth-delegator.yaml metrics-server-service.yaml
auth-reader.yaml README.md
metrics-apiservice.yaml resource-reader.yaml
⭐ CPU / Memory 확인하기
$ kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
controlplane 239m 0% 1107Mi 0%
node01 24m 0% 283Mi 0%
$ kubectl top pod
NAME CPU(cores) MEMORY(bytes)
elephant 14m 32Mi
lion 1m 17Mi
rabbit 99m 252Mi
$ kubectl top pods --sort-by=memory
⭐ Sidecar container
Kubernetes에서 emptyDir 볼륨은 여러 컨테이너가 데이터를 공유할 때 유용하다.
→ 공통 저장소 역할을 하면서, 컨테이너 간 데이터 교환을 가능하게 함
사이드카(Sidecar) 패턴은 하나의 애플리케이션을 보조하는 추가 컨테이너를 함께 배포하는 방식으로, 주 컨테이너(Main Container)가 있고, 이를 보조하는 사이드카 컨테이너(Sidecar Container)가 같이 실행된다.
사이드카 컨테이너의 역할?
- 로그 수집 → 메인 컨테이너의 로그를 수집하여 외부 저장소로 전달
- 데이터 변환 → 메인 컨테이너의 데이터를 가공 후 저장
- 프록시 역할 → 네트워크 트래픽을 가로채어 보안, 캐싱 처리
- 백업 & 복구 → 특정 디렉터리를 지속적으로 저장 또는 백업
[ 예제 ]
apiVersion: v1
kind: Pod
metadata:
name: sidecar-pod
spec:
volumes:
- name: shared-logs
emptyDir: {} # 컨테이너 간 공유되는 볼륨 (임시 저장소)
containers:
- name: app-container # 애플리케이션 실행 및 로그 생성
image: busybox:1.31.1
command: ["/bin/sh", "-c"]
args:
- while true; do echo "$(date) Application log" >> /logs/app.log; sleep 5; done
volumeMounts:
- mountPath: /logs
name: shared-logs # emptyDir 볼륨을 마운트하여 로그 저장
- name: log-collector # 로그를 emptyDir에서 읽어 외부로 전송
image: busybox:1.31.1
command: ["/bin/sh", "-c"]
args:
- while true; do cat /logs/app.log; sleep 5; done
volumeMounts:
- mountPath: /logs
name: shared-logs # 동일한 emptyDir 볼륨을 마운트하여 로그 읽기
반응형
'Container > Kubernetes' 카테고리의 다른 글
[K8S] Multiple Container (0) | 2024.04.28 |
---|---|
[K8S] Cluster Upgrade (0) | 2024.04.26 |
[K8S] kube-scheduler (0) | 2024.04.25 |
[K8S] ETCD Backup 및 Restore (0) | 2024.04.21 |
[K8S] CoreDNS (0) | 2024.04.21 |