kubernetes-graceful-shutdown

created : Thu, 04 Aug 2022 17:25:09 +0900
modified : Thu, 04 Aug 2022 17:31:12 +0900
kubernetes devops

동기

기본구조

  1. api server layer 에서 pod 가 삭제되면 endpoint 를 갱신함으로써 새롭게 들어오는 트래픽 차단
  2. 새롭게 들어오는 트래픽 차단 이후 기존 traffic 이 다 처리될때까지 pod를 죽이지 않고 기다려준다.:

코드 구조

// kubernetes/pkg/controller/endpoint/endpoints_controller.go#L282
Endpointcontroller.deletePod(obj interface{})
- endpointutil.GetPodFromDeleteAction(obj interface{}) // pod 유효성 검사
- Endpointcontroller.addPod(obj interface{}) // addPod 라고 적혀있긴 한데, 실제로는 이 Pod를 스케줄링하라는 의미
-- ServiceSelectorCache.GetPodServiceMemberships(v1listers.ServiceLister, *v1.Pod) // Pod 가 대상인 서비스들을 조회
-- GetPodServiceMemberships() 함수 값들에 대해서 갱신 -> syncService() 호출
// kubernetes/pkg/controller/endpoint/endpoints_controller.go#L366
EndpointController.syncService(context.Context, string)
// L534 에서 Endpoints 를 갱신함
- _, err = e.client.CoreV1().Endpoints(service.Namespace).Update(ctx, newEndpoints, metav1.UpdateOptions{})
// 이 시점이 그림상에서 2번째로 API Server 가 호출되는 시점
// kubernetes/pkg/proxy/iptables/proxier.go #L298
endpointsChanges:         proxy.NewEndpointChangeTracker(hostname, newEndpointInfo, ipFamily, recorder, nil),
// 위를 보면 proxier(kube-proxy) 는 endpoint의 변화를 tracking 하고 있음.