# Подготовка к развороту кластера ## Подготовка schematic.yaml для генерации образа через публичный/приватный Image Factory ```yaml customization: systemExtensions: officialExtensions: - siderolabs/iscsi-tools - siderolabs/nfs-utils - siderolabs/qemu-guest-agent - siderolabs/util-linux-tools extraKernelArgs: - net.ifnames=0 ``` ##### В образ добавляются расширения: - `siderolabs/iscsi-tools` - утилиты для работы с сетевыми дисками по протоколу iscsi - `siderolabs/nfs-utils` - утилиты для монтирования фс по протоколу nfs - `siderolabs/qemu-guest-agent` - гостевой агент для виртуальных машин, запущенных в среде QEMU/KVM (тестовый кластер разворачивается в Proxmox VE) - `siderolabs/util-linux-tools` - набор низкоуровневых утилит Linux, нужен для диагностики и для некоторых CSI драйверов ## Отправка schematic.yaml в сторону Image Fabric, получение ID образа и скачивание образа #### Следующая команда отправляет файл в сторону Image Fabric: `curl -X POST --data-binary @schematics/schematic.yaml https://factory.talos.dev/schematics` - `--data-binary @schematics/schematic.yaml` - передача файла, в данном случае размещен в директории для удобства, но может быть размещен в корне проекта - `https://factory.talos.dev/schematics` - URL публичного factory ##### В ответ прилетит JSON с ID образа и информацией об установленных расширениях: ```json { "id": "c0ad57b8eb60094dd2ebed394ae5e9dfb279c7661d6c1de5944ede4c16cbfc9d", "schematic": "customization:\n extraKernelArgs:\n - net.ifnames=0\n systemExtensions:\n officialExtensions:\n - siderolabs/iscsi-tools\n - siderolabs/nfs-utils\n - siderolabs/qemu-guest-agent\n" } ``` ##### Скачать образ можно командой: `curl -L -o images/metal-amd64.iso "https://factory.talos.dev/image/c0ad57b8eb60094dd2ebed394ae5e9dfb279c7661d6c1de5944ede4c16cbfc9d/v1.13.7/metal-amd64.iso"` - `c0ad57b8eb60094dd2ebed394ae5e9dfb279c7661d6c1de5944ede4c16cbfc9d` - ID, полученный в ответе ранее - `metal-amd64.iso` - образ для bare metal и виртуальных машин без поддержки cloud-init ## Подготовка виртуальных машин #### Будет развернут кластер следующего вида: - 3 мастера: 1vcpu, 2G ram, 15G ssd - 3 воркера с доп диском под данные: 3vcpu, 6G ram, 15G + 30G ssd - 3 воркера без доп дисков: 3vcpu, 6G ram, 15G ssd ##### Для мастеров будут закреплены IP: - `10.255.200.201` - `10.255.200.202` - `10.255.200.203` ##### Для воркеров будут закреплены IP: - `10.255.200.204` - `10.255.200.205` - `10.255.200,206` - `10.255.200.207` - `10.255.200.208` - `10.255.200.209` ##### Скрин со списком виртуальных машин: ![vm](/img/pve-vms.png) ##### Скрин с настройками статики для сети в maintenance mode: ![net](/img/talos-net.png) По аналогии настройки сети нужно провести для всех виртуальных машин. # Сборка кластера Сейчас узлы запущены в maintenance mode из iso образа и для первичной заливки machineconfig нужно в явном виде указать флаг `--insecure` - ## Генерация конфига кластера `talosctl gen config test-cluster https://10.255.200.201:6443 -o ./test-cluster` - `talosctl gen config` - команда генерации конфига - `test-cluster` - имя кластера - `https://10.255.200.201:6443` - эндпоинт, в данном случае первый мастер(может быть адрес/домен балансировщика) - `-o ./test-cluster` - сохранение конфигов для доступа к кластеру ##### Пример выполнения команды: ``` generating PKI and tokens Created test-cluster/controlplane.yaml Created test-cluster/worker.yaml Created test-cluster/talosconfig ``` - `test-cluster/talosconfig` - конфиг с секретом для управления узлами после бутстрапа - `test-cluster/controlplane.yaml` - конфигурация для мастер узлов - `test-cluster/worker.yaml` - конфигурация для воркер узлов ## Патчи machineconfig для узлов кластера ### Общий патч для установки ОС на диск: ```yaml machine: install: disk: /dev/sda image: factory.talos.dev/installer/c0ad57b8eb60094dd2ebed394ae5e9dfb279c7661d6c1de5944ede4c16cbfc9d:v1.13.7 ``` #### Патч указывает на образ, который будет установлен на диск `/dev/sda` ### Общие патчи для мастер и воркер нод с зависимостью от дополнительного диска: - #### patch-controlplane.yaml ```yaml machine: network: kubespan: enabled: true mtu: 1420 advertiseKubernetesNetworks: true cluster: discovery: enabled: true network: cni: name: none proxy: disabled: true ``` - #### patch-worker-with-disk.yaml ```yaml machine: disks: - device: /dev/sdb partitions: - mountpoint: /var/lib/longhorn kubelet: extraMounts: - destination: /var/lib/longhorn type: bind source: /var/lib/longhorn options: - bind - rshared - rw network: kubespan: enabled: true mtu: 1420 advertiseKubernetesNetworks: true cluster: discovery: enabled: true network: cni: name: none proxy: disabled: true ``` - #### patch-worker-without-disk.yaml ```yaml machine: network: kubespan: enabled: true mtu: 1420 advertiseKubernetesNetworks: true cluster: discovery: enabled: true network: cni: name: none proxy: disabled: true ``` #### В патчах для мастер и воркер нод заданы настройки для: - Kubespan - настройка wireguard mesh сети между узлами кластера - Отключение kube-proxy и установки дефолтного CNI (Flannel) - Для нод с доп диском описано монтирование доп диска и проброс его в контейнер kubelet для корректной работы ### Патч для настроек сети, в качестве примера показан только для одного из мастеров, по аналогии сделаны для всех узлов ```yaml machine: network: interfaces: - interface: eth0 addresses: - 10.255.200.201/24 routes: - network: 0.0.0.0/0 gateway: 10.255.200.1 dhcp: false nameservers: - 9.9.9.9 ``` ## Применение конфигурации к узлам кластера #### Экспорт переменной TALOSCONFIG для работы с talosctl: `export TALOSCONFIG=$(pwd)/test-cluster/talosconfig` ### Применение machineconfig для всех узлов кластера с патчами ```sh talosctl apply-config \ --insecure -n 10.255.200.201 \ --file ./test-cluster/controlplane.yaml \ --config-patch @patches/patch-install.yaml \ --config-patch @patches/patch-controlplane.yaml \ --config-patch @patches/patch-net-master-1.yaml ``` #### Остальные узлы по аналогии, нужно только указать соответствующие узлу и роли патчи #### После применения machineconfig нужно выполинть bootstrap на первом мастере, адрес которого был указан при инициализации конфига `talosctl bootstrap -n 10.255.200.201 -e 10.255.200.201` #### Проверить, что кластер подает признаки жизни командами ```sh talosctl etcd members -n 10.255.200.201 -e 10.255.200.201 talosctl health -n 10.255.200.201 -e 10.255.200.201 talosctl get members -n 10.255.200.201 -e 10.255.200.201 ``` #### Получить и добавить в переменную kubeconfig: ```sh talosctl kubeconfig ./kubeconfig -n 10.255.200.201 -e 10.255.200.201 export KUBECONFIG=$(pwd)/kubeconfig ``` ### Установка CNI cilium в кластер через helm #### cilium-values.yaml ```yaml ipam: mode: kubernetes routingMode: native ipv4NativeRoutingCIDR: 10.244.0.0/16 autoDirectNodeRoutes: false kubeProxyReplacement: true k8sServiceHost: localhost k8sServicePort: 7445 bpf: masquerade: true cgroup: autoMount: enabled: false hostRoot: /sys/fs/cgroup securityContext: capabilities: ciliumAgent: - CHOWN - KILL - NET_ADMIN - NET_RAW - IPC_LOCK - SYS_ADMIN - SYS_RESOURCE - DAC_OVERRIDE - FOWNER - SETGID - SETUID cleanCiliumState: - NET_ADMIN - SYS_ADMIN - SYS_RESOURCE hubble: enabled: true relay: enabled: true ui: enabled: true MTU: 1420 ``` #### Подключение репозитория helm для cilium и установка CNI: ```sh helm repo add cilium https://helm.cilium.io/ helm repo update cilium helm install cilium cilium/cilium --version 1.19.6 --namespace kube-system -f cilium-values.yaml ``` #### Проверить доступность узлов кластера: ```sh kubectl get node ```