Kubeconfig для сервиса внутри пода

Столкнулся с задачей связать Istio и AWS Certificate Manager Private Certificate Authority. Для того чтобы истио вместо своих самоподписных сертификатов использовал сертификат из AWS PCA. Это один из пунктов успешного прохождения сертификации от Fedramp, ведь PCA имеют нужный нам стандарт FIPS 140‑2.

На просторах интернета можно запросто наткнуться на статью AWS Private CA Integration в которой описывается как это сделать через сервис getmesh. От себя скажу, что тулза отличная и по сути делает все за нас. Подключается к PCA, получает сертификат, на его основе создается сертификат для истио и после чего пушится в istio-system неймспейс для того, что бы IstioD с ним работал.

Все отлично - все работает. Но хотелось бы это дело автоматизировать, что бы каждый раз руками не проделывать одну и ту же работу для множества кластеров.

Так как мы инсталим Истио через наш кастомизированный Helm чарт, было принято решение создать джобу лично для getmesh с OIDC ролью для доступа к AWS PCA и RBAC ролью для доступа к istio-system неймспейсу и созданию сикрета с сертификатом.

Джобу создал, докеризировал getmesh, деплою и вижу, что джоба валится с ошибкой, смотрю в логи и нахожу, что getmesh ищет kubeconfig файлик несмотря на то, что у джобы есть Service Account с прикрепленной OIDC и RBAC ролью.

unable to create kube cli: failed to get kubeconfig: error building config from kubeconfig located in /root/.kube/config: stat /root/.kube/config: no such file or directory

Получается, чтобы запустить getmesh нам нужно иметь kubeconfig, хорошо.

Добавляю в докерфайл всеми любимый kubectl, собираю имейдж.

В команде для джобы прописываю

kubectl config set-credentials pca --token=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)

getmesh gen-ca --config-file manifest.yaml

Деплою хелмом и о чудо - джоба отработала и сикрет создался.

User "pca-manager" set.
Kubernetes Secret YAML created successfully in /root/.getmesh/secret/getmesh-708117521.yaml
Kubernetes Secret created successfully with name: cacerts, in namespace: istio-system

А все потому, что каждый в под c сервис аккаунтом добавляется сикрет с токеном. И через команду kubectl config set-credentials <NAME> --token= можно создать на основе токена kubeconfig файл, который нам и нужен был для getmesh

comments powered by Disqus