我在一个容器中有一个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,即使它重新启动
将应用程序和数据库保存在一个pod中是Kubernetes中最糟糕的做法之一。如果更新应用程序代码 - 则必须重新启动pod才能应用更改。所以你也重新启动数据库。
解决方案非常简单 - 您应该在一个部署和数据库中运行应用程序。这样您就可以更新应用程序而无需重新启动数据库在这种情况下,您还可以单独缩放app和DB,例如向app添加更多副本,同时将DB保持在1个副本,反之亦然。