일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- MSA
- 쿠버네티스
- decorator 패턴
- ingress
- 머신러닝
- kubernetes
- Stress test
- Kotlin
- spring microservice
- ansible
- devops
- nGrinder
- cloud native java
- 동기화
- Adapter 패턴
- Microservice
- java
- 익명클래스
- 마이크로서비스
- 클라우드 네이티브 자바
- Semaphore
- 클라우드 네이티브
- 헬름
- Spring
- MySQL
- cloud native
- 코틀린
- CRD
- 자바
- Algorithm
- Today
- Total
카샤의 만개시기
쿠버네티스 리소스 관리하기 본문
특정 파드가 너무 많은 리소스를 점유하게 되면 같은 노드에 있는 다른 파드에 영향을 줄 수 있기 때문에 스케줄러는 각 파드가 최대/최소로 사용 가능한 리소스 요구 사항을 파악하고 이에 맞게 효율적으로 스케줄링해야 한다.
리소스 요청
파드를 실행하기 위한 최소 리소스 양을 지정한다.
파드를 실행하기 위한 최소한의 리소스를 가지고 있는 노드가 존재하지 않는다면 여유 용량이 확보될 때까지 대기 상태로 기다린다.
리소스 상한
파드가 사용할 수 있는 최대 리소스 양을 지정한다.
파드가 최대 상한을 초과하려 한다면 해당 파드는 요청이 제한되고 상한을 초과하였을 경우에는 파드가 종료되고 다시 스케줄링되어 동일 노드에서 재시작 된다.
spec:
containers:
- name: cafe
image: kakao/cafe:kasha
ports:
- containerPort: 8080
resources:
requests: # 리소스 요청
memory: "20Mi"
cpu: "250m"
limits: # 리소스 상한
memory: "50Mi"
cpu: "500m"
PodDisruptionBudgets
어플리케이션을 업그레이드 하거나 파드를 다른 노드로 옮겨야 할 경우, 활성 상태의 파드를 중지해야 할 수 있다.
그럴 경우 여러 파드가 동시에 중지되어 서비스의 다운 타임이 발생하지 않도록 PodDisruptionBudget
를 사용하여 주어진 시간에 제거할 수 있는 파드의 양을 제한할 수 있다.
minAvailable
최소한 실행해야하는 파드의 갯수 지정.
maxUnavailable
최대로 퇴출할 수 있는 파드의 갯수나 비율을 지정.
이것은 파드가 자발적 퇴출(voluntary evictions)인 경우에만 해당되고, 하드웨어 장애 등의 이유로 비자발적으로 퇴출 될 경우에는 해당되지 않는다.
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: kasha
spec:
minAvailable: 3
maxUnavailable: 10%
selector:
matchLabels:
app: cafe
네임스페이스를 이용한 제한
개별 컨테이너에 CPU와 메모리를 제한하는것 외에도 namespace를 이용하여 리소스 사용을 제한할 수 있다.
ResourceQuota
특정 네임스페이스에서 한번에 실행 가능한 파드의 갯수를 제한한다.
apiVersion: policy/v1
kind: ResourceQuota
metadata:
name: kasha
spec:
hard:
pods: "50" # 50개로 제한
특정 네임스페이스에서 ResourceQuota가 활성화 되어있는지 확인 하기 위해서는 kubectl get resourcequotas -n cafe
명령어를 실행하면 된다.
LimitRage
특정 네임스페이스 내에 모든 컨테이너의 기본 요청과 상한을 지정할수 있다.
apiVersion: policy/v1
kind: ResourceQuota
metadata:
name: kasha
spec:
limits:
- defaultRequest: # 리소스 요청
memory: "50Mi"
cpu: "500m"
default: # 리소스 상한
memory: "20Mi"
cpu: "250m"
type: Container
대부분의 경우, 클러스터 관리 도구는 노드를 자동으로 비우지만
kubectl drain
명령어를 사용하여 직접 비울수 있다.
노드를 제거할때에는 바로 종료하지 말고 먼저 비우기 작업을 통하여 해당 노드에서 실행 중인 워크로드를 다른 노드로 이전해야한다.
'DevOps > Docker & K8S' 카테고리의 다른 글
쿠버네티스 디스케줄러(descheduler) (0) | 2020.01.29 |
---|---|
쿠버네티스 오토스케일러 (1) | 2020.01.29 |
쿠버네티스 프로브 (활성 프로브, 준비성 프로브) (0) | 2020.01.29 |
쿠베네티스 헬름(Helm) (0) | 2020.01.22 |
쿠버네티스 오브젝트 (0) | 2020.01.22 |