При использовании 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
работает.