У нас есть кластер 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
?
IngressRoute
s .spec.routes[0].services[0].name
с помощью KustomizeИзменить IngressRoute
s .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
.
.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