참고
리소스 관리(request, limit)
NOTE
Pod를 생성할 때 컨테이너가 필요로하는 양(Request)과 사용할 수 있는 양(limit)의 엄격한 제한을 지정할 수 있다!
apiVersion: v1
kind: Pod
metadata:
name: requests-pod
spec:
containers:
- image: busybox
command: ["dd", "if=/dev/zero", "of=/dev/null"]
name: main
resources:
requests: # 컨테이너 리소스 요청
cpu: 200m # cpu 200밀리코어 (1 core : 1000m 또는 1, 200밀리코어는 1/5 core 시간을 의미)
memory: 10Mi # 10Mi 메모리를 요청
YAML
복사
request ⇒ 필요한 양
•
requests는 파드가 실행될 때 최소한으로 필요한 리소스의 양을 정의한다.
•
쿠버네티스는 이 정보를 사용하여 충분한 리소스를 가진 노드에 파드를 배치한다.
apiVersion: v1
kind: Pod
metadata:
name: limited-pod
spec:
containers:
- image: busybox
command: ["dd", "if=/dev/zero", "of=/dev/null"]
name: main
resources:
limits: # 컨테이너의 리소스 제한
cpu: 1 # 최대 CPU 1코어를 사용할 수 있다.
memory: 20Mi # 최대 20Mi 메모리를 사용할 수 있다.
YAML
복사
limits ⇒ 제한된 양
•
limits는 파드가 사용할 수 있는 리소스의 최대량을 정의한다.
•
쿠버네티스는 limits를 초과해서 사용하려하면 파드를 종료시키고 재시작한다.
자원단위
자원 유형 | 단위 |
CPU | m(millicpu) |
Memory | Ti, Gi, Mi, Ki, T, G, M, K |
•
CPU 0.1은 100m과 동일한 기능
•
K, M, G의 단위는 1000씩 증가, Ki, Mi, Gi의 단위는 1024씩 증가한다.
리소스 제한 초과
NOTE
쿠버네티스에서 리소스 제한으로 인해 CPU와 메모리 사용량을 초과하면 어떻게 되는가?
CPU 제한 초과
•
CPU제한을 넘어서는 CPU 사용량을 할당받을 수 없다.
•
즉, 프로세스가 더 많은 CPU 사용량을 요청해도 제한에 의해 사용할 수 없다.
•
컨테이너는 노드의 모든 CPU 코어를 볼 수 있다. 제한되는 것은 CPU의 시간만을 의미하며 제한이 1코어로 설정되도, 여러 코어가 그만큼의 시간을 사용할 수 있다.
메모리 제한 초과
•
메모리의 경우, 할당된 제한보다 더 많은 메모리를 사용하려 하면 OOMKilled 상태로 강제종료된다.
•
컨테이너는 메모리의 경우 직접적으로 제한을 인식못하며, 노드 전체의 메모리를 볼 수 있다. 이는 JVM에서 문제가 될 수 있는데 JVM이 총 메모리를 기준으로 힙 크기를 설정한다.
재시작 정책이 Always, OnFailure로 설정된 경우, 강제 종료된 프로세스는 자동으로 다시 시작된다.
•
이러한 상태가 반복되면 쿠버네티스는 재시작 시간을 늘려가며 이런 상태를 CrashLoopBackOff라고 한다.
•
1번째 실패에는 즉시, 이후로 10초, 20초와 같이 점차 늘어나며 최대 5분까지 대기하게 된다.
네임스페이스 리소스 제한(LimitRange, ResourceQuota)
NOTE
LimitRange, ResourceQuota를 통해 네임스페이스 내의 리소스 사용을 제한할 수 있다!
apiVersion: v1
kind: LimitRange
metadata:
name: simple-limitrange
spec:
limits:
- type: Container
max:
cpu: "1"
memory: "1Gi"
min:
cpu: "100m"
memory: "100Mi"
YAML
복사
POD 생성마다 적용
•
특정 네임스페이스 내에서 파드가 생성될 때 적용될 수 있는 리소스 사용의 최소/최대 및 기본값을 정의한다.
•
네임스페이스 내의 리소스 사용을 제어하여 너무 적거나 많은 리소스 요청을 제한한다.
•
ex) 요청제한 - CPU 1코어, 메모리 1Gi, 최소 요청 - CPU 100m, 메모리 100Mi
apiVersion: v1
kind: ResourceQuota
metadata:
name: simple-quota
spec:
hard:
requests.cpu: "2"
requests.memory: "2Gi"
limits.cpu: "4"
limits.memory: "4Gi"
YAML
복사
네임스페이스 전체 적용
•
네임스페이스 전체 리소스의 사용량에 대한 총량 제한을 설정한다.
•
네임스페이스 내에서 사용하는 리소스 총량을 제한해,하나의 네임스페이스의 리소스 사용이 과도하게 증가하여 다른 네임스페이스에 영향을 끼치는걸 방지한다.
부하에 따라 자동조절하는 HPA
NOTE
사용자가 갑자기 늘어나서 pod가 더이상 감당할 수 없게되는 경우 어떻게 대처하는가? 쿠버네티스는 이런 경우를 대비해 디플로이먼트를 유동적으로 관리하는 HPA를 사용한다.
HPA가 자원을 모니터링하면서 AutoScaling해준다.
k create deploy hpa-hname-pods --image=sysnet4admin/echo-hname
k expose deploy hpa-hname-pods --type=LoadBalancer --name=hpa-hname-svc --port=80
Bash
복사
테스트 pod
# metric-server 설치
k apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
k edit deploy -n kube-system metrics-server # args 값 추가
k top pods # a모니터링 가능해짐
Bash
복사
spec:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls << 추가
YAML
복사
네임스페이스 전체 적용
k edit deployment hpa-hname-pods # 매우적게 할당
k autoscale deploy hpa-hname-pods --min=10 --max=30 --cpu-percent=50 # cpu50이상 쓰면 자동증가
Bash
복사
cpu 사용제한 0.5%
resources:
requests:
cpu: "10m"
limits:
cpu: "50m"
YAML
복사
제한사항