Привет всем 👋,
В прошлой заметке мы развернули кластер 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-кластера становится значительно проще:
- Мы определяем единый манифест с описанием кластера,
- Задаём сетевые настройки и патчи,
- Генерируем секреты и конфиги автоматически.
Такой подход позволяет минимизировать ручные ошибки, ускоряет развёртывание и обеспечивает повторяемость.
