Search
Duplicate
📒

[Kubernetes Infra] 02-5. 리소스 제한, 오토스케일링

상태
완료
수업
Kubernetes Infra
주제
4 more properties
참고

리소스 관리(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
metrics-server
kubernetes-sigs
# 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
복사
제한사항