Kubernetes 이야기

Kubernetes Pod Eviction 본문

Kubernetes/일반

Kubernetes Pod Eviction

kmaster 2022. 4. 2. 19:07
반응형

Kubernetes에서는 NotReady 노드, 노드 리소스 부족 ( Memory, Disk 등 ) 일 때 실행 중인 포드를 다른 노드로 추방할 수 있는 특징이 있다. 이 때 Kubernetes는 2가지 축출 메커니즘이 있다.

 

  • kube-controller-manager : 주기적으로 모든 노드의 상태를 확인하고 노드가 일정 시간 이상 NotReady 일때 해당 노드의 모든 Pod를 축출한다.
  • kubelet : 주기적으로 노드의 리소스를 확인하고 리소스가 부족한 경우 우선 순위에 따라 일부 포드를 축출한다.

출처 : https://learnk8s.io/allocatable-resources

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
Comments