我在一个容器中有一个Go Lang REST服务和ETCD DB,使用Deployment类型部署在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
我希望数据库即使重新启动也能够连接到pod
答案 0 :(得分:1)
在一个吊舱中保存应用程序和数据库是Kubernetes中最糟糕的做法之一。如果您更新应用程序代码,则必须重新启动pod才能应用更改。因此,您重启数据库也一无是处。
解决方案非常简单-您应该在一个部署中运行应用程序,而在另一个部署中运行数据库。这样,您可以更新应用程序而无需重新启动数据库。在这种情况下,您还可以分别缩放应用程序和数据库,例如向应用程序添加更多副本,同时将数据库保持为1个副本,反之亦然。