ArgoCD: создание namespace с добавлением label istio-injection=enabled

При использовании ArgoCD столкнулся с проблемой добавления label на namespace, чтоб произвести istio injection для добавления sidecar в pod приложения. В офф документации есть несколько вариантов injection смотрим здесь, но в нашем случае подходит вариант с добавлением label в namespace istio-injection=enabled

По умолчанию ArgoCD не умеет назначать label к namespace, его можно назначить только на app, плюс ко всему при создании application ми можем указать создавать namespace или задеплоить уже в существующий (что в моем случае не подходит нам).

Возникла идея: а что если описать ресурс namespace в helm chart и в описании указать лейбл? Звучит неплохо, но тогда нужно как то сказать argo, чтоб первым должен создаваться namespace, а потом все остальные ресурсы. К счастью argo имеет такой функционал, для реализации мы будем использовать аннотацию argocd.argoproj.io/sync-wave: “”, подробнее про sync-wave можно почитать здесь

Для реализации нам понадобиться:
   – добавить в репозиторий с helm chart-ом  файл namespace.yaml;
   – описать в файле ресурс namespace;
   – добавить в annotation параметр argocd.argoproj.io/sync-wave;
   – указать label istio-injection: enabled.

Как это будет работать?

Argo создает ресурсы  волнами, то есть все ресурсы имеют значение sync-wave 0 (по умолчанию), если значение 0 тогда все ресурсы будут создаваться одновременно. Для того чтоб ресурс создался первым (в первой волне) нужно выставить значение -1. При использовании sync-wave ми можем организовать последовательность создания ресурсов в Argo (если это необходимо). Переходим к практике.

Так как у меня уже есть готовый чарт с app, добавлю в него файл namespace.yaml и в файле опишу все необходимые параметры для создания:

apiVersion: v1
kind: Namespace
metadata:
  name: test-namespace-istio-label-ns
  annotations:
    argocd.argoproj.io/sync-wave: "-1"
  labels:
    istio-injection: enabled

Общее содержание чарта выглядит так:

 test-app-frontend
    ├── Chart.yaml
    ├── env
    │   └── dev
    │       ├── secrets.yaml
    │       └── values.yaml
    └── templates
        ├── deployment.yaml
        ├── _helpers.tpl
        ├── hpa.yaml
        ├── namespace.yaml
        ├── rbac.yaml
        ├── secrets.yaml
        └── svc-ingress.yaml

перейдем к деплою, логинимся в Argo:

❯ argocd login dev-1-18.argocd.example.com --username admin
Password:
'admin:login' logged in successfully
Context 'dev-1-18.argocd.example.com' updated

создаем app:

❯ argocd app create -f argo/test-app-manifest.yaml \
--name test-app-ns-label \
--dest-namespace test-istio-enjection-from-argocd-ns \
--project=default \
--sync-policy auto application 'test-app-ns-label' created

и следим в UI Argo за процессом создания:

Как показано на изображении, в первой волне сначала создался namespace, а в следующей волне будут созданы остальные ресурсы. Осталось дождаться завершения синхронизации, и проверить создание ресурсы.

Немножко подождав завершения синхронизации, посмотрим, как сейчас, выглядит наш application:

Что ж, как видим app создался, осталось только проверить лейбл и доступность самого приложения.

Сначала проверяем namespace:

❯ kubectl describe ns test-istio-enjection-from-argocd-ns
Name:         test-istio-enjection-from-argocd-ns
Labels:       argocd.argoproj.io/instance=test-app-ns-label
              istio-injection=enabled
Annotations:  argocd.argoproj.io/sync-wave: -6
Status:       Active

все на месте, label создан, далее describe pod и посмотрим event:

❯ kubectl -n test-istio-enjection-from-argocd-ns describe pods
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 10m default-scheduler Successfully assigned test-istio-enjection-from-argocd-ns/web-***z-frontend-7**5*7**d-**kv7 to ip-1*-*1-5*-149.us-east-2.compute.internal
Normal Pulling 10m kubelet Pulling image "docker.io/istio/proxyv2:1.9.1"
Normal Pulled 10m kubelet Successfully pulled image "docker.io/istio/proxyv2:1.9.1"
Normal Created 10m kubelet Created container istio-init
Normal Started 10m kubelet Started container istio-init
Normal Pulled 10m kubelet Container image "be***/web-***-frontend:***" already present on machine
Normal Created 10m kubelet Created container web-***-frontend
Normal Started 10m kubelet Started container web-***-frontend
Normal Pulling 10m kubelet Pulling image "docker.io/istio/proxyv2:1.9.1"
Normal Pulled 10m kubelet Successfully pulled image "docker.io/istio/proxyv2:1.9.1"
Normal Created 10m kubelet Created container istio-proxy
Normal Started 10m kubelet Started container istio-proxy

istio-proxy добавился в pod и запущен, далее проверим доступность приложения, для этого будем использовать любимый curl:

❯ kubectl -n test-istio-enjection-from-argocd-ns describe pods
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 10m default-scheduler Successfully assigned test-istio-enjection-from-argocd-ns/web-***z-frontend-7**5*7**d-**kv7 to ip-1*-*1-5*-149.us-east-2.compute.internal
Normal Pulling 10m kubelet Pulling image "docker.io/istio/proxyv2:1.9.1"
Normal Pulled  10m kubelet Successfully pulled image "docker.io/istio/proxyv2:1.9.1"
Normal Created 10m kubelet Created container istio-init
Normal Started 10m kubelet Started container istio-init
Normal Pulled  10m kubelet Container image "be***/web-***-frontend:***" already present on machine
Normal Created 10m kubelet Created container web-***-frontend
Normal Started 10m kubelet Started container web-***-frontend
Normal Pulling 10m kubelet Pulling image "docker.io/istio/proxyv2:1.9.1"
Normal Pulled  10m kubelet Successfully pulled image "docker.io/istio/proxyv2:1.9.1"
Normal Created 10m kubelet Created container istio-proxy
Normal Started 10m kubelet Started container istio-proxy

работает.

Click to rate this post!
[Total: 1 Average: 5]