Серьезные изменения в настройке кластеров Talos

Серьезные изменения в настройке кластеров Talos

Intro

Мне нравится проект Talos - минимальный дистрибутив для развертывания кластера Kubernetes. Использую в лабораторных проектах, в принципе все устраивает.

Но вот в 2025 году не было проектов, а в июле 2026 пришлось поработать и вот обнаружил изменения в настройках.

Изменился talosctl

talosctl изменился и команды, которые раньше работали нужно исправлять. Ну это не самое страшное.

Изменение в разбиение дисков

Ранее, в 2022-2024 годах можно было спокойно поставить talos, затем запустить local-path-provisioner, повесить labels на namespace. Ну и все работало. Для лабораторных работ больше не нужно было.

Теперь же нужно нужно добавлять новые манифесты UserVolumeConfig, VolumeConfig.

get disks

Всю информацию о дисковой подсистеме можно получить используя следующие команды.

talosctl get disks --insecure -e 192.168.1.2 -n 192.168.1.2

talosctl get disks --insecure -o yaml -e 192.168.1.2 -n 192.168.1.2

EPHEMERAL занимает все свободное место на диске

Ставим с нуля talos, затем допустим запускаем longhorn, а оно не работает. Нет места.

Это решается следующим образом, в control-plane.yaml (worker.yaml) добавляем следующие строки

---
apiVersion: v1alpha1
kind: VolumeConfig
name: EPHEMERAL
provisioning:
  maxSize: 100GB
---
version: v1alpha1
debug: false
persist: true
machine:
    type: controlplane

EPHEMERAL ограничен размером в 100ГБайт. Не забывайте, что etcd data dir хранится в EPHEMERAL, не сильно ограничивайте EPHEMERAL в размере без особой необходимости.

Также можно ограничить и другие Volumes - EFI, META, STATE. Более подробнее здесь.

Добавить раздел для longhorn

В 2026 году следует отказаться от local-path-provisioner, перейти на longhorn. Но в стандартной конфигурации оно не заработает. Нужно добавить следующую конфигурацию.

---
apiVersion: v1alpha1
kind: VolumeConfig
name: EPHEMERAL
provisioning:
  maxSize: 100GB
---
apiVersion: v1alpha1
kind: UserVolumeConfig
name: longhorn
provisioning:
  diskSelector:
    match: disk.transport == 'sata'
  minSize: 20GB
  maxSize: 200GB
---
version: v1alpha1
debug: false
persist: true
machine:
    type: controlplane
    kubelet:
        image: ghcr.io/siderolabs/kubelet:v1.36.2
        defaultRuntimeSeccompProfileEnabled: true
        disableManifestsDirectory: true
        extraMounts:
            - destination: /var/mnt/longhorn
              type: bind
              source: /var/mnt/longhorn
              options:
                  - bind
                  - rshared
                  - rw

Если longhorn устанавливается через Helm, то не забудьте заменить путь с /var/lib/longhorn на /var/mnt/longhorn.

Теперь можно указать установочный диск

Теперь можно явно в конфигурации указать на какой жесткий диск нужно устанавливать Talos.

---
version: v1alpha1
debug: false
persist: true
machine:
    type: controlplane
    install:
        disk: /dev/disk/by-id/ata-WDC_1234567890-1234567_12-123456789012
        wipe: true
        image: ghcr.io/siderolabs/installer:v1.13.5 # Allows for supplying the image used to perform the installation.
        grubUseUKICmdline: true

Используйте diskSelector для многодисковой конфигурации.

Можно использовать diskSelector для многодисковых конфигурации. Пример - есть сервер с 3 дисковыми устройствами. Первый диск отдадим под систему, второй под EPHEMERAL, третий под longhorn.

---
apiVersion: v1alpha1
kind: VolumeConfig
name: EPHEMERAL
provisioning:
  diskSelector:
    match: 'disk.transport == "sata" && !system_disk'
  grow: true
---
apiVersion: v1alpha1
kind: UserVolumeConfig
name: longhorn
provisioning:
  diskSelector:
    match: 'disk.transport == "sata" && !system.disk'
  grow: true
---
version: v1alpha1
debug: false
persist: true
machine:
    type: controlplane
    kubelet:
        image: ghcr.io/siderolabs/kubelet:v1.36.2
        defaultRuntimeSeccompProfileEnabled: true
        disableManifestsDirectory: true
        extraMounts:
            - destination: /var/mnt/longhorn
              type: bind
              source: /var/mnt/longhorn
              options:
                  - bind
                  - rshared
                  - rw

Используйте diskSelector для выбора подходяшего диска по размеру (критерий)

diskSelector также можно использовать, чтобы разместить userVolumeConfig, volumeConfig на подходящий по размеру диск.

---
apiVersion: v1alpha1
kind: UserVolumeConfig
name: data
provisioning:
  diskSelector:
    # Match disks between 100GB and 500GB
    match: 'disk.size >= 100u * GB && disk.size <= 500u * GB'

Используйте diskSelector для выбора подходяшего диска по интерфейсу (критерий)

diskSelector также можно использовать, чтобы размещать userVolumeConfig по типу интерфейса. Например, базы данных держать на nvme, архивы и бакапы на sata, а что не жалко вообще вынести на usb флешку.

---
apiVersion: v1alpha1
kind: UserVolumeConfig
name: databases
provisioning:
  diskSelector:
    # Match either an NVMe drive or a large SSD
    match: 'disk.transport == "nvme" || (!disk.rotational && disk.size >= 500u * GB)'
---
apiVersion: v1alpha1
kind: UserVolumeConfig
name: backups
provisioning:
  diskSelector:
    # Match either an NVMe drive or a large SSD
    match: 'disk.transport == "sata" || (!disk.rotational && disk.size >= 1500u * GB)'
---
apiVersion: v1alpha1
kind: UserVolumeConfig
name: others
provisioning:
  diskSelector:
    # Match either an NVMe drive or a large SSD
    match: disk.transport == usb

Больше примеров можно найти здесь.