Kubectl - Как прочитать входящие хосты из переменных конфигурации? - PullRequest
1 голос
/ 28 марта 2020

У меня есть ConfigMap с переменной для моего домена:

apiVersion: v1
kind: ConfigMap
metadata:
  name: config
data:
  MY_DOMAIN: mydomain.com

, и моя цель - использовать переменную MY_DOMAIN внутри моей входной конфигурации

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myingress
spec:
  tls:
    - hosts:
⮕       - config.MY_DOMAIN
      secretName: mytls
  rules:
⮕   - host: config.MY_DOMAIN
      http:
        paths:
          - backend:
              serviceName: myservice
              servicePort: 3000

Но очевидно, конфиг выше не действителен. Так как же этого достичь?

1 Ответ

3 голосов
/ 28 марта 2020

Функции configMapRef и secretMapRef для envFrom и valueFrom доступны только для переменных среды, что означает, что их нельзя использовать в этом контексте. Требуемая функциональность недоступна в Vanilla Kubernetes с 1.18.0.

Однако это можно сделать. Helm и Kustomize , вероятно, являются двумя лучшими способами выполнить sh, но это также можно сделать с помощью sed или awk. Хелм - это шаблонизатор для манифестов Кубернетеса. Это значит, что вы создаете манифесты c generic, шаблонируете дельты между желаемыми манифестами с помощью манифестов c generi по переменным, а затем предоставляете файл переменных. Затем во время выполнения переменные из вашего файла переменных автоматически вставляются в шаблон для вас.

Еще один способ достижения sh, поэтому Kustomize. Что я лично рекомендую. Kustomize похож на Helm в том, что он имеет дело с созданием персонализированных манифестов из обобщенных c, но не делает это с помощью шаблонов. Kustomize уникален тем, что он выполняет исправления слияния между YAML или JSON файлами во время выполнения. Эти патчи называются оверлеями , поэтому их часто называют оверлейным механизмом, чтобы отличаться от традиционных шаблонных движков. Причиной является то, что Kustomize может использоваться с рекурсивными деревьями каталогов баз и оверлеев . Это делает его гораздо более масштабируемым для сред, в которых могут потребоваться десятки, сотни или тысячи манифестов из шаблонных обобщенных примеров c.

Так как мы это сделаем? Что ж, с Kustomize вы сначала определите файл kustomization.yml . Внутри вы определяете свои ресурсы. В этом случае myingress:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
    - myingress.yml

Создайте каталог example и создайте в нем подкаталог с именем base. Создайте ./example/base/kustomization.yml и заполните его настройкой выше. Теперь создайте файл ./example/base/myingress.yml и заполните его примером файла myingress, который вы дали выше.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myingress
spec:
  tls:
    - hosts:
      - config.MY_DOMAIN
      secretName: mytls
  rules:
     - host: config.MY_DOMAIN
        http:
          paths:
            - backend:
                serviceName: myservice
                servicePort: 3000

Теперь нам нужно определить наше первое наложение. Мы создадим две разные конфигурации домена, чтобы предоставить пример того, как работают оверлеи. Сначала создайте каталог ./example/overlays/domain-a и создайте в нем файл kustomization.yml со следующим содержимым:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
    - ../../../base/

patchesStrategicMerge:
    - ing_patch.yml

configMapGenerator:
    - name: config_a
      literals:
        - MY_DOMAIN='domain_a'

На этом этапе мы определили ing_patch.yml и config_a в этом файле. ing_patch.yml будет служить нашим входным патчем, а config_a будет нашим configMap. Однако в этом случае мы будем использовать функцию Kustomize, известную как configMapGenerator , вместо того, чтобы вручную создавать файлы configMap для отдельных литеральных пар key:value.

Теперь, когда мы сделали это, нам нужно сделать наш первый патч! Поскольку дельты в вашем входе довольно маленькие, это не так сложно. Создайте ./example/overlays/domain_a/ing_patch.yml и заполните его:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myingress
spec:
  tls:
    - hosts:
      - domain.a.com
  rules:
     - host: domain.a.com

Отлично, вы создали свой первый оверлей. Теперь вы можете использовать kubectl или kustomize для генерации результирующего манифеста для применения к серверу Kubernetes API.

  • Kubectl Build: kubectl kustomize ./example/overlays/domain_a
  • Kustomize Build: kustomize build ./example/overlays/domain_a

Run one из вышеупомянутых команд Build и просмотрите STDOUT, произведенный в вашем терминале. Обратите внимание, что он содержит два файла, myingress и config? И myingress содержит конфигурацию домена, присутствующую в патче наложения?

Итак, на данный момент вы, вероятно, спрашиваете. Почему Kustomize существует, если Kubectl поддерживает функции по умолчанию? Итак, Kustomize изначально был запущен как внешний проект, и бинарный файл Kustomize часто запускает более новую версию, чем версия, доступная в Kubectl.

Следующим шагом является создание второго наложения. Итак, go впереди и cp ваше первое наложение: cp -r ./example/overlays/domain_a ./example/overlays/domain_b.

Теперь, когда вы сделали это, откройте ./example/overlays/domain_b/ing_patch.yml в текстовом редакторе и измените содержимое так, чтобы оно выглядело так:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myingress
spec:
  tls:
    - hosts:
      - domain.b.com
  rules:
     - host: domain.b.com

Сохраните файл и затем создайте два отдельных оверлея:

kustomize build ./example/overlays/domain_a
kustomize build ./example/overlays/domain_b

Обратите внимание, как каждый сгенерированный поток STDOUT изменяется в зависимости от патча, присутствующего в каталоге Overlay? Вы можете продолжить абстрагирование этого шаблона, сделав свои Базы наложениями для других баз. Или сделав ваши оверлеи основ для других оверлеев. Это может позволить вам масштабировать этот проект чрезвычайно мощным и эффективным способом. Примените их к вашему API-серверу, если вы sh:

kubectl apply -k ./example/overlays/domain_a
kubectl apply -k ./example/overlays/domain_b

Это только начало Kustomize на самом деле. Как вы могли догадаться, увидев поле configMapGenerator в файле kustomization.yml для каждого наложения, Kustomize имеет множество встроенных функций. Он может добавлять метки ко всем вашим ресурсам, он может переопределять их пространства имен или контейнер image information, et c.

Надеюсь, это поможет. Дайте мне знать, если у вас есть еще вопросы.

...