Мне нужно иметь возможность назначать настраиваемые переменные среды каждой реплике модуля. Одна переменная должна быть случайным uuid, другая - уникальным числом. Как этого добиться? Я бы предпочел продолжить использование «Развертывания» с репликами. Если это невозможно из коробки, как этого можно достичь, настроив контроллер / диспетчер репликации? Есть ли хуки для этого?





If this is not feasible out of the box, how can it be achieved by customizing replication controller/controller manager? Are there hooks available to achieve this?
Лучше всего использовать комбинацию initContainer: и / или настраиваемой - возможно, переопределенной - точки входа command:. Все стручки будут точными копиями друг друга, за исключением их имен и нескольких других тривиальных изменений. За любое специфическое поведение для каждого модуля ответственность несут сами контейнеры в этом модуле.
containers:
- image: whatever
command:
- bash
- -c
- |
export RANDOM_UUID=`uuidgen`
export UNIQ=/usr/bin/generate-some-awesome-sauce
exec /usr/local/bin/dockerfile-entrypoint.sh or whatever else
Это никогда не выходит за рамки вашей досягаемости, поскольку kubernetes - это оркестратор контейнеров. Но вы заметите, что я также упомянул initContainers:, поэтому используйте его для запуска image: super-sekrit-generator:1 и монтируйте том emptyDir: {} между двумя контейнерами и используйте тот для внедрения в среду основного контейнера. Тем не менее, если вы на 100% против отмены command:, тогда вас ждет много боли.
Спасибо, я займусь этим завтра! Каким-то образом наборы с отслеживанием состояния могут сделать это проще? Похоже, у них автоматически настраивается индекс постановления.
С помощью StatefulSet вам все равно придется извлекать индекс предписания из модуля, что вы можете сделать в initContainer.
Как передать индекс предписания из initContainer в контейнер вычислений? Я бы не хотел использовать объемы. Могу ли я писать в переменные среды? Я исправил с помощью команды «экспорт», но она не сработала.
Что означает «попытался использовать экспорт, но ничего не вышло»? А с StatefulSet я почти уверен, что порядковый номер - это конечная цифра имени модуля, которую вы можете получить через hostname или через нисходящий API, упомянутый Джорданом в его ответе.
Вы можете использовать нисходящий API, чтобы ввести metadata.uid модуля как envvar, который уникален для каждого модуля.
kubectl run hello --restart Never --image busybox -- /bin/sh -c "while true; do echo \$RANDOM; sleep 1;done"
или
kubectl run busybox --image busybox --env = random = $ RANDOM --restart Never - / bin / sh -c "echo \ $ random"
Это отлично работает
[root@master 41-jobs]# kubectl logs hello
3298
16447
9517
3082
32611
19179
21098
12943
То, что происходит внутри контейнера, мне недоступно. Так что "/ usr / bin / generate-some-awesome -auce" на самом деле недоступен.