пятница, 25 ноября 2022 г.

Bitnami Sealed Secrets

Чтобы управлять 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

Комментариев нет:

Отправить комментарий