Привет всем 👋,
В прошлой заметке мы развернули кластер 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:
Hostname | IP | Role |
---|---|---|
devcluster-cp01.home.local | 10.21.101.221 | Control Plane |
devcluster-cp02.home.local | 10.21.101.222 | Control Plane |
devcluster-cp03.home.local | 10.21.101.223 | Control Plane |
devcluster-n01.home.local | 10.21.101.224 | Worker Node |
devcluster-n02.home.local | 10.21.101.225 | Worker 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-кластера становится значительно проще:
- Мы определяем единый манифест с описанием кластера,
- Задаём сетевые настройки и патчи,
- Генерируем секреты и конфиги автоматически.
Такой подход позволяет минимизировать ручные ошибки, ускоряет развёртывание и обеспечивает повторяемость.