Как перезаписать файл во время развертывания в kubernetes?

Я пытаюсь развернуть образ Diffusion в kubernetes, и мне нужно перезаписать один из файлов конфигурации Diffusion во время развертывания.

На самом деле это SystemAuthentication.store файл с учетными данными по умолчанию в /opt/Diffusion6.0.3_01/etc/, Я храню новый файл в секрете и монтирую в etc/test/ который можно увидеть в файле ниже.

template:
metadata:
  labels:
    run: diffusion
spec:
  serviceAccountName: diffusion-role
  volumes:
  - name: diffusion-secrets
    secret:
      secretName: diffusion-license
  - name: ssl-cert
    secret:
      secretName: ssl-certificate
  - name: system-authentication
    secret:
      secretName: system-authentication-store
  containers:
  - image: pushtechnology/diffusion:6.0.3
    imagePullPolicy: IfNotPresent
    name: diffusion
    ports:
    - containerPort: 8080
      protocol: TCP
    - containerPort: 8443
      protocol: TCP
    volumeMounts:
    - name: diffusion-secrets
      mountPath: /etc/diffusion-secrets
      readOnly: true
    - name: ssl-cert
      mountPath: /etc/test/
      readOnly: true
    - name: system-authentication
      mountPath: /etc/test/
    command: [ "/bin/sh", "-c", "cp etc/test/SystemAuthentication.store /opt/DIffusion6.0.3_01" ]

Когда я развертываю этот модуль, происходит сбой

Events:
Type     Reason                 Age              From                                   Message
----     ------                 ----             ----                               -------
Normal   Scheduled              2m               default-scheduler                  Successfully assigned diffusion-db6d6df7b-f5tp4 to timmy.pushtechnology.com
Normal   SuccessfulMountVolume  2m               kubelet, timmy.pushtechnology.com  MountVolume.SetUp succeeded for volume "diffusion-role-token-n59ds"
Normal   SuccessfulMountVolume  2m               kubelet, timmy.pushtechnology.com  MountVolume.SetUp succeeded for volume "ssl-cert"
Normal   SuccessfulMountVolume  2m               kubelet, timmy.pushtechnology.com  MountVolume.SetUp succeeded for volume "system-authentication"
Normal   SuccessfulMountVolume  2m               kubelet, timmy.pushtechnology.com  MountVolume.SetUp succeeded for volume "diffusion-secrets"
Normal   Killing                1m (x2 over 1m)  kubelet, timmy.pushtechnology.com  Killing container with id docker://diffusion:FailedPostStartHook
Warning  BackOff                1m (x2 over 1m)  kubelet, timmy.pushtechnology.com  Back-off restarting failed container
Normal   Pulled                 1m (x3 over 2m)  kubelet, timmy.pushtechnology.com  Container image "pushtechnology/diffusion:6.0.3" already present on machine
Normal   Created                1m (x3 over 1m)  kubelet, timmy.pushtechnology.com  Created container
Normal   Started                1m (x3 over 1m)  kubelet, timmy.pushtechnology.com  Started container
Warning  FailedPostStartHook    1m (x3 over 1m)  kubelet, timmy.pushtechnology.com  
Warning  FailedSync             1m (x5 over 1m)  kubelet, timmy.pushtechnology.com  Error syncing pod

Я попытался также описать здесь workaruond: https://github.com/kubernetes/kubernetes/issues/19764

с такими же результатами.

2 ответа

Решение

Я думаю, что ответ @svenwtl может быть правильным, но Dockerfile изображения, которое я использую, имеет несколько сложных конструкций, которые я понятия не имел, как использовать в файле развертывания. Исправление, которое сработало для меня (после долгого цикла try / fail), заключалось в том, чтобы фактически использовать хук жизненного цикла контейнера:

    volumeMounts:
    - name: diffusion-secrets
      mountPath: /etc/diffusion-secrets
      readOnly: true
    - name: ssl-cert
      mountPath: /etc/test/
      readOnly: true
    - name: system-authentication
      mountPath: /etc/test1/
    lifecycle:
      postStart:
        exec:
          command: [ "/bin/sh", "-c", "cp -f /etc/test1/SystemAuthentication.store /opt/Diffusion6.0.3_01/etc/" ]

Я также смонтировал SystemAuthentication в другой папке /etc/test1, но я не думаю, что это было частью исправления.

Вы перезаписали команду контейнера cp etc/test/SystemAuthentication.store /opt/DIffusion6.0.3_01, которая является командой с выходами после того, как это сделано. Кубернетес предполагает, что это провал.

Вам нужно заменить его чем-то вроде cp etc/test/SystemAuthentication.store /opt/DIffusion6.0.3_01 && /path/to/original/binaryгде последняя команда - это команда, которую изображение будет запускать без команды перезаписи. Это зависит от вашего имиджа.

Другие вопросы по тегам