2017-06-15 11 views
0

Ich bin ein K8s-Cluster auf Google GKE, wo ich eine Statefulsets mit Redis und ElasticSearch laufen. Also hin und wieder landen die Pods in einem vollendeten Zustand und so laufen sie nicht mehr und meine darauf basierenden Dienste scheitern. Diese Pods werden auch nie von selbst neu gestartet, eine einfache kubectl delete pod x wird das Problem lösen, aber ich möchte meine Pods von selbst heilen. Ich habe die neueste Version 1.6.4, ich habe keine Ahnung, warum sie nicht abgeholt und wie alle anderen regulären Pod neu gestartet werden. Vielleicht vermisse ich etwas Offensichtliches.Kubernetes Statefulset endet im fertigen Zustand

edit: Ich habe auch bemerkt, dass der Pod ein Beendigungssignal bekommt und sich richtig schließt, also frage ich mich, woher das kommt. Ich schließe nicht manuell nach unten und ich erlebe das gleiche mit Elasticsearch

Das ist meine statefulset Ressourcendeklaration:

--- 
apiVersion: apps/v1beta1 
kind: StatefulSet 
metadata: 
    name: redis 
spec: 
    serviceName: "redis" 
    replicas: 1 
    template: 
    metadata: 
     labels: 
     app: redis 
    spec: 
     containers: 
     - name: redis 
     image: redis:3.2-alpine 
     ports: 
      - name: redis-server 
      containerPort: 6379 
     volumeMounts: 
     - name: redis-storage 
      mountPath: /data 
    volumeClaimTemplates: 
    - metadata: 
     name: redis-storage 
     annotations: 
     volume.alpha.kubernetes.io/storage-class: anything 
    spec: 
     accessModes: [ "ReadWriteOnce" ] 
     resources: 
     requests: 
      storage: 10Gi 
+0

Können Sie das Attribut restartPolicy überprüfen: Immer dieses statefulset? Der Standardwert ist immer, aber stellen Sie sicher, dass ... –

+0

Ja, ich habe überprüft, die Neustart-Richtlinie ist 'Immer' – Niels

Antwort

0

ich gleiche Konfiguration wie Sie bin mit aber die Anmerkung in den volumeClaimTemplates zu entfernen, da ich versuche, dies auf minikube:

$ cat sc.yaml 
--- 
apiVersion: apps/v1beta1 
kind: StatefulSet 
metadata: 
    name: redis 
spec: 
    serviceName: "redis" 
    replicas: 1 
    template: 
    metadata: 
     labels: 
     app: redis 
    spec: 
     containers: 
     - name: redis 
     image: redis:3.2-alpine 
     ports: 
      - name: redis-server 
      containerPort: 6379 
     volumeMounts: 
     - name: redis-storage 
      mountPath: /data 
    volumeClaimTemplates: 
    - metadata: 
     name: redis-storage 
    spec: 
     accessModes: [ "ReadWriteOnce" ] 
     resources: 
     requests: 
      storage: 10Gi 

nun versuchen, den Fall zu simulieren, wo redis ausfällt, so in die Gondel execing und den redis Server-Prozess zu töten:

$ k exec -it redis-0 sh 
/data # kill 1 
/data # $ 

See, der unmittelbar nach dem Prozess stirbt kann ich sehen, dass die STATUS-Completed geändert hat:

$ k get pods                             
NAME  READY  STATUS  RESTARTS AGE 
redis-0 0/1  Completed 1   38s 

Es dauerte einige Zeit für mich, die redis und zum Laufen zu bringen:

$ k get pods 
NAME  READY  STATUS RESTARTS AGE 
redis-0 1/1  Running 2   52s 

Aber bald danach konnte ich sehen, wie es den Pod startete. Kannst du die Ereignisse sehen, die ausgelöst wurden, als das passierte? Wie war es ein Problem, wenn das Volume wieder an den Pod angeschlossen wurde?

1

Überprüfen Sie die Version des ausgeführten Andockprogramms und ob der Andockdämon während dieser Zeit neu gestartet wurde.

Wenn der Docker-Dämon neu gestartet wurde, werden alle Container beendet (es sei denn, Sie verwenden die neue Funktion "Live-Wiederherstellung" in 1.12). In einige Docker-Versionen kann Docker falsch "Exit-Code 0" für alle Container melden, die in dieser Situation beendet werden. Weitere Informationen finden Sie unter https://github.com/docker/docker/issues/31262.

Quelle: https://stackoverflow.com/a/43051371/5331893

Verwandte Themen