0

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

编辑:我还注意到吊舱收到终止信号并正常关闭,所以我想知道这是从哪里来的。我没有手动关闭,我对 ElasticSearch 也有同样的体验

这是我的 statefulset 资源声明:

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

2 回答 2

1

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

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

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

于 2017-06-16T18:03:55.393 回答
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,你能看到发生这种情况时触发的事件吗?将卷重新附加到 pod 时是否有问题?

于 2017-06-16T05:25:28.787 回答