Kubernetes - Монтирование постоянного тома в каталог root - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь создать новое развертывание Kubernetes, которое позволит мне сохранять состояние модуля при его перезапуске или завершении работы. Для справки: экземпляр Kubernetes - это управляемый кластер Amazon EKS, и я пытаюсь включить постоянный том, поддерживаемый Amazon EFS, который подключен к модулю.

К сожалению, в моем нынешнем виде PV подключается к /etc/ по желанию, но содержимое почти пустое, за исключением некоторых файлов, которые были изменены во время загрузки.

Вид развертывания выглядит как показано ниже:

kind: Deployment
apiVersion: apps/v1

spec:
  replicas: 1
  selector:
    matchLabels:
      app: testpod
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: testpod
    spec:
      volumes:
        - name: efs
          persistentVolumeClaim:
            claimName: efs
      containers:
        - name: testpod
          image: 'xxxxxxxxxxxx.dkr.ecr.us-east-2.amazonaws.com/testpod:latest'
          args:
            - /bin/init
          ports:
            - containerPort: 443
              protocol: TCP
          resources: {}
          volumeMounts:
            - name: efs
              mountPath: /etc
              subPath: etc
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent
          securityContext:
            capabilities:
              add:
                - ALL
      restartPolicy: Always
      terminationGracePeriodSeconds: 60
      dnsPolicy: ClusterFirst
      securityContext: {}
      schedulerName: default-scheduler

Есть идеи, что может пойти не так? Я ожидаю, что / etc / будет заполнен содержимым изображения.

Редактировать:

Кажется, что это нормально работает в Docker, используя то же изображение, создавая том с docker volume create <name>, а затем смонтируйте его как -v <name>:/etc.

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

Kubernetes не имеет функции Docker, которая заполняет объемы на основе содержимого изображения. Если вы создаете новый том (будь то том emptyDir или что-то на основе облачного хранилища, например AWS EBS или EFS), он будет начинаться с пустого и скрывать все, что было в контейнере.

Таким образом, Вы не можете смонтировать объем над большими частями контейнера; он не будет работать для монтирования тома поверх дерева исходных текстов вашего приложения или над /etc, как вы показываете. В частности, для файлов в /etc лучшим подходом будет использование Kubernetes ConfigMap для хранения определенных c файлов, которые вы хотите добавить в этот каталог. (Сохраните файлы конфигурации в системе управления версиями и добавьте их как часть последовательности развертывания; не пытайтесь сохранить неизмененные изменения в развернутых файлах.)

1 голос
/ 26 февраля 2020

я думаю, что монтирование в контейнерах работает точно так же, как монтирование в операционной системе ... если вы монтируете что-то на /etc, вы просто перезаписываете (лучше слово 'cover') то, что было раньше ... если вы смонтировать пустой EFS, там будет пустая папка

Я попробовал то, что вы пробовали в docker и (удивительно для меня) это работает так, как вы описываете ... вероятно, потому что docker тома просто технологически нечто иное, чем Утверждения тома kubernetes (особенно поддерживаемые EFS) объясняют это следующим образом: Docker монтирование в папку переопределяющего содержимого tldr: если docker том пуст, файлы будут зеркально отражены

Я не лично думаю, что с k8s и EFS вы можете добиться того, что вы пытаетесь

...