Перейти к основному содержимому

Как доставить секреты в COI при развертывании docker-compose

· 2 мин. чтения

И так нам понадобится сервис Lockbox и сервисный аккаунт с доступом к нему.

Создадим секрет в Lockbox

Я для тестовых целей задал содержимое в поле ввода, но можно и загрузить файл. Так же можно настроить шифрование, но для примера я не буду усложнять.

Сервисный аккаунт

Тут все просто.

Нужен аккаунт с ролью lockbox.payloadViewer или выше т.е. lockbox.admin или admin.

Готовим конфиги для развертывания машины

#cloud-config
runcmd:
- mkdir /run/yc
- "curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh > /run/yc/install.sh"
- [ sudo, bash, /run/yc/install.sh]
- [ sudo, mkdir, /data ]
- "sudo /root/yandex-cloud/bin/yc lockbox payload get --id $secret_id --key config --cloud-id $cloud_id --folder-id $folder_id > /data/test.conf"
users:
- name: username
groups: sudo
shell: /bin/bash
sudo: ['ALL=(ALL) NOPASSWD:ALL']
ssh-authorized-keys:
- ssh-rsa AAAA...

Его надо будет сохранить в файле user-data.yaml. Подставьте свои значения вместо $secret_id, $cloud_id, $folder_id, a также имя пользователя в name и ключ в ssh-authorized-keys.

В секции runcmd описаны команды, которые cloud init выполнит при старте машины. В последней мы при помощи YC CLI идем в сервис Lockbox, получаем секрет $secret_id, берем часть секрета по ключу config, а далее записываем его в файл > /data/test.conf.

Теперь подготовим файл с COI спецификацией, где опишем какие контейнеры развернуть. Подробнее читайте по ссылке. А тут я приведу пример оттуда, немного модифицированный. Его надо будет сохранить в файле spec.yaml.

spec:
containers:
- command:
- sleep
args:
- 100000
env:
- name: MYENV
value: myvalue
image: cr.yandex/mirror/ubuntu:16.04
name: my-container
securityContext:
privileged: false
stdin: false
tty: false
volumeMounts:
- mountPath: /home/yc-user/data
name: data-volume
restartPolicy: Always
volumes:
- name: data-volume
hostPath:
path: /data

Разворачиваем COI VM

Теперь нам нужно взять id image из которого мы будем разворачивать ВМ.

IMAGE_ID=$(yc compute image get-latest-from-family container-optimized-image --folder-id standard-images --format=json | jq -r .id)

Дальше его нам его надо будет подставить в команду создания ВМ.

yc compute instance create \
--name coi-vm \
--zone=ru-central1-c \
--network-interface subnet-name=default-ru-central1-c,nat-ip-version=ipv4 \
--metadata-from-file user-data=user-data.yaml,docker-container-declaration=spec.yaml \
--create-boot-disk image-id=$IMAGE_ID \
--service-account-name lockbox

Теперь можно зайти на ВМ и убедиться что файл создан. Далее можно зайти в контейнер и убедиться, что файл доступен в примонтированной директории /home/yc-user/data внутри контейнера.