Как стать автором
Обновить
71.76

Простой способ установки Talos Linux на любую машину и у любого провайдера

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров3K

Talos Linux — это специализированная операционная система, предназначенная для запуска Kubernetes. На мой взгляд, с этой задачей она справляется лучше остальных ОС. С одной стороны, он полностью закрывает вопросы full lifecycle management для управления Kubernetes control-plane. А с другой — Talos Linux фокусируется на безопасности, по-максимуму ограничивая пользователя от возможности влиять на систему. Особенность этой ОС — практически полное отсутствие исполняемых файлов, в том числе shell и возможности зайти по SSH. Вся настройка Talos Linux осуществляется через Kubernetes-подобное API.

Обычно Talos Linux предоставляется в виде набора готовых образов под различные системы. 

Стандартный метод установки предполагает, что вы возьмёте подготовленный образ под конкретное облако или гипервизор и просто создадите из него виртуальную машину. Если же говорить о физических серверах, то предполагается, что для загрузки образа Talos Linux и последующей установки вы будете использовать ISO или PXE.

К сожалению, это не работает, когда речь заходит о провайдерах, которые предоставляют преднастроенный сервер или виртуальную машину без возможности использовать кастомный образ или даже ISO для установки через KVM. В этом случае ваш выбор будет ограничен лишь теми дистрибутивами, которые предлагает облачный провайдер.

В процессе установки Talos Linux необходимо дать ответы на два вопроса: (1) как загрузить образ Talos Linux и (2) как описать и применить в этот загруженный образ machine-config — основной конфиг для настройки Talos Linux. О них и пойдёт речь дальше.

Загружаем образ Talos Linux

В качестве одного из самых универсальных методов мы воспользуемся механизмом ядра Linux — kexec.

kexec — это утилита и одноименный системный вызов, позволяющий загрузить новое ядро из существующей системы без «железной» перезагрузки самой машины. То есть мы можем скачать необходимые vmlinuz и initramfs от Talos Linux, а затем, передав необходимые параметры ядра, сразу переключиться в новую систему. Это похоже на то, если бы загрузка ядра производилась обычным загрузчиком при старте машины, только используя вашу существующую ОС в качестве такого загрузчика.

По сути, всё, что вам понадобится — это любой установленный Linux-дистрибутив. Подойдёт как физический сервер, запущенный в rescue-режиме, так и виртуальная машина с уже установленной операционной системой. Мы рассмотрим вариант, когда на сервере используется Ubuntu, но вместо нее может использоваться любой другой популярный дистрибутив Linux. 

Давайте залогинимся с помощью SSH и установим пакет с kexec-tools — он содержит утилиту kexec, которая понадобится нам позднее.

apt install kexec-tools -y

Теперь необходимо скачать образ Talos Linux, а точнее — ядро и initramfs. Их можно скачать из официального репозитория:

wget -O /tmp/vmlinuz https://github.com/siderolabs/talos/releases/latest/download/vmlinuz-amd64
wget -O /tmp/initramfs.xz https://github.com/siderolabs/talos/releases/latest/download/initramfs-amd64.xz

Если сервер физический, а не виртуальный, вам необходимо будет сформировать собственный образ со всеми необходимыми прошивками, используя https://factory.talos.dev. Кроме того, вы можете воспользоваться готовыми образами из проекта Cozystack (решение для построения облаков, которое мы создали в Ænix и передали в CNCF Sandbox) — они уже включают все необходимые модули и прошивки, так что ничего собирать не придется:

wget -O /tmp/vmlinuz https://github.com/cozystack/cozystack/releases/latest/download/kernel-amd64
wget -O /tmp/initramfs.xz https://github.com/cozystack/cozystack/releases/latest/download/initramfs-metal-amd64.xz

Теперь нам понадобятся данные о сети, которые необходимо передать Talos Linux во время загрузки. Ниже — небольшой скрипт, он собирает всё необходимое и устанавливает переменные окружения.

IP=$(ip -o -4 route get 8.8.8.8 | awk -F"src " '{sub(" .*", "", $2); print $2}')
GATEWAY=$(ip -o -4 route get 8.8.8.8 | awk -F"via " '{sub(" .*", "", $2); print $2}')
ETH=$(ip -o -4 route get 8.8.8.8 | awk -F"dev " '{sub(" .*", "", $2); print $2}')
CIDR=$(ip -o -4 addr show "$ETH" | awk -F"inet $IP/" '{sub(" .*", "", $2); print $2; exit}')
NETMASK=$(echo "$CIDR" | awk '{p=$1;for(i=1;i<=4;i++){if(p>=8){o=255;p-=8}else{o=256-2^(8-p);p=0}printf(i<4?o".":o"\n")}}')
DEV=$(udevadm info -q property "/sys/class/net/$ETH" | awk -F= '$1~/ID_NET_NAME_ONBOARD/{print $2; exit} $1~/ID_NET_NAME_PATH/{v=$2} END{if(v) print v}')

Передавать параметры мы будем через kernel cmdline. По сути, мы просто сформируем опцию ip= для настройки сети методом Kernel level IP configuration. Этот метод позволяет автоматически настраивать сетевые интерфейсы и назначать им IP-адреса во время загрузки ядра на основе параметров, переданных через командную строку ядра. Эта возможность реализуется самим ядром и настраивается опцией CONFIG_IP_PNP, в ядре Talos Linux она уже включена по умолчанию. Чтобы ей воспользоваться, вам нужно передать правильно сформированные опции для настройки сети в kernel cmdline.

  • На сайте Talos Linux есть документация, содержащая описание синтаксиса для этой опции.

  • В официальной документации Linux Kernel вы можете найти более детальные примеры.

Установим переменную CMDLINE с опцией ip, которая будет содержать настройки существующей системы, и выведем на экран её содержимое:

CMDLINE="init_on_alloc=1 slab_nomerge pti=on console=tty0 console=ttyS0 printk.devkmsg=on talos.platform=metal ip=${IP}::${GATEWAY}:${NETMASK}::${DEV}:::::"
echo $CMDLINE

На выходе мы должны получить что-то вроде такого:

init_on_alloc=1 slab_nomerge pti=on console=tty0 console=ttyS0 printk.devkmsg=on talos.platform=metal ip=10.0.0.131::10.0.0.1:255.255.255.0::eno2np0:::::

Сверяемся с синтаксисом команды и загружаем наше новое ядро:

kexec -l /tmp/vmlinuz --initrd=/tmp/initramfs.xz --command-line="$CMDLINE"
kexec -e

Первая команда загрузит ядро Talos в оперативную память, а вторая команда переключит текущую систему на это новое ядро.

В итоге мы получим загруженный Talos Linux с настроенной сетью. Пока он работает прямо из оперативной памяти, поэтому при перезагрузке сервера система вернётся в изначальное состояние (загрузится оригинальная ОС с жесткого диска, то есть Ubuntu).

Применяем machine-config и устанавливаем Talos Linux на диск

Для того чтобы установить Talos Linux на диск персистентно и заменить текущую ОС, потребуется применить machine-config, с указанием диска, на который следует произвести установку. Для настройки машины вы можете воспользоваться официальной утилитой talosctl или утилитой Talm, которая развивается мейнтейнерами проекта Cozystack (Talm можно использовать с ванильным Talos Linux).

Давайте для начала рассмотрим вариант конфигурации с помощью talosctl. Перед применением конфига убедитесь, что он содержит настройки сети для вашей ноды, в противном случае после перезагрузки нода не настроит сеть, так как во время установки на диск записывается bootloader, конфигурация которого по умолчанию не содержит опции ip для автонастройки сети ядром.

Вот пример конфиг-патча который содержит необходимые значения:

# node1.yaml
machine:
  install:
    disk: /dev/sda
  network:
    hostname: node1
    nameservers:
    - 1.1.1.1
    - 8.8.8.8
    interfaces:
    - interface: eno2np0
      addresses:
      - 10.0.0.131/24
      routes:
      - network: 0.0.0.0/0
        gateway: 10.0.0.1

Вы можете использовать его для генерации полного конфига:

talosctl gen secrets
talosctl gen config --with-secrets=secrets.yaml --config-patch-control-plane=@node1.yaml <cluster-name> <cluster-endpoint>

Полученный конфиг стоит проверить и применить на ноде:

talosctl apply -f controlplane.yaml -e 10.0.0.131 -n 10.0.0.131 -i

Как только вы примените полученный controlplane.yaml, нода установит Talos на диск /dev/sda, перезаписав текущую систему, и уйдёт в ребут.

Вам останется только выполнить команду bootstrap для иницииации etcd-кластера:

talosctl --talosconfig=talosconfig bootstrap -e 10.0.0.131 -n 10.0.0.131

В любой момент вы можете посмотреть состояние ноды через встроенный dashboard:

talosctl --talosconfig=talosconfig dashboard -e 10.0.0.131 -n 10.0.0.131

Как только все сервисы перейдут в состояние Ready, вам остаётся получить kubeconfig — теперь вы можете пользоваться свежеустановленным Kubernetes:

talosctl --talosconfig=talosconfig kubeconfig kubeconfig
export KUBECONFIG=${PWD}/kubeconfig

Используем Talm для управления и применения конфигов

Когда таких конфигов становится слишком много, хочется иметь удобный способ ими управлять. Особенно это бывает полезно в случае использования bare-metal нод, где у каждой ноды могут быть диски и сетевые интерфейсы, а другого способа настройки сети просто нет. В итоге для каждой ноды приходится держать отдельный патч со своими настройками.

Чтобы решить эту проблему, мы разработали Talm — менеджер конфигурации для Talos Linux, механика работы которого напоминает логику Helm.

Суть очень проста: у нас есть общий шаблон конфига с lookup-функциями, и когда вы генерируете из этого шаблона конфиг для конкретной ноды, Talm в режиме реального времени опрашивает Talos API и подставляет значения в финальный патч.

Talm содержит в себе почти все возможности talosctl, расширяя их дополнительными функциями путем генерации конфигов из Helm-подобного темплейта, а также позволяет запоминать параметры node и endpoint в конфигурационном файле ноды — это избавляет от необходимости указывать их для каждой ноды.

Теперь я покажу, как произвести установку Talos с помощью Talm:

Для начала инициируем конфигурацию для нового кластера:

mkdir talos
cd talos
talm init

Поправим дефолтные значения в values.yaml:

endpoint: "https://10.0.0.131:6443"
podSubnets:
- 10.244.0.0/16
serviceSubnets:
- 10.96.0.0/16
advertisedSubnets:
- 10.0.0.0/24

Сгенерируем конфиг для нашей ноды:

talm template -t templates/controlplane.yaml -e 10.0.0.131 -n 10.0.0.131 > nodes/node1.yaml

На выходе вы получите конфиг такого вида:

# talm: nodes=["10.0.0.131"], endpoints=["10.0.0.131"], templates=["templates/controlplane.yaml"]
# THIS FILE IS AUTOGENERATED. PREFER TEMPLATE EDITS OVER MANUAL ONES.
machine:
  type: controlplane
  kubelet:
    nodeIP:
      validSubnets:
        - 10.0.0.0/24
  network:
    hostname: node1
    # -- Discovered interfaces:
    # eno2np0:
    #   hardwareAddr:a0:36:bc:cb:eb:98
    #   busPath: 0000:05:00.0
    #   driver: igc
    #   vendor: Intel Corporation
    #   product: Ethernet Controller I225-LM)
    interfaces:
      - interface: eno2np0
        addresses:
          - 10.0.0.131/24
        routes:
          - network: 0.0.0.0/0
            gateway: 10.0.0.1
    nameservers:
      - 1.1.1.1
      - 8.8.8.8
  install:
    # -- Discovered disks:
    # /dev/sda:
    #    model: SAMSUNG MZQL21T9HCJR-00A07
    #    serial: S64GNG0X444695
    #    wwid: eui.36344730584446950025384700000001
    #    size: 1.9 TB
    disk: /dev/sda
cluster:
  controlPlane:
    endpoint: https://10.0.0.131:6443
  clusterName: talos
  network:
    serviceSubnets:
      - 10.96.0.0/16
  etcd:
    advertisedSubnets:
      - 10.0.0.0/24

Вам остаётся лишь применить его на свою ноду:

talm apply -f nodes/node1.yaml -i

Talm автоматически подхватит адрес ноды и endpoint из modeline (условного комментария в начале файла), и применит конфиг на ноду.

Кроме того, подобным образом вы можете выполнять и другие команды. Приведу несколько примеров.

Посмотреть состояние ноды через встроенный dashboard:

talm dashboard -f nodes/node1.yaml

Забутстрапить etcd:

talm bootstrap -f nodes/node1.yaml

Сохранить kubeconfig в текущую директорию:

talm kubeconfig kubeconfig -f nodes/node1.yaml

В отличии от официальной утилиты talosctl полученные конфиги не содержат секретов, что позволяет хранить их в git без дополнительного шифрования. Секреты хранятся в корне вашего проекта и только в файлах: secrets.yaml, talosconfig и kubeconfig.

Резюме

Таким образом мы получили готовую схему установки Talos Linux, которая работает практически везде. Кратко повторю шаги, которые необходимо пройти:

  1. Используем вариант с kexec для запуска Talos Linux на любой системе.

  2. Для того чтобы новое ядро имело правильные настройки сети, собираем их из текущей системы и передаём через опцию ip в cmdline. Это позволит обратиться к загруженной системе по API.

  3. При загрузке ядра методом kexec оно работает прямо в памяти, а чтобы установить Talos Linux на диск, необходимо применить конфиг с помощью talosctl или Talm.

  4. При применении конфига не забываем указать в нём настройки сети для своей ноды, в противном случае при загрузке с диска ей будет неоткуда их взять.

  5. Пользуемся установленным и готовым к работе Talos Linux.

Дополнительные материалы

Теги:
Хабы:
+22
Комментарии15

Публикации

Информация

Сайт
aenix.io
Дата регистрации
Численность
2–10 человек
Местоположение
Чехия
Представитель
Andrei Kvapil