我在一个容器中有一个 Go Lang REST 服务和 ETCD DB,使用 Deployment 类型部署在 kubernetes 集群中。每当我尝试重新启动服务 Pod 时,该服务都会失去与 ETCD 的连接,我尝试使用有状态集而不是部署,但仍然没有帮助。我的部署如下所示。
由于以下问题,ETCD无法重新启动:https://github.com/etcd-io/etcd/issues/10487
聚氯乙烯:
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,即使它重新启动
将应用程序和数据库保持在一个pod中是库伯内特斯中最糟糕的做法之一。如果您更新应用程序代码-您必须重新启动pod才能应用更改。因此,您也可以免费重新启动数据库。
解决方案非常简单-您应该在一个部署中运行应用程序,在另一个部署中运行数据库。这样您就可以在不重新启动数据库的情况下更新应用程序。在这种情况下,您还可以单独扩展应用程序和数据库,例如在应用程序中添加更多副本,同时将数据库保持在1个副本,反之亦然。