Можно ли передавать разные аргументы в стручки на основе их порядкового индекса в StatefulSets? Не нашли ответа в документации StatefulSets. Благодаря!Как передать аргументы в контейнеры на основе индекса ординалов в StatefulSets?
ответ
Я не знаю, как это сделать, но я знаю, что это работает. Во-первых, каждый элемент в StatefulSet получает уникальное предсказуемое имя. Он может обнаружить это имя через the downward API или просто позвонив по номеру hostname
. Таким образом, у меня есть сценарий оболочки, как точка входа в мой контейнер, и этот скрипт получает его имя/имя хоста. Оттуда он называет «реальный» исполняемый файл, используя аргументы командной строки, соответствующие конкретному хосту.
Например, один из моих сценариев ожидает, что имя подкарта будет отображаться в окружении, как POD_NAME
с помощью нисходящего api. Затем он делает что-то вроде:
#!/bin/bash
pet_number=${POD_NAME##*-}
if [ pet_number == 0 ]
then
# stuff here
fi
# etc.
В случае, если вы хотите, чтобы отслеживать ход этого, билет в вопрос для этой функции здесь: https://github.com/kubernetes/kubernetes/issues/30427
Предложение включает в себя положить порядковое как ярлык на pod, а затем используя вниз api, чтобы вытащить это в переменную среды или что-то в этом роде.
Вы можете избежать использования нисходящей API с помощью HOSTNAME
:
command:
- bash
- c
- |
ordinal=${HOSTNAME##*-}
if [[ "$ordinal" = "0" ]]; then
...
else
...
fi
Я нашел один менее hacky
способа передать порядковый индекс в контейнер, используя жизненный цикл крючки
containers:
- name: cp-kafka
imagePullPolicy: Always
image: confluentinc/cp-kafka:4.0.0
resources:
requests:
memory: "2Gi"
cpu: 0.5
ports:
- containerPort: 9093
name: server
protocol: TCP
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "export KAFKA_BROKER_ID=${HOSTNAME##*-}"]
env:
- name: KAFKA_ZOOKEEPER_CONNECT
value: zk-cs.default.svc.cluster.local:2181
- name: KAFKA_ADVERTISED_LISTENERS
value: PLAINTEXT://localhost:9093