2017-01-19 4 views

ответ

1

Я не знаю, как это сделать, но я знаю, что это работает. Во-первых, каждый элемент в StatefulSet получает уникальное предсказуемое имя. Он может обнаружить это имя через the downward API или просто позвонив по номеру hostname. Таким образом, у меня есть сценарий оболочки, как точка входа в мой контейнер, и этот скрипт получает его имя/имя хоста. Оттуда он называет «реальный» исполняемый файл, используя аргументы командной строки, соответствующие конкретному хосту.

Например, один из моих сценариев ожидает, что имя подкарта будет отображаться в окружении, как POD_NAME с помощью нисходящего api. Затем он делает что-то вроде:

#!/bin/bash 

pet_number=${POD_NAME##*-} 

if [ pet_number == 0 ] 
then 
    # stuff here 
fi 

# etc. 
0

В случае, если вы хотите, чтобы отслеживать ход этого, билет в вопрос для этой функции здесь: https://github.com/kubernetes/kubernetes/issues/30427

Предложение включает в себя положить порядковое как ярлык на pod, а затем используя вниз api, чтобы вытащить это в переменную среды или что-то в этом роде.

0

Вы можете избежать использования нисходящей API с помощью HOSTNAME:

command: 
- bash 
- c 
- | 
    ordinal=${HOSTNAME##*-} 
    if [[ "$ordinal" = "0" ]]; then 
    ... 
    else 
    ... 
    fi 
1

Я нашел один менее 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