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

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