Чтобы управлять Kubernetes секретами в духе GitOps нужно их шифровать перед фиксацией в Git и расшифровывать на стороне Kubernetes. Для CI я раньше использовал Mozilla SOPS, а для Kubernetes решил попробовать Bitnami Sealed Secrets.
В Sealed Secrets используется ассиметричная криптография и расшифровать секреты без доступа к приватному ключу не получится - можно коммитить даже в публичный репозитарий, хотя я бы не рекомендовал так делать.
У меня установка sealed secrets контроллера делается посредством Argo CD с использованием Helm чарта, но на всякий случай опишу и ручную установку:
$ kubectl create namespace sealed-secrets
$ helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
$ helm install sealed-secrets sealed-secrets/sealed-secrets \
--namespace sealed-secrets --version 2.7.1
Чтобы начать шифровать секреты осталось установить kubeseal
$ curl -OL https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.19.2/kubeseal-0.19.2-linux-amd64.tar.gz $ tar -xzf kubeseal-0.19.2-linux-amd64.tar.gz kubeseal $ sudo install -o root -m 755 kubeseal /usr/local/bin $ rm kubeseal kubeseal-0.19.2-linux-amd64.tar.gz $ kubeseal --version kubeseal version: 0.19.2
Создание запечатанного секрета для приватного Docker registry
$ REGISTRY_SECRET=gitlab-registry
$ REGISTRY_SERVER=registry.example.com
$ REGISTRY_USERNAME=k3s-cluster
$ REGISTRY_PASSWORD=SecurePasswordHere
$ kubectl create secret docker-registry ${REGISTRY_SECRET} \
--dry-run=client \
--docker-server=${REGISTRY_SERVER} \
--docker-username="${REGISTRY_USERNAME}" \
--docker-password="${REGISTRY_PASSWORD}" \
-o yaml | \
kubeseal --namespace default \
--controller-namespace sealed-secrets \
--controller-name sealed-secrets \
--format yaml > ${REGISTRY_SECRET}-sealed.yaml
После этого файл gitlab-registry-sealed.yaml можно коммитить в репозитарий.
В процессе тестирования я наступил на несколько граблей из-за невнимательного чтения README - продублирую тут на всякий случай:
error: invalid configuration: no configuration has been provided, try setting KUBERNETES_MASTER environment variable
Я использую k3s и у меня отсутствует файл ~/.kube/config - нужно указать путь к нему через опцию --kubeconfig
$ kubeseal --kubeconfig /etc/rancher/k3s/k3s.yaml
или задать переменную окружения KUBECONFIG
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
error: cannot get sealed secret service: services "sealed-secrets-controller" not found
По-умолчанию kubeseal полагается на установку контроллера в kube-system неймспейс с именем sealed-secrets-controller. Если ставить в отдельный неймспейс и не использовать fullnameOverride=sealed-secrets-controller, то нужно использовать параметры --controller-namespace и --controller-name
kubeseal --controller-namespace sealed-secrets --controller-name sealed-secrets
Комментариев нет:
Отправить комментарий