当POD重新启动时,服务将失去与ETCD DB的连接



我在一个容器中有一个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才能应用更改。因此,您还可以重新启动数据库。

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

最新更新