Как использовать Kustomize для настройки Traefik 2.x IngressRoute (metadata.name, spec.routes[0].services[0].name & spec.routes[0].match = Host() )

У нас есть кластер EKS, работающий с Traefik, развернутым в стиле CRD (полная настройка на GitHub), и мы не хотим развертывать наше приложение https://gitlab.com/jonashackt/microservice-api-spring-boot с объектами Kubernetes Deployment, Service и IngressRoute (см. репозиторий конфигурации здесь). Манифесты выглядят так:

deployment.yml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: microservice-api-spring-boot
spec:
  replicas: 3
  revisionHistoryLimit: 3
  selector:
    matchLabels:
      app: microservice-api-spring-boot
      branch: main
  template:
    metadata:
      labels:
        app: microservice-api-spring-boot
        branch: main
    spec:
      containers:
        - image: registry.gitlab.com/jonashackt/microservice-api-spring-boot:c25a74c8f919a72e3f00928917dc4ab2944ab061
          name: microservice-api-spring-boot
          ports:
            - containerPort: 8098
      imagePullSecrets:
        - name: gitlab-container-registry

service.yml:

apiVersion: v1
kind: Service
metadata:
  name: microservice-api-spring-boot
spec:
  ports:
    - port: 80
      targetPort: 8098
  selector:
    app: microservice-api-spring-boot
    branch: main

traefik-ingress-route.yml:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: microservice-api-spring-boot-ingressroute
  namespace: default
spec:
  entryPoints:
    - web
  routes:
    - match: Host(`microservice-api-spring-boot-BRANCHNAME.tekton-argocd.de`)
      kind: Rule
      services:
        - name: microservice-api-spring-boot
          port: 80

Мы уже используем настроить и особенно kustomize CLI (на Mac или в GitHub Actions с установкой brew install kustomize) со следующей структурой папок:

├── deployment.yml
├── kustomization.yaml
├── service.yml
└── traefik-ingress-route.yml

Наш kustomization.yaml выглядит так:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- deployment.yml
- service.yml
- traefik-ingress-route.yml

images:
- name: registry.gitlab.com/jonashackt/microservice-api-spring-boot
  newTag: foobar

commonLabels:
  branch: foobar

nameSuffix: foobar

Теперь изменить metadata.name динамически, чтобы добавить суффикс к Deployment, Service и IngressRoute .metadata.name из рабочего процесса GitHub Actions легко с помощью kustomize CLI (поскольку мы хотим, чтобы суффикс использовал префикс -, нам нужно использовать синтаксис -- -barfoo здесь):

kustomize edit set namesuffix -- -barfoo

Проверьте результат с

kustomize build .

Также не проблема изменить .spec.selector.matchLabels.branch, .spec.template.metadata.labels.branch и .spec.selector.branch в развертывании и сервисе:

kustomize edit set label branch:barfoo

Изменение .spec.template.spec.containers[0].image нашего развертывания работает с:

kustomize edit set image registry.gitlab.com/jonashackt/microservice-api-spring-boot:barfoo

Но глядя на наш IngressRoute кажется, что .spec.routes[0].services[0].name и .spec.routes[0].match = Host() нельзя изменить с помощью Kustomize из коробки?! Итак, как мы можем изменить оба поля без необходимости замены инструментов, таких как yq или даже sed/envsubst?

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
0
0
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

1. Измените IngressRoutes .spec.routes[0].services[0].name с помощью Kustomize

Изменить IngressRoutes .spec.routes[0].services[0].name можно с помощью Kustomize с помощью NameReference трансформер (см. документацию здесь) — к счастью, я нашел вдохновение в этом выпуске. Поэтому нам нужно включить ключевое слово configurations в наш kustomize.yaml:

nameSuffix: foobar
configurations:
  # Tie target Service metadata.name to IngressRoute's spec.routes.services.name
  # Once Service name is changed, the IngressRoute referrerd service name will be changed as well.
  - nameReference.yml

Нам также нужно добавить файл с именем nameReference.yml:

nameReference:
  - kind: Service
    fieldSpecs:
      - kind: IngressRoute
        path: spec/routes/services/name

Как видите, мы привязываем name Сервиса к IngressRoutes spec/routes/services/name. Сейчас работает

kustomize edit set namesuffix barfoo

изменит не только теги metadata.name Deployment, Service и IngressRoute, но и .spec.routes[0].services[0].name IngressRoute, поскольку теперь он связан с metadata.name службы. Обратите внимание, что это только в том случае, если и реферер, и цель имеют тег name.

2. Изменить часть IngressRoutes .spec.routes[0].match = Host()

Вторая часть вопроса спрашивает, как изменить часть IngressRoutes .spec.routes[0].match = Host(). Есть открытая проблема в проекте Kustomize GitHub. Прямо сейчас Kustomize не поддерживает этот вариант использования — только написание собственного плагина-генератора для Kustomize. Поскольку это может быть не предпочтительным вариантом, есть еще один способ, вдохновленный этот пост в блоге. Поскольку мы можем создавать встроенные файлы yaml в нашей консоли, используя синтаксис cat > ./myyamlfile.yml <<EOF ... EOF, мы также можем использовать подстановку встроенной переменной.

Поэтому сначала определите имя ветки как переменную:

RULE_HOST_BRANCHNAME=foobar

А затем используйте описанный синтаксис для создания встроенного файла ingressroute-patch.yml:

cat > ./ingressroute-patch.yml <<EOF
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: microservice-api-spring-boot-ingressroute
  namespace: default
spec:
  entryPoints:
    - web
  routes:
    - match: Host(\`microservice-api-spring-boot-$RULE_HOST_BRANCHNAME.tekton-argocd.de\`)
      kind: Rule
      services:
        - name: microservice-api-spring-boot
          port: 80

EOF

Последний шаг — использовать файл ingressroute-patch.yml как patchesStrategicMerge внутри нашего kustomization.yaml следующим образом:

patchesStrategicMerge:
  - ingressroute-patch.yml

Теперь запуск kustomize build . должен выводить правильный Deployment, Service и IngressRoute для нашей установки:

apiVersion: v1
kind: Service
metadata:
  labels:
    branch: barfoo
  name: microservice-api-spring-boot-barfoo
spec:
  ports:
  - port: 80
    targetPort: 8098
  selector:
    app: microservice-api-spring-boot
    branch: barfoo
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    branch: barfoo
  name: microservice-api-spring-boot-barfoo
spec:
  replicas: 3
  revisionHistoryLimit: 3
  selector:
    matchLabels:
      app: microservice-api-spring-boot
      branch: barfoo
  template:
    metadata:
      labels:
        app: microservice-api-spring-boot
        branch: barfoo
    spec:
      containers:
      - image: registry.gitlab.com/jonashackt/microservice-api-spring-boot:barfoo
        name: microservice-api-spring-boot
        ports:
        - containerPort: 8098
      imagePullSecrets:
      - name: gitlab-container-registry
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  labels:
    branch: barfoo
  name: microservice-api-spring-boot-ingressroute-barfoo
  namespace: default
spec:
  entryPoints:
  - web
  routes:
  - kind: Rule
    match: Host(`microservice-api-spring-boot-barfoo.tekton-argocd.de`)
    services:
    - name: microservice-api-spring-boot-barfoo
      port: 80

Другие вопросы по теме