我在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
答案 0 :(得分:1)
检查您运行的docker的版本,以及在此期间是否重新启动了docker守护程序。
如果docker守护程序重新启动,则所有容器都将被终止(除非您在1.12中使用新的"实时恢复"功能)。在某些 docker版本中,docker可能会错误地报告"退出代码0"对于在这种情况下终止的所有容器。有关详细信息,请参阅https://github.com/docker/docker/issues/31262。
答案 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,你能看到发生这种情况时触发的事件吗?就像将音量重新连接到吊舱时有问题吗?