提问者:小点点

pod重新启动时,服务失去与Etcd数据库的连接


我在一个容器中有一个 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,即使它重新启动


共1个答案

匿名用户

将应用程序和数据库保持在一个pod中是库伯内特斯中最糟糕的做法之一。如果您更新应用程序代码-您必须重新启动pod才能应用更改。因此,您也可以免费重新启动数据库。

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