Как перезаписать файл во время развертывания в 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
где последняя команда - это команда, которую изображение будет запускать без команды перезаписи. Это зависит от вашего имиджа.