Как доставить секреты в COI при развертывании docker-compose
И так нам понадобится сервис 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
внутри контейнера.