Привет всем 👋,

В прошлой заметке мы развернули кластер Kubernetes на TalosLinux в среде VMware. Тогда для каждой ноды приходилось вручную формировать собственный конфигурационный файл. Процесс этот хоть и несложный, но довольно рутинный: копировать шаблон, править параметры, следить за синхронизацией — всё это легко приводит к ошибкам и отнимает лишнее время.

Сегодня посмотрим на инструмент, который упрощает эту задачу. Он берёт на себя генерацию конфигураций для всех нод сразу. Нам достаточно определить всего один манифест с описанием желаемого состояния кластера. Дальше утилита Talhelper сама сгенерирует необходимые конфиги.

Установка и подготовка

Для начала нужно установить утилиту talhelper на клиентскую машину.

На macOS это делается одной командой:

brew install talhelper

На Linux установка чуть отличается: скачиваем бинарный файл с релизов GitHub, распаковываем его и переносим в директорию с исполняемыми файлами (например, /usr/local/bin).

Чтобы хранить все манифесты кластера в одном месте, удобно завести отдельный каталог:

mkdir -p Clusters/DevCluster                                                                                                              
cd Clusters/DevCluster

Пишем конфигурацию кластера

Как было упомянуто ранее, мы определяем один манифест - talconfig.yaml.

В нём задаётся полное описание кластера: хосты, роли, сеть и дополнительные параметры.

Для примера возьмём кластер из трёх Control Plane-нод и двух Worker Node:

HostnameIPRole
devcluster-cp01.home.local10.21.101.221Control Plane
devcluster-cp02.home.local10.21.101.222Control Plane
devcluster-cp03.home.local10.21.101.223Control Plane
devcluster-n01.home.local10.21.101.224Worker Node
devcluster-n02.home.local10.21.101.225Worker Node

Для высокой доступности Control Plane плоскости будем использовать ip - 10.21.101.220.

В любом редакторе открываем файл talconfig.yaml, и определяем:

Базовые параметры

clusterName: DevCluster
talosVersion: v1.10.3
kubernetesVersion: v1.30.0
endpoint: https://10.21.101.220:6443
domain: devcluster.home.local
  • clusterName — название нашего кластера,
  • talosVersion — версия TalosLinux, на базе которой будут созданы ноды,
  • kubernetesVersion — используемая версия Kubernetes,
  • endpoint — адрес API Kubernetes (в данном случае указывает на VIP 10.21.101.220),
  • domain — домен, внутри которого будут работать сервисы кластера.

Сети и CNI

cniConfig:
  name: "none"
clusterPodNets:
  - 10.244.0.0/16
clusterSvcNets:
  - 10.96.0.0/12
  • cniConfig - здесь мы исключаем использование сетевого плагина. CNI обычно ставлю отдельно,
  • clusterPodNets - подсеть для подов,
  • clusterSvcNets - подсеть для сервисов K8s

Патчи

Патчи в talhelper позволяют модифицировать итоговый конфиг Talos. По сути, это механизм «вклинивания» в базовую конфигурацию: можно задать как общие параметры для всех нод, так и специфичные настройки для отдельных машин.

В нашем случае логично вынести в патчи параметры, которые должны применяться ко всему кластеру:

  • NTP/DNS — сервера для всех нод.
  • Proxy — если в инфраструктуре используется корпоративный прокси-сервер.
  • Сертификаты — для доверия к локальным CA.

Пример секции с патчами:

patches:
  - |-
    cluster:
      discovery:
        enabled: false
  - |-
    machine:
      network:
        nameservers:
          - 10.21.10.21
          - 10.21.10.22
        interfaces:
          - interface: eth0
            routes:
              - network: 0.0.0.0/0
                gateway: 10.21.101.40
            dhcp: false
      env:
        http_proxy: 'squid.home.local:8080'
        https_proxy: 'squid.home.local:8080'
        no_proxy: "127.0.0.1,10.21.101.0/24,.home.local,192.168.0.0/16,.svc,10.244.0.0/16,10.96.0.0/12"
      time:
        bootTimeout: 2m
        servers:
          - 10.21.10.21
          - 10.21.10.22
      files:
        - content: |
            -----BEGIN CERTIFICATE-----
            ...
            -----END CERTIFICATE-----
          permissions: 0644
          path: /etc/ssl/certs/ca-certificates
          op: append

Описание нод

Так как в моей инфраструктуре отсутствует DHCP-сервер, IP-адреса нод необходимо прописывать вручную. Для этого в блоке nodes мы определяем список серверов с их параметрами.

Пример описания Control Plane узла:

nodes:
  - hostname: "devcluster-cp01"
    controlPlane: true
    ipAddress: 10.21.101.221
    installDisk: /dev/sda
    networkInterfaces:
      - interface: eth0
        addresses:
          - 10.21.101.221/24
        dhcp: false
        vip:
          ip: 10.21.101.220

В блоке каждой ноды описывается:

  • hostname - имя узла,
  • controlPlane - флаг, указывающий на то что это управляющий узел.
  • ipAddress - IP-адрес, котороый будет добавляем в talosconfig,
  • installDisk - здесь указывается диск, куда будет установлен Talos,
  • networkInterfaces - конфигурация сетевых интерфейсов и параметров сети. Также указывается виртальный IP.

Пример описания Worker узла:

- hostname: "devcluster-n01"
    controlPlane: false
    ipAddress: 10.21.101.224
    installDisk: /dev/sda
    networkInterfaces:
      - interface: eth0
        addresses:
          - 10.21.101.224/24
        dhcp: false

Отличие в моментах:

  • controlPlane со значением false,
  • vip - данное поле отсутствует.

Итоговый файл манифеста будет таким:

clusterName: DevCluster
talosVersion: v1.10.3
kubernetesVersion: v1.30.0
endpoint: https://10.21.101.220:6443
domain: devcluster.home.local

cniConfig:
  name: "none"

clusterPodNets:
  - 10.244.0.0/16
clusterSvcNets:
  - 10.96.0.0/12

patches:
  - |-
      cluster:
        discovery:
          enabled: false
  - |-
      machine:
        network:
          nameservers:
            - 10.21.10.21
            - 10.21.10.22
          interfaces:
            - interface: eth0
              routes:
                - network: 0.0.0.0/0   # The route's network.
                  gateway: 10.21.101.40 # The route's gateway.
              dhcp: false
        env:
          http_proxy: 'squid.home.local:8080'
          https_proxy: 'squid.home.local:8080'
          no_proxy: "127.0.0.1,10.21.101.0/24,.home.local,192.168.0.0/16,.svc,10.244.0.0/16,10.96.0.0/12"
        time:
          bootTimeout: 2m
          servers:
            - 10.21.10.21
            - 10.21.10.22
        files:
          - content: |
              -----BEGIN CERTIFICATE-----
              ....
              -----END CERTIFICATE-----
            permissions: 0644
            path: /etc/ssl/certs/ca-certificates
            op: append

nodes:
  - hostname: "devcluster-cp01"
    controlPlane: true
    ipAddress: 10.21.101.221
    installDisk: /dev/sda
    networkInterfaces:
      - interface: eth0
        addresses:
          - 10.21.101.221/24
        dhcp: false
        vip:
          ip: 10.21.101.220

  - hostname: "devcluster-cp02"
    controlPlane: true
    ipAddress: 10.21.101.222
    installDisk: /dev/sda
    networkInterfaces:
      - interface: eth0
        addresses:
          - 10.21.101.222/24
        dhcp: false
        vip:
          ip: 10.21.101.220

  - hostname: "devcluster-cp03"
    controlPlane: true
    ipAddress: 10.21.101.223
    installDisk: /dev/sda
    networkInterfaces:
      - interface: eth0
        addresses:
          - 10.21.101.223/24
        dhcp: false
        vip:
          ip: 10.21.101.220

  - hostname: "devcluster-n01"
    controlPlane: false
    ipAddress: 10.21.101.224
    installDisk: /dev/sda
    networkInterfaces:
      - interface: eth0
        addresses:
          - 10.21.101.224/24
        dhcp: false

  - hostname: "devcluster-n02"
    controlPlane: false
    ipAddress: 10.21.101.225
    installDisk: /dev/sda
    networkInterfaces:
      - interface: eth0
        addresses:
          - 10.21.101.225/24
        dhcp: false

Секреты и конфиги

Последующим этапом сгенерим файл секретов и конфиги Talos.

При помощи команды talhelper gensecret, мы получаем набор ключей и сертификатов для K8s и Talos:

talhelper gensecret > talsecret.sops.yaml

Файл talsecret.sops.yaml рекомендуется зашифровать с помошью SOPS, для безопасного хранения.

Теперь генерим конфигурации нашего кластера:

talhelper genconfig
---
generated config for devcluster-cp01 in ./clusterconfig/DevCluster-devcluster-cp01.yaml
generated config for devcluster-cp02 in ./clusterconfig/DevCluster-devcluster-cp02.yaml
generated config for devcluster-cp03 in ./clusterconfig/DevCluster-devcluster-cp03.yaml
generated config for devcluster-n01 in ./clusterconfig/DevCluster-devcluster-n01.yaml
generated config for devcluster-n02 in ./clusterconfig/DevCluster-devcluster-n02.yaml
generated client config in ./clusterconfig/talosconfig
generated .gitignore file in ./clusterconfig/.gitignore

Утилита создаст поддериуторию clusterconfig, внутри которой будут созданы:

  • Отдельные манифесты под каждую ноду - DevCluster-devcluster-*.yaml,
  • talosconfig - для взаимодействия с кластером,

Дальше эти манифесты можно применить к существующим нодам или использовать для бутстрапа нового кластера.

В заключение

Как вы могли заметить, с помощью talhelper процесс подготовки Talos-кластера становится значительно проще:

  • Мы определяем единый манифест с описанием кластера,
  • Задаём сетевые настройки и патчи,
  • Генерируем секреты и конфиги автоматически.

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