Ресурсы 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 со значением полученного секрета.
Он также может синхронизировать секреты во всех пространствах имен кластера Kubernetes (Мне нравится эта функция ❤️):
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".
Нажмите кнопку "Add user", чтобы создать локального пользователя IAM, и заполните поля, как показано ниже:
Обратите внимание, что я назвал пользователя "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
Параметры пути
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:
Если вы впервые выбираете этот регион, необходимо его активировать:
Выберите домен OKMS:
Заполните путь и значение вашего секрета. Например:
Ваш секрет был успешно создан:
Установка 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, в ближайшие месяцы вы сможете его использовать 🎉
Комментарии
Категории
Случайное

Как оценивается экологическое

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

Создайте праздничный сайт за вечер:

Топ-6 VPS-хостингов в Великобритании:
