Kısaca tüm shutdown işleminin ne kadar sürmesi gerektiğini belirtir
Açıklaması şöyle
When the programmer or deployment pipeline executes the kubectl delete pod command, two procedures begin1. Network rules coming into effect- Kube-apiserver receives the pod deletion request and updates the state of the pod to Terminating at Etcd;- Endpoint Controller deletes the IP of the pod from the Endpoint object;- Kuber-proxy updates the rules of iptables according to the change of the Endpoint object, and no longer routes traffic to the deleted pod.2. Deleting a pod- Kube-apiserver receives the pod deletion request and updates the state of the pod to Terminating at Etcd- Kubelet cleans up container-related resources at the node, such as storage, network- Kubelet sends SIGTERM to the container; if there are no configurations for the process within the container, the container will exit at once.- If the container didn’t exit within the default 30s, Kubelet will send SIGKILL and force it to exit.
Ancak bu iki işlem paralel çalışıyor, sıralı değil. Bu yüzden bazı hatalar oluşabiliyor. Açıklaması şöyle
- A pod that is currently in the middle of processing a request is removed, which, if the request is not idempotent, leads to an inconsistent state.- Kubernetes routes traffic to pods that have already be en deleted, resulting in failure of processing requests and poor user experience.
Bu durumdan kaçınmak için graceful shutdown yapmak gerekir. Yani
1. Pod network kurallarından silinir
2. Pod'un mevcut işlerini bitirmesi beklenir.
Pod network kurallarından silinmesinin önce gerçekleşmesi için Pod'un mevcut işlerini bitirmesini uzatmak gerekir. Bunun için preStop Hook kullanıır
Örnek
Şöyle yaparız.
apiVersion: apps/v1 kind: Pod metadata: name: my-pod spec: containers: - name: web image: nginx ports: - web containerPort : 80 lifecycle preStop: exec: command: ["sleep", "15"]
Pod açısından akış şöyle. Yani preHook süresinden sonra uygulamanın SIGTERM sinyalini yakalayıp sonlanması gerekiyor.
When the kubelet deletes a pod, it goes through the following steps:- Triggers the preStop hook (if any).- Sends the SIGTERM.- Sends the SIGKILL signal (after 30 seconds).
Örnek
Şöyle yaparız. Burada
1. Önce Pod'un IP'sinin silinmesini beklemek için preStop Hook ile 10 saniye bekleniyor.
2. Daha sonra Spring uygulamasının shutdown endpoint çağrılıyor. SpringBoot uygulaması şöyle
server: shutdown: graceful spring: lifecycle: timeout-per-shutdown-phase: 30s
Yani 30 saniye içinde graceful shutdown yapmaya çalışıyor. Kubernetes açısından tüm shutdown işleminin 45 saniye sürmesini sağlamak için terminationGracePeriodSeconds 45 saniye yapılıyor.
kind: Deployment apiVersion: apps/v1 metadata: name: gracefulshutdown-app spec: replicas: 3 selector: matchLabels: app: gracefulshutdown-app template: metadata: labels: app: gracefulshutdown-app spec: containers: - name: graceful-shutdown-test image: gracefulshutdown-app:latest ports: - containerPort: 8080 lifecycle: preStop: exec: command: ["sh", "-c", "sleep 10"] #set prestop hook terminationGracePeriodSeconds: 45