Information in this document may be out of date
This document has an older update date than the original, so the information it contains may be out of date. If you're able to read English, see the English version for the most up-to-date information: Resource metrics pipeline
๋ฆฌ์์ค ๋ฉํธ๋ฆญ ํ์ดํ๋ผ์ธ
์ฟ ๋ฒ๋คํฐ์ค์์, ๋ฉํธ๋ฆญ API(Metrics API) ๋ ์๋ ์ค์ผ์ผ๋ง ๋ฐ ๋น์ทํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ง์ํ๊ธฐ ์ํ ๊ธฐ๋ณธ์ ์ธ ๋ฉํธ๋ฆญ ์งํฉ์ ์ ๊ณตํ๋ค. ์ด API๋ ๋ ธ๋์ ํ๋์ ๋ฆฌ์์ค ์ฌ์ฉ๋ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ฌ๊ธฐ์๋ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋ฉํธ๋ฆญ์ด ํฌํจ๋๋ค. ๋ฉํธ๋ฆญ API๋ฅผ ํด๋ฌ์คํฐ์ ๋ฐฐํฌํ๋ฉด, ์ฟ ๋ฒ๋คํฐ์ค API์ ํด๋ผ์ด์ธํธ๋ ์ด ์ ๋ณด์ ๋ํด ์ง์ํ ์ ์์ผ๋ฉฐ, ์ง์ ๊ถํ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฟ ๋ฒ๋คํฐ์ค์ ์ ๊ทผ ์ ์ด ๋ฉ์ปค๋์ฆ์ ์ด์ฉํ ์ ์๋ค.
HorizontalPodAutoscaler(HPA) ๋ฐ VerticalPodAutoscaler(VPA)๋ ์ฌ์ฉ์์ ์๊ตฌ ์ฌํญ์ ๋ง์กฑํ ์ ์๋๋ก ์ํฌ๋ก๋ ๋ ํ๋ฆฌ์นด์ ๋ฆฌ์์ค๋ฅผ ์กฐ์ ํ๋ ๋ฐ์ ๋ฉํธ๋ฆญ API์ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ๋ค.
kubectl top
๋ช
๋ น์ ์ด์ฉํ์ฌ
๋ฆฌ์์ค ๋ฉํธ๋ฆญ์ ๋ณผ ์๋ ์๋ค.
์ฐธ๊ณ :
๋ฉํธ๋ฆญ API ๋ฐ ์ด๊ฒ์ด ์ ๊ณตํ๋ ๋ฉํธ๋ฆญ ํ์ดํ๋ผ์ธ์ HPA / VPA ์ ์ํ ์๋ ์ค์ผ์ผ๋ง์ด ๋์ํ๋ ๋ฐ ํ์ํ ์ต์ํ์ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋ฉํธ๋ฆญ๋ง์ ์ ๊ณตํ๋ค. ๋ ๋ง์ ๋ฉํธ๋ฆญ ์งํฉ์ ์ ๊ณตํ๋ ค๋ฉด, ์ปค์คํ ๋ฉํธ๋ฆญ API ๋ฅผ ์ฌ์ฉํ๋ ์ถ๊ฐ ๋ฉํธ๋ฆญ ํ์ดํ๋ผ์ธ์ ๋ฐฐํฌํ์ฌ ๊ธฐ๋ณธ ๋ฉํธ๋ฆญ API๋ฅผ ๋ณด์ถฉํ ์ ์๋ค.๊ทธ๋ฆผ 1์ ๋ฆฌ์์ค ๋ฉํธ๋ฆญ ํ์ดํ๋ผ์ธ์ ์ํคํ ์ฒ๋ฅผ ๋ํ๋ธ๋ค.
] A[Metrics-
Server] subgraph B[๋ ธ๋] direction TB D[cAdvisor] --> C[kubelet] E[์ปจํ ์ด๋
๋ฐํ์] --> D E1[์ปจํ ์ด๋
๋ฐํ์] --> D P[ํ๋ ๋ฐ์ดํฐ] -.- C end L[API
์๋ฒ] W[HPA] C ---->|์์ฝ
API| A -->|๋ฉํธ๋ฆญ
API| L --> W end L ---> K[kubectl
top] classDef box fill:#fff,stroke:#000,stroke-width:1px,color:#000; class W,B,P,K,cluster,D,E,E1 box classDef spacewhite fill:#ffffff,stroke:#fff,stroke-width:0px,color:#000 class S spacewhite classDef k8s fill:#326ce5,stroke:#fff,stroke-width:1px,color:#fff; class A,L,C k8s
๊ทธ๋ฆผ 1. ๋ฆฌ์์ค ๋ฉํธ๋ฆญ ํ์ดํ๋ผ์ธ
๊ทธ๋ฆผ์ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ ์์ผ๋ก, ์ํคํ ์ฒ ๊ตฌ์ฑ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
cAdvisor: kubelet์ ํฌํจ๋ ์ปจํ ์ด๋ ๋ฉํธ๋ฆญ์ ์์ง, ์ง๊ณ, ๋ ธ์ถํ๋ ๋ฐ๋ชฌ
kubelet: ์ปจํ ์ด๋ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ์ํ ๋ ธ๋ ์์ด์ ํธ. ๋ฆฌ์์ค ๋ฉํธ๋ฆญ์ kubelet API ์๋ํฌ์ธํธ
/metrics/resource
๋ฐ/stats
๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผ ๊ฐ๋ฅํ๋ค.์์ฝ API:
/stats
์๋ํฌ์ธํธ๋ฅผ ํตํด ์ฌ์ฉํ ์ ์๋ ๋ ธ๋ ๋ณ ์์ฝ๋ ์ ๋ณด๋ฅผ ํ์ ๋ฐ ์์งํ ์ ์๋๋ก kubelet์ด ์ ๊ณตํ๋ APImetrics-server: ๊ฐ kubelet์ผ๋ก๋ถํฐ ์์งํ ๋ฆฌ์์ค ๋ฉํธ๋ฆญ์ ์์ง ๋ฐ ์ง๊ณํ๋ ํด๋ฌ์คํฐ ์ ๋์จ ๊ตฌ์ฑ ์์. API ์๋ฒ๋ HPA, VPA ๋ฐ
kubectl top
๋ช ๋ น์ด๊ฐ ์ฌ์ฉํ ์ ์๋๋ก ๋ฉํธ๋ฆญ API๋ฅผ ์ ๊ณตํ๋ค. metrics-server๋ ๋ฉํธ๋ฆญ API์ ๋ํ ๊ธฐ์ค ๊ตฌํ(reference implementation) ์ค ํ๋์ด๋ค.๋ฉํธ๋ฆญ API: ์ํฌ๋ก๋ ์คํ ์ค์ผ์ผ๋ง์ ์ฌ์ฉ๋๋ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ ๋ณด๋ก์ ์ ๊ทผ์ ์ง์ํ๋ ์ฟ ๋ฒ๋คํฐ์ค API. ์ด๋ฅผ ํด๋ฌ์คํฐ์์ ์ฌ์ฉํ๋ ค๋ฉด, ๋ฉํธ๋ฆญ API๋ฅผ ์ ๊ณตํ๋ API ํ์ฅ(extension) ์๋ฒ๊ฐ ํ์ํ๋ค.
์ฐธ๊ณ :
cAdvisor๋ cgroups์ผ๋ก๋ถํฐ ๋ฉํธ๋ฆญ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์ง์ํ๋ฉฐ, ๋ฆฌ๋ ์ค์ ์ผ๋ฐ์ ์ธ ์ปจํ ์ด๋ ๋ฐํ์์ ์ด๋ฅผ ์ง์ํ๋ค. ๋ง์ฝ ๋ค๋ฅธ ๋ฆฌ์์ค ๊ฒฉ๋ฆฌ ๋ฉ์ปค๋์ฆ(์: ๊ฐ์ํ)์ ์ฌ์ฉํ๋ ์ปจํ ์ด๋ ๋ฐํ์์ ์ฌ์ฉํ๋ค๋ฉด, kubelet์ด ๋ฉํธ๋ฆญ์ ์ฌ์ฉํ ์ ์๊ธฐ ์ํด์๋ ํด๋น ์ปจํ ์ด๋ ๋ฐํ์์ด CRI ์ปจํ ์ด๋ ๋ฉํธ๋ฆญ์ ์ง์ํด์ผ ํ๋ค.
๋ฉํธ๋ฆญ API
Kubernetes 1.8 [beta]
metrics-server๋ ๋ฉํธ๋ฆญ API์ ๋ํ ๊ตฌํ์ด๋ค. ์ด API๋ ํด๋ฌ์คํฐ ๋ด ๋ ธ๋์ ํ๋์ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ ๋ณด์ ์ ๊ทผํ ์ ์๊ฒ ํด ์ค๋ค. ์ด๊ฒ์ ์ฃผ ์ญํ ์ ๋ฆฌ์์ค ์ฌ์ฉ ๋ฉํธ๋ฆญ์ ์ฟ ๋ฒ๋คํฐ์ค ์คํ ์ค์ผ์ผ๋ฌ ๊ตฌ์ฑ ์์์ ์ ๊ณตํ๋ ๊ฒ์ด๋ค.
๋ค์์ minikube
๋
ธ๋์ ๋ํ ๋ฉํธ๋ฆญ API ์์ฒญ ์์์ด๋ฉฐ
๊ฐ๋
์ฑ ํฅ์์ ์ํด jq
๋ฅผ ํ์ฉํ๋ค.
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes/minikube" | jq '.'
๋ค์์ curl
์ ์ด์ฉํ์ฌ ๋์ผํ API ํธ์ถ์ ํ๋ ๋ช
๋ น์ด๋ค.
curl http://localhost:8080/apis/metrics.k8s.io/v1beta1/nodes/minikube
์๋ต ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
{
"kind": "NodeMetrics",
"apiVersion": "metrics.k8s.io/v1beta1",
"metadata": {
"name": "minikube",
"selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/minikube",
"creationTimestamp": "2022-01-27T18:48:43Z"
},
"timestamp": "2022-01-27T18:48:33Z",
"window": "30s",
"usage": {
"cpu": "487558164n",
"memory": "732212Ki"
}
}
๋ค์์ kube-system
๋ค์์คํ์ด์ค ๋ด์ kube-scheduler-minikube
ํ๋์ ๋ํ
๋ฉํธ๋ฆญ API ์์ฒญ ์์์ด๋ฉฐ ๊ฐ๋
์ฑ ํฅ์์ ์ํด jq
๋ฅผ ํ์ฉํ๋ค.
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods/kube-scheduler-minikube" | jq '.'
๋ค์์ curl
์ ์ด์ฉํ์ฌ ๋์ผํ API ํธ์ถ์ ํ๋ ๋ช
๋ น์ด๋ค.
curl http://localhost:8080/apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods/kube-scheduler-minikube
์๋ต ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
{
"kind": "PodMetrics",
"apiVersion": "metrics.k8s.io/v1beta1",
"metadata": {
"name": "kube-scheduler-minikube",
"namespace": "kube-system",
"selfLink": "/apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods/kube-scheduler-minikube",
"creationTimestamp": "2022-01-27T19:25:00Z"
},
"timestamp": "2022-01-27T19:24:31Z",
"window": "30s",
"containers": [
{
"name": "kube-scheduler",
"usage": {
"cpu": "9559630n",
"memory": "22244Ki"
}
}
]
}
๋ฉํธ๋ฆญ API๋ k8s.io/metrics ์ ์ฅ์์ ์ ์๋์ด ์๋ค.
metrics.k8s.io
API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋
API ์ง๊ณ(aggregation) ๊ณ์ธต์ ํ์ฑํํ๊ณ
APIService๋ฅผ ๋ฑ๋กํด์ผ ํ๋ค.
๋ฉํธ๋ฆญ API์ ๋ํด ๋ ์์๋ณด๋ ค๋ฉด, ๋ฆฌ์์ค ๋ฉํธ๋ฆญ API ๋์์ธ, metrics-server ์ ์ฅ์ ๋ฐ ๋ฆฌ์์ค ๋ฉํธ๋ฆญ API๋ฅผ ์ฐธ๊ณ ํ๋ค.
์ฐธ๊ณ :
๋ฉํธ๋ฆญ API์ ์ ๊ทผํ๋ ค๋ฉด ๋จผ์ ๋ฉํธ๋ฆญ API๋ฅผ ์ ๊ณตํ๋ metrics-server ๋๋ ๋์ฒด ์ด๋ํฐ๋ฅผ ๋ฐฐํฌํด์ผ ํ๋ค.๋ฆฌ์์ค ์ฌ์ฉ๋ ์ธก์
CPU
CPU๋ cpu
๋จ์๋ก ์ธก์ ๋ ํ๊ท ์ฝ์ด ์ฌ์ฉ๋ ํํ๋ก ๋ณด๊ณ ๋๋ค. ์ฟ ๋ฒ๋คํฐ์ค์์ 1 cpu๋
ํด๋ผ์ฐ๋ ์ ๊ณต์์ ๊ฒฝ์ฐ 1 vCPU/์ฝ์ด์ ํด๋นํ๊ณ , ๋ฒ ์ด๋ฉํ ์ธํ
ํ๋ก์ธ์์ ๊ฒฝ์ฐ 1 ํ์ดํผ-์ค๋ ๋์ ํด๋นํ๋ค.
์ด ๊ฐ์ ์ปค๋(Linux ๋ฐ Windows ์ปค๋ ๋ชจ๋)์์ ์ ๊ณตํ๋ ๋์ CPU ์นด์ดํฐ์ ๋ํ
๋น์จ์ ์ทจํ์ฌ ์ป์ด์ง๋ค.
CPU ๊ฐ ๊ณ์ฐ์ ์ฌ์ฉ๋ ํ์ ์๋์ฐ๋ ๋ฉํธ๋ฆญ API์ window
ํ๋์ ํ์๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค๊ฐ ์ด๋ป๊ฒ CPU ๋ฆฌ์์ค๋ฅผ ํ ๋นํ๊ณ ์ธก์ ํ๋์ง ๋ ์์๋ณด๋ ค๋ฉด, CPU์ ์๋ฏธ๋ฅผ ์ฐธ๊ณ ํ๋ค.
๋ฉ๋ชจ๋ฆฌ
๋ฉ๋ชจ๋ฆฌ๋ ๋ฉํธ๋ฆญ์ ์์งํ๋ ์๊ฐ์ ๋ฐ์ดํธ ๋จ์๋ก ์ธก์ ๋ ์ํน ์ (working set) ํํ๋ก ๋ณด๊ณ ๋๋ค.
์ด์์ ์ธ ํ๊ฒฝ์์, "์ํน ์ "์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ์ํ๋๋ผ๋ ํด์ ํ ์ ์๋ ์ฌ์ฉ ์ค์ธ ๋ฉ๋ชจ๋ฆฌ์ ์์ด๋ค. ๊ทธ๋ฌ๋ ์ํน ์ ์ ๊ณ์ฐ ๋ฐฉ๋ฒ์ ํธ์คํธ OS์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ถ์ ์น๋ฅผ ์ถ์ถํ๊ธฐ ์ํด ํด๋ฆฌ์คํฑ์ ๋ง์ด ์ฌ์ฉํ๋ค.
์ปจํ ์ด๋์ ์ํน ์ ์ ๋ํ ์ฟ ๋ฒ๋คํฐ์ค ๋ชจ๋ธ์ ์ปจํ ์ด๋ ๋ฐํ์์ด ํด๋น ์ปจํ ์ด๋์ ์ฐ๊ฒฐ๋ ์ต๋ช (anonymous) ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ์ฐํ ๊ฒ์ผ๋ก ์์ํ๋ค. ํธ์คํธ OS๊ฐ ํญ์ ํ์ด์ง๋ฅผ ํ์ํ ์๋ ์๊ธฐ ๋๋ฌธ์, ์ํน ์ ๋ฉํธ๋ฆญ์๋ ์ผ๋ฐ์ ์ผ๋ก ์ผ๋ถ ์บ์๋ (ํ์ผ ๊ธฐ๋ฐ) ๋ฉ๋ชจ๋ฆฌ๋ ํฌํจ๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค๊ฐ ์ด๋ป๊ฒ ๋ฉ๋ชจ๋ฆฌ ๋ฆฌ์์ค๋ฅผ ํ ๋นํ๊ณ ์ธก์ ํ๋์ง ๋ ์์๋ณด๋ ค๋ฉด, ๋ฉ๋ชจ๋ฆฌ์ ์๋ฏธ๋ฅผ ์ฐธ๊ณ ํ๋ค.
metrics-server
metrics-server๋ kubelet์ผ๋ก๋ถํฐ ๋ฆฌ์์ค ๋ฉํธ๋ฆญ์ ์์งํ๊ณ ,
์ด๋ฅผ HPA(Horizontal Pod Autoscaler) ๋ฐ VPA(Vertical Pod Autoscaler)๊ฐ ํ์ฉํ ์ ์๋๋ก ์ฟ ๋ฒ๋คํฐ์ค API ์๋ฒ ๋ด์์ ๋ฉํธ๋ฆญ API(Metrics API)๋ฅผ ํตํด ๋
ธ์ถํ๋ค.
kubectl top
๋ช
๋ น์ ์ฌ์ฉํ์ฌ ์ด ๋ฉํธ๋ฆญ์ ํ์ธํด๋ณผ ์๋ ์๋ค.
metrics-server๋ ์ฟ ๋ฒ๋คํฐ์ค API๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ฌ์คํฐ์ ๋ ธ๋์ ํ๋๋ฅผ ์ถ์ ํ๋ค. metrics-server๋ ๊ฐ ๋ ธ๋์ HTTP๋ฅผ ํตํด ์ง์ํ์ฌ ๋ฉํธ๋ฆญ์ ์์งํ๋ค. metrics-server๋ ๋ํ ํ๋ ๋ฉํ๋ฐ์ดํฐ์ ๋ด๋ถ์ ๋ทฐ๋ฅผ ์์ฑํ๊ณ , ํ๋ ํฌ์ค(health)์ ๋ํ ์บ์๋ฅผ ์ ์งํ๋ค. ์ด๋ ๊ฒ ์บ์๋ ํ๋ ํฌ์ค ์ ๋ณด๋ metrics-server๊ฐ ์ ๊ณตํ๋ ํ์ฅ API(extension API)๋ฅผ ํตํด ์ด์ฉํ ์ ์๋ค.
HPA ์ง์์ ๋ํ ์์์์, ์๋ฅผ ๋ค์ด HPA ์ง์์ ๋ํ ๊ฒฝ์ฐ, metrics-server๋ ๋ํ๋ก์ด๋จผํธ์ ์ด๋ค ํ๋๊ฐ ๋ ์ด๋ธ ์ ๋ ํฐ ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ํ๋ณํด์ผ ํ๋ค.
metrics-server๋ ๊ฐ ๋ ธ๋๋ก๋ถํฐ ๋ฉํธ๋ฆญ์ ์์งํ๊ธฐ ์ํด kubelet API๋ฅผ ํธ์ถํ๋ค. ์ฌ์ฉ ์ค์ธ metrics-server ๋ฒ์ ์ ๋ฐ๋ผ, ๋ค์์ ์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉํ๋ค.
- v0.6.0 ์ด์: ๋ฉํธ๋ฆญ ๋ฆฌ์์ค ์๋ํฌ์ธํธ
/metrics/resource
- ์ด์ ๋ฒ์ : ์์ฝ API ์๋ํฌ์ธํธ
/stats/summary
๋ค์ ๋ด์ฉ
metrics-server์ ๋ํ ๋ ๋ง์ ์ ๋ณด๋ metrics-server ์ ์ฅ์๋ฅผ ํ์ธํ๋ค.
๋ํ ๋ค์์ ์ฐธ๊ณ ํ ์๋ ์๋ค.
- metrics-server ๋์์ธ
- metrics-server ์์ฃผ ๋ฌป๋ ์ง๋ฌธ
- metrics-server ์๋ ค์ง ์ด์
- metrics-server ๋ฆด๋ฆฌ์ค
- Horizontal Pod Autoscaling
kubelet์ด ์ด๋ป๊ฒ ๋ ธ๋ ๋ฉํธ๋ฆญ์ ์ ๊ณตํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ฟ ๋ฒ๋คํฐ์ค API๋ฅผ ํตํด ์ด๋ฌํ ๋ฉํธ๋ฆญ์ ์ด๋ป๊ฒ ์ ๊ทผํ๋์ง ์์๋ณด๋ ค๋ฉด, ๋ ธ๋ ๋ฉํธ๋ฆญ ๋ฐ์ดํฐ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ๋ค.