<๋ค์์คํ์ด์ค ์ ์ฑ >
์ปจํ ์ด๋ ๋ฆฌ์์ค - ์ปจํ ์ด๋ ๋ฆฌ์์ค ์ ์ฝ ์กฐ๊ฑด
Limit Ranges - ํ๋ ๋ฆฌ์์ค ์ ์ฝ ์กฐ๊ฑด<๋ค์์คํ์ด์ค ์์ฒด ์ ํ>
ResourceQuata - ๋ค์์คํ์ด์ค ๋ฆฌ์์ค ์ ์ฝ ์กฐ๊ฑด๋ฆฌ์์ค ์ ํ์ ํตํด ํ๋, ์ปจํ ์ด๋ ๋ฑ์ด ์ฌ์ฉํ ๋ฆฌ์์ค ๋ฒ์๋ฅผ ์ ์ ํ๊ฒ ์ค์ ํ๋๋ก ์ง์ํ๋ ์ ์ฑ
https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
!!!์ปจํ ์ด๋ ๋ณ ์ ํ์กฐ๊ฑด!!!
ํฌ๋์ ๋ณผ๋ฅจ ์ ํ์ด ์กด์ฌํ๊ธด ํ๋, ์ปจํ ์ด๋ ์์ฒด์ ๋ณผ๋ฅจ ์ ํ์ ๋ฑํ ์์.
ํ๋๊ฐ ์คํ ์ค์ธ ๋ ธ๋์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฆฌ์์ค๊ฐ ์ถฉ๋ถํ๋ฉด, ์ปจํ ์ด๋๊ฐ ํด๋น ๋ฆฌ์์ค์ ์ง์ ํ request ๋ณด๋ค ๋ ๋ง์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ์ฉ๋๋ค. ๊ทธ๋ฌ๋, ์ปจํ ์ด๋๋ ๋ฆฌ์์ค limit ๋ณด๋ค ๋ ๋ง์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
์๋ฅผ ๋ค์ด, ์ปจํ ์ด๋์ ๋ํด 256MiB์ memory ์์ฒญ์ ์ค์ ํ๊ณ , ํด๋น ์ปจํ ์ด๋๊ฐ 8GiB์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง ๋ ธ๋๋ก ์ค์ผ์ค๋ ํ๋์ ์๊ณ ๋ค๋ฅธ ํ๋๋ ์๋ ๊ฒฝ์ฐ, ์ปจํ ์ด๋๋ ๋ ๋ง์ RAM์ ์ฌ์ฉํ ์ ์๋ค.
ํด๋น ์ปจํ ์ด๋์ ๋ํด 4GiB์ memory ์ ํ์ ์ค์ ํ๋ฉด, kubelet(๊ทธ๋ฆฌ๊ณ ์ปจํ ์ด๋ ๋ฐํ์)์ด ์ ํ์ ์ ์ฉํ๋ค. ๋ฐํ์์ ์ปจํ ์ด๋๊ฐ ๊ตฌ์ฑ๋ ๋ฆฌ์์ค ์ ํ์ ์ด๊ณผํ์ฌ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ํ๋ค. ์๋ฅผ ๋ค์ด, ์ปจํ ์ด๋์ ํ๋ก์ธ์ค๊ฐ ํ์ฉ๋ ์๋ณด๋ค ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด, ์์คํ ์ปค๋์ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ(out of memory, OOM) ์ค๋ฅ์ ํจ๊ป ํ ๋น์ ์๋ํ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๋ค.
์ ํ์ ๋ฐ์์ (์์คํ ์ด ์๋ฐ์ ๊ฐ์งํ ํ์ ๊ฐ์ )์ผ๋ก ๋๋ ๊ฐ์ ์ (์์คํ ์ด ์ปจํ ์ด๋๊ฐ ์ ํ์ ์ด๊ณผํ์ง ์๋๋ก ๋ฐฉ์ง)์ผ๋ก ๊ตฌํํ ์ ์๋ค. ๋ฐํ์๋ง๋ค ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋์ผํ ์ ์ฝ์ ๊ตฌํํ ์ ์๋ค.
- ์์ฒญ ์ ํ์ด ์์ ๊ฒฝ์ฐ ๋ฆฌ์์ค ์ ํ์ ๋ณต์ฌํ์ฌ ์์ฒญ ๊ฐ์ ์ฌ์ฉํจ.
hugepages-*
spec.containers[].resources.limits.cpu
spec.containers[].resources.limits.memory
spec.containers[].resources.limits.hugepages-<size>
spec.containers[].resources.requests.cpu
spec.containers[].resources.requests.memory
spec.containers[].resources.requests.hugepages-<size>
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: app
image: images.my-company.example/app:v4
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- name: log-aggregator
image: images.my-company.example/log-aggregator:v6
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
kubectl top pod
-> heapster๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํจ
https://kubernetes.io/docs/concepts/policy/limit-range/
!!!ํฌ๋๋ณ ์ ์ฝ์กฐ๊ฑด!!!
- ์ฟ ๋ฒ๋คํฐ์ค์ ๋ฆฌ์์ค ์ฟผํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋ฌ์คํฐ ๊ด๋ฆฌ์(๋๋ ํด๋ฌ์คํฐ ์คํผ๋ ์ดํฐ ๋ผ๊ณ ํจ)๋ ๋ค์์คํ์ด์ค๋ณ๋ก ๋ฆฌ์์ค(CPU ์๊ฐ, ๋ฉ๋ชจ๋ฆฌ ๋ฐ ํผ์์คํดํธ ์คํ ๋ฆฌ์ง) ์ฌ์ฉ๊ณผ ์์ฑ์ ์ ํํ ์ ์๋ค.
- ๋ค์์คํ์ด์ค ๋ด์์ ํ๋๋ ๋ค์์คํ์ด์ค์ ๋ฆฌ์์ค ์ฟผํฐ์ ์ ์๋ ๋งํผ์ CPU์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Limit Range : ๋ค์์คํ์ด์ค์ ๊ฐ ์ ์ฉ ๊ฐ๋ฅํ ์ค๋ธ์ ํธ ์ข
๋ฅ์ ๋ํด ์ง์ ํ ์ ์๋ ๋ฆฌ์์คํ ๋น์ ์ ํํ๋ ์ ์ฑ
-> ์ค๋ธ์ ํธ ์ข
๋ฅ: ํ๋, PVC | ๋ฆฌ์์คํ ๋น (์ ํ/์์ฒญ)
๊ด๋ฆฌ์๋ ๋ค์์คํ์ด์ค์ ๋ฆฌ๋ฐ๋ ์ธ์ง๋ฅผ ์์ฑํ๋ค.
์ฌ์ฉ์๋ ํด๋น ๋ค์์คํ์ด์ค์์ ํ๋ ๋๋ ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์๊ณผ ๊ฐ์ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๊ฑฐ๋ ์์ฑํ๋ ค๊ณ ์๋ํ๋ค.
์ฒซ์งธ, LimitRange ์ด๋๋ฏธ์ ์ปจํธ๋กค๋ฌ๋ ์ปดํจํ ๋ฆฌ์์ค ์๊ตฌ์ฌํญ์ ์ค์ ํ์ง ์์ ๋ชจ๋ ํ๋(๋ฐ ํด๋น ์ปจํ ์ด๋)์ ๋ํด ๊ธฐ๋ณธ ์์ฒญ ๋ฐ ์ ํ ๊ฐ์ ์ ์ฉํ๋ค.
๋์งธ, LimitRange๋ ์ฌ์ฉ๋์ ์ถ์ ํ์ฌ ๋ค์์คํ์ด์ค์ ์กด์ฌํ๋ LimitRange์ ์ ์๋ ๋ฆฌ์์ค ์ต์, ์ต๋ ๋ฐ ๋น์จ์ ์ด๊ณผํ์ง ์๋์ง ํ์ธํ๋ค.
๋ฆฌ๋ฐ๋ ์ธ์ง ์ ์ฝ ์กฐ๊ฑด์ ์๋ฐํ๋ ๋ฆฌ์์ค(ํ๋, ์ปจํ ์ด๋, ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์)๋ฅผ ์์ฑํ๊ฑฐ๋ ์ ๋ฐ์ดํธํ๋ ค๊ณ ํ๋ ๊ฒฝ์ฐ HTTP ์ํ ์ฝ๋ 403 FORBIDDEN ๋ฐ ์๋ฐ๋ ์ ์ฝ ์กฐ๊ฑด์ ์ค๋ช ํ๋ ๋ฉ์์ง์ ํจ๊ป API ์๋ฒ์ ๋ํ ์์ฒญ์ด ์คํจํ๋ค.
cpu, memory์ ๊ฐ์ ์ปดํจํ ๋ฆฌ์์ค์ ๋ค์์คํ์ด์ค์์ ๋ฆฌ๋ฐ๋ ์ธ์ง๋ฅผ ์ถ๊ฐํ ๊ฒฝ์ฐ ์ฌ์ฉ์๋ ํด๋น ๊ฐ์ ๋ํ ์์ฒญ ๋๋ ์ ํ์ ์ง์ ํด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์คํ ์์ ํ๋ ์์ฑ์ด ๊ฑฐ๋ถ๋ ์ ์๋ค.
LimitRange ์ ํจ์ฑ ๊ฒ์ฌ๋ ์คํ ์ค์ธ ํ๋๊ฐ ์๋ ํ๋ ์ด๋๋ฏธ์ ๋จ๊ณ์์๋ง ์ํ๋๋ค. ๋ฆฌ๋ฐ๋ ์ธ์ง๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ์์ ๋๋ฉด, ํด๋น ๋ค์์คํ์ด์ค์ ์ด๋ฏธ ์กด์ฌํ๋ ํ๋๋ ๋ณ๊ฒฝ๋์ง ์๊ณ ๊ณ์ ์ ์ง๋๋ค. (admissiont:๊ฐ์ )
๋ค์์คํ์ด์ค์ ๋ ๊ฐ ์ด์์ LimitRange ์ค๋ธ์ ํธ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ, ์ด๋ค ๊ธฐ๋ณธ๊ฐ์ด ์ ์ฉ๋ ์ง๋ ๊ฒฐ์ ์ ์ด์ง ์๋ค.
concepts/policy/limit-range/problematic-limit-range.yaml
apiVersion: v1 kind: LimitRange metadata: name: cpu-resource-constraint spec: limits: - default: # this section defines default limits cpu: 500m defaultRequest: # this section defines default requests cpu: 500m max: # max and min define the limit range cpu: "1" min: cpu: 100m type: Container
-type: PersistentVolumeClaim ์ ํตํด pvc์ ๋ํ ์ ์ฝ๋ ์ถ๊ฐ ๊ฐ๋ฅ
concepts/policy/limit-range/example-conflict-with-limitrange-cpu.yaml
apiVersion: v1 kind: Pod metadata: name: example-conflict-with-limitrange-cpu spec: containers: - name: demo image: registry.k8s.io/pause:2.0 resources: requests: cpu: 700m
ํด๋น ํ๋ ์คํ์ ์๋ ์ค๋ฅ ๋ฐ์
Pod "example-conflict-with-limitrange-cpu" is invalid: spec.containers[0].resources.requests: Invalid value: "700m": must be less than or equal to cpu limit
concepts/policy/limit-range/example-no-conflict-with-limitrange-cpu.yaml
apiVersion: v1 kind: Pod metadata: name: example-no-conflict-with-limitrange-cpu spec: containers: - name: demo image: registry.k8s.io/pause:2.0 resources: requests: cpu: 700m limits: cpu: 700m
request, limit ๋ชจ๋ ์ค์ ์ ๋์ผํ LimitRange ์ ์ฉ๋๋ ํ๋ ์ค์ผ์ค๋ง ์ฑ๊ณต
https://kubernetes.io/docs/concepts/policy/resource-quotas/
์ฌ๋ฌ ์ฌ์ฉ์๋ ํ์ด ์ ํด์ง ์์ ๋
ธ๋๋ก ํด๋ฌ์คํฐ๋ฅผ ๊ณต์ ํ ๋ ํ ํ์ด ๊ณต์ ํ๊ฒ ๋ถ๋ฐฐ๋ ๋ฆฌ์์ค๋ณด๋ค ๋ง์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋๊ตฌ
!!!๋ค์์คํ์ด์ค๋ณ ์ ์ฝ ์กฐ๊ฑด!!!
์ ํ๋ณ๋ก ๋ค์์คํ์ด์ค์์ ๋ง๋ค ์ ์๋ ์ค๋ธ์ ํธ ์์ ํด๋น ๋ค์์คํ์ด์ค์ ๋ฆฌ์์ค๊ฐ ์ฌ์ฉํ ์ ์๋ ์ด ์ปดํจํธ ๋ฆฌ์์ค์ ์์ ์ ํํ ์ ์๋ค.
๋ค๋ฅธ ํ์ ๋ค๋ฅธ ๋ค์์คํ์ด์ค์์ ์์ ํ๋ค. ์ด๊ฒ์ RBAC์ผ๋ก ์ค์ ํ ์ ์๋ค.
๊ด๋ฆฌ์๋ ๊ฐ ๋ค์์คํ์ด์ค์ ๋ํด ํ๋์ ๋ฆฌ์์ค์ฟผํฐ๋ฅผ ์์ฑํ๋ค.
์ฌ์ฉ์๋ ๋ค์์คํ์ด์ค์์ ๋ฆฌ์์ค(ํ๋, ์๋น์ค ๋ฑ)๋ฅผ ์์ฑํ๊ณ ์ฟผํฐ ์์คํ ์ ์ฌ์ฉ๋์ ์ถ์ ํ์ฌ ๋ฆฌ์์ค์ฟผํฐ์ ์ ์๋ ํ๋(hard) ๋ฆฌ์์ค ์ ํ์ ์ด๊ณผํ์ง ์๋๋ก ํ๋ค.
๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ฑฐ๋ ์ ๋ฐ์ดํธํ ๋ ์ฟผํฐ ์ ์ฝ ์กฐ๊ฑด์ ์๋ฐํ๋ฉด ์๋ฐ๋ ์ ์ฝ ์กฐ๊ฑด์ ์ค๋ช ํ๋ ๋ฉ์์ง์ ํจ๊ป HTTP ์ํ ์ฝ๋ 403 FORBIDDEN์ผ๋ก ์์ฒญ์ด ์คํจํ๋ค.
cpu, memory์ ๊ฐ์ ์ปดํจํธ ๋ฆฌ์์ค์ ๋ํด ๋ค์์คํ์ด์ค์์ ์ฟผํฐ๊ฐ ํ์ฑํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ์๋ ํด๋น๊ฐ์ ๋ํ ์์ฒญ ๋๋ ์ ํ์ ์ง์ ํด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฟผํฐ ์์คํ
์ด ํ๋ ์์ฑ์ ๊ฑฐ๋ถํ ์ ์๋ค. -> ์ปจํ
์ด๋์ CPU, ๋ฉ๋ชจ๋ฆฌ ์ต์ ์๊ตฌ์ฌํญ ์ ํ ์ค์ ํ์
(์ปดํจํธ ๋ฆฌ์์ค ์๊ตฌ ์ฌํญ์ด ์๋ ํ๋๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ๋ ค๋ฉด LimitRanger ์ด๋๋ฏธ์
์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ์.)
https://kubernetes.io/ko/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
kubectl create namespace quota-mem-cpu-example
kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu.yaml --namespace=quota-mem-cpu-example
kubectl describe resourcequotas -n quota-mem-cpu-example
admin/resource/quota-mem-cpu-pod.yaml
apiVersion: v1 kind: Pod metadata: name: quota-mem-cpu-demo spec: containers: - name: quota-mem-cpu-demo-ctr image: nginx resources: limits: memory: "800Mi" cpu: "800m" requests: memory: "600Mi" cpu: "400m"
kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu-pod.yaml --namespace=quota-mem-cpu-example
kubectl get pod quota-mem-cpu-demo --namespace=quota-mem-cpu-example
admin/resource/quota-mem-cpu-pod-2.yaml
apiVersion: v1 kind: Pod metadata: name: quota-mem-cpu-demo-2 spec: containers: - name: quota-mem-cpu-demo-2-ctr image: redis resources: limits: memory: "1Gi" cpu: "800m" requests: memory: "700Mi" cpu: "400m"
kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu-pod-2.yaml --namespace=quota-mem-cpu-example
- ์๋ฌ๋ฐ์
- ๋ ๋ฒ์งธ ํ๋๋ฅผ ์์ฑํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์์ฒญ๋์ ์ด ํฉ๊ณ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์์ฒญ๋ ์ฟผํฐ๋ฅผ ์ด๊ณผํจ์ ๋ณด์ฌ์ค๋ค.
Error from server (Forbidden): error when creating "https://k8s.io/examples/admin/resource/quota-mem-cpu-pod-2.yaml": pods "quota-mem-cpu-demo-2" is forbidden: exceeded quota: mem-cpu-demo, requested: requests.memory=700Mi, used: requests.memory=600Mi, limited: requests.memory=1Gi