Cloud-init
Общая информация
Cloud-init - это программа, запускающаяся на ВМ при загрузке, которая ищет данные конфигурации для применения к ВМ во время инициализации.
Примечание 1
Только для ВМ с ОС Linux.
Образы
Можно использовать как готовые образы, предоставляемые производителями ОС, например Debian, так и подготовить свои образы, например OpenStack create images manually.
Идея состоит в том, чтобы иметь определенный независимый от операционной системы формат конфигурации для параметров, общих для многих систем (таких, как имя хоста и конфигурация сети).
Подробные примеры командной строки см. в Документации cloud-init.
Рекомендуется использовать источник NoCloud. Подробное описание см. в Источники Cloud-Init.
Использование в SpaceVM
При включении Cloud-init для ВМ создается ISO-образ, содержащий 2 YAML файла user-data и meta-data и монтирующийся через виртуальный CD-ROM (через первый свободный имеющийся или создаваемый новый).
Также можно передать параметры cloud-init при создании ВМ через эндпоинт multi-create-domain или clone.
user-data
user_data - строка (может быть закодированной в base64), содержащая в формате yaml конфигурацию user_data.
Пример 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 - строка (может быть закодированной в base64), содержащая в формате 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
Подготовка ВМ
- Установите нужную ОС. Это может быть любая ОС, на которую можно поставить пакет Cloud-init. Желательно ставить наиболее свежую версию Cloud-init.
Пример создания кластера k8s через Rancherd
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.