Pod重新启动后,服务将失去与Etcd DB的连接

时间:2019-05-01 16:48:56

标签: kubernetes etcd etcd3

我在一个容器中有一个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

1 个答案:

答案 0 :(得分:1)

在一个吊舱中保存应用程序和数据库是Kubernetes中最糟糕的做法之一。如果您更新应用程序代码,则必须重新启动pod才能应用更改。因此,您重启数据库也一无是处。

解决方案非常简单-您应该在一个部署中运行应用程序,而在另一个部署中运行数据库。这样,您可以更新应用程序而无需重新启动数据库。在这种情况下,您还可以分别缩放应用程序和数据库,例如向应用程序添加更多副本,同时将数据库保持为1个副本,反之亦然。