2016-09-14 3 views
2

Ich muss den Container laufen lassen 5 Minuten nach der kubectl 'Terminierung. Es muss etwas arbeiten, bevor es zerstört wird. Es scheint, dass Kubernetes enthält genau das, was ich brauche:Graceful pod Terminierung

terminationGracePeriodSeconds: 300 

so definiert ich es in meiner yaml. Ich habe aktualisiert RCs, aktuelle Pods zu löschen, so dass neue erstellt wurden und jetzt kann ich sehen, dass ein Pod genau diese Einstellung über get pod xyz -o=yaml enthält.

Leider, als ich versuchte, rolling-update zu tun, wurde der ursprüngliche Pod nach genau 1 Minute, nicht nach 5 Minuten getötet. Ich mache SSH auf dem Zielcomputer und ich konnte sehen, dass das Andockfenster den Container nach dieser Zeit terminierte.

Ich habe versucht zu untersuchen, wie das Feature funktioniert. Ich fand schließlich die Dokumentation zu kubectl delete, wo es eine Vorstellung über anmutigen Abschlusszeitraum:

http://kubernetes.io/docs/user-guide/pods/

Standardmäßig wird alle Löschungen sind anmutig innerhalb von 30 Sekunden. Der Befehl kubectl delete unterstützt die Option -grace-period =, mit der ein Benutzer den Standardwert überschreiben und seinen eigenen Wert angeben kann. Der Wert 0 gibt an, dass der Löschvorgang sofort erfolgen soll, und entfernt den Pod sofort in der API, sodass ein neuer Pod mit demselben Namen erstellt werden kann. Auf die Knoten Schoten, die sofort nach wie vor beenden gesetzt wird Kraft eine kleine Gnadenfrist gegeben werden, bevor sie getötet

Also nahm ich eine Schote, nginx, und versuchen Sie es mit grace-period=30 zu löschen. Es stellte sich heraus, dass der ursprüngliche Pod sofort gelöscht wurde und get pods zeigte, dass der neue gestartet wurde.

Also keine 30 Sekunden. Was mache ich falsch? Es scheint, dass alle Pods kubernetes diese Werte nicht berücksichtigen. Bitte beachte, dass ich Kubernetes v1.2.2

Ich fand auch dieses Problem https://github.com/kubernetes/kubernetes/issues/24695 wo der Reporter gleiches Problem hatte und er löste es auf die gleiche Art und Weise verwendet wird. So z.B. 300 Sekunden sind nicht zu viel für kubernetes.

Antwort

1

Möglicherweise können Sie den magischen Schlaf im 'preStop'-Hook einstellen. Dieser Hook wird vor kubectl ausgetragen und sendet SIGTERM an Ihren Container.

http://kubernetes.io/docs/user-guide/production-pods/#lifecycle-hooks-and-termination-notice

so etwas wie:

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: nginx 
spec: 
    template: 
    metadata: 
     labels: 
     app: nginx 
    spec: 
     containers: 
     - name: nginx 
     image: nginx 
     ports: 
     - containerPort: 80 
     lifecycle: 
      preStop: 
      exec: 
       command: ["/bin/sleep","300"] 
0

https://pracucci.com/graceful-shutdown-of-kubernetes-pods.html kann dies kann Ihnen helfen.

Es gibt Situationen, in denen ein SIGTERM die Anwendung gewaltsam beendet und alle Bemühungen zunichte macht, um sie ordnungsgemäß herunterzufahren. Nginx zum Beispiel, schnell auf SIGTERM verlassen.

+1

Während dies theoretisch die Frage beantworten könnte, [wäre es vorzuziehen] (// meta.stackoverflow.com/q/8259), die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. – Draken