diff --git a/.gitignore b/.gitignore index 4b269c7..1803723 100644 --- a/.gitignore +++ b/.gitignore @@ -79,6 +79,9 @@ go.work .vscode .DS_Store ansible/secrets -main -talos/{controlplane,worker}.yaml -talosconfig +talos/controlplane.yaml +talos/worker.yaml +talos/secrets.yaml +talos/talosconfig +talos/cp*.yaml +talos/worker*.yaml diff --git a/talos/README.md b/talos/README.md index eb88d84..2ac3ed5 100644 --- a/talos/README.md +++ b/talos/README.md @@ -1,73 +1,114 @@ # Talos -## Что такое Талос? +## Что такое Talos? -Talos - это дистрибутив Linux, оптимизированный для контейнеров; -переосмысление Linux для распределенных систем, таких как Kubernetes. -Разработанный, чтобы быть максимально минимальным, сохраняя при этом практичность. -По этим причинам Talos имеет ряд уникальных для него особенностей: +[Talos Linux](https://www.talos.dev/) — это **Linux**, разработанный для [Kubernetes](https://kubernetes.io/): безопасный, неизменяемый и минималистичный. -- неизменяесый -- атомарный -- эфимерный -- минималистичный -- по умолчанию он безопасен -- управляется с помощью одного декларативного файла конфигурации и gRPC API -- Talos может быть развернут в контейнерных, облачных, виртуализированных и голых металлических платформах. +- Поддерживает **облачные платформы, «голое железо» и платформы виртуализации** +- Все **управление системой осуществляется через API**. Нет SSH, оболочки или консоли +- Готовность к работе: **поддерживает одни из крупнейших Kubernetes-кластеров в мире** +- Проект с открытым исходным кодом от команды [Sidero Labs](https://www.siderolabs.com/) -## Почему Талос +## Почему Talos -Имея меньше, Талос предлагает больше. Безопасность. Эффективность. Устойчивость. Последовательность. +Имея меньше, Talos предлагает больше: безопасность, эффективность, устойчивость, согласованность. -Все эти области улучшаются просто за счет того, что у них меньше. +Все эти аспекты улучшаются благодаря простоте и минимализму. -## Загрузка Talos на голом металле с ISO +## Загрузка Talos на физический сервер с использованием ISO -Talos не устанавливается на диск при загрузке из ISO до тех пор, пока не будет применена конфигурация машины. +Talos может быть установлен на физическую машину с использованием ISO-образа. ISO-образы для архитектур amd64 и arm64 доступны на [странице релизов Talos](https://github.com/siderolabs/talos/releases/). -## Настройка Talos Linux +Talos не устанавливается на диск при загрузке с ISO до тех пор, пока не будет применена конфигурация машины. -Определяем переменную с IP адресом Control Plane узла: +Пожалуйста, следуйте [руководству по началу работы](https://www.talos.dev/v1.9/introduction/getting-started/) для выполнения общих шагов по установке Talos. + +Примечание: Если на диске уже установлена Talos, при загрузке с ISO Talos загрузится с этой установленной версии. +Порядок загрузки должен отдавать предпочтение диску перед ISO, либо ISO должно быть удалено после установки, чтобы Talos загружался с диска. + +Ознакомьтесь со справочником по [параметрам ядра](https://www.talos.dev/v1.9/reference/kernel/) для списка поддерживаемых Talos параметров ядра. + +Доступны два типа ISO-образов: + +- metal-arch.iso: поддерживает загрузку на системах с BIOS и UEFI (для x86), только UEFI для arm64. +- metal-arch-secureboot.iso: поддерживает загрузку только на системах с UEFI в режиме SecureBoot (создано с помощью [Image Factory](https://www.talos.dev/v1.9/learn-more/image-factory/). + +## Начало работы + +Руководство по настройке кластера Talos Linux. + +Этот документ проведет вас через процесс установки простого кластера Talos, а также объяснит некоторые ключевые концепции. + +Независимо от того, где вы запускаете Talos, этапы создания Kubernetes-кластера включают: + +1. Загрузка машин с образа Talos Linux. +2. Определение конечной точки API Kubernetes и создание конфигурации машин. +3. Настройка Talos Linux путем применения конфигураций машин. +4. Настройка `talosctl`. +5. Запуск Kubernetes. + +## Производственный кластер + +Для высокодоступного Kubernetes-кластера в продакшене рекомендуется использовать три узла плоскости управления. +Использование пяти узлов может обеспечить большую устойчивость к сбоям, +но также приводит к большему количеству операций репликации и может отрицательно сказаться на производительности. + +### Layer 2 VIP (общий IP-адрес) + +Talos имеет встроенную поддержку работы Kubernetes через общий/виртуальный IP-адрес. +Для этого требуется соединение уровня 2 (Layer 2) между узлами управляющей плоскости. + +Выберите неиспользуемый IP-адрес в той же подсети, что и узлы плоскости управления, для использования в качестве VIP. +(Убедитесь, что выделенный адрес не используется другими устройствами и исключен из диапазона DHCP.) + +### Выделение секретов + +При создании конфигурационных файлов для кластера Talos Linux рекомендуется начать с генерации файлы с секретами, +который должен быть сохранен в безопасном месте. +Этот файл можно использовать для генерации конфигураций машин или клиентов в любое время: ```sh -export TALOS_CONTROL_PLANE_IP=192.168.1.48 +talosctl gen secrets -o secrets.yaml ``` -Вот так можно посмотреть список дисков на узле: +### Запускаем Talos + +Теперь мы можем создать общую конфигурацию машин: ```sh -talosctl -n $TALOS_CONTROL_PLANE_IP get disks --insecure +talosctl gen config --kubernetes-version 1.31.4 --with-secrets secrets.yaml my-cluster https://172.16.61.10:6443 --config-patch @patch.yaml ``` -Генерируем конфиг +Создаем конфигурацию для каждого узла: ```sh -talosctl gen config --kubernetes-version 1.32.0 talos https://$TALOS_CONTROL_PLANE_IP:6443 --config-patch @patch.yaml +talosctl machineconfig patch controlplane.yaml --patch @cp0.patch --output cp0.yaml +talosctl machineconfig patch controlplane.yaml --patch @cp1.patch --output cp1.yaml +talosctl machineconfig patch controlplane.yaml --patch @cp2.patch --output cp2.yaml +talosctl machineconfig patch worker.yaml --patch @worker0.patch --output worker0.yaml +talosctl machineconfig patch worker.yaml --patch @worker1.patch --output worker1.yaml +talosctl machineconfig patch worker.yaml --patch @worker2.patch --output worker2.yaml ``` -Применяем конфигурацию - ```sh -talosctl apply-config --insecure -n $TALOS_CONTROL_PLANE_IP --file ./controlplane.yaml +talosctl apply-config --insecure -n 172.16.61.144 --file ./cp0.yaml +talosctl apply-config --insecure -n 172.16.61.145 --file ./cp1.yaml +talosctl apply-config --insecure -n 172.16.61.146 --file ./cp2.yaml +talosctl apply-config --insecure -n 172.16.61.147 --file ./worker0.yaml +talosctl apply-config --insecure -n 172.16.61.149 --file ./worker1.yaml +talosctl apply-config --insecure -n 172.16.61.148 --file ./worker2.yaml ``` После перезапуска Controls Plane узла необходимо инициализировать etcd: ```sh -talosctl bootstrap --nodes $TALOS_CONTROL_PLANE_IP --endpoints $TALOS_CONTROL_PLANE_IP --talosconfig=./talosconfig +talosctl bootstrap --nodes 172.16.61.11 --endpoints 172.16.61.11 --talosconfig=./talosconfig ``` Получаем kube config: ```sh -talosctl kubeconfig ~/.kube/config --nodes $TALOS_CONTROL_PLANE_IP --endpoints $TALOS_CONTROL_PLANE_IP --talosconfig ./talosconfig -``` - -Добавляем рабочий узел: - -```sh -export TALOS_WORKER_1_IP=192.168.1.142 -talosctl apply-config --insecure -n $TALOS_WORKER_1_IP --file ./worker.yaml +talosctl kubeconfig ~/.kube/config --nodes 172.16.61.10 --endpoints 172.16.61.10 --talosconfig ./talosconfig ``` ## Настройка Cilium @@ -88,7 +129,7 @@ helm upgrade \ cilium/cilium \ --version 1.16.5 \ --namespace kube-system \ - --values cilium.yaml + --values cilium/values.yaml ``` ## Metrics Server @@ -102,6 +143,19 @@ helm upgrade \ --set args={--kubelet-insecure-tls} ``` +Поднимаем **Traefik Kubernetes Ingress** + ```sh -talosctl upgrade-k8s --nodes $TALOS_CONTROL_PLANE_IP --to 1.32.1 +helm upgrade \ + --install \ + --namespace traefik \ + --create-namespace \ + traefik traefik/traefik \ + --values traefik/values.yaml +``` + +Обновление кластера + +```sh +talosctl --nodes 172.16.61.10 upgrade-k8s --to 1.32.0 ``` diff --git a/talos/cilium/ippool.yaml b/talos/cilium/ippool.yaml new file mode 100644 index 0000000..0a8fddb --- /dev/null +++ b/talos/cilium/ippool.yaml @@ -0,0 +1,7 @@ +apiVersion: cilium.io/v2alpha1 +kind: CiliumLoadBalancerIPPool +metadata: + name: pool +spec: + blocks: + - cidr: 172.16.61.20/32 diff --git a/talos/cilium/l2-announcement-policy.yaml b/talos/cilium/l2-announcement-policy.yaml new file mode 100644 index 0000000..36141c0 --- /dev/null +++ b/talos/cilium/l2-announcement-policy.yaml @@ -0,0 +1,16 @@ +apiVersion: cilium.io/v2alpha1 +kind: CiliumL2AnnouncementPolicy +metadata: + name: policy1 +spec: + serviceSelector: + matchLabels: + color: blue + nodeSelector: + matchExpressions: + - key: node-role.kubernetes.io/control-plane + operator: DoesNotExist + interfaces: + - ^ens[160-161]+ + externalIPs: true + loadBalancerIPs: true diff --git a/talos/cilium.yaml b/talos/cilium/values.yaml similarity index 65% rename from talos/cilium.yaml rename to talos/cilium/values.yaml index 5f0225d..c38c2d0 100644 --- a/talos/cilium.yaml +++ b/talos/cilium/values.yaml @@ -23,5 +23,17 @@ cgroup: autoMount: enabled: false hostRoot: /sys/fs/cgroup -k8sServiceHost: localhost -k8sServicePort: 7445 +k8sServiceHost: 172.16.61.10 +k8sServicePort: 6443 +l2announcements: + enabled: true +devices: ens+ +hubble: + relay: + enabled: true + ui: + enabled: true + ingress: + enabled: true + hosts: + - hubble.test diff --git a/talos/cp0.patch b/talos/cp0.patch new file mode 100644 index 0000000..0559b75 --- /dev/null +++ b/talos/cp0.patch @@ -0,0 +1,13 @@ +machine: + network: + hostname: cp0 + interfaces: + - interface: ens160 + dhcp: false + addresses: + - 172.16.61.11/24 + vip: + ip: 172.16.61.10 + routes: + - network: 0.0.0.0/0 + gateway: 172.16.61.2 diff --git a/talos/cp1.patch b/talos/cp1.patch new file mode 100644 index 0000000..e9c3d9d --- /dev/null +++ b/talos/cp1.patch @@ -0,0 +1,13 @@ +machine: + network: + hostname: cp1 + interfaces: + - interface: ens160 + dhcp: false + addresses: + - 172.16.61.12/24 + vip: + ip: 172.16.61.10 + routes: + - network: 0.0.0.0/0 + gateway: 172.16.61.2 diff --git a/talos/cp2.patch b/talos/cp2.patch new file mode 100644 index 0000000..95b1f80 --- /dev/null +++ b/talos/cp2.patch @@ -0,0 +1,13 @@ +machine: + network: + hostname: cp2 + interfaces: + - interface: ens160 + dhcp: false + addresses: + - 172.16.61.13/24 + vip: + ip: 172.16.61.10 + routes: + - network: 0.0.0.0/0 + gateway: 172.16.61.2 diff --git a/talos/patch.yaml b/talos/patch.yaml index 3cfc2cf..a421507 100644 --- a/talos/patch.yaml +++ b/talos/patch.yaml @@ -1,4 +1,8 @@ machine: + network: + nameservers: + - 77.88.8.8 + - 77.88.8.1 install: disk: /dev/nvme0n1 time: diff --git a/talos/traefik/values.yaml b/talos/traefik/values.yaml new file mode 100644 index 0000000..5937aa4 --- /dev/null +++ b/talos/traefik/values.yaml @@ -0,0 +1,11 @@ +deployment: + kind: DaemonSet + +service: + labels: + color: blue + spec: + externalTrafficPolicy: Local + +additionalArguments: + - --serversTransport.insecureSkipVerify=true diff --git a/talos/worker0.patch b/talos/worker0.patch new file mode 100644 index 0000000..18cd1b3 --- /dev/null +++ b/talos/worker0.patch @@ -0,0 +1,11 @@ +machine: + network: + hostname: worker0 + interfaces: + - interface: ens160 + dhcp: false + addresses: + - 172.16.61.14/24 + routes: + - network: 0.0.0.0/0 + gateway: 172.16.61.2 diff --git a/talos/worker1.patch b/talos/worker1.patch new file mode 100644 index 0000000..9cbc611 --- /dev/null +++ b/talos/worker1.patch @@ -0,0 +1,11 @@ +machine: + network: + hostname: worker1 + interfaces: + - interface: ens160 + dhcp: false + addresses: + - 172.16.61.15/24 + routes: + - network: 0.0.0.0/0 + gateway: 172.16.61.2 diff --git a/talos/worker2.patch b/talos/worker2.patch new file mode 100644 index 0000000..03f5b39 --- /dev/null +++ b/talos/worker2.patch @@ -0,0 +1,11 @@ +machine: + network: + hostname: worker2 + interfaces: + - interface: ens160 + dhcp: false + addresses: + - 172.16.61.16/24 + routes: + - network: 0.0.0.0/0 + gateway: 172.16.61.2