Kubernetes statefulset以完成状态结束

时间:2017-06-15 07:25:39

标签: kubernetes statefulset

我在Google GKE上运行k8s群集,我有一个运行Redis和ElasticSearch的状态集。 因此,pod偶尔会以完成状态结束,因此它们不再运行,我的服务依赖于它失败。 这些pod也将永远不会自行重启,一个简单的kubectl delete pod x将解决问题,但我希望我的pod自己治愈。 我正在运行1.6.4的最新版本,我不知道为什么它们不像任何其他常规吊舱那样拾取和重新启动。也许我错过了一些明显的东西。

编辑:我还注意到pod已收到终止信号并正常关闭,因此我想知道它来自哪里。我没有手动关闭,我在ElasticSearch

中遇到了同样的问题

这是我的有状态资源声明:

---
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

2 个答案:

答案 0 :(得分:1)

  

检查您运行的docker的版本,以及在此期间是否重新启动了docker守护程序。

     

如果docker守护程序重新启动,则所有容器都将被终止(除非您在1.12中使用新的"实时恢复"功能)。在某些 docker版本中,docker可能会错误地报告"退出代码0"对于在这种情况下终止的所有容器。有关详细信息,请参阅https://github.com/docker/docker/issues/31262

来源:https://stackoverflow.com/a/43051371/5331893

答案 1 :(得分:0)

我正在使用与您相同的配置,但删除volumeClaimTemplates中的注释,因为我在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

现在尝试模拟redis失败的情况,因此执行进入pod并终止redis服务器进程:

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

在流程终止后立即看到我发现STATUS已更改为Completed

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

我花了一些时间让redis启动并运行:

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

但不久之后我就可以看到它启动了pod,你能看到发生这种情况时触发的事件吗?就像将音量重新连接到吊舱时有问题吗?