Передача значений из initContainers в спецификацию контейнера - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть развертывание kubernetes с приведенным ниже параметром c, которое устанавливается через helm 3.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: gatekeeper
spec:
  replicas: 1
  template:
    spec:
      containers:
        - name: gatekeeper
          image: my-gatekeeper-image:some-sha
          args:
            - --listen=0.0.0.0:80
            - --client-id=gk-client
            - --discovery-url={{ .Values.discoveryUrl }}

Мне нужно передать значение discoveryUrl в качестве значения helm, то есть publi c IP-адрес модуля nginx-ingress, который я развернул с помощью другой схемы управления. Я устанавливаю приведенное выше развертывание, как показано ниже:

helm3 install my-nginx-ingress-chart
INGRESS_IP=$(kubectl get svc -lapp=nginx-ingress -o=jsonpath='{.items[].status.loadBalancer.ingress[].ip}')
helm3 install my-gatekeeper-chart --set discovery_url=${INGRESS_IP}

Это работает нормально, однако, теперь вместо этих двух helm3 install я хочу иметь одну установку helm3, где оба - nginx -ingress и развертывание привратника должно быть создано.

Я понимаю, что в initContainer из my-gatekeeper-image мы можем получить IP-адрес nginx -ingress, но я не могу понять, как установить его как переменная окружения или передача в контейнер spe c.

Есть несколько вопросов, связанных со стековым потоком, в которых упоминается, что мы можем создать постоянный том или секрет для достижения этого, но я не уверен, как это будет работать, если мы должны удалить их. Я не хочу создавать какие-либо дополнительные объекты и поддерживать их жизненный цикл.

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Невозможно сделать это без монтирования постоянного тома. Но создание постоянного тома может быть поддержано только хранилищем в памяти, а не блочным устройством хранения. Таким образом, нам не нужно заниматься дополнительным управлением жизненным циклом. Способ достижения этого:

apiVersion: v1
kind: ConfigMap
metadata:
  name: gatekeeper
data:
  gatekeeper.sh: |-
    #!/usr/bin/env bash
    set -e

    INGRESS_IP=$(kubectl get svc -lapp=nginx-ingress -o=jsonpath='{.items[].status.loadBalancer.ingress[].name}')
    # Do other validations/cleanup
    echo $INGRESS_IP > /opt/gkconf/discovery_url;
    exit 0

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gatekeeper
  labels:
    app: gatekeeper
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gatekeeper
  template:
    metadata:
      name: gatekeeper
      labels:
        app: gatekeeper
    spec:
      initContainers:
        - name: gkinit
          command: [ "/opt/gk-init.sh" ]
          image: 'bitnami/kubectl:1.12'
          volumeMounts:
            - mountPath: /opt/gkconf
              name: gkconf
            - mountPath: /opt/gk-init.sh
              name: gatekeeper
              subPath: gatekeeper.sh
              readOnly: false
      containers:
        - name: gatekeeper
          image: my-gatekeeper-image:some-sha
          # ENTRYPOINT of above image should read the
          # file /opt/gkconf/discovery_url and then launch
          # the actual gatekeeper binary
          imagePullPolicy: Always
          ports:
            - containerPort: 80
              protocol: TCP
          volumeMounts:
            - mountPath: /opt/gkconf
              name: gkconf
      volumes:
        - name: gkconf
          emptyDir:
            medium: Memory
        - name: gatekeeper
          configMap:
            name: gatekeeper
            defaultMode: 0555
0 голосов
/ 08 апреля 2020

Использование init-контейнеров действительно является правильным решением, но вы должны знать, что таким образом вы увеличиваете сложность своего развертывания.

Это потому, что вам также необходимо создать учетную запись с разрешениями, чтобы иметь возможность читать служебные объекты изнутри контейнера init. Затем, имея IP-адрес, вы не можете просто установить переменную env для контейнера-привратника, не воссоздавая модуль, поэтому вам потребуется сохранить IP-адрес, например, в общий файл, и прочитать его из него при запуске привратника.

В качестве альтернативы Вы можете зарезервировать IP-адрес, если ваше облачное хранилище поддерживает эту функцию, и использовать этот адрес c IP при развертывании службы nginx:

apiVersion: v1
kind: Service
[...]
  type: LoadBalancer
  loadBalancerIP: "YOUR.IP.ADDRESS.HERE"

Дайте мне знать, если у вас есть какие-либо вопросы или что-то требует разъяснения.

...