Перейти к содержанию

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.

image