Инфраструктура, VPS и облачный хостинг

Безопасное управление секретами в Kubernetes с OVHcloud Secret Manager

Поделиться:
Manage your secrets through OVHcloud Secret Manager thanks to External Secrets Operator (ESO) on OVHcloud Managed Kubernetes Service (MKS)

Ресурсы Secrets в Kubernetes позволяют нам хранить конфиденциальную информацию, такую как логины, пароли, токены, учетные данные и сертификаты. Но будьте осторожны: при создании Secret в Kubernetes он кодируется в base64, но не шифруется, поэтому каждый может прочитать и декодировать его.

Хорошая новость в том, что в OVHcloud мы выпустили бета-версию нашего Secret Manager, который вы можете использовать в своих кластерах Kubernetes благодаря External Secrets Operator (ESO) 🎉.

External Secrets Operator

External Secrets Operator (ESO) расширяет Kubernetes с помощью Custom Resource Definitions (CRD), которые определяют где находятся секреты и как их синхронизировать.

Контроллер извлекает секреты из внешнего API и создает Kubernetes Secrets. Если секрет изменяется во внешнем API, контроллер обновляет секрет в кластере Kubernetes.

Конкретно, ESO может подключиться к внешнему Secret Manager (OVHcloud, Vault, AWS, GCP...), через (Cluster)SecretStore и благодаря ExternalSecret он знает, какие секреты нужно получить. Затем он создает Secret в кластере Kubernetes со значением полученного секрета.

Manage your secrets through OVHcloud Secret Manager thanks to External Secrets Operator (ESO) on OVHcloud Managed Kubernetes Service (MKS)

Он также может синхронизировать секреты во всех пространствах имен кластера Kubernetes (Мне нравится эта функция ❤️):

Manage your secrets through OVHcloud Secret Manager thanks to External Secrets Operator (ESO) on OVHcloud Managed Kubernetes Service (MKS)

External Secrets поддерживает множество Провайдеров (AWS Secrets Manager, HashiCorp Vault, Google Secret Manager...). В этом посте блога мы будем использовать провайдер Hashicorp Vault для создания секрета, хранящегося в новом OVHcloud Secret Manager.

Чтобы узнать больше, прочитайте официальную документацию ESO.

Давайте сделаем это!

Создание локального пользователя IAM

Чтобы иметь право извлекать секреты из Secret Manager, сначала нам нужно создать (или иметь существующего) локального пользователя IAM с необходимыми правами.

В Панели управления OVHcloud (UI) перейдите в раздел "Identity and Access Management", а затем в сервис "Identities".

Manage your secrets through OVHcloud Secret Manager thanks to External Secrets Operator (ESO) on OVHcloud Managed Kubernetes Service (MKS)

Нажмите кнопку "Add user", чтобы создать локального пользователя IAM, и заполните поля, как показано ниже:

Manage your secrets through OVHcloud Secret Manager thanks to External Secrets Operator (ESO) on OVHcloud Managed Kubernetes Service (MKS) Manage your secrets through OVHcloud Secret Manager thanks to External Secrets Operator (ESO) on OVHcloud Managed Kubernetes Service (MKS)

Обратите внимание, что я назвал пользователя "secretmanager-", за которым следует ID домена OKMS, который я хочу использовать.

Пользователь должен быть в группе ADMIN или, что лучше, должен иметь следующие политики:

okms:apikms:secret/create
okms:apikms:secret/version/getData
okms:apiovh:secret/get

Получение Personal Access Token (PAT)

ClusterSecretStore ESO должен иметь право извлекать секреты из Secret Manager, поэтому нам нужно получить PAT, токен.

Через наш API вы можете его получить.

URL консоли API OVHcloud: https://eu.api.ovh.com/console/?section=%2Fme&branch=v1#post-/me/identity/user/-user-/token

Manage your secrets through OVHcloud Secret Manager thanks to External Secrets Operator (ESO) on OVHcloud Managed Kubernetes Service (MKS)

Параметры пути

user: secretmanager-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx

Тело запроса:

{
"description": "PAT secretmanager-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
"name": "pat-secretmanager-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"
}

Вы должны получить ответ примерно такого вида:

{
"creation": "2025-11-07T14:02:56.679157188Z",
"description": "PAT secretmanager-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
"expiresAt": null,
"lastUsed": null,
"name": "pat-secretmanager-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
"token": "eyJhbGciOiJ...punpVAg"
}

Сохраните значение токена, мы будем использовать его в следующие минуты.

Создание секрета в Secret Manager

В этом посте блога мы создадим секрет, который будет очень полезен в кластере Kubernetes - он будет содержать информацию для аутентификации в нашем OVHcloud MPR.

В Панели управления OVHcloud (UI) перейдите в "Secret Manager", а затем создайте секрет "prod/va1/dockerconfigjson" в регионе Европа (Франция - Париж) eu-west-par:

Manage your secrets through OVHcloud Secret Manager thanks to External Secrets Operator (ESO) on OVHcloud Managed Kubernetes Service (MKS)

Если вы впервые выбираете этот регион, необходимо его активировать:

Manage your secrets through OVHcloud Secret Manager thanks to External Secrets Operator (ESO) on OVHcloud Managed Kubernetes Service (MKS)

Выберите домен OKMS:

Manage your secrets through OVHcloud Secret Manager thanks to External Secrets Operator (ESO) on OVHcloud Managed Kubernetes Service (MKS)

Заполните путь и значение вашего секрета. Например:

Manage your secrets through OVHcloud Secret Manager thanks to External Secrets Operator (ESO) on OVHcloud Managed Kubernetes Service (MKS)

Ваш секрет был успешно создан:

Manage your secrets through OVHcloud Secret Manager thanks to External Secrets Operator (ESO) on OVHcloud Managed Kubernetes Service (MKS)

Установка External Secrets Operator в ваш кластер

Разверните external secret через Helm:

helm repo add external-secrets https://charts.external-secrets.io
helm repo update

Установите из репозитория чартов:

helm install external-secrets 
external-secrets/external-secrets
-n external-secrets
--create-namespace
--set installCRDs=true

Вы должны получить результат примерно такого вида:

$ helm install external-secrets 
external-secrets/external-secrets
-n external-secrets
--create-namespace
--set installCRDs=true

NAME: external-secrets
LAST DEPLOYED: Mon Nov 24 17:08:58 2025
NAMESPACE: external-secrets
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
external-secrets has been deployed successfully in namespace external-secrets!

In order to begin using ExternalSecrets, you will need to set up a SecretStore
or ClusterSecretStore resource (for example, by creating a 'vault' SecretStore).

More information on the different types of SecretStores and how to configure them
can be found in our Github: https://github.com/external-secrets/external-secrets

Эта команда установит External Secrets Operator в ваш кластер.

Проверьте, что ESO запущен:

$ kubectl get all -n external-secrets
NAME READY STATUS RESTARTS AGE
pod/external-secrets-6b9f8ff5d4-jwd6g 1/1 Running 0 25m
pod/external-secrets-cert-controller-7bf8fd894c-d24xb 1/1 Running 0 25m
pod/external-secrets-webhook-df488ddff-2xv4t 1/1 Running 0 25m

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/external-secrets-webhook ClusterIP 10.3.106.32 <none> 443/TCP 25m

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/external-secrets 1/1 1 1 25m
deployment.apps/external-secrets-cert-controller 1/1 1 1 25m
deployment.apps/external-secrets-webhook 1/1 1 1 25m

NAME DESIRED CURRENT READY AGE
replicaset.apps/external-secrets-6b9f8ff5d4 1 1 1 25m
replicaset.apps/external-secrets-cert-controller-7bf8fd894c 1 1 1 25m
replicaset.apps/external-secrets-webhook-df488ddff 1 1 1 25m

Создание Secret, содержащего PAT

Закодируйте PAT в base64:

$ echo -n "<token>" | base64

ZXlKaG...wVkFn

Создайте секрет с ним внутри файла secret.yaml:

apiVersion: v1
kind: Secret
metadata:
name: ovhcloud-vault-token
namespace: external-secrets
data:
token: ZXlKaG...wVkFn

Примените ресурс в вашем кластере:

kubectl apply -f secret.yaml

Проверьте, что секрет был создан:

$ kubectl get secret ovhcloud-vault-token -n external-secrets
NAME TYPE DATA AGE
ovhcloud-vault-token Opaque 1 5m

Развертывание ClusterSecretStore для подключения ESO к Secret Manager

Настройте ClusterSecretStore, который отвечает за синхронизацию с Secret Manager.
Он будет использовать провайдер HashiCorp Vault с аутентификацией по токену и бэкендом OKMS endpoint.

Создайте файл clustersecretstore.yaml с таким содержимым:

apiVersion: external-secrets.io/v1
kind: ClusterSecretStore
metadata:
name: vault-secret-store
spec:
provider:
vault:
server: "https://eu-west-par.okms.ovh.net/api/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # OKMS endpoint, заполните правильным регионом и вашим okms_id
path: "secret"
version: "v2"
auth:
tokenSecretRef:
name: ovhcloud-vault-token # k8s secret, содержащий ваш PAT
key: token

Обратите внимание, что в нашем примере "eu-west-par" - это выбранный нами регион. Заполните URL сервера другим регионом в зависимости от вашего случая.

Примените его:

kubectl apply -f clustersecretstore.yaml

Проверьте:

$ kubectl get clustersecretstore.external-secrets.io/vault-secret-store
NAME AGE STATUS CAPABILITIES READY
vault-secret-store 2m Valid ReadWrite True

Создание ExternalSecret

Создайте файл externalsecret.yaml с таким содержимым:

apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
name: docker-config-secret
namespace: external-secrets
spec:
refreshInterval: 30m
secretStoreRef:
name: vault-secret-store
kind: ClusterSecretStore
target:
template:
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: "{{ .mysecret | toString }}"
name: ovhregistrycred
creationPolicy: Owner
data:
- secretKey: mysecret
remoteRef:
key: prod/va1/dockerconfigjson

Примените его:

$ kubectl apply -f externalsecret.yaml
externalsecret.external-secrets.io/docker-config-secret created

Проверьте:

$ kubectl get externalsecret.external-secrets.io/docker-config-secret -n external-secrets
NAME STORETYPE STORE REFRESH INTERVAL STATUS READY
docker-config-secret ClusterSecretStore vault-secret-store 30m0s SecretSynced True

После применения этой команды будет создан объект Kubernetes Secret

$ kubectl get secret -n external-secrets
NAME TYPE DATA AGE
...
ovhregistrycred kubernetes.io/dockerconfigjson 1 17d
...

Как вы можете видеть, Secret был создан и теперь вы можете использовать его в своих Pods как imagePullSecret!

Заключение

В этой статье вы увидели, как создавать секреты в новом OVHcloud Secret Manager и как использовать их непосредственно в ваших Kubernetes кластерах через провайдер ESO Vault.

И хорошая новость заключается в том, что наши команды разрабатывают OVHcloud External Secret Operator, в ближайшие месяцы вы сможете его использовать 🎉

Manage your secrets through OVHcloud Secret Manager thanks to External Secrets Operator (ESO) on OVHcloud Managed Kubernetes Service (MKS)