이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

Kubernetes/Monitoring

kubernetes 모니터링 : cAdvisor 란? (cAdvisor분석 version2)

이쿠우우 2024. 9. 5. 21:16
반응형

 

kubernetes kubelet cAdvisor

cAdvisor란?

Container Advisor의 약자로 Google에서 개발한 오픈소스 컨테이너 모니터링 도구.
 

kubelet과 cAdvisor 관계는?

kubernetes cluster의 모든 Node에는 kubelet이 설치되어 있음.
해당 kubelet에는 cAdvisor가 탐재되어 있음.
cAdvisor는 kubelet 바이너리에 통합된 오픈 소스 에이전트로
cAdvisor를 통해서 Node의 자원 사용량을 모니터링하고 컨테이너의 성능을 분석함. 
(Pod 레벨에서는 실행되지 않음)
cAdvisor는 정보를 수집해서 kubelet의 메모리에 올려놓음.
 
아래 예제에서는 
curl 명령을 통해 해당 cAdvisor가 수집한 metrics 정보를 가져오는 것을 알아봄.
 
 

수집하는 metrics 계층

=  System Metrics
instance에서 실행되는 Container의CPU, 메모리, 디스크, 네트워크 사용량 등
그 외에 시스템 이벤트도 모니터링함.
 

수집하는 metrics 정보 확인 링크

 
 

수집한 metrics 정보를 전달하는 방식

=  push 방식
cAdvisor는 수집한 metrics정보를 특정 plugin으로 전달할 수 있음.
 

관련 설정

-storage_driver
 

전달 가능 대상

  • ElasticSearch
  • InfluxDB
  • Kafka
  • Prometheus
  • Redis
  • StatsD
  • stdout
storage_driver를 설정하지 않을 경우 메모리에 임시 저장함
참고
 
 

알면 쓸만한 설정

 

--housekeeping_interval=30s 

minimal update interval for data about containers
cAdvisor가 수집한 메트릭 데이터를 유지하는 시간 간격을 설정하는 옵션.
cAdvisor는 기본적으로 메모리에 메트릭 데이터를 저장하며, 일정 시간이 지나면 이 데이터를 디스크에 저장하고 삭제함.
이렇게 함으로써 cAdvisor는 메트릭 데이터를 지속적으로 유지하면서도 메모리 사용량을 최소화할 수 있음.
 

--max_housekeeping_interval=60s

 

--enable_metrics=app,cpu,disk,diskIO,memory,network,process

수집하는 metrics 정보 설정
활성화 가능 metrics 항목
advtcp,app,cpu,cpuLoad,cpu_topology,cpuset,disk,diskIO,hugetlb,memory,memory_numa,network,oom_event,percpu,perf_event,process,referenced_memory,resctrl,sched,tcp,udp

 

 

--disable_metrics=app,cpu,disk,diskIO,memory,network,process

별도로 옵션을 설정하지 않을 경우 아래와 같은 항목은 default로 disable 되어 제공됨.
해제하고 수집할 경우 매우 방대한 양의 metric 정보를 수집함.
(default advtcp,cpu_topology,cpuset,hugetlb,memory_numa,process,referenced_memory,resctrl,sched,tcp,udp)

 

kubelet의 cadvisor에 설정되어있는 수집 항목 :

  • CpuUsageMetrics
  • MemoryUsageMetrics
  • CpuLoadMetrics
  • DiskIOMetrics
  • NetworkUsageMetrics
  • AppMetrics
  • ProcessMetrics
  • OOMMetrics

 

kubelet의 cAdvisor 특징 분석

아래와 같은 이유로 일반적인 cAdvisor로 실행하는 경우와
kubelet에서 실행되고 있는 cAdvisor의 경우 차이점이 있을 수 있음.
 

1. TCP, UDP total 정보를 확인할 수 없음.

기본적으로 kubelet에 내장되어있는 cAdvisor에서
container_network_tcp_usage_total , udp 에 대한 정보를 확인할 수가 없었는데
그 이유는 kubelet에서 사용하는 cAdvisor의 경우 해당 정보 조회 옵션이 default 로 disable 이기 때문임.
tcp,udp 정보를 조회하게 되면 data양이 굉장히 많아져서 각 worker node에 리소스 과부하가 올 수 있음
반드시 resource 설정으로 리소스 사용량을 제한해야함.
그래서 kubelet의 cAdvisor의 경우 해당 옵션이 비활성화 되어있음.
 

2. 네트워크 통신 정보의 경우 Pod 내부에 있는 container간의 통신 정보는 확인할 수 없음.

테스트로 한개의 1개의 Pod를 생성했고
해당 Pod안에는 mysql, tomcat 2개의 container가 생성했지만
각 container에 해당하는 network 정보는 없고
Pause Container의 Network 정보만 있음
즉 Pod network 정보만 있음
Pod 내부의 container 간 통신에 대한 정보는 알 수 없음
 

3. Metrics-Server는 왜 kubelet의 cAdvisor정보를 /metrics로 모두 가져오는게 아니라 /stat/summary 정보만 가져올까?

Metrics-Server 코드를 분석해보면 /stat/summary request로 요약정보만 가져오고
그 중 cpu, memory 정보만 kubelet으로 보냄.
그 이유는 cAdvisor 에서 모든 정보를 가져오게되면 대량의 log로 인해 과부하가 발생할 수 있기때문.
(참고)
 
 

4. 그렇다면 사용자가 직접 cAdvisor배포하고 수집하는 자료 중 특정항목을 disabled 시키고 원하는 정보만 수집하면 되지 않나?

cAdvisor의 -disable_metrics flag를 사용해도 일부 metrics만 제외시킬 수 있음.
실제로 -disable_metrics flag에 disk, network, tcp, udp, sched, process, advtcp, hugetlb 옵션을 모두 적용하고 
test 해본 결과 그래도 상당량의 metrics 정보를 생성하고 있음.
그로 인해 기본적인 metrics정보만 수집하더라도 과부하가 발생할 수 있음.
cAdvisor 공식 page에서 패치 note를 보면 verison이 증가할 때 마다 
disable_metrics 옵션을 추가하고 있는데 
왜 애초에 모든 metrics정보를 추가해주지 않는건지는 의문임.
(참고)
 
 

5. kubelet의 cAdvisor는 왜 tcp, udp 정보를 수집하지 않도록 설정했을까?

/stat/summary 결과를 보면 network 트래픽 사용량 정보만 조회할 수 있고
pod안에 생성된 container의 tcp, udp 정보는 조회할 수 없음
이 또한 과부하를 고려해서 설정해놓은것이라고 함.
 

kubelet의 cAdvisor가 수집한 metrics 정보 확인하는 방법

 

방법 1 : 인증서로 kubelet 인증

인증서로 kubelet https 인증.
apiserver-kubelet-client.crt, key 파일을 사용해서 kubelet에 접근
curl https://localhost:10250/metrics -k --cert /etc/kubernetes/pki/apiserver-kubelet-client.crt --key /etc/kubernetes/pki/apiserver-kubelet-client.key

 

curl https://localhost:10250/stats/summary -k --cert /etc/kubernetes/pki/apiserver-kubelet-client.crt --key /etc/kubernetes/pki/apiserver-kubelet-client.key

 

방법 2 : Token으로 kubelet 인증

별도 SA를 생성해서 token으로 kubelet https 인증
 
[주의] : kubernetes v1.24 이상 부터는 SA 생성 시 secret 이 자동 생성되지 않음.
 
[SA생성 명령어]
kubectl create sa kubelet-api-test
kubectl create clusterrolebinding kubelet-api-test --clusterrole=system:kubelet-api-admin --serviceaccount=default:kubelet-api-test
SECRET=$(kubectl get secrets | grep kubelet-api-test | awk '{print $1}')
TOKEN=$(kubectl describe secret ${SECRET} | grep -E '^token' | awk '{print $2}')
echo ${TOKEN}

 

 

[SA Token을 사용한 curl 예시]
curl -Ssk --header "Authorization: Bearer ${TOKEN}" https://10.0.2.4:10250/metrics
curl -Ssk --header "Authorization: Bearer ${TOKEN}" https://10.0.2.4:10250/stats/summary

 

수집한 metrics 정보 확인

cAdvisor /stats/summary 정보 조회 (요약 정보)

curl -Ssk --header "Authorization: Bearer ${TOKEN}" https://10.0.2.4:10250/stats/summary

 

stat/summary 정보 중 cpu와 memory 정보만 조회하고 싶은 경우는?

url에 사용자쿼리(querystring)를 사용해서 
 ?only_cpu_and_memory=true를 붙여주면 됨.
curl -Ssk --header "Authorization: Bearer ${TOKEN}" https://10.0.2.4:10250/stats/summary?only_cpu_and_memory=true

 

 

 

cAdvisor container로 배포 해서 확인 하는 방법(storage driver = local)

nerdctl run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:rw \
  --volume=/sys:/sys:ro \
  --network host \
  --detach=true \
  --name=cadvisor \
  --privileged \
  gcr.io/cadvisor/cadvisor:v0.47.0 \
  --port=8080 \
  --enable_metrics=cpu,cpuLoad,cpu_topology,memory,memory_numa
배포 이후 localhost:8080으로 확인해보면 아래와 같은 default 사이트 나오면서 metrics 정보 확인 가능.

반응형