Чтобы управлять 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
Комментариев нет:
Отправить комментарий