我在一个容器中有一个go lang rest服务和etcd db,使用部署类型部署在kubernetes群集中。每当我尝试重新启动服务POD时,服务都会失去与ETCD的连接,我尝试使用状态集而不是部署,但仍然没有帮助。我的部署看起来像下面。
由于此问题,ETCD未能重新启动:https://github.com/etcd-io/etcd/issues/10487
PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: XXXX
namespace: XXXX
annotations:
volume.beta.kubernetes.io/storage-class: glusterfs-storage
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: XXX
namespace: XXX
spec:
replicas: X
XXXXXXX
template:
metadata:
labels:
app: rest-service
version: xx
spec:
hostAliases:
- ip: 127.0.0.1
hostnames:
- "etcd.xxxxx"
containers:
- name: rest-service
image: xxxx
imagePullPolicy: IfNotPresent
ports:
- containerPort: xxx
securityContext:
readOnlyRootFilesystem: false
capabilities:
add:
- IPC_LOCK
- name: etcd-db
image: quay.io/coreos/etcd:v3.3.11
imagePullPolicy: IfNotPresent
command:
- etcd
- --name=etcd-db
- --listen-client-urls=https://0.0.0.0:2379
- --advertise-client-urls=https://etcd.xxxx:2379
- --data-dir=/var/etcd/data
- --client-cert-auth
- --trusted-ca-file=xxx/ca.crt
- --cert-file=xxx/tls.crt
- --key-file=xxx/tls.key
volumeMounts:
- mountPath: /var/etcd/data
name: etcd-data
XXXX
ports:
- containerPort: 2379
volumes:
- name: etcd-data
persistentVolumeClaim:
claimName: XXXX
我希望DB即使重新启动
将应用程序和数据库保存在一个POD中是Kubernetes中最糟糕的做法之一。如果您更新应用程序代码 - 您必须重新启动POD才能应用更改。因此,您还可以重新启动数据库。
解决方案非常简单 - 您应该在另一个部署和数据库中运行应用程序。这样,您可以在不重新启动数据库的情况下更新应用程序。在这种情况下,您还可以分别缩放应用程序和数据库,例如在将DB保持在1个副本的同时,反之亦然。