일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- operator
- Kopf
- kubernetes operator
- seldon core
- Pulumi
- Kubernetes
- tekton
- argocd
- serving
- xdp
- eBPF
- mlops
- CI/CD
- 오퍼레이터
- blue/green
- Model Serving
- CANARY
- opentelemetry
- Argo
- Continuous Deployment
- keda
- 카오스 엔지니어링
- knative
- Kubernetes 인증
- Litmus
- nginx ingress
- opensearch
- gitops
- MLflow
- Kubeflow
- Today
- Total
Kubernetes 이야기
Kubernetes Pod Eviction 본문
Kubernetes에서는 NotReady 노드, 노드 리소스 부족 ( Memory, Disk 등 ) 일 때 실행 중인 포드를 다른 노드로 추방할 수 있는 특징이 있다. 이 때 Kubernetes는 2가지 축출 메커니즘이 있다.
- kube-controller-manager : 주기적으로 모든 노드의 상태를 확인하고 노드가 일정 시간 이상 NotReady 일때 해당 노드의 모든 Pod를 축출한다.
- kubelet : 주기적으로 노드의 리소스를 확인하고 리소스가 부족한 경우 우선 순위에 따라 일부 포드를 축출한다.
kube-controller-manager
node failover되는 특정시간 (기본 5분 이상) 을 더 낮은 설정으로 하려는 경우 아래의 설정을 조정하였다.
kube-controller-manager
- node-monitor-grace-period=40s
- node-monitor-period=5s
- pod-eviction-timeout=5m0s
kubelet
- node-status-update-frequency=5s
( 하지만, 실제 테스트 시 pod-eviction-timeout 매개변수로 node down 시 failover가 되지 않았다. )
Kubernetes v1.18 부터 기본적으로 활성화되는 새로운 베타 기능으로 "Taint based Evictions "를 도입했습니다. 이 taint를 기반으로 노드 오류의 경우 NodeController가 자동으로 추가합니다. 노드 준비 상태에 기반한 이전 동작은 더 이상 활성화되지 않습니다. ( 참고자료 : https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/ )
1. toleration으로 not-ready랑 unreachable 상태일때 타임아웃 설정 ( Pod단위 설정 )
tolerations:
- key: "node.kubernetes.io/unreachable"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 60
- key: "node.kubernetes.io/not-ready"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 60
2. kube-apiserver에 적용 ( 글로벌 설정 - kube-apiserver.yaml )
이 설정을 하면 pod 생성 시 tolerations가 자동 설정된다.
spec:
containers:
- command:
...
- --enable-admission-plugins=DefaultTolerationSeconds
- --default-not-ready-toleration-seconds=60
- --default-unreachable-toleration-seconds=60
추가로 영향 받는 설정은 아래와 같다.
kube-controller: extra_args
node-monitor-period: Xs
node-monitor-grace-period: Xs
kubelet:
node-status-update-frequency: Xs
kubelet
kubelet 은 주기적으로 노드의 메모리와 디스크 리소스를 확인한다. 리소스가 임계값보다 낮으면 우선 순위에 따라 포드가 제거된다. 확인된 특정 리소스는 다음과 같다.
- memory.available
- nodefs.available
- nodefs.inodesFree
- imagefs.available
- imagefs.inodesFree
축출이 발생되면 kubelet은 두 가지 모드를 지원한다.
- soft : 유예 기간 후 퇴거
- hard : 즉시 퇴거
이 값을 조정하려면 예를 들어 아래와 같이 설정한다.
/var/lib/kubelet/config.yaml
evictionHard:
imagefs.available: 1%
memory.available: 100Mi
nodefs.available: 1%
nodefs.inodesFree: 1%
'Kubernetes > 일반' 카테고리의 다른 글
PodNodeSelector (0) | 2022.04.02 |
---|---|
Pod 스케줄링 (0) | 2022.04.02 |
Pod에서 imagePullSecrets 설정하기 (0) | 2022.03.24 |
kubernetes yaml 을 helm chart로 변환하기 (0) | 2022.03.15 |
Nginx Ingress Path 기반 라우팅 설정 (0) | 2022.03.15 |