Служба теряет соединение с Etcd DB при перезагрузке модуля - PullRequest
0 голосов
/ 01 мая 2019

У меня есть служба Go Lang REST и база данных ETCD в одном контейнере, развернутые в кластере kubernetes с использованием типа развертывания. Всякий раз, когда я пытаюсь перезапустить модуль службы, служба теряет связь с 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

Я ожидаю, что БД сможет подключаться к модулю даже после перезапуска

1 Ответ

1 голос
/ 01 мая 2019

Хранение приложения и базы данных в одном модуле - одна из худших практик в Кубернетесе. Если вы обновляете код приложения - вам нужно перезапустить модуль, чтобы применить изменения. Таким образом, вы просто перезагружаете базу данных.

Решение очень простое - вы должны запустить приложение в одном развертывании, а базу данных - в другом. Таким образом, вы можете обновить приложение без перезапуска базы данных. В этом случае вы также можете масштабировать приложение и БД по отдельности, например, добавлять дополнительные реплики в приложение, сохраняя БД на 1 реплике, или наоборот.

...