Cloud-init
Общие сведения
Cloud-init - широко используемое средство для настройки виртуальной машины Linux при ее первой загрузке. Используется для установки пакетов, записи файлов или настройки пользователей и параметров безопасности.
Внимание
Утилита используется только для ВМ с ОС Linux.
Дополнительная информация
Допускается использовать как готовые образы, предоставляемые производителями ОС, например Debian, так и подготовить образы самостоятельно, например OpenStack create images manually.
Подробные примеры командной строки см. в Документации cloud-init.
Рекомендуется использовать источник NoCloud.
Подробное описание см. в Источники Cloud-Init.
Использование в SpaceVM
При включении Cloud-init для ВМ автоматически создается ISO-образ,
содержащий 2 YAML файла user-data
и meta-data
.
ISO-образ автоматически монтируется к ВМ через виртуальный CD-ROM.
ISO-образ примонтируется к свободному CD-ROM, если такого нет, то будет автоматически создан новый.
Также возможно передать параметры Cloud-init при создании ВМ через запрос multi-create-domain
или clone
.
user-data
Внимание
Необходимо ознакомиться с официальной документацией или документацией, представленной в дополнительной информации для подготовки user-data
.
user_data
- строка, содержащая в формате yaml конфигурацию user_data.
Файл user-data
должен начинаться со строки #cloud-config
.
Файлы
#cloud-config
— это текстовые файлы, закодированные в формате base64.
Пример user_data
#cloud-config
groups:
- ubuntu: [root,sys]
- cloud-users
users:
- default
# Создает пользователя user1 в группе sudo без пароля с незашифрованном паролем
# Не рекомендуется описывать пароль в незашифрованном виде (plain_text_passwd).
- name: user1
gecos: test user1 with plain passwd configured and sudo nopasswd enabled
groups: sudo
sudo: ['ALL=(ALL) NOPASSWD:ALL']
plain_text_passwd: < plain text password here >
lock_passwd: false
# Создает пользователя user2 с хэшированным паролем
- name: user2
gecos: test user2 with hashed passwd configured
passwd: < hashed password here >
lock_passwd: false
# Создает пользователя user3 с отключенным входом по паролю и вклюнным входом по публичному ключу.
# The following entry creates user3, disables password-based login and enables an SSH public key.
- name: user3
gecos: test user3 with SSH key configured
ssh_authorized_keys:
- ssh-public-key-information
lock_passwd: true
# Обновление базы пакетов
package_update: True
# Обновление пакетов
package_upgrade: False
# Устанавливаемые или обновляемые пакеты
packages:
- docker.io
- curl
- openssh-server
- qemu-guest-agent
# Запись файлов
write_files:
- path: /etc/rancher/rancherd/config.yaml
permissions: "0444"
content: |
role: server
server: https://192.168.6.113:8443
token: somethingrandom
# NOTE: Cloud-init applies network settings on every boot by default. To retain network settings from first
boot, uncomment the following section:
- path: /etc/cloud/cloud.cfg.d/80_disable_network_after_firstboot.cfg
content: |
# Отключение конфигурации сети полсе первой загрузки
network:
config: disabled
# Отключение Selinux
- path: /etc/sysconfig/selinux
encoding: b64
permissions: "0644"
owner: root:root
content: ClNFTElOVVg9ZGlzYWJsZWQKU0VMSU5VWFRZUEU9dGFyZ2V0ZWQK
runcmd:
# Принудительное отключение Selinux сразу
- setenforce 0
# Старт гостевого агента
- systemctl start qemu-guest-agent
# запуск rancherd
- curl -fL https://raw.githubusercontent.com/rancher/rancherd/master/install.sh | sh -
- [ ls, -l, / ]
- ls -l /root
- curl -fL https://raw.githubusercontent.com/rancher/rancherd/master/install.sh | sh -
final_message: "The system is finally up, after $UPTIME seconds"
meta-data
Внимание
Необходимо ознакомиться с официальной документацией или документацией, представленной в дополнительной информации для подготовки meta_data
.
meta_data
- строка, содержащая в формате yaml конфигурацию meta_data.
Автогенерация meta_data
Если meta_data
не задана пользователем, то instance-id
и local-hostname
будут заданы как ID ВМ.
Пример meta_data
instance-id: 898a905c-e9b8-4ea1-87a3-452497e467b6
local-hostname: ubuntu-guacamole
Пример meta_data с настройкой интерфейса eth0
instance-id: 898a905c-e9b8-4ea1-87a3-452497e467b6
local-hostname: ubuntu-guacamole
network-interfaces: |
iface eth0 inet static
address 192.168.1.10
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.254
Пример генерации хэшированного пароля в Python3
import crypt, getpass
print(crypt.crypt(getpass.getpass()))
Пример кодирования в base64 meta-data и user-data в Python
Пример кодирования
import base64
user_data = '''#cloud-config
groups:
- ubuntu: [root,sys]
- cloud-users
package_update: True
package_upgrade: False
packages:
- docker.io
- curl
- openssh-server
- qemu-guest-agent
write_files:
- path: /etc/rancher/rancherd/config.yaml
permissions: "0444"
content: |
role: cluster-init
token: bazalt
runcmd:
- curl -fL https://raw.githubusercontent.com/rancher/rancherd/master/install.sh | sh -
final_message: "The system is finally up, after $UPTIME seconds"
'''
user_data_bytes = user_data.encode('ascii')
base64_bytes = base64.b64encode(user_data_bytes)
base64_user_data = base64_bytes.decode('ascii')
print(base64_user_data)
meta_data = '''
instance-id: b73e86d6-6b77-4d14-bcef-a1df736ce87e
local-hostname: somedomain
'''
meta_data_bytes = meta_data.encode('ascii')
base64_bytes = base64.b64encode(meta_data_bytes)
base64_meta_data = base64_bytes.decode('ascii')
print(base64_meta_data)
Пример json параметров запроса создания тонкого клона с Cloud_init
POST http(s)://<адрес контроллера>/api/domains/multi-create-domain/?async=1
{"parent": "bfd282a4-3b1f-4f68-98cb-16deee43a3b8", # id шаблона ВМ
"start_on": true, # Включить тонкий клон после создания
"thin": true, # Параметр, что создается тонкий клон
"cloud_init": true, # Включение подготовки образа с cloud_init
"cloud_init_config": {
"user_data": "I2Nsb3VkLWNvbmZpZwoKZ3JvdXBzOgotIHVidW50dTogW3Jvb3Qsc3lzXQotIGNsb3VkLXVzZXJzCgpwYWNrYWdlX3VwZGF0ZTogVHJ1ZQpwYWNrYWdlX3VwZ3JhZGU6IEZhbHNlCgpwYWNrYWdlczoKICAtIGRvY2tlci5pbwogIC0gY3VybAogIC0gb3BlbnNzaC1zZXJ2ZXIKICAtIHFlbXUtZ3Vlc3QtYWdlbnQKCndyaXRlX2ZpbGVzOgogIC0gcGF0aDogL2V0Yy9yYW5jaGVyL3JhbmNoZXJkL2NvbmZpZy55YW1sCiAgICBwZXJtaXNzaW9uczogIjA0NDQiCiAgICBjb250ZW50OiB8CiAgICAgIHJvbGU6IGNsdXN0ZXItaW5pdAogICAgICB0b2tlbjogYmF6YWx0CgpydW5jbWQ6CiAtIGN1cmwgLWZMIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yYW5jaGVyL3JhbmNoZXJkL21hc3Rlci9pbnN0YWxsLnNoIHwgc2ggLQoKZmluYWxfbWVzc2FnZTogIlRoZSBzeXN0ZW0gaXMgZmluYWxseSB1cCwgYWZ0ZXIgJFVQVElNRSBzZWNvbmRzIiAgIAo",
"meta_data": "Cmluc3RhbmNlLWlkOiBiNzNlODZkNi02Yjc3LTRkMTQtYmNlZi1hMWRmNzM2Y2U4N2UKbG9jYWwtaG9zdG5hbWU6IHNvbWVkb21haW4KCg=="
}
}
Создание SSH-ключей через ssh-keygen
Пример создания SSH-ключей
[user@host ~]$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in .ssh/key-with-password.
Your public key has been saved in .ssh/key-with-password.pub.
The key fingerprint is:
SHA256:s7GGB7EyHUry4aOcNPKmhNKS7dl1YsMVLvFZJ77VxAo user@host.lab.example.com
The key's randomart image is:
+---[RSA 2048]----+
| . + =.o ... |
| = B XEo o. |
| . o O X =.... |
| = = = B = o. |
|= + * * S . |
|.+ = o + . |
| + . |
| |
| |
+----[SHA256]-----+
По умолчанию ключи будут сохранены в ~/.ssh/id_rsa
и ~/.ssh/id_rsa.pub
соответственно.
Ручное создание cloud-образа
Для создания cloud-образа необходимо в терминале из директории, содержащей конфигурационные файлы, выполнить команду:
genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data
Подготовка ВМ
- Установить поддерживаемую ОС семейства Linux.
Пример создания кластера k8s через Rancherd
Rancher
Rancher — это популярная платформа управления контейнерами с открытым исходным кодом. Выпущенная в начале 2018 года версия Rancher 2.X работает на Kubernetes и включает новые инструменты, такие, как управление несколькими кластерами и встроенные CI конвейеры. Помимо повышенной безопасности, масштабируемости и простых инструментов развертывания, уже имеющихся в Kubernetes, Rancher предлагает графический пользовательский интерфейс, упрощающий управление контейнерами. Благодаря графическому интерфейсу Rancher пользователи смогут управлять секретами, безопасно обрабатывать роли и разрешения, масштабировать узлы и поды, а также выполнять настройку средств распределения нагрузки и томов без необходимости использования инструментов командной строки или сложных файлов YAML.
ОС | Статус проверки | Доп. инфо |
---|---|---|
Debian Bullseye | + | |
CentOS-7 | + | |
CentOS-8 | + | Требуется настройка SELinux |
CentOS-8-Stream | + | Требуется настройка SELinux |
Fedora (Cloud Base image for Openstack) | + | |
ALTLinux P10 | + |
-
Загрузить в пул данных cloud-образ.
-
Импортировать файл в виртуальный диск.
-
Расширить размер виртуального диска до требуемой величины.
-
Создать ВМ, добавить диск, сетевой интерфейс, 2 консоли (необходимы для Сloud_init).
-
Перевести ВМ в шаблон.
-
Создать первый тонкий клон, который будет мастером кластера, используя приведённый ниже конфигурационный файл cloud.
Пример
#cloud-config groups: - cloud-users package_update: False package_upgrade: False users: - default - name: user groups: sudo sudo: ALL=(ALL) NOPASSWD:ALL shell: /bin/bash lock_passwd: false # пароль user для пользователя user passwd: $6$rounds=4096$9cYh.jYsend9bOZ$VBqFtH6Jc6cgpYga.sWD.G5l/h.Fedn.CRO7ouw7S7JiMbwXvf5cuENpOk9W4pqAAmF7vxKJy62QCHZ9xVvAd0 # cгенерируйте свой ключ ssh_authorized_keys: - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCWRyWsZAFDAiUuCPAz0cN1jFREnnBdLkpIoQygLJqkrzh85l47Omib+IlryIaa7QsjaKhI2dYUfviTiOeUM0yLH17YD7IR+8n2uADy3kNHbjwDn3+9OOfCGExLXH6Az1imenWJj6ErLmelTJi66xLWcGQhBNtr37XwOlL8eguP4TwZ1LmoUqWseKXEerUoOKqP2abYu5zgWNtkWJ5604V8lvQt5JgMJMqr7oGCIT/DgD/ndqOOu0G6698deEk/ooADVB1CUglrPni+ZPBHhwwMrovpkKgwbOTUXrmE5I9OrmsjLGiaLkjsSyQrfx5xfrXhogbCE174PWJaCy8zD7HLGArmhsBnMz8FKEbX/We547llCKGPGmc4H6IMhbryiZky3XuGK3nBKvmOiwwKUNoamt7yXUIRfFcoOqhC63DZfHT/4OvfvKnv3HtnY2VoDgZCaYCcT6ZZwntk2p6LY2zoDwqThXLtvZwouPkhtdOs2ATvW04CMnXCKBsu2W76c60= user@user-To-be-filled-by-O-E-M manage_resolv_conf: false manage_etc_hosts: false # qemu-guest-agent нужен для интеграции ВМ с гипервизором # curl, openssl нужен для загрузки и установки rancherd # openssh-server нужен для подключения по ssh packages: - qemu-guest-agent - openssl - curl - openssh-server # Конфигурация rancherd write_files: - path: /etc/rancher/rancherd/config.yaml permissions: "0444" content: | kubernetesVersion: v1.21 rancherVersion: stable rancherValues: # cгенерируйте свой пароль bootstrapPassword: admin role: cluster-init token: random # Disable Selinux - path: /etc/sysconfig/selinux encoding: b64 permissions: "0644" owner: root:root content: ClNFTElOVVg9ZGlzYWJsZWQKU0VMSU5VWFRZUEU9dGFyZ2V0ZWQK runcmd: # Принудительное отключение Selinux сразу - setenforce 0 # Старт гостевого агента - systemctl start qemu-guest-agent # Скачивание и запуск rancherd - curl -fL https://raw.githubusercontent.com/rancher/rancherd/master/install.sh | sh -
-
Дождаться завершения активации мастера кластера. Проверить, что Rancher доступен для управления по адресу https://{адрес ВМ}:8443 и там появился первый узел.
-
Создать необходимое количество тонких клонов, которые будет узлами кластера, используя приведённый ниже конфигурационный файл cloud.
Не забудьте указать адрес мастера (первой ВМ) в конфигурации Rancherd!
Пример
#cloud-config groups: - cloud-users package_update: False package_upgrade: False users: - default - name: user groups: sudo sudo: ALL=(ALL) NOPASSWD:ALL shell: /bin/bash lock_passwd: false passwd: $6$rounds=4096$9cYh.jYsend9bOZ$VBqFtH6Jc6cgpYga.sWD.G5l/h.Fedn.CRO7ouw7S7JiMbwXvf5cuENpOk9W4pqAAmF7vxKJy62QCHZ9xVvAd0 ssh_authorized_keys: - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCWRyWsZAFDAiUuCPAz0cN1jFREnnBdLkpIoQygLJqkrzh85l47Omib+IlryIaa7QsjaKhI2dYUfviTiOeUM0yLH17YD7IR+8n2uADy3kNHbjwDn3+9OOfCGExLXH6Az1imenWJj6ErLmelTJi66xLWcGQhBNtr37XwOlL8eguP4TwZ1LmoUqWseKXEerUoOKqP2abYu5zgWNtkWJ5604V8lvQt5JgMJMqr7oGCIT/DgD/ndqOOu0G6698deEk/ooADVB1CUglrPni+ZPBHhwwMrovpkKgwbOTUXrmE5I9OrmsjLGiaLkjsSyQrfx5xfrXhogbCE174PWJaCy8zD7HLGArmhsBnMz8FKEbX/We547llCKGPGmc4H6IMhbryiZky3XuGK3nBKvmOiwwKUNoamt7yXUIRfFcoOqhC63DZfHT/4OvfvKnv3HtnY2VoDgZCaYCcT6ZZwntk2p6LY2zoDwqThXLtvZwouPkhtdOs2ATvW04CMnXCKBsu2W76c60= user@user-To-be-filled-by-O-E-M manage_resolv_conf: false manage_etc_hosts: false packages: - qemu-guest-agent - curl - openssh-server write_files: - path: /etc/rancher/rancherd/config.yaml permissions: "0444" content: | kubernetesVersion: v1.21 rancherVersion: stable role: server server: https://{адрес мастера}:8443 token: random runcmd: # Принудительное отключение Selinux сразу - setenforce 0 # Старт гостевого агента - systemctl start qemu-guest-agent # запуск rancherd - curl -fL https://raw.githubusercontent.com/rancher/rancherd/master/install.sh | sh -
-
Дождаться завершения активации узлов кластера. Проверить, что они доступны в интерфейсе управления Rancher.