Редакция июль, 2026
Аннотация
apt-get позволяют пользователям легко обновлять свои системы и быть в курсе актуальных новинок мира свободных программ.
Содержание
Таблица 3.1. Минимальные требования
|
Роль ноды
|
ОЗУ
|
ЦП
|
Системный диск
|
|---|---|---|---|
|
Control Plane
|
2 ГБ
|
2
|
10 ГБ
|
|
Worker
|
2 ГБ
|
1
|
10 ГБ
|
Таблица 3.2. Рекомендуемые требования
|
Роль ноды
|
ОЗУ
|
ЦП
|
Системный диск
|
|---|---|---|---|
|
Control Plane
|
4 ГБ
|
4
|
100 ГБ
|
|
Worker
|
2 ГБ
|
2
|
100 ГБ
|
Примечание
Таблица 4.1. Матрица поддержки
|
Версия ALT Orchestra
|
Версия Talos
|
Kubernetes
|
Архитектура
|
|---|---|---|---|
|
11.0
|
1.12
|
1.35, 1.34, 1.33, 1.32, 1.31, 1.30
|
amd64, arm64
|
Примечание
Примечание

$ talosctl get extensions
Ожидаемый вывод:
NODE NAMESPACE TYPE ID VERSION NAME VERSION 192.168.0.200 runtime ExtensionStatus 0 1 intel-ucode 20250512 192.168.0.200 runtime ExtensionStatus 1 1 util-linux-tools v2.39.2 192.168.0.200 runtime ExtensionStatus 2 1 schematic 80d5f9d0991e825b84617b4f2ce25b840050e3ee6a83647ac1bc0a559cf90962Ожидаемый вывод для базового образа:
NODE NAMESPACE TYPE ID VERSION NAME VERSION 192.168.0.200 runtime ExtensionStatus 0 1 schematic 376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba


Примечание


Примечание

Таблица 5.1. Системные расширения
|
Расширение
|
Описание
|
|---|---|
|
crun
|
Альтернативная среда выполнения контейнеров, совместимая с OCI (обеспечивает запуск crun с использованием обработчика среды выполнения containerd)
|
|
util-linux-tools
|
Дополнительные системные утилиты из набора util-linux
|
|
intel-ucode
|
Микрокоды процессоров Intel для обновления CPU на этапе загрузки
|
|
btrfs
|
Поддержка файловой системы Btrfs и связанные утилиты
|
|
nvidia-container-toolkit
|
Набор инструментов для запуска контейнеров с поддержкой GPU NVIDIA
|
|
drbd
|
Распределённое блочное устройство для репликации данных между узлами
|
|
nonfree-kmod-nvidia
|
Проприетарные модули ядра NVIDIA для работы графических ускорителей
|
|
qemu-guest-agent
|
Гостевой агент QEMU (удобен при использовании облачных серверов или виртуальных сред)
|

console=ttyS0,115200
-console).
machine.install.extraKernelArgs в конфигурации машины.

POST /schematicsсоздает новую схему образа на основе предоставленной конфигурации.
Таблица 5.2. Основные параметры (customization)
|
Параметр
|
Тип
|
Описание
|
|---|---|---|
extraKernelArgs
|
[]string
|
Дополнительные аргументы ядра (например, console=ttyS0,115200)
|
meta
|
[]Meta
|
Метаданные для инициализации ALT Orchestra (пары ключ-значение в hex-формате)
|
systemExtensions
|
object
|
Системные расширения, включаемые в образ
|
secureboot
|
object
|
Настройки Secure Boot (только для совместимых образов)
|
custom.yaml):
customization:
extraKernelArgs:
- console=ttyS0,115200
systemExtensions:
officialExtensions:
- alt-orchestra/intel-ucode
- alt-orchestra/util-linux-tools
Примечание
$ curl -X POST --data-binary @custom.yaml \
https://factory.altlinux.space/schematics
Ответ:
{"id":"60686148f84df043380005f117452c396347e3405e856aa70ba02318a9ab2a99"}
Возвращаемый id — уникальный хеш схемы, используемый для загрузки образов.
GET /image/:schematic/:version/:pathЗагружает загрузочный образ ALT Orchestra с указанной схемой и версией.
:schematic — идентификатор схемы, возвращаемый запросом POST /schematics;
:version — версия ALT Orchestra (например, v11.0);
:path — путь к образу, определяющий тип и формат загружаемого артефакта.
:path (см. таблицу Поддерживаемые значения :path):
<arch> — архитектура системы (amd64 или arm64);
<platform> — платформа ALT Orchestra (например, metal или aws);
<version> — версия продукта (используется в имени файлов);
secureboot — опциональный суффикс для образов с поддержкой Secure Boot.
alt-orchestra-<version>-<platform>-<arch>[-secureboot].<format>
Примечание
Таблица 5.3. Поддерживаемые значения :path
|
Формат
|
Тип образа
|
Пример
|
|---|---|---|
|
kernel-<arch>
|
Необработанный образ ядра
|
kernel-amd64
|
|
cmdline-<platform>-<arch>[-secureboot]
|
Командная строка ядра
|
cmdline-metal-amd64
|
|
initramfs-<arch>.xz
|
Образ initramfs (включая системные расширения, если они настроены)
|
initramfs-amd64.xz
|
|
<platform>-<arch>[-secureboot].iso
|
ISO-образ
|
metal-amd64.iso
|
|
<platform>-<arch>[-secureboot]-uki.efi
|
Образ UEFI UKI (совместим с Secure Boot)
|
metal-amd64-secureboot-uki.efi
|
|
installer-<arch>[-secureboot].tar
|
Образ установщика ALT Orchestra для платформы metal (включая системные расширения, если они настроены)
|
installer-amd64.tar
|
|
metal-<arch>[-secureboot].raw.xz
|
Дисковый образ (XZ)
|
metal-amd64.raw.xz
|
|
metal-<arch>[-secureboot].raw.qcow2
|
Дисковый образ (QCOW2)
|
metal-amd64.raw.qcow2
|
$ curl -LO https://factory.altlinux.space/image/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba/v11.0/alt-orchestra-11.0-metal-amd64.qcow2
$ curl -LO https://factory.altlinux.space/image/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba/v11.0/alt-orchestra-11.0-metal-amd64.iso
GET /versionsВозвращает список версий ALT Orchestra, доступных для создания образа.
$ curl -X GET https://factory.altlinux.space/versions
Пример ответа:
["v11.0"]
GET /version/:version/extensions/officialВозвращает список официальных системных расширений, доступных для указанной версии ALT Orchestra.
:version — версия ALT Orchestra, например v11.0.
$ curl -X GET https://factory.altlinux.space/version/v11.0/extensions/official | jq .
Пример вывода:
[
{
"name": "alt-orchestra/crun",
"ref": "altlinux.space/alt-orchestra/crun:1.27",
"digest": "sha256:6a71e16de2b55ea03e4ef60dc1e2620f808facdbb948a4a87fc57a2cf1290127",
"author": "Basealt LLC",
"description": "containerd's runtime handler crun\n"
},
{
"name": "alt-orchestra/util-linux-tools",
"ref": "altlinux.space/alt-orchestra/util-linux-tools:2.39.2",
"digest": "sha256:d8d76085b5144655baee9a55ab9b1c7583de6eabaaedd5954c8c3c1499de2ecd",
"author": "Basealt LLC",
"description": "minimal util-linux package\n"
},
{
"name": "alt-orchestra/intel-ucode",
"ref": "altlinux.space/alt-orchestra/intel-ucode:20251111",
"digest": "sha256:459538bdeb0564fa0ccc86232f8dc0ba82e6937e7cbd1a12df04c0092740330e",
"author": "Basealt LLC",
"description": "intel-ucode module\n"
},
{
"name": "alt-orchestra/btrfs",
"ref": "altlinux.space/alt-orchestra/btrfs:v11.0",
"digest": "sha256:f5b98bc2cec6bce4b539a204e74b1bac4926c4c27364279a74514d25b85cd34a",
"author": "Basealt LLC",
"description": "btrfs filesystem\n"
},
{
"name": "alt-orchestra/nvidia-container-toolkit",
"ref": "altlinux.space/alt-orchestra/nvidia-container-toolkit:580.142.0-1.17.8",
"digest": "sha256:6acf10587343018528744e712187668e85258bdee739f77236f0e7c031f3064f",
"author": "Basealt LLC",
"description": "nvidia runtime and it's dependencies using NVIDIA's runtime handler.\n"
},
{
"name": "alt-orchestra/drbd",
"ref": "altlinux.space/alt-orchestra/drbd:9.3.0-v11.0",
"digest": "sha256:592f5a83c78d1c17333d406449b2953a903ccbe1342950a67605703016a96d13",
"author": "Basealt LLC",
"description": "system extension provides kernel module driver for DRBD\n"
},
{
"name": "alt-orchestra/qemu-guest-agent",
"ref": "altlinux.space/alt-orchestra/qemu-guest-agent:9.1.2",
"digest": "sha256:fe82cf46923b1ce7f3b6ea07cee04a29d8d3ea5a2fbba1ec79fdb2c467b68a1f",
"author": "Basealt LLC",
"description": "qemu-guest-agent service\n"
},
{
"name": "alt-orchestra/nonfree-kmod-nvidia",
"ref": "altlinux.space/alt-orchestra/nonfree-kmod-nvidia:580.142.0-v11.0",
"digest": "sha256:b966fbea6ad241f4d28f12b08a6068385226ef00bcd729e0339ab9a7d537795f",
"author": "Basealt LLC",
"description": "nvidia proprietary kernel modules\n"
}
]
https://factory.altlinux.space/pxe/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba/v11.0/alt-orchestra-11.0-metal-amd64
GET /pxe/:schematic/:version/:pathВозвращает iPXE-скрипт, который загружает ALT Orchestra с указанной схемой, версией, архитектурой и платформой.
:schematic — идентификатор схемы, возвращаемый запросом POST /schematics;
:version — версия ALT Orchestra, например v11.0;
:path — путь в формате <platform>-<arch>[-secureboot] (например, metal-amd64).
#!ipxe kernel http://factory.altlinux.space/image/:schematic/:version/kernel-<arch> <kernel-cmdline> initrd http://factory.altlinux.space/image/:schematic/:version/initramfs-<arch>.xz bootПример:
$ curl -X GET https://factory.altlinux.space/pxe/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba/v11.0/alt-orchestra-11.0-metal-amd64Ответ:
#!ipxe imgfree kernel https://factory.altlinux.space/image/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba/v11.0/kernel-amd64 talos.platform=metal console=tty0 init_on_alloc=1 slab_nomerge pti=on consoleblank=0 nvme_core.io_timeout=4294967295 printk.devkmsg=on selinux=1 initrd https://factory.altlinux.space/image/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba/v11.0/initramfs-amd64.xz boot
$ podman pull <registry>/<platform>-installer[-secureboot]/<schematic>:<version>
<platform> — платформа;
secureboot — опциональный суффикс, указывающий на поддержку Secure Boot;
<schematic> — идентификатор схемы, возвращаемый запросом POST /schematics;
<version> — версия ALT Orchestra.
podman docker pull.
$ podman pull \
factory.altlinux.space/alt-orchestra-metal-installer/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba:v11.0
$ podman pull \
factory.altlinux.space/alt-orchestra-aws-installer/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba:v11.0
GET /oci/cosign/signing-key.pubВозвращает открытый ключ в формате PEM, используемый для цифровой подписи официальных образов установщика ALT Orchestra.
$ curl -X GET https://factory.altlinux.space/oci/cosign/signing-key.pub
Ответ:
-----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEq2DB1eviFoHEcqKk+5wOXJ104XDP P6sF7X9ddibyerutMvRY5zjxqVCZPRcTwVOZV49WmEIXia81JPgcEshkLA== -----END PUBLIC KEY-----
cosign (пакет cosign должен быть установлен):
$ cosign verify --offline \
--insecure-ignore-tlog \
--insecure-ignore-sct \
--key signing-key.pub \
factory.altlinux.space/<image>
$Ответ:wget https://factory.altlinux.space/oci/cosign/signing-key.pub$cosign verify --offline \--insecure-ignore-tlog \ --insecure-ignore-sct \ --key signing-key.pub \ factory.altlinux.space/alt-orchestra-metal-installer/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba:v11.0
Verification for factory.altlinux.space/alt-orchestra-metal-installer/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba:v11.0 --
The following checks were performed on each of these signatures:
- The cosign claims were validated
- The signatures were verified against the specified public key
[{"critical":{"identity":{"docker-reference":"127.0.0.1:5001/image-factory/metal-installer/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba"},"image":{"docker-manifest-digest":"sha256:b4639acde912d59dda83427e47f83acf75cd5bf95ef59c38271cb2cf7c15366f"},"type":"cosign container image signature"},"optional":null}]
Подпись успешно проверена.
Примечание
# apt-get install talosctl curl
Примечание
kubectl должен быть установлен пакет kubernetes<Версия>-client, например kubernetes1.35-client.
$ curl -OJ \
https://factory.altlinux.space/image/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba/v11.0/alt-orchestra-11.0-metal-amd64.iso







Примечание
/etc/pve/qemu-server/<VMID>.conf:
args: -cpu kvm64,+cx16,+lahf_lm,+popcnt,+sse3,+ssse3,+sse4.1,+sse4.2
host, если узел PVE поддерживает эти функции. В этом случае живая миграция ВМ будет недоступна.







$ scp alt-orchestara-11.0-metal-amd64.iso root@libvirt:/var/lib/libvirt/images/




#где:ddoflag=direct if=<файл-образа.iso> of=/dev/sdX bs=1M status=progress;sync
/dev/sdX — устройство, соответствующее flash-диску.
#где:pv<файл-образа.iso> | dd oflag=direct of=/dev/sdX bs=1M;sync
/dev/sdX — устройство, соответствующее flash-диску.
/dev/sdd (следует убедиться, что выбрано правильное устройство):
# pv alt-orchestra-11.0-metal-amd64.iso | dd of=/dev/sdd bs=1M oflag=direct; sync
apply-config через talosctl).
Примечание
kernel-amd64 (alt-orchestra-11.0-kernel-amd64) — ядро Linux;
initramfs-amd64.xz (alt-orchestra-11.0-initramfs-amd64.xz) — сжатый образ начальной загрузки (initramfs).
Примечание
talos.platform=metal slab_nomerge pti=on
talos.config=https://<metadata-service>/talos/config?mac=${mac}
Примечание
# apt-get install dhcp-server
/etc/dhcp/dhcpd.conf):
authoritative;
ddns-update-style none;
option arch code 93 = unsigned integer 16;
option space ipxe;
option ipxe.no-pxedhcp code 176 = unsigned integer 8;
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.200 192.168.0.250;
option domain-name "test.alt";
option domain-name-servers 192.168.0.1;
option routers 192.168.0.1;
option broadcast-address 192.168.0.255;
option subnet-mask 255.255.255.0;
default-lease-time 1800;
max-lease-time 3600;
option ipxe.no-pxedhcp 1;
# Указание используемого TFTP-сервера
next-server 192.168.0.224;
# Если это уже iPXE
if exists user-class and option user-class = "iPXE" {
filename "http://192.168.0.224/talos/script-amd64.ipxe";
} else {
# PXE Выбор загрузчика в зависимости от архитектуры клиента
if option arch = 00:00 {
filename "undionly.kpxe"; # Legacy BIOS
} else {
filename "ipxe-x86_64.efi"; # UEFI
}
}
}
# systemctl enable --now dhcpd
# apt-get install ipxe-bootimgs tftp tftp-server-xinetd
#mkdir -p /srv/boot#cp /usr/share/ipxe/{ipxe-x86_64.efi,undionly.kpxe} /srv/boot/
/etc/xinetd.d/tftp значение disable = no. В параметре server_args необходимо указать IP-адрес и корневой каталог TFTP-сервера:
service tftp
{
disable = no
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -4 -a 192.168.0.224 -u tftp -s /srv/boot
}
/etc/sysconfig/xinetd:
# Add extra options here EXTRAOPTIONS='-remlock'
/etc/xinetd.conf:
only_from = 127.0.0.1
# systemctl enable --now xinetd.service
# apt-get install nginx
/etc/nginx/sites-available.d/netboot.conf:
server {
listen 192.168.0.224:80;
server_name 192.168.0.224;
location / {
root /srv;
}
access_log /var/log/nginx/access.log;
}
где 192.168.0.224 — IP-адрес сервера сетевой установки.
# mkdir -p /srv/talos
# ln -s /etc/nginx/sites-available.d/netboot.conf /etc/nginx/sites-enabled.d/netboot.conf
# systemctl enable --now nginx.service
/srv/talos/script-amd64.ipxe:
#!ipxe imgfree kernel http://192.168.0.224/talos/alt-orchestra-11.0-kernel-amd64 initrd=initramfs-amd64.xz talos.platform=metal console=tty0 init_on_alloc=1 slab_nomerge pti=on consoleblank=0 nvme_core.io_timeout=4294967295 printk.devkmsg=on ima_template=ima-ng ima_appraise=fix ima_hash=sha512 selinux=1 initrd http://192.168.0.224/talos/alt-orchestra-11.0-initramfs-amd64.xz boot
Примечание
/srv/talos/script-amd64.ipxe можно также использовать прямые ссылки на Image Factory — в этом случае локальное хранение ядра не требуется (см. PXE Frontend API):
#!ipxe imgfree kernel http://factory.altlinux.space/image/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba/v11.0/alt-orchestra-11.0-kernel-amd64 talos.platform=metal console=tty0 init_on_alloc=1 slab_nomerge pti=on consoleblank=0 nvme_core.io_timeout=4294967295 printk.devkmsg=on ima_template=ima-ng ima_appraise=fix ima_hash=sha512 selinux=1 initrd http://factory.altlinux.space/image/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba/v11.0/alt-orchestra-11.0-initramfs-amd64.xz boot
alt-orchestra-11.0-kernel-amd64)
alt-orchestra-11.0-initramfs-amd64.xz)
/srv/talos/:
#apt-get install wget#cd /srv/talos#wget https://factory.altlinux.space/image/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba/v11.0/alt-orchestra-11.0-kernel-amd64#wget http://factory.altlinux.space/image/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba/v11.0/alt-orchestra-11.0-initramfs-amd64.xz




Примечание

Примечание


Примечание
talosctl apply-config.
Примечание
ip:
ip=192.168.0.100::192.168.0.1:255.255.255.0::ens19:off
ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>где:
client-ip — статический IP-адрес машины;
server-ip — IP-адрес сервера, который используется для дополнительных сетевых задач на раннем этапе загрузки системы (например, для загрузки с сервера TFTP или NFS). Для загрузки с локального диска можно не указывать;
gw-ip — IP-адрес шлюза по умолчанию;
netmask — сетевая маска;
hostname — имя хоста (можно не указывать);
device — сетевой интерфейс (актуальное имя: ens19, enp0s3 и т.д.);
autoconf — режим автоматической настройки сети (dhcp — использовать DHCP; off — отключить автоматическую настройку).
ip=172.20.0.2::172.20.0.1:255.255.255.0::eth0.100:::::
vlan=:
vlan=eth0.100:eth0
bond=):
bond=bond0:eth0,eth1:balance-rr
Примечание
controlplane.yaml или worker.yaml).


Примечание

ip=192.168.0.140::192.168.0.1:255.255.255.0::ens19:off


linux /boot/vmlinuz, и добавьте в её конец параметры IP, например:
ip=192.168.0.140::192.168.0.1:255.255.255.0::ens19:off

Примечание
Примечание
CLUSTER_ENDPOINT может совпадать с его IP-адресом. В остальных случаях возможны два варианта:
.env:
# IP-адреса ВМ
CONTROL_PLANE_IP=<control-plane-ip-1> # или массив: ("ip1" "ip2" ...)
WORKER_IP=("<worker-ip-1>" "<worker-ip-2>" "<worker-ip-3>"…)
# IP-адрес API кластера
CLUSTER_ENDPOINT=<endpoint-ip>
# Название кластера
CLUSTER_NAME=<имя кластера>
BASE_REGISTRY="factory.altlinux.space"
INSTALLERIMAGE=<образ>
CONTROL_PLANE_IP=192.168.0.140
WORKER_IP=("192.168.0.145" "192.168.0.146" "192.168.0.147")
CLUSTER_ENDPOINT=192.168.0.140
CLUSTER_NAME="pve-cluster"
BASE_REGISTRY="factory.altlinux.space"
INSTALLERIMAGE="$BASE_REGISTRY/alt-orchestra-metal-installer/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba:v11.0"
$ source .env
$ talosctl gen secrets -o secrets.yaml
$ talosctl gen config <имя кластера> https://$CONTROL_PLANE_IP:6443 \
--output-dir <каталог>\
--install-image <образ> \
--with-secrets <файл> \
--talos-version <TALOS_VERSION> \
--kubernetes-version <KUBE_VERSION>
где:
имя кластера — произвольное название;
каталог — каталог, в который будут сохранены сконфигурированные файлы конфигурации;
образ — сгенерированная на начальном этапе ссылка на образ инсталлятора (по умолчанию altlinux.space/alt-orchestra/installer:v11.0);
TALOS_VERSION — версия пакета talos, в соответствии с которой будет сгенерирован актуальный конфиг. Если версия talosctl совпадает с версией пакета talos в устанавливаемом образе на узле (можно проверить в таблице Матрица поддержки или командой talosctl get version -i -n <IP-адрес-узла>), данный параметр можно опустить, иначе укажите соответствующую версию пакета (по умолчанию будет указана версия talosctl);
KUBE_VERSION — версия kubernetes из списка удовлетворяющих в таблице Матрица поддержки.
Таблица 8.1. Параметры команды talosctl gen config
|
Параметр
|
Описание
|
|---|---|
--additional-sans
|
Дополнительные имена в поле Subject Alternative Name (SAN) для сертификата API-сервера Kubernetes (например, IP-адреса или доменные имена)
|
--config-patch
|
Патч, применяемый ко всем типам машин (init, controlplane, worker). Поддерживает чтение из файла
@filename.yaml
|
--config-patch-control-plane
|
Патч, применяемый только к узлам типа Control Plane (init и controlplane)
|
--config-patch-worker
|
Патч, применяемый только к узлам типа Worker
|
--dns-domain
|
DNS-домен кластера (по умолчанию: cluster.local)
|
--help, -h
|
Показать справку по команде
|
--install-disk
|
Диск, на который будет установлена система (по умолчанию: /dev/sda)
|
--install-image
|
Образ установщика, используемый при первой загрузке (по умолчанию: altlinux.space/alt-orchestra/installer:v11.0)
|
--kubernetes-version
|
Версия Kubernetes, которую следует развернуть (по умолчанию: 1.35)
|
--output, -o
|
Путь для сохранения сгенерированных файлов. Если указано несколько типов вывода — должен быть каталог. Для одного типа — может быть файлом или «-» (вывод в stdout)
|
--output-types, -f
|
Типы генерируемых файлов. Возможные значения: controlplane, worker, talosconfig (по умолчанию: все три)
|
--persist, -p
|
Сохранять ли конфигурацию на диске после перезагрузки (по умолчанию: true)
|
--registry-mirror
|
Список зеркал контейнерных реестров в формате: <реестр>=<зеркало> (например, docker.io=http://mirror.local)
|
--talos-version
|
Версия формата машинной конфигурации (по умолчанию: v1alpha1)
|
--with-cluster-discovery
|
Включить функцию автоматического обнаружения узлов в кластере (по умолчанию: true)
|
--with-docs
|
Добавить в конфигурацию комментарии с описанием каждого поля (по умолчанию: true)
|
--with-examples
|
Включить в конфигурацию закомментированные примеры использования (по умолчанию: true)
|
--with-kubespan
|
Включить функцию KubeSpan (межсетевое взаимодействие узлов через WireGuard)
|
--with-secrets
|
Использовать файл секретов, созданный командой
talosctl gen secrets
|
orchestra будут созданы файлы:
controlplane.yaml — конфигурация управляющего узла (Control Plane);
worker.yaml — конфигурация для рабочих узлов (Worker Node);
talosconfig — настройки подключения к API.
$ talosctl gen config $CLUSTER_NAME https://$CONTROL_PLANE_IP:6443 \
--output-dir orchestra \
--install-image $INSTALLERIMAGE \
--with-secrets secrets.yaml
Ожидаемый вывод:
generating PKI and tokens Created orchestra/controlplane.yaml Created orchestra/worker.yaml Created orchestra/talosconfig
Примечание
--talos-version.
controlplane.yaml и worker.yaml и перейдите к шагу инициализаии узлов (см. раздел Инициализация узлов).
disk и interface в конфигурации должны соответствовать реальному оборудованию сервера.
/dev/sda. Однако он может называться иначе (например, /dev/vda).
$ talosctl get disks --insecure --nodes <IP-адрес-узла>
Пример вывода:
NODE NAMESPACE TYPE ID SIZE READ ONLY TRANSPORT MODEL
runtime Disk loop0 4.1 kB true
runtime Disk loop1 98 MB true
runtime Disk sda 11 GB false virtio QEMU HARDDISK
runtime Disk sr0 375 MB false sata QEMU DVD-ROM
Примечание
/dev/sda, его можно указать его при создании конфигурации, например:
$Или изменить в уже сгенерированных файлах.export DISK_NAME=/dev/vda$talosctl gen config $CLUSTER_NAME https://$CONTROL_PLANE_IP:6443 --install-disk $DISK_NAME
$ talosctl get links --insecure --nodes <IP-адрес-узла>
Пример вывода:
NODE NAMESPACE TYPE ID VERSION TYPE KIND HW ADDR OPER STATE LINK STATE network LinkStatus bond0 1 ether bond 2a:83:c2:4e:b2:b6 down false network LinkStatus dummy0 1 ether dummy 3e:11:cf:ae:2a:6f down false network LinkStatus enp0s3 3 ether 08:00:27:87:04:28 up true network LinkStatus ip6tnl0 1 tunnel6 ip6tnl 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 down false network LinkStatus lo 2 loopback 00:00:00:00:00:00 unknown true network LinkStatus sit0 1 sit sit 00:00:00:00 down false network LinkStatus teql0 1 void down false network LinkStatus tunl0 1 ipip ipip 00:00:00:00 down false
$mkdir -p orchestra/controlplanes$mkdir -p orchestra/workers$cd talos
├── orchestra/ │ ├── controlplanes/ │ │ └── controlplane-01.yaml │ └── workers/ │ ├── worker-01.yaml │ ├── worker-02.yaml │ └── worker-03.yaml
machine:
network: {}
network:
interfaces:
- interface: ens19
install:
disk: /dev/sda # Диск для установки системы
hostname с учетом уникальности для каждого узла в конце файла. Можно оставить автоматическое присвоение имени, либо убрать настройку auto и указать hostname:
kind: HostnameConfig # auto: stable # A method to automatically generate a hostname for the machine. # # A static hostname to set for the machine. hostname: controlplane-01
Примечание
machine:
network:
interfaces:
- interface: <interface>
dhcp: true
install:
disk: /dev/<disk>
#controlplane-patch-01.yaml
machine:
network:
interfaces:
- interface: ens19
addresses:
- 192.168.0.140/24
routes:
- network: 0.0.0.0/0
gateway: 192.168.0.1
nameservers:
- 192.168.0.1
install:
disk: /dev/sda
apiVersion: v1alpha1
auto: off
kind: HostnameConfig
hostname: worker-01
---
machine:
network:
interfaces:
- interface: ens19
addresses:
- 192.168.0.145/24
routes:
- network: 0.0.0.0/0
gateway: 192.168.0.1
nameservers:
- 192.168.0.1
install:
disk: /dev/sda
$ talosctl machineconfig patch controlplane.yaml \
--patch @controlplane-patch-01.yaml \
--output controlplanes/controlplane-01.yaml
Worker:
$talosctl machineconfig patch worker.yaml\ --patch @worker-patch-01.yaml \ --output workers/worker-01.yaml $talosctl machineconfig patch worker.yaml\ --patch @worker-patch-02.yaml \ --output workers/worker-02.yaml $talosctl machineconfig patch worker.yaml\ --patch @worker-patch-03.yaml --output workers/worker-03.yaml
orchestra/controlplanes и orchestra/workers.
hostname с учетом уникальности для каждого узла в конце файла. Можно оставить автоматическое присвоение имени, либо убрать настройку auto и указать hostname:
kind: HostnameConfig # auto: stable # A method to automatically generate a hostname for the machine. # # A static hostname to set for the machine. hostname: controlplane-01
install:
image: factory.altlinux.space/alt-orchestra-metal-installer/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba:v11.0
kubelet:
image: registry.altlinux.org/p11/kubelet:<KUBE_VERSION>
apiServer:
image: registry.altlinux.org/p11/kube-apiserver:<KUBE_VERSION>
controllerManager:
image: registry.altlinux.org/p11/kube-controller-manager:<KUBE_VERSION>
proxy:
image: registry.altlinux.org/p11/kube-proxy:<KUBE_VERSION>
scheduler:
image: registry.altlinux.org/p11/kube-scheduler:<KUBE_VERSION>
--config-patch — патч для всех узлов;
--config-patch-control-plane — патч только для control-plane;
--config-patch-worker — патч только для worker-узлов.
controlplane.yaml и worker.yaml, а изменения передавать через патчи при выполнении команды apply-config.
$talosctl apply-config --insecure\ --nodes 192.168.0.140 \ --file orchestra/controlplane.yaml \ --config-patch @controlplane-patch-01.yaml $talosctl apply-config --insecure\ --nodes 192.168.0.145 \ --file orchestra/worker.yaml \ --config-patch @worker-patch-01.yaml
$talosctl apply-config --insecure\ --nodes 192.168.0.140 \ --file orchestra/controlplane.yaml \ --config-patch-control-plane @controlplane-common.yaml $talosctl apply-config --insecure\ --nodes 192.168.0.145 \ --file orchestra/worker.yaml \ --config-patch-worker @worker-common.yaml
$ talosctl apply-config --insecure \
--nodes 192.168.0.145 \
--file orchestra/worker.yaml \
--config-patch @worker-network.yaml \
--config-patch @worker-hostname-01.yaml
controlplane.yaml к управляющему узлу, используя talosctl:
$ talosctl apply-config --insecure \
--nodes $CONTROL_PLANE_IP \
--file controlplanes/controlplane-01.yaml


Примечание
Примечание
machine.install.image), система не сможет установиться на жёсткий диск. Поэтому, после применения конфигов, подождите немного, а затем зайдите на ноды. Тревожными звонками будет сброс конфигурации (если вы устанавливали её на экране f3), невозможность посмотреть на ноды через команду:
$ talosctl get addresses -n <IP-адрес-узла>
$talosctl apply-config --insecure\ --nodes 192.168.0.145 \ --file workers/worker-01.yaml $talosctl apply-config --insecure\ --nodes 192.168.0.146 \ --file workers/worker-02.yaml $talosctl apply-config --insecure\ --nodes 192.168.0.147 \ --file workers/worker-03.yaml
talosctl для работы с кластером:
$export TALOSCONFIG="$HOME/.talos/config"$talosctl config merge orchestra/talosconfig$talosctl --talosconfig $TALOSCONFIG config endpoint $CONTROL_PLANE_IP$talosctl --talosconfig $TALOSCONFIG config node $CONTROL_PLANE_IP
.talos/config:
context: pve-cluster
contexts:
pve-cluster:
endpoints:
- 192.168.0.140
nodes:
- 192.168.0.140
ca: LS0tL...
crt: LS0tLS1CR...
key: LS0tLS1CRUd...
$ talosctl bootstrap --nodes $CONTROL_PLANE_IP --talosconfig $TALOSCONFIG
Примечание



$ talosctl dmesg -n <NODE_IP>
kubeconfig для работы с kubectl.
$ talosctl --nodes $CONTROL_PLANE_IP \
--talosconfig $TALOSCONFIG kubeconfig .
$talosctl kubeconfig alternative-kubeconfig\ --nodes $CONTROL_PLANE_IP \ --talosconfig $TALOSCONFIG $export KUBECONFIG=./alternative-kubeconfig
kubectl с альтернативным файлом:
$ kubectl --kubeconfig ./alternative-kubeconfig get pods -A
Примечание
kubectl должен быть установлен пакет kubernetes<Версия>-client, например kubernetes1.35-client.
talosctl:
$ talosctl --nodes $CONTROL_PLANE_IP --talosconfig $TALOSCONFIG health
$ talosctl config contexts
Пример вывода:
CURRENT NAME ENDPOINTS NODES
* pve-cluster 192.168.0.140 192.168.0.140
security-cluster 192.168.0.222 192.168.0.222
Примечание
talosctl определяет, к какому кластеру выполняются запросы управления.
$ talosctl config context <имя контекста>
kubectl:
$ kubectl --kubeconfig ./kubeconfig get nodes
Пример вывода:
NAME STATUS ROLES AGE VERSION controlplane-01 Ready control-plane 18h v1.35.0 worker-01 Ready <none> 18h v1.35.0 worker-02 Ready <none> 18h v1.35.0 worker-03 Ready <none> 18h v1.35.0Все узлы должны находиться в состоянии Ready.
$ kubectl --kubeconfig kubeconfig get nodes -o wide
Пример вывода:
NAME ROLES INTERNAL-IP OS-IMAGE KERNEL-VERSION controlplane-01 control-plane 192.168.0.140 ALT Orchestra 6.18.18-talos-alt1 worker-01 <none> 192.168.0.145 ALT Orchestra 6.18.18-talos-alt1 worker-02 <none> 192.168.0.146 ALT Orchestra 6.18.18-talos-alt1

$ kubectl config get-contexts --kubeconfig kubeconfig
Пример вывода:
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
admin@libvirt-cluster libvirt-cluster admin@libvirt-cluster default
* admin@libvirt-cluster-1 libvirt-cluster-1 admin@libvirt-cluster-1 default
admin@pve-cluster pve-cluster admin@pve-cluster default
$ kubectl --kubeconfig kubeconfig config use-context <имя контекста>
Примечание
kubeconfig настроено несколько контекстов. Если используется один контекст, выполнять данную команду не требуется.
$ kubectl --kubeconfig kubeconfig get pods --namespace kube-system
Пример вывода:
NAME READY STATUS RESTARTS AGE coredns-5966c6bdcd-978cs 1/1 Running 0 18m coredns-5966c6bdcd-fk9xl 0/1 Completed 0 2d21h coredns-5966c6bdcd-jbrnk 1/1 Running 1 (2d18h ago) 2d21h kube-apiserver-alt-orchestra-38k-guy 1/1 Running 0 18m kube-controller-manager-alt-orchestra-38k-guy 1/1 Running 2 (19m ago) 18m kube-flannel-8rhrg 1/1 Running 1 (2d18h ago) 2d21h kube-flannel-gn8x4 1/1 Running 0 2d18h kube-flannel-t6k6t 1/1 Running 0 18m kube-proxy-4hmfp 1/1 Running 1 (2d18h ago) 2d21h kube-proxy-b85mh 1/1 Running 0 18m kube-proxy-m2wrb 1/1 Running 0 18m kube-scheduler-alt-orchestra-38k-guy 1/1 Running 2 (19m ago) 18m
$ kubectl --kubeconfig kubeconfig apply \
-f https://k8s.io/examples/application/deployment.yaml
Пример вывода:
deployment.apps/nginx-deployment created
$kubectl --kubeconfig kubeconfig get deployNAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 2/2 2 2 28s $kubectl --kubeconfig kubeconfig get rsNAME DESIRED CURRENT READY AGE nginx-deployment-647677fc66 2 2 2 43s $kubectl --kubeconfig kubeconfig get podNAME READY STATUS RESTARTS AGE nginx-deployment-647677fc66-kzxn9 1/1 Running 0 54s nginx-deployment-647677fc66-snfhq 1/1 Running 0 54s
nginx-service.yaml со следующим содержимым:
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: nginx
$ kubectl --kubeconfig kubeconfig apply -f nginx-service.yaml
Пример вывода:
service/nginx created
$ kubectl --kubeconfig kubeconfig get svc nginx
Пример вывода:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx NodePort 10.106.76.186 <none> 80:30576/TCP 24m
$ curl -I <IP-адрес>:<порт>
где:
$ curl -I 192.168.0.145:30576
Пример вывода:
HTTP/1.1 200 OK Server: nginx/1.14.2 Date: Tue, 19 May 2026 19:41:36 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Tue, 04 Dec 2018 14:44:49 GMT Connection: keep-alive ETag: "5c0692e1-264" Accept-Ranges: bytes
$ kubectl --kubeconfig kubeconfig delete svc nginx
$ kubectl --kubeconfig kubeconfig delete deployment nginx-deployment
$ kubectl --kubeconfig kubeconfig get pod
talosctl reset:
$ talosctl reset --nodes <IP-адрес-узла>
Примечание
talosctl reset на облачных ВМ может привести к невозможности загрузки, поскольку команда стирает весь диск. В таких случаях рекомендуется очищать только системные разделы:
$ talosctl reset --system-labels-to-wipe STATE --system-labels-to-wipe EPHEMERAL
Таблица 8.2. Параметры команды talosctl reset
|
Параметр
|
Описание
|
|---|---|
-n, --nodes
|
IP-адреса или имена узлов, которые необходимо сбросить
|
--graceful
|
Попытаться корректно вывести узел из кластера и покинуть etcd (по умолчанию true)
|
--reboot
|
Перезагрузить узел после сброса вместо выключения
|
--system-labels-to-wipe
|
Очистить только указанные системные разделы (например, STATE, EPHEMERAL), оставив остальные без изменений
|
--user-disks-to-wipe
|
Список устройств (например,
/dev/sdb), которые будут полностью стёрты
|
--wipe-mode
|
Режим очистки диска:
|
--insecure
|
Использовать незащищённый режим обслуживания (без аутентификации, только шифрование). Требуется при работе в режиме maintenance
|
--endpoints, -e
|
Переопределить адреса endpoints из конфигурации ALT Orchestra
|
--talosconfig
|
Путь к файлу конфигурации ALT Orchestra (по умолчанию
$HOME/.talos/config)
|
--context
|
Контекст подключения (например, при использовании прокси или SideroV1)
|
--debug
|
Включить отладочный вывод (в том числе из журналов ядра). Автоматически включает
--wait
|
--wait
|
Ожидать завершения операции и отслеживать её прогресс (по умолчанию true)
|
--timeout
|
Максимальное время ожидания завершения операции (по умолчанию 30m)
|
Примечание
--graceful=true. В одноузловом кластере (например, для тестирования) невозможно корректно вывести узел из состава кластера etcd, поэтому следует использовать --graceful=false.
talos.experimental.wipe=system
talosctl.
$ talosctl --talosconfig=./talosconfig -e ${endPoint} -n ${endPoint} service
Ожидаемый вывод:
NODE SERVICE STATE HEALTH LAST CHANGE LAST EVENT 192.168.0.140 apid Running OK 34h16m51s ago Health check successful 192.168.0.140 containerd Running OK 22h27m21s ago Health check successful 192.168.0.140 cri Running OK 6m17s ago Health check successful 192.168.0.140 dashboard Running ? 34h16m57s ago Process Process(["/sbin/dashboard"]) started with PID 2117 192.168.0.140 etcd Running OK 34h15m53s ago Health check successful 192.168.0.140 kubelet Running OK 6m6s ago Health check successful 192.168.0.140 machined Running OK 34h16m59s ago Health check successful 192.168.0.140 syslogd Running OK 34h16m58s ago Health check successful 192.168.0.140 trustd Running OK 34h16m53s ago Health check successful 192.168.0.140 udevd Running OK 34h16m58s ago Health check successful
$ talosctl --talosconfig=./talosconfig -e ${endPoint} -n ${workerIP} service
Ожидаемый вывод:
NODE SERVICE STATE HEALTH LAST CHANGE LAST EVENT 192.168.0.145 apid Running OK 34h19m8s ago Health check successful 192.168.0.145 containerd Running OK 34h19m13s ago Health check successful 192.168.0.145 cri Running OK 14m1s ago Health check successful 192.168.0.145 dashboard Running ? 34h19m11s ago Process Process(["/sbin/dashboard"]) started with PID 2122 192.168.0.145 kubelet Running OK 34h17m38s ago Health check successful 192.168.0.145 machined Running OK 34h19m13s ago Health check successful 192.168.0.145 syslogd Running OK 34h19m12s ago Health check successful 192.168.0.145 udevd Running OK 34h19m12s ago Health check successful
$ talosctl --talosconfig=./talosconfig -e ${endPoint} -n ${endPoint} health
Ожидаемый вывод:
discovered nodes: ["192.168.0.145" "192.168.0.140"] waiting for etcd to be healthy: ... waiting for etcd to be healthy: OK waiting for etcd members to be consistent across nodes: ... waiting for etcd members to be consistent across nodes: OK waiting for etcd members to be control plane nodes: ... waiting for etcd members to be control plane nodes: OK waiting for apid to be ready: ... waiting for apid to be ready: OK waiting for all nodes memory sizes: ... waiting for all nodes memory sizes: OK waiting for all nodes disk sizes: ... waiting for all nodes disk sizes: OK waiting for no diagnostics: ... waiting for no diagnostics: OK waiting for kubelet to be healthy: ... waiting for kubelet to be healthy: OK waiting for all nodes to finish boot sequence: ... waiting for all nodes to finish boot sequence: OK waiting for all k8s nodes to report: ... waiting for all k8s nodes to report: OK waiting for all control plane static pods to be running: ... waiting for all control plane static pods to be running: OK waiting for all control plane components to be ready: ... waiting for all control plane components to be ready: OK waiting for all k8s nodes to report ready: ... waiting for all k8s nodes to report ready: OK waiting for kube-proxy to report ready: ... waiting for kube-proxy to report ready: OK waiting for coredns to report ready: ... waiting for coredns to report ready: OK waiting for all k8s nodes to report schedulable: ... waiting for all k8s nodes to report schedulable: OKВсе проверки должны завершиться со статусом OK.
$ talosctl --talosconfig=./talosconfig -e ${endPoint} -n ${endPoint} stats
Пример вывода:
NODE NAMESPACE ID MEMORY(MB) CPU 192.168.0.140 system apid 17.66 12755669000 192.168.0.140 system trustd 10.76 11336251000
$ talosctl --talosconfig=./talosconfig -e ${endPoint} -n ${endPoint} stats -k
Пример вывода:
NODE NAMESPACE ID MEMORY(MB) CPU 192.168.0.140 k8s.io kube-system/coredns-5c584f8977-nctvv 0.00 0 192.168.0.140 k8s.io └─ kube-system/coredns-5c584f8977-nctvv:coredns:7b0dd9383da7 23.88 7867830000 192.168.0.140 k8s.io kube-system/coredns-5c584f8977-t55cr 0.00 0 192.168.0.140 k8s.io └─ kube-system/coredns-5c584f8977-t55cr:coredns:c34642e2a12c 23.55 7406138000 192.168.0.140 k8s.io kube-system/kube-apiserver-talos-vt1-w8a 0.00 0 192.168.0.140 k8s.io └─ kube-system/kube-apiserver-talos-vt1-w8a:kube-apiserver:… 356.34 12322845633000 192.168.0.140 k8s.io kube-system/kube-controller-manager-talos-vt1-w8a 0.00 0 192.168.0.140 k8s.io └─ kube-system/kube-controller-manager-talos-vt1-w8a:… 0.00 0 192.168.0.140 k8s.io └─ kube-system/kube-controller-manager-talos-vt1-w8a:… 93.95 40557624000 192.168.0.140 k8s.io kube-system/kube-flannel-vzvzx 0.00 0 192.168.0.140 k8s.io └─ kube-system/kube-flannel-vzvzx:install-config:494eaa3616eb 0.00 0 192.168.0.140 k8s.io └─ kube-system/kube-flannel-vzvzx:kube-flannel:518979a3ecfb 19.67 859609411000 192.168.0.140 k8s.io kube-system/kube-proxy-9rmz2 0.00 0 192.168.0.140 k8s.io └─ kube-system/kube-proxy-9rmz2:kube-proxy:… 25.46 38185553000 192.168.0.140 k8s.io kube-system/kube-scheduler-talos-vt1-w8a 0.00 0 192.168.0.140 k8s.io └─ kube-system/kube-scheduler-talos-vt1-w8a:kube-scheduler:… 30.48 8256563000 192.168.0.140 k8s.io └─ kube-system/kube-scheduler-talos-vt1-w8a:kube-scheduler:… 0.00 0
$ talosctl --talosconfig=./talosconfig -e ${endPoint} -n ${endPoint} conformance kubernetes
Пример вывода:
running conformance tests version 1.31.1 running tests: \[Conformance\] 2025/01/29 13:34:23 Running command: Command env: [] Run from directory: Executable path: /usr/local/bin/ginkgo Args (comma-delimited): /usr/local/bin/ginkgo,--focus=\[Conformance\],--skip=,--no-color=true,--procs=4,--timeout=24h,/usr/local/bin/e2e.test,--,--disable-log-dump,--repo-root=/kubernetes,--provider=skeleton,--report-dir=/tmp/results,--kubeconfig= 2025/01/29 13:34:23 Now listening for interrupts Running Suite: Kubernetes e2e suite - /usr/local/bin ==================================================== Random Seed: 1738157663 - will randomize all specs Will run 404 of 6603 specs .... Summarizing 2 Failures: [FAIL] [sig-scheduling] SchedulerPredicates [Serial] [It] validates resource limits of pods that are allowed to run [Conformance] [sig-scheduling, Serial, Conformance] k8s.io/kubernetes/test/e2e/scheduling/predicates.go:414 [FAIL] [sig-apps] Daemon set [Serial] [It] should rollback without unnecessary restarts [Conformance] [sig-apps, Serial, Conformance] k8s.io/kubernetes/test/e2e/apps/daemon_set.go:446 Ran 404 of 6603 Specs in 2842.641 seconds FAIL! -- 402 Passed | 2 Failed | 0 Pending | 6199 Skipped Ginkgo ran 1 suite in 47m26.014915675s tests finished after 47m26s.После завершения проверки отображается сводка с количеством успешно пройденных и неуспешных тестов.
Содержание
Таблица 10.1. Службы и программные компоненты инфраструктурного сервера для развёртывания ALT Orchestra в закрытом контуре
|
Функция
|
Программное обеспечение
|
Необходимость
|
|---|---|---|
|
Выдача IP-адресов (DHCP)
|
dhcp-server
|
Нет: возможно использование статических адресов
|
|
Разрешение имён (DNS)
|
bind
|
Нет: можно использовать IP-адреса
|
|
Синхронизация времени (NTP)
|
chrony
|
Да: kubelet и etcd ожидают синхронизации времени перед запуском
|
|
Реестр-прокси с кешем для доступа к образам контейнеров
|
docker-registry
|
Да
|
|
Обнаружение узлов (Discovery Service RS)
|
discovery-service-rs
|
Нет: требуется только для использования KubeSpan и KubePrism
|
|
Сетевая загрузка по iPXE
|
dnsmasq
|
Нет: возможна загрузка с ISO
|
|
Доступ реестра в интернет
|
-
|
Нет: используется только для первоначальной загрузки образов
|
Примечание
skopeo copy.
Примечание
# apt-get install dhcp-server \
bind \
bind-utils \
chrony \
podman \
docker-registry \
containers-common \
net-tools \
curl \
jq \
grpcurl \
git \
talosctl \
wget \
kubernetes1.35-client \
discovery-service-rs \
helm
Примечание
$ ip link
# IFACE="ens20" && mkdir -p /etc/net/ifaces/${IFACE}
# echo 192.168.0.1/24 > /etc/net/ifaces/${IFACE}/ipv4address
# cat > /etc/net/ifaces/${IFACE}/options <<EOF
TYPE=eth
CONFIG_WIRELESS=no
BOOTPROTO=static
CONFIG_IPV4=yes
DISABLED=no
NM_CONTROLLED=no
SYSTEMD_CONTROLLED=no
ONBOOT=yes
EOF
# systemctl restart network && ip a
# mkdir -p /etc/systemd/network
.network со статическим IPv4-адресом:
# cat > /etc/systemd/network/20-${IFACE}.network <<EOF
[Match]
Name=${IFACE}
[Network]
Address=192.168.0.1/24
EOF
# networkctl reload
# networkctl status ${IFACE} && ip a
Примечание
/etc/dhcp/dhcpd.conf):
option space altlinux;
option altlinux.keydata code 2 = string;
vendor-option-space altlinux;
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.2 192.168.0.100;
option domain-name-servers 192.168.0.1;
option routers 192.168.0.1;
option broadcast-address 192.168.0.255;
option ntp-servers 192.168.0.1;
option subnet-mask 255.255.255.0;
default-lease-time 3600;
max-lease-time 3600;
next-server 192.168.0.1;
}
# systemctl enable --now dhcpd
Примечание
# sed -i 's|listen-on {.*|listen-on { 127.0.0.1; 192.168.0.1; };|g' \
/etc/bind/options.conf
# cat >> /etc/bind/local.conf <<'EOF'
zone "internal.local" {
type master;
file "/etc/bind/zone/db.internal.local";
allow-update { 192.168.0.0/24; };
};
zone "0.168.192.in-addr.arpa" {
type master;
file "/etc/bind/zone/db.192.168.0";
allow-update { 192.168.0.0/24; };
};
EOF
# cat > /etc/bind/zone/db.internal.local <<'EOF'
$TTL 604800
@ IN SOA ns1.internal.local. admin.internal.local. (
2025010101 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ; Negative Cache TTL
)
IN NS ns1.internal.local.
ns1 IN A 192.168.0.1
EOF
# cat > /etc/bind/zone/db.192.168.0 <<'EOF'
$TTL 604800
@ IN SOA ns1.internal.local. admin.internal.local. (
2025010101 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ; Negative Cache TTL
)
IN NS ns1.internal.local.
1 IN PTR ns1.internal.local.
EOF
# systemctl enable --now bind
# cat >> /etc/chrony.conf <<'EOF'
allow all
pool pool.ntp.org iburst
EOF
# systemctl enable chronyd
# systemctl restart chronyd
Примечание
Таблица 10.2. Экземпляры Docker Registry
|
Реестр
|
Удалённый адрес
|
Порт
|
|---|---|---|
|
registry.altlinux.org
|
https://altlinux.space
|
5000
|
|
altlinux.space
|
https://altlinux.space
|
5001
|
Таблица 10.3. Значения для распространённых реестров
|
Реестр
|
Удалённый адрес
|
Порт
|
|---|---|---|
|
factory.altlinux.space
|
https://factory.altlinux.space
|
5002
|
|
ghcr.io
|
https://ghcr.io
|
5003
|
|
registry.k8s.io
|
https://registry.k8s.io
|
5004
|
|
docker.io
|
https://registry-1.docker.io
|
5005
|
setup_registry() {
local registry_name="$1"
local remote_url="$2"
local registry_port="$3"
# Настроить клиент Podman на использование прокси-кеша
cat >> /etc/containers/registries.conf <<EOF
[[registry]]
location = "${registry_name}"
[[registry.mirror]]
location = "localhost:${registry_port}"
insecure = true
EOF
# Создать конфигурацию сервера Docker Registry
cat > /etc/docker-registry/config-${registry_name}.yml <<EOF
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/docker-registry/${registry_name}
http:
addr: ":${registry_port}"
headers:
X-Content-Type-Options: [nosniff]
proxy:
remoteurl: ${remote_url}
EOF
# Создать и включить systemd-службу
cp /lib/systemd/system/docker-registry.service \
/etc/systemd/system/docker-registry-${registry_name}.service
sed -i "s|config.yml|config-${registry_name}.yml|g" \
/etc/systemd/system/docker-registry-${registry_name}.service
systemctl daemon-reload
systemctl enable --now docker-registry-${registry_name}.service && \
sleep 5 && \
systemctl status docker-registry-${registry_name}.service --no-pager -l
}
#setup_registry registry.altlinux.org https://registry.altlinux.org 5000#setup_registry altlinux.space https://altlinux.space 5001
containers/image (podman, skopeo, buildah, cri-o). Она не применяется автоматически к другим механизмам загрузки образов:
hosts.toml;
daemon.json.
# netstat -nlpt | grep -E ':(500[0-5])'
# for port in 5000 5001; do
curl -s http://localhost:${port}/v2/_catalog | jq
done
$podman pull registry.altlinux.org/p11/kube-apiserver &&\curl http://localhost:5000/v2/_catalog | jq &&\curl http://localhost:5000/v2/p11/kube-apiserver/tags/list | jq &&\podman pull localhost:5000/p11/kube-apiserver
# systemctl enable --now discovery-service-rs.service
$ netstat -tulnp | grep '[32]000'
Ожидаемый вывод:
tcp 0 0 0.0.0.0:2000 0.0.0.0:* LISTEN 1790/discovery-serv tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 1790/discovery-serv
# sed -i 's|# read_real_ip = false|read_real_ip = true|' \
/etc/discovery-service-rs/discovery-service-rs.ini
# systemctl restart discovery-service-rs
#Примерный вывод:mkdir -p proto#cat > proto/cluster_grpc.proto << 'EOF'syntax = "proto3"; package sidero.discovery.server; import "google/protobuf/duration.proto"; service Cluster { rpc Hello(HelloRequest) returns (HelloResponse); rpc AffiliateUpdate(AffiliateUpdateRequest) returns (AffiliateUpdateResponse); rpc AffiliateDelete(AffiliateDeleteRequest) returns (AffiliateDeleteResponse); rpc List(ListRequest) returns (ListResponse); rpc Watch(WatchRequest) returns (stream WatchResponse); } message Affiliate { string id = 1; bytes data = 2; repeated bytes endpoints = 3; } message HelloRequest { string cluster_id = 1; string client_version = 2; } message RedirectMessage { string endpoint = 1; } message HelloResponse { optional RedirectMessage redirect = 1; bytes client_ip = 2; } message AffiliateUpdateRequest { string cluster_id = 1; string affiliate_id = 2; optional bytes affiliate_data = 3; repeated bytes affiliate_endpoints = 4; google.protobuf.Duration ttl = 5; } message AffiliateUpdateResponse { } message AffiliateDeleteRequest { string cluster_id = 1; string affiliate_id = 2; } message AffiliateDeleteResponse { } message ListRequest { string cluster_id = 1; } message ListResponse { repeated Affiliate affiliates = 1; } message WatchRequest { string cluster_id = 1; } message WatchResponse { repeated Affiliate affiliates = 1; bool deleted = 2; } EOF #grpcurl -proto cluster_grpc.proto -import-path ./proto -plaintext\ -d '{"clusterId": "abc", "clientVersion": "11.0"}' \ -H 'X-Real-IP: 1.2.3.4' 192.168.0.1:3000 \ sidero.discovery.server.Cluster/Hello
{
"redirect": {},
"clientIp": "AQIDBA=="
}
$ for i in 2 3 4 5 6; do
talosctl -e 192.168.0.$i -n 192.168.0.$i get disks --insecure
done
Примерный вывод:
NODE NAMESPACE TYPE ID VERSION SIZE READ ONLY TRANSPORT ROTATIONAL WWID MODEL SERIAL
runtime Disk loop0 2 4.1 kB true
runtime Disk loop1 2 98 MB true
runtime Disk sda 2 6 GB false virtio true QEMU HARDDISK
runtime Disk sr0 2 377 MB false sata QEMU DVD-ROM
REPO=p11 && \
KUBELET_VERSION="v1.34.8" && \
COREDNS_VERSION="$(curl -ks "https://registry.altlinux.org/v2/${REPO}/coredns/tags/list" | jq -r '.tags | sort | .[]' | tail -1)" && \
ETCD_VERSION="$(curl -ks "https://registry.altlinux.org/v2/${REPO}/etcd/tags/list" | jq -r '.tags | sort | .[]' | tail -1)" && \
PAUSE_VERSION="$(curl -ks "https://registry.altlinux.org/v2/${REPO}/pause/tags/list" | jq -r '.tags | sort | .[]' | tail -1)"
DEVICE="/dev/sda" && \ INSTALLERIMAGE="altlinux.space/alt-orchestra/installer:v11.0"Значение
/dev/sda необходимо заменить на имя диска из вывода команды talosctl get disks (например, /dev/vda для дисков типа VirtIO).
KUBELETIMAGE="registry.altlinux.org/${REPO}/kubelet:${KUBELET_VERSION}" && \
APISERVERIMAGE="registry.altlinux.org/${REPO}/kube-apiserver:${KUBELET_VERSION}" && \
CONTROLMANAGERIMAGE="registry.altlinux.org/${REPO}/kube-controller-manager:${KUBELET_VERSION}" && \
SCHEDULERIMAGE="registry.altlinux.org/${REPO}/kube-scheduler:${KUBELET_VERSION}" && \
COREDNSIMAGE="registry.altlinux.org/${REPO}/coredns:${COREDNS_VERSION}" && \
ETCDIMAGE="registry.altlinux.org/${REPO}/etcd:${ETCD_VERSION}" && \
PAUSEIMAGE="registry.altlinux.org/${REPO}/pause:${PAUSE_VERSION}"
$ for image in \
${KUBELETIMAGE} \
${APISERVERIMAGE} \
${CONTROLMANAGERIMAGE} \
${SCHEDULERIMAGE} \
${COREDNSIMAGE} \
${ETCDIMAGE} \
${PAUSEIMAGE} \
${INSTALLERIMAGE};
do
podman pull $image;
done
Примечание
podman pull не является обязательной. Если настроен прокси-кеш реестров, необходимые образы будут автоматически загружены при первом обращении.
$curl http://localhost:5000/v2/_catalog | jq$curl http://localhost:5001/v2/_catalog | jq
$ cat > patch_common.yaml << PATCH
cluster:
network:
cni:
name: none
proxy:
disabled: true
discovery:
enabled: true
registries:
kubernetes:
disabled: true
service:
endpoint: http://192.168.0.1:3000
machine:
time:
servers:
- 192.168.0.1
network:
nameservers:
- 192.168.0.1
install:
disk: ${DEVICE}
image: ${INSTALLERIMAGE}
kubelet:
image: ${KUBELETIMAGE}
registries:
mirrors:
registry.altlinux.org:
endpoints:
- http://192.168.0.1:5000
altlinux.space:
endpoints:
- http://192.168.0.1:5001
PATCH
$ cat > patch_controlplane.yaml << PATCH
machine:
network:
interfaces:
- deviceSelector:
physical: true
dhcp: true
vip:
ip: 192.168.0.200
cluster:
apiServer:
image: ${APISERVERIMAGE}
controllerManager:
image: ${CONTROLMANAGERIMAGE}
scheduler:
image: ${SCHEDULERIMAGE}
etcd:
image: ${ETCDIMAGE}
coreDNS:
image: ${COREDNSIMAGE}
PATCH
$ talosctl gen config talos https://192.168.0.200:6443 \
--config-patch @patch_common.yaml \
--config-patch-control-plane @patch_controlplane.yaml
talosctl) виртуальный IP-адрес не используется.
talosconfig с конфигурацией по умолчанию:
$ talosctl config merge talosconfig
$talosctl config context talos$talosctl config info
$talosctl apply-config --insecure -n 192.168.0.2 --file controlplane.yaml$talosctl apply-config --insecure -n 192.168.0.3 --file controlplane.yaml$talosctl apply-config --insecure -n 192.168.0.4 --file controlplane.yaml
$talosctl apply-config --insecure -n 192.168.0.5 --file worker.yaml$talosctl apply-config --insecure -n 192.168.0.6 --file worker.yaml
$ talosctl -e 192.168.0.2 -n 192.168.0.2 bootstrap
Команду bootstrap необходимо выполнить только на одном узле Control Plane.
kubeconfig для доступа к Kubernetes:
$ talosctl -e 192.168.0.2 -n 192.168.0.2 kubeconfig
$curl https://altlinux.space/cloud/charts/raw/branch/master/cilium/sisyphus/1.18.2/values.yaml -o cilium-values.yaml$sed -i '/genericDigest: "sha256:a573bf42c0199aef9c68b657b2ea53cc31293a0a6eb2e812604cc8c31f846db0"/d' cilium-values.yaml$sed -i "s|useDigest: true|useDigest: false|g" cilium-values.yaml$helm repo add cilium https://helm.cilium.io$helm repo update$helm install\ cilium \ cilium/cilium \ --version 1.18.2 \ --namespace kube-system \ --set ipam.mode=kubernetes \ --set kubeProxyReplacement=true \ --set securityContext.capabilities.ciliumAgent="{CHOWN,KILL,NET_ADMIN,NET_RAW,IPC_LOCK,SYS_ADMIN,SYS_RESOURCE,DAC_OVERRIDE,FOWNER,SETGID,SETUID}" \ --set securityContext.capabilities.cleanCiliumState="{NET_ADMIN,SYS_ADMIN,SYS_RESOURCE}" \ --set cgroup.autoMount.enabled=false \ --set cgroup.hostRoot=/sys/fs/cgroup \ --set k8sServiceHost=localhost \ --set k8sServicePort=7445 \ -f cilium-values.yaml
$ kubectl get nodes
Примерный вывод:
NAME STATUS ROLES AGE VERSION alt-orchestra-2n9-fm5 Ready <none> 69s v1.34.8 alt-orchestra-4ty-xyj Ready control-plane 70s v1.34.8 alt-orchestra-861-o83 Ready <none> 61s v1.34.8 alt-orchestra-9v7-0p2 Ready control-plane 63s v1.34.8 alt-orchestra-kus-sds Ready control-plane 67s v1.34.8
$ kubectl get pods -A
Примерный вывод:
NAMESPACE NAME READY STATUS RESTARTS AGE kube-system cilium-2jvb4 1/1 Running 0 112s kube-system cilium-4xrlg 1/1 Running 1 (52s ago) 112s kube-system cilium-9nspx 1/1 Running 0 112s kube-system cilium-9zb6v 1/1 Running 0 113s kube-system cilium-cp96k 1/1 Running 0 113s kube-system cilium-envoy-2m8wp 1/1 Running 0 112s kube-system cilium-envoy-4mx5h 1/1 Running 0 113s kube-system cilium-envoy-g8qh5 1/1 Running 0 112s kube-system cilium-envoy-xffdn 1/1 Running 0 113s kube-system cilium-envoy-z8xw6 1/1 Running 0 113s kube-system cilium-operator-67f4b4f5fd-9djtg 1/1 Running 1 (82s ago) 112s kube-system cilium-operator-67f4b4f5fd-wkjdq 1/1 Running 1 (69s ago) 113s kube-system coredns-5966c6bdcd-2gxvq 1/1 Running 0 3m43s kube-system coredns-5966c6bdcd-qfmn2 1/1 Running 0 3m43s kube-system kube-apiserver-alt-orchestra-27m-03d 1/1 Running 0 3m30s kube-system kube-apiserver-alt-orchestra-gpg-qkl 1/1 Running 0 3m36s kube-system kube-apiserver-alt-orchestra-urk-gud 1/1 Running 0 2m59s kube-system kube-controller-manager-alt-orchestra-27m-03d 1/1 Running 0 3m30s kube-system kube-controller-manager-alt-orchestra-gpg-qkl 1/1 Running 1 (96s ago) 3m36s kube-system kube-controller-manager-alt-orchestra-urk-gud 1/1 Running 2 (4m3s ago) 2m59s kube-system kube-scheduler-alt-orchestra-27m-03d 1/1 Running 0 3m30s kube-system kube-scheduler-alt-orchestra-gpg-qkl 1/1 Running 0 3m36s kube-system kube-scheduler-alt-orchestra-urk-gud 1/1 Running 4 (58s ago) 2m58s
$ kubectl get all -A
Примерный вывод:
NAMESPACE NAME READY STATUS RESTARTS AGE kube-system pod/cilium-2jvb4 1/1 Running 0 2m11s kube-system pod/cilium-4xrlg 1/1 Running 1 (71s ago) 2m11s kube-system pod/cilium-9nspx 1/1 Running 0 2m11s kube-system pod/cilium-9zb6v 1/1 Running 0 2m12s kube-system pod/cilium-cp96k 1/1 Running 0 2m12s kube-system pod/cilium-envoy-2m8wp 1/1 Running 0 2m11s kube-system pod/cilium-envoy-4mx5h 1/1 Running 0 2m12s kube-system pod/cilium-envoy-g8qh5 1/1 Running 0 2m11s kube-system pod/cilium-envoy-xffdn 1/1 Running 0 2m12s kube-system pod/cilium-envoy-z8xw6 1/1 Running 0 2m12s kube-system pod/cilium-operator-67f4b4f5fd-9djtg 1/1 Running 1 (101s ago) 2m11s kube-system pod/cilium-operator-67f4b4f5fd-wkjdq 1/1 Running 1 (88s ago) 2m12s kube-system pod/coredns-5966c6bdcd-2gxvq 1/1 Running 0 4m2s kube-system pod/coredns-5966c6bdcd-qfmn2 1/1 Running 0 4m2s kube-system pod/kube-apiserver-alt-orchestra-27m-03d 1/1 Running 0 3m49s kube-system pod/kube-apiserver-alt-orchestra-gpg-qkl 1/1 Running 0 3m55s kube-system pod/kube-apiserver-alt-orchestra-urk-gud 1/1 Running 0 3m18s kube-system pod/kube-controller-manager-alt-orchestra-27m-03d 1/1 Running 0 3m49s kube-system pod/kube-controller-manager-alt-orchestra-gpg-qkl 1/1 Running 1 (115s ago) 3m55s kube-system pod/kube-controller-manager-alt-orchestra-urk-gud 1/1 Running 2 (4m22s ago) 3m18s kube-system pod/kube-scheduler-alt-orchestra-27m-03d 1/1 Running 0 3m49s kube-system pod/kube-scheduler-alt-orchestra-gpg-qkl 1/1 Running 0 3m55s kube-system pod/kube-scheduler-alt-orchestra-urk-gud 1/1 Running 4 (77s ago) 3m17s NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5m32s kube-system service/cilium-envoy ClusterIP None <none> 9964/TCP 2m12s kube-system service/hubble-peer ClusterIP 10.110.143.8 <none> 443/TCP 2m12s kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 4m16s NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE kube-system daemonset.apps/cilium 5 5 5 5 5 kubernetes.io/os=linux 2m12s kube-system daemonset.apps/cilium-envoy 5 5 5 5 5 kubernetes.io/os=linux 2m12s NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE kube-system deployment.apps/cilium-operator 2/2 2 2 2m12s kube-system deployment.apps/coredns 2/2 2 2 4m16s NAMESPACE NAME DESIRED CURRENT READY AGE kube-system replicaset.apps/cilium-operator-67f4b4f5fd 2 2 2 2m12s kube-system replicaset.apps/coredns-5966c6bdcd 2 2 2 4m2s
$ kubectl get svc -A
Примерный вывод:
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6m2s kube-system cilium-envoy ClusterIP None <none> 9964/TCP 2m42s kube-system hubble-peer ClusterIP 10.110.143.8 <none> 443/TCP 2m42s kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 4m46s kube-system hubble-relay ClusterIP 10.109.3.163 <none> 80/TCP 2m42s kube-system hubble-ui ClusterIP 10.97.174.183 <none> 80/TCP 2m42s
$ talosctl config endpoint 192.168.0.2 192.168.0.3 192.168.0.4
$Примерный вывод для Control Plane:talosctl -n 192.168.0.2 service$talosctl -n 192.168.0.3 service$talosctl -n 192.168.0.4 service$talosctl -n 192.168.0.5 service$talosctl -n 192.168.0.6 service
NODE SERVICE STATE HEALTH LAST CHANGE LAST EVENT 192.168.0.4 apid Running OK 5m41s ago Health check successful 192.168.0.4 auditd Running OK 5m52s ago Health check successful 192.168.0.4 containerd Running OK 5m52s ago Health check successful 192.168.0.4 cri Running OK 5m41s ago Health check successful 192.168.0.4 dashboard Running ? 5m42s ago Process Process(["/sbin/dashboard"]) started with PID 2204 192.168.0.4 etcd Running OK 3m37s ago Health check successful 192.168.0.4 kubelet Running OK 5m35s ago Health check successful 192.168.0.4 machined Running OK 5m52s ago Health check successful 192.168.0.4 syslogd Running OK 5m51s ago Health check successful 192.168.0.4 trustd Running OK 5m41s ago Health check successful 192.168.0.4 udevd Running OK 5m43s ago Health check successfulПримерный вывод для Control Worker:
NODE SERVICE STATE HEALTH LAST CHANGE LAST EVENT 192.168.0.5 apid Running OK 5m40s ago Health check successful 192.168.0.5 auditd Running OK 5m48s ago Health check successful 192.168.0.5 containerd Running OK 5m48s ago Health check successful 192.168.0.5 cri Running OK 5m39s ago Health check successful 192.168.0.5 dashboard Running ? 5m41s ago Process Process(["/sbin/dashboard"]) started with PID 2094 192.168.0.5 kubelet Running OK 5m34s ago Health check successful 192.168.0.5 machined Running OK 5m48s ago Health check successful 192.168.0.5 syslogd Running OK 5m47s ago Health check successful 192.168.0.5 udevd Running OK 5m42s ago Health check successful
$Присутствуют все узлы кластера:talosctl get members -n 192.168.0.2 -e 192.168.0.2$talosctl get members -n 192.168.0.3 -e 192.168.0.3$talosctl get members -n 192.168.0.4 -e 192.168.0.4$talosctl get members -n 192.168.0.5 -e 192.168.0.5$talosctl get members -n 192.168.0.6 -e 192.168.0.6
NODE NAMESPACE TYPE ID VERSION HOSTNAME MACHINE TYPE OS ADDRESSES 192.168.0.2 cluster Member alt-orchestra-4nl-pux 1 alt-orchestra-4nl-pux controlplane ALT Orchestra (v11.0) ["192.168.0.2"] 192.168.0.2 cluster Member alt-orchestra-8vo-85l 1 alt-orchestra-8vo-85l controlplane ALT Orchestra (v11.0) ["192.168.0.3"] 192.168.0.2 cluster Member alt-orchestra-hku-1uk 1 alt-orchestra-hku-1uk worker ALT Orchestra (v11.0) ["192.168.0.5"] 192.168.0.2 cluster Member alt-orchestra-tab-x0d 1 alt-orchestra-tab-x0d worker ALT Orchestra (v11.0) ["192.168.0.6"] 192.168.0.2 cluster Member alt-orchestra-y3q-ik2 1 alt-orchestra-y3q-ik2 controlplane ALT Orchestra (v11.0) ["192.168.0.4"]
$talosctl health -n 192.168.0.2$talosctl health -n 192.168.0.3$talosctl health -n 192.168.0.4
$ kubectl get nodes -o jsonpath='{.items[0].status.nodeInfo.kubeletVersion}'
Вывод:
v1.34.8
REPO=p11 && \
KUBELET_VERSION="v1.35.5" && \
KUBELETIMAGE="registry.altlinux.org/${REPO}/kubelet:${KUBELET_VERSION}" && \
APISERVERIMAGE="registry.altlinux.org/${REPO}/kube-apiserver:${KUBELET_VERSION}" && \
CONTROLMANAGERIMAGE="registry.altlinux.org/${REPO}/kube-controller-manager:${KUBELET_VERSION}" && \
SCHEDULERIMAGE="registry.altlinux.org/${REPO}/kube-scheduler:${KUBELET_VERSION}"
$ for image in ${KUBELETIMAGE} ${APISERVERIMAGE} ${CONTROLMANAGERIMAGE} ${SCHEDULERIMAGE}
do
podman pull "$image"
done
$ podman images
upgrade-k8s выполняет переход на одну минорную версию за раз):
$ talosctl --nodes 192.168.0.2 upgrade-k8s --to 1.35.5
Примечание
… > "192.168.0.4": starting update > update kube-scheduler: v1.35.0 -> 1.35.5 > "192.168.0.4": machine configuration patched > "192.168.0.4": waiting for kube-scheduler pod update > "192.168.0.4": kube-scheduler: waiting, config version mismatch: got "1", expected "2" > "192.168.0.4": kube-scheduler: waiting, config version mismatch: got "1", expected "2" > "192.168.0.4": kube-scheduler: waiting, config version mismatch: got "1", expected "2" > "192.168.0.4": kube-scheduler: waiting, config version mismatch: got "1", expected "2" > "192.168.0.4": kube-scheduler: pod is not ready, waiting > "192.168.0.4": kube-scheduler: pod is not ready, waiting > "192.168.0.4": kube-scheduler: pod is not ready, waiting < "192.168.0.4": successfully updated …
… > processing manifest v1.Secret/kube-system/bootstrap-token-u8gr7g < no changes > processing manifest rbac.authorization.k8s.io/v1.ClusterRoleBinding/system-bootstrap-approve-node-client-csr < no changes > processing manifest rbac.authorization.k8s.io/v1.ClusterRoleBinding/system-bootstrap-node-bootstrapper < no changes > processing manifest rbac.authorization.k8s.io/v1.ClusterRoleBinding/system-bootstrap-node-renewal < no changes . . . . . < applied successfully > processing manifest v1.ServiceAccount/kube-system/coredns < no changes > processing manifest rbac.authorization.k8s.io/v1.ClusterRoleBinding/system:coredns < no changes > processing manifest rbac.authorization.k8s.io/v1.ClusterRole/system:coredns < no changes > processing manifest v1.ConfigMap/kube-system/coredns < no changes > processing manifest apps/v1.Deployment/kube-system/coredns < no changes > processing manifest v1.Service/kube-system/kube-dns < no changes > processing manifest v1.ConfigMap/kube-system/kubeconfig-in-cluster < no changes waiting for all manifests to be applied
$ kubectl get nodes -o jsonpath='{.items[0].status.nodeInfo.kubeletVersion}'
Вывод:
v1.35.5
$ kubectl get nodes
$ kubectl get all -A
Все рабочие поды должны находиться в состоянии Running.
$talosctl health --nodes 192.168.0.2$talosctl health --nodes 192.168.0.3$talosctl health --nodes 192.168.0.4
Примечание
Enroll Secure Boot keys: auto.
Примечание

Enroll Secure Boot keys: auto
factory.altlinux.space/alt-orchestra-metal-installer-secureboot/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba:v11.0
Примечание
/usr/share/OVMF/OVMF_CODE_4M.secboot.qcow2 в режиме readonly и скопированный в рабочий каталог /usr/share/OVMF/OVMF_VARS_4M.qcow2. Необходимо использовать именно копию файла OVMF_VARS_4M.qcow2, поскольку переменные UEFI изменяются во время работы виртуальной машины.
$cp /usr/share/OVMF/OVMF_VARS_4M.qcow2 /tmp/my_vm_ovmf_vars_4m.qcow2$qemu-system-x86_64\ ... \ -machine q35 \ -drive if=pflash,format=qcow2,readonly=on,file=/usr/share/OVMF/OVMF_CODE_4M.secboot.qcow2 \ -drive if=pflash,format=qcow2,file=/tmp/my_vm_ovmf_vars_4m.qcow2
Autoenroll Secure Boot Keys), загрузчик предложит вручную импортировать ключи.
Reset Secure Boot Keys.
Enroll ... Using File -> EFI -> <EFI>/<keys>/uki-signing-cert.der

$ talosctl -n <IP-адрес-узла> get securitystate --insecure
Пример:
$ talosctl -n 192.168.0.222 get securitystate --insecure
Ожидаемый вывод:
NODE NAMESPACE TYPE ID SECUREBOOT runtime SecurityState securitystate true

$ talosctl gen config <cluster-name> https://<endpoint>:6443 \
--install-image=<secureboot-image> \
--install-disk=/dev/sda
Пример:
$CONTROL_PLANE_IP=192.168.0.222$export CLUSTER_NAME=security-cluster$export BASE_REGISTRY="factory.altlinux.space"$export INSTALLERIMAGE="$BASE_REGISTRY/alt-orchestra-metal-installer-secureboot/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba:v11.0"$export DISK_NAME=/dev/vda$talosctl gen config $CLUSTER_NAME https://$CONTROL_PLANE_IP:6443\ --output-dir _security \ --install-image $INSTALLERIMAGE \ --install-disk=$DISK_NAME
$ talosctl -n <IP-адрес-узла> apply-config --insecure -f controlplane.yaml
Пример:
$ talosctl apply-config --insecure \
--nodes $CONTROL_PLANE_IP \
--file _security/controlplane.yaml
После применения конфигурации система установится на диск и перезагрузится.
$ talosctl -n <IP-адрес-узла> --talosconfig=<talosconfig> get securitystate
Пример:
$ talosctl -n $CONTROL_PLANE_IP \
--talosconfig=_security/talosconfig get securitystate
Ожидаемый вывод:
NODE NAMESPACE TYPE ID SECUREBOOT 192.168.0.222 runtime SecurityState securitystate true

Примечание
talosctl get securitystate следует выполнять после того, как узел полностью загрузился и стал доступен по сети, то есть после перезагрузки, вызванной apply-config. Ошибка failed to determine endpoints означает, что:
Примечание
Примечание
tpm-disk-encryption.yaml:
machine:
systemDiskEncryption:
ephemeral:
provider: luks2
keys:
- slot: 0
tpm: {}
state:
provider: luks2
keys:
- slot: 0
tpm: {}
$ talosctl gen config <cluster-name> https://<endpoint>:6443 \
--install-image=<secureboot-image> \
--install-disk=/dev/sda \
--config-patch @tpm-disk-encryption.yaml
Пример:
$CONTROL_PLANE_IP=192.168.0.194$export CLUSTER_NAME=security-cluster$export BASE_REGISTRY="factory.altlinux.space"$export INSTALLERIMAGE="$BASE_REGISTRY/alt-orchestra-metal-installer-secureboot/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba:v11.0"$export DISK_NAME=/dev/vda$talosctl gen config $CLUSTER_NAME https://$CONTROL_PLANE_IP:6443\ --output-dir _tpm \ --install-image $INSTALLERIMAGE \ --config-patch @tpm-disk-encryption.yaml \ --install-disk=$DISK_NAME
$ talosctl -n <IP-адрес-узла> apply-config --insecure -f controlplane.yaml
Пример:
$ talosctl apply-config --insecure \
--nodes $CONTROL_PLANE_IP \
--file _tpm/controlplane.yaml
После применения конфигурации система установится на диск и перезагрузится.
$ talosctl -n <IP-адрес-узла> --talosconfig=<talosconfig> get securitystate
Важно
Важно
$ talosctl gen secureboot uki --common-name "SecureBoot Key"
Результат:
writing _out/uki-signing-cert.pem writing _out/uki-signing-cert.der writing _out/uki-signing-key.pem
$ talosctl gen secureboot pcr
Результат:
writing _out/pcr-signing-key.pemВ результате генерируется ключ RSA, 2048 бит, в формате PEM.
$ talosctl gen secureboot database
Результат:
writing _out/db.auth writing _out/KEK.auth writing _out/PK.authЭти файлы используются при загрузке с ISO-образа в режиме настройки UEFI.
Примечание
talosctl gen secureboot создаёт самоподписанный сертификат. При необходимости его можно заменить сертификатом, соответствующим корпоративной PKI.
$ podman run --rm -t \
-v $PWD/_out:/secureboot:ro \
-v $PWD/_out:/out \
altlinux.space/alt-orchestra/imager:v11.0 secureboot-iso
Результат:
_out/alt-orchestra-11.0-metal-amd64-secureboot.iso
$ podman run --rm -t \
-v $PWD/_out:/secureboot:ro \
-v $PWD/_out:/out \
altlinux.space/alt-orchestra/imager:v11.0 \
secureboot-installer \
--base-installer-image altlinux.space/alt-orchestra/installer-base:v11.0
Результат:
_out/alt-orchestra-11.0-installer-amd64-secureboot.tar
talosctl и kubectl на рабочее место администратора согласно разделу Подготовка рабочего места администратора;
Примечание
talosctl bootstrap выполняется только один раз на одном из узлов Control Plane;
talosctl upgrade-k8s.
Таблица 12.1. Топология
|
Роль узла
|
Количество
|
Назначение
|
|---|---|---|
|
Control Plane
|
3
|
Kubernetes API, etcd, управляющие компоненты
|
|
Worker
|
2
|
Выполнение пользовательских рабочих нагрузок
|
CONTROL_PLANE_IP=("192.168.0.2" "192.168.0.3" "192.168.0.4")
WORKER_IP=("192.168.0.5" "192.168.0.6")
CLUSTER_ENDPOINT="kube.example.com"
CLUSTER_NAME="ha-cluster"
CLUSTER_ENDPOINT должна указывать на балансировщик нагрузки или DNS-имя, через которое доступен Kubernetes API по порту 6443/tcp.
CLUSTER_ENDPOINT указывал не на один управляющий узел, а на адрес, обеспечивающий доступ ко всем трём узлам Control Plane. Например, DNS-имя может содержать несколько A-записей:
kube.example.com IN A 192.168.0.2 kube.example.com IN A 192.168.0.3 kube.example.com IN A 192.168.0.4
https://kube.example.com:6443
secrets.yaml, controlplane.yaml, worker.yaml и talosconfig.
$mkdir -p ~/ha-cluster$cd ~/ha-cluster
$ talosctl gen secrets -o secrets.yaml
$ talosctl gen config \
--with-secrets secrets.yaml \
"$CLUSTER_NAME" \
"https://$CLUSTER_ENDPOINT:6443"
talos/controlplanes/controlplane-1.yaml, talos/controlplanes/controlplane-2.yaml, talos/controlplanes/controlplane-3.yaml, talos/workers/worker-1.yaml, talos/workers/worker-2.yaml.
$talosctl apply-config --insecure \--nodes "${CONTROL_PLANE_IP[0]}" \ --file talos/controlplanes/controlplane-1.yaml $talosctl apply-config --insecure \--nodes "${CONTROL_PLANE_IP[1]}" \ --file talos/controlplanes/controlplane-2.yaml $talosctl apply-config --insecure \--nodes "${CONTROL_PLANE_IP[2]}" \ --file talos/controlplanes/controlplane-3.yaml
$talosctl apply-config --insecure \--nodes "${WORKER_IP[0]}" \ --file talos/workers/worker-1.yaml $talosctl apply-config --insecure \--nodes "${WORKER_IP[1]}" \ --file talos/workers/worker-2.yaml
controlplane.yaml и worker.yaml.
talosctl:
$ talosctl dmesg --nodes <IP-адрес_узла>
talosconfig с локальной конфигурацией рабочего места администратора:
$ talosctl config merge ./talosconfig
talosctl на контекст создаваемого кластера:
$ talosctl config context "$CLUSTER_NAME"
$ talosctl config endpoint "${CONTROL_PLANE_IP[@]}"
Это позволит talosctl автоматически использовать доступный управляющий узел при недоступности одного из endpoint.
$ talosctl bootstrap \
--nodes "${CONTROL_PLANE_IP[0]}" \
--endpoints "${CONTROL_PLANE_IP[0]}"
Важно
talosctl bootstrap нельзя выполнять повторно на остальных управляющих узлах. После выполнения bootstrap остальные узлы Control Plane автоматически присоединятся к кластеру etcd с использованием общей конфигурации.
$ talosctl kubeconfig \
--nodes "${CONTROL_PLANE_IP[0]}" \
--endpoints "${CONTROL_PLANE_IP[0]}"
$ kubectl config current-context
$ kubectl get nodes -o wide
Ожидаемый результат — три узла Control Plane и два узла Worker в состоянии Ready.
$ talosctl health \
--nodes "${CONTROL_PLANE_IP[0]}" \
--endpoints "${CONTROL_PLANE_IP[0]}"
kubectl drain;
talosconfig, kubeconfig и secrets.yaml в защищённом месте (пример шифрования приведён ниже);
talosconfig, kubeconfig и secrets.yaml предоставляют доступ к управлению кластером или содержат конфиденциальные данные. Не рекомендуется хранить их в открытом виде в Git-репозиториях, общих каталогах или резервных копиях без шифрования.
sops и ключей age.
# apt-get install sops age
$mkdir -p ~/.config/sops/age$age-keygen -o ~/.config/sops/age/keys.txt
$ AGE_RECIPIENT=$(age-keygen -y ~/.config/sops/age/keys.txt)
$sops encrypt --age "$AGE_RECIPIENT" secrets.yaml > secrets.sops.yaml$sops encrypt \--input-type binary \ --output-type binary \ --age "$AGE_RECIPIENT" \ talosconfig > talosconfig.sops $sops encrypt \--input-type binary \ --output-type binary \ --age "$AGE_RECIPIENT" \ kubeconfig > kubeconfig.sops
$sops decrypt secrets.sops.yaml > secrets.yaml$sops decrypt \--input-type binary \ --output-type binary \ talosconfig.sops > talosconfig $sops decrypt \--input-type binary \ --output-type binary \ kubeconfig.sops > kubeconfig
~/.config/sops/age/keys.txt, необходимо хранить отдельно от зашифрованных файлов. При необходимости можно использовать другой путь к ключу, задав переменную окружения SOPS_AGE_KEY_FILE.
/etc/kubernetes/pki;
kubectl и talosctl;
Важно
CONTROL_PLANE_IP=<control-plane-ip>
WORKER_IP=("<worker-ip-1>" "<worker-ip-2>" "<worker-ip-3>")
CLUSTER_ENDPOINT=<endpoint-ip>
CLUSTER_NAME="myOldClusterName"
CLUSTER_ENDPOINT — IP-адрес или DNS-имя, по которому после миграции будет доступен Kubernetes API. Варианты настройки отказоустойчивой точки доступа описаны в разделе Конечная точка доступа Kubernetes API.
CLUSTER_NAME должен совпадать с именем существующего Kubernetes-кластера.
secrets.yaml на основе PKI существующего кластера:
$ talosctl gen secrets \
--from-kubernetes-pki /etc/kubernetes/pki \
--output-file secrets.yaml
/etc/kubernetes/pki на машину с установленным talosctl и выполнить команду там.
$ talosctl gen config \
--with-secrets secrets.yaml \
"$CLUSTER_NAME" \
"https://$CLUSTER_ENDPOINT:6443"
talosctl bootstrap и talosctl kubeconfig, описанные в этой инструкции.
cluster.network.cni должно быть установлено в none, чтобы ALT Orchestra не разворачивала новую CNI-сеть поверх существующей (подробнее этот режим описан в разделе Пользовательское развертывание CNI):
cluster:
network:
cni:
name: none
$ grep -E 'service-account-issuer|api-audiences|service-account-key-file|service-account-signing-key-file' \
/etc/kubernetes/manifests/kube-apiserver.yaml
service-account-issuer и api-audiences:
cluster:
apiServer:
extraArgs:
service-account-issuer: https://kubernetes.default.svc.cluster.local
api-audiences: https://kubernetes.default.svc.cluster.local
cluster.controlPlane.endpoint.
machine:
features:
diskQuotaSupport: true
kubePrism:
enabled: false
cluster.controlPlane.endpoint endpoint существующего Kubernetes API:
cluster:
controlPlane:
endpoint: https://<старый-endpoint>:6443
$ talosctl apply-config \
-n "$CONTROL_PLANE_IP" \
--endpoints <старый-endpoint> \
-f <path-to-controlplane.yaml> \
--insecure
Get https://localhost:6443/... dial tcp [::1]:6443: connect: connection refusedна данном этапе можно игнорировать.
$ kubectl get nodes -o wide
$ kubectl get pods -n kube-system \
--field-selector=status.phase!=Running
kubeconfig:
$ kubectl config set-cluster "$CLUSTER_NAME" \
--server="https://$CLUSTER_ENDPOINT:6443"
cluster.controlPlane.endpoint в конфигурации нового узла Control Plane, указав новый постоянный endpoint:
cluster:
controlPlane:
endpoint: https://<новый-endpoint>:6443
--insecure:
$ talosctl --talosconfig <path-to-talosconfig> apply-config \
-n "$CONTROL_PLANE_IP" \
--endpoints "$CONTROL_PLANE_IP" \
-f <path-to-controlplane.yaml>
/etc/kubernetes/kubelet.conf.
server и укажите новый endpoint Kubernetes API.
# systemctl restart kubelet
$ kubectl -n kube-system edit cm kube-proxy
kubeconfig.conf замените значение параметрастроку server:
kubeconfig.conf: |-
clusters:
- cluster:
server: https://<новый-endpoint>:6443
$kubectl -n kube-system rollout restart ds kube-proxy$kubectl -n kube-system rollout status ds kube-proxy
$ kubectl get nodes -o wide
$ kubectl -n kube-system get pods -l k8s-app=kube-proxy -o wide
etcdctl.
$kubectl cordon <node-name>$kubectl delete node <node-name>
$ talosctl apply-config \
-n <worker-ip> \
--endpoints "$CONTROL_PLANE_IP" \
-f <path-to-worker.yaml> \
--insecure
$ kubectl get nodes -o wide
$kubectl cordon <node-name>$kubectl drain <node-name> \--ignore-daemonsets \ --delete-emptydir-data $kubectl delete node <node-name>
talosctl.
Содержание
talosctl.
$ talosctl --nodes <IP-адрес-узла> health
$ talosctl --nodes <IP-адрес-узла> dmesg
$ talosctl --nodes <IP-адрес-узла> logs <сервис>
Например:
$ talosctl --nodes 192.168.0.140 logs kubelet
$ talosctl --nodes <IP-адрес-узла> services
$ talosctl --nodes <IP-адрес-узла> get links
$ talosctl --nodes <IP-адрес-узла> get disks
$ talosctl dashboard
Либо для конкретного узла:
$ talosctl --nodes <IP-адрес-узла> dashboard
$ talosctl kubeconfig .
$ talosctl --nodes <IP-адрес-узла> reboot
$ talosctl --nodes <IP-адрес-узла> shutdown
Примечание
talosconfig и доступности API на целевом узле.
worker.yaml или controlplane.yaml, в зависимости от роли узла.
controlplane.yaml, worker.yaml), которые были сгенерированы при первоначальном развертывании кластера, так как они содержат необходимые сертификаты для аутентификации узлов.
$ talosctl apply-config --insecure \
--nodes <IP-адрес-узла> \
--file controlplane.yaml # или worker.yaml
--insecure используется, так как на данном этапе инфраструктура PKI (сертификаты и шифрование) на узле ещё не настроена.
$ talosctl apply-config --insecure \
--nodes 192.168.0.141 \
--file _pve/controlplane.yaml
Примечание
DEVICE="/dev/sda" INSTALLERIMAGE="factory.altlinux.space/alt-orchestra-metal-installer/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba:v11.0"
$ cat > new_controlplane.patch << PATCH
.machine.install.disk="$DEVICE" |
.machine.install.image|="$INSTALLERIMAGE"
PATCH
$ cat _pve/controlplane.yaml | yq -y "$(cat new_controlplane.patch)" > _pve/new_controlplane.yaml
$ talosctl apply-config --insecure \
--nodes 192.168.0.147 \
--file _pve/worker.yaml
Пример вывода:
$ talosctl apply-config --insecure \
--nodes 192.168.0.147 \
--file _pve/worker.yaml
Примечание
DEVICE="/dev/sda" INSTALLERIMAGE="factory.altlinux.space/alt-orchestra-metal-installer/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba:v11.0"
$ cat > new_worker.patch << PATCH
.machine.install.disk="$DEVICE" |
.machine.install.image|="$INSTALLERIMAGE"
PATCH
$ cat _pve/worker.yaml | yq -y "$(cat new_worker.patch)" > _pve/new_worker.yaml
$ kubectl --kubeconfig ./kubeconfig get nodes
Пример вывода:
NAME STATUS ROLES AGE VERSION alt-orchestra-40p-byh Ready <none> 5m16s v1.35.0 alt-orchestra-6ub-m6m Ready <none> 26m v1.35.0 alt-orchestra-9hf-ozu Ready control-plane 26m v1.35.0 alt-orchestra-bob-f6v NotReady control-plane 17s v1.35.0 alt-orchestra-ezp-gxw Ready <none> 26m v1.35.0
$talosctl health -n 192.168.0.140$talosctl health -n 192.168.0.141
$ kubectl --kubeconfig ./kubeconfig get all -A
$ talosctl --nodes <IP-адрес-узла> reset
$ kubectl delete node <имя_узла>
Операция reset не удаляет узел из Kubernetes — это необходимо выполнить отдельно с помощью kubectl.
$ talosctl apply-config --insecure \
--nodes <IP-адрес-узла> \
--file controlplane.yaml # или worker.yaml
Примечание
talosctl reset рекомендуется сначала корректно вывести узел из кластера Kubernetes с помощью команды:
$ kubectl drain <узел> --ignore-daemonsets --delete-emptydir-data
$ talosctl -n 192.168.0.141 reset
Пример вывода:
watching nodes: [192.168.0.141]
* 192.168.0.197: events check condition met
$ DELETED_NODE="$(kubectl --kubeconfig ./kubeconfig get nodes -o wide | grep 192.168.0.197 | awk '{print $1}')"
$ kubectl --kubeconfig ./kubeconfig delete node $DELETED_NODE;
Пример вывода:
node "alt-orchestra-40p-byh" deleted
$ kubectl --kubeconfig ./kubeconfig get nodes -o wide | grep 192.168.0.141
$talosctl health -n 192.168.0.140$talosctl health -n 192.168.0.141
$ kubectl --kubeconfig ./kubeconfig get all -A
Все поды должны находиться в состоянии Running. Допускается наличие подов в состоянии Completed или ContainerStatusUnknown (например, для cilium-operator).
controlplane.yaml) необходимо:
controlplane.yaml.
cluster: allowSchedulingOnControlPlanes: true
$ talosctl apply-config --insecure \
--nodes <IP-адрес-узла> \
--file controlplane.yaml
$ talosctl get nodes
$ talosctl edit machineconfig -n <IP-адрес-узла>
cluster с параметром:
cluster: allowSchedulingOnControlPlanes: true
allowSchedulingOnControlPlanes, Kubernetes по умолчанию добавляет taint NoSchedule на управляющие узлы.
$ kubectl taint nodes <имя_ноды> \
node-role.kubernetes.io/control-plane:NoSchedule-
Примечание
$ talosctl get KubernetesDynamicCerts -o yaml \
--nodes <controlplane-ip>
talosconfig и kubeconfig) являются ответственностью пользователя. Каждый раз при получении kubeconfig из кластера ALT Orchestra клиентский сертификат в нём создаётся заново и будет действовать в течение одного года. После истечения срока действия потребуется сгенерировать kubeconfig заново.
talosconfig (для работы с talosctl) также имеет срок действия, который обычно составляет 1 год. Необходимо обновлять его вручную.
talosconfig с ролью os:admin, можно сгенерировать новый файл клиентской конфигурации:
$ talosctl -n <controlplane-ip> config new talosconfig-reader \
--roles os:reader \
--crt-ttl 24h
Можно указать другие роли (os:admin, k8s:admin) и срок действия (--crt-ttl).
secrets.yaml, его можно использовать для генерации talosconfig:
$ talosctl gen config \
--with-secrets secrets.yaml \
--output-types talosconfig \
-o talosconfig \
<cluster-name> https://<cluster-endpoint>
Примечание
cluster-name и cluster-endpoint не используются при генерации talosconfig, но их всё равно нужно указать.
controlplane.yaml всё ещё доступен, можно извлечь CA и сгенерировать сертификат вручную:
$yq 'select(.machine) | .machine.ca.crt | @base64d' controlplane.yaml > ca.crt$yq 'select(.machine) | .machine.ca.key | @base64d' controlplane.yaml > ca.key
Примечание
yq из пакета yq-go.
$talosctl gen key --name admin$talosctl gen csr --key admin.key --ip 127.0.0.1$talosctl gen crt --ca ca --csr admin.csr --name admin
talosconfig:
context: mycluster
contexts:
mycluster:
endpoints:
- <controlplane-ip-1>
- <controlplane-ip-2>
ca: <base64-encoded ca.crt>
crt: <base64-encoded admin.crt>
key: <base64-encoded admin.key>
talosctl apply-config — применение конфигурации из файла;
talosctl edit machineconfig — редактирование текущей конфигурации в интерактивном редакторе с последующим применением;
talosctl patch machineconfig — применение изменений к конфигурации в формате JSON Patch.
default — автоматическое применение: изменения применяются немедленно; при необходимости выполняется перезагрузка;
--mode=reboot — применение после перезагрузки узла (узел перезагружается автоматически);
--mode=no-reboot — немедленное применение без перезагрузки; команда завершится ошибкой, если изменения требуют перезагрузки;
--mode=staged — изменения подготавливаются и применяются при следующей перезагрузке (узел не перезагружается автоматически);
--mode=try — временное применение: если изменения не будут подтверждены в течение одной минуты, они автоматически отменяются;
--mode=interactive — интерактивный режим (TUI; доступен только для talosctl apply-config).
Примечание
--mode=staged не изменяет текущую конфигурацию узла. Повторный вызов talosctl edit machineconfig --mode=staged не отобразит подготовленные изменения.
$ talosctl get machineconfig v1alpha1 -o jsonpath='{.spec}'
talosctl apply-config.
talosctl apply-config обычно используется для отправки начальной конфигурации, сгенерированной с помощью talosctl gen config, на узел.
$ talosctl get machineconfig v1alpha1 -o jsonpath='{.spec}' > machineconfig.yaml
$ talosctl -n <IP-адрес-узла> apply-config -f config.yaml
apply-config также может быть вызвана в альтернативной форме:
$ talosctl -n <IP-адрес-узла> apply machineconfig -f config.yaml
Немедленное применение конфигурации (без перезагрузки):
$ talosctl -n <IP-адрес-узла> apply machineconfig -f config.yaml --mode=no-reboot
Интерактивный режим (TUI):
$ talosctl -n <IP-адрес-узла> apply machineconfig --mode=interactive
Примечание
--insecure (-i) для подключения к API и применения конфигурации.
talosctl edit machineconfig загружает текущую конфигурацию с узла и открывает её в редакторе. Если конфигурация не была изменена (или результат пустой), обновление не применяется.
Примечание
TALOS_EDITOR и EDITOR для выбора редактора. Если они не заданы, по умолчанию используется vim.
$ talosctl -n <IP-адрес-узла> edit machineconfig
$ talosctl -n <IP1>,<IP2>… edit machineconfig
$ talosctl -n <IP-адрес-узла> edit machineconfig --mode=no-reboot
talosctl patch machineconfig работает аналогично команде edit — она загружает текущую конфигурацию машины, но вместо интерактивного редактирования применяет набор изменений (patch) к конфигурации.
$ talosctl -n <IP-адрес-узла> patch machineconfig -p '[{"op": "replace", "path": "/machine/kubelet/image", "value": "registry.altlinux.org/p11/kubelet:v1.35"}]'
$ talosctl -n <IP-адрес-узла> patch machineconfig --mode=no-reboot -p '[{"op": "replace", "path": "/cluster/apiServer/image", "value": "registry.altlinux.org/p11/kube-apiserver:v1.35"}]'
$ talosctl -n <IP1>,<IP2>… patch machineconfig -p '[{...}]'
$ talosctl -n <IP-адрес-узла> patch machineconfig \
-p @kubelet-patch.json -p @manifest-patch.json
kubelet-patch.yaml:
- op: replace path: /machine/kubelet/image value: registry.altlinux.org/p11/kubelet:v1.35Применение патча:
$ talosctl -n <IP-адрес-узла> patch machineconfig -p @kubelet-patch.yaml
Примечание
.machine.install.image).
$ talosctl upgrade -n <IP-адрес-узла> \
--image factory.altlinux.space/metal-installer/<идентификатор-схемы>:<версия>
$ talosctl -n 192.168.0.147 get extensions
Вывод:
NODE NAMESPACE TYPE ID VERSION NAME VERSION 192.168.0.147 runtime ExtensionStatus 0 1 schematic 376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba
$ talosctl upgrade -n 192.168.0.147 \
--image factory.altlinux.space/alt-orchestra-metal-installer/80d5f9d0991e825b84617b4f2ce25b840050e3ee6a83647ac1bc0a559cf90962:v11.0
$ talosctl -n 192.168.0.147 get extensions
Вывод:
NODE NAMESPACE TYPE ID VERSION NAME VERSION 192.168.0.147 runtime ExtensionStatus 0 1 intel-ucode 20251111 192.168.0.147 runtime ExtensionStatus 1 1 util-linux-tools 2.39.2 192.168.0.147 runtime ExtensionStatus 2 1 schematic 80d5f9d0991e825b84617b4f2ce25b840050e3ee6a83647ac1bc0a559cf90962
$ talosctl upgrade -n 192.168.0.147 \
--image factory.altlinux.space/alt-orchestra-metal-installer/b8a905a80cb59e5cb28d30420b3d14b62b1ff4c75ee906657d3ed8c3b0b087d5:v11.0
В процессе обновления узел перезагружается и загружается с новым образом, в котором отсутствует отключённое расширение.
$ talosctl -n 192.168.0.147 get extensions
Пример вывода:
NODE NAMESPACE TYPE ID VERSION NAME VERSION 192.168.0.147 runtime ExtensionStatus 0 1 util-linux-tools 2.39.2 192.168.0.147 runtime ExtensionStatus 1 1 schematic b8a905a80cb59e5cb28d30420b3d14b62b1ff4c75ee906657d3ed8c3b0b087d5
docker build -t my-extension:latest .
talosctl get extensions:
$ talosctl -n 192.168.0.147 get extensions
Пример вывода:
NODE NAMESPACE TYPE ID VERSION NAME VERSION 192.168.0.147 runtime ExtensionStatus 0 1 intel-ucode 20251111 192.168.0.147 runtime ExtensionStatus 1 1 util-linux-tools 2.39.2 192.168.0.147 runtime ExtensionStatus 1 schematic 80d5f9d0991e825b84617b4f2ce25b840050e3ee6a83647ac1bc0a559cf90962
$ talosctl -n 192.168.0.147 get extensions 0 -o yaml
Пример вывода:
node: 192.168.0.147
metadata:
namespace: runtime
type: ExtensionStatuses.runtime.talos.dev
id: 0
version: 1
owner: runtime.ExtensionStatusController
phase: running
created: 2026-04-23T11:21:14Z
updated: 2026-04-23T11:21:14Z
spec:
image: 0.sqsh
metadata:
name: intel-ucode
version: "20251111"
author: Basealt LLC
description: |
intel-ucode module
compatibility:
talos:
version: '>= v1.0.0'
$ talosctl -n 192.168.0.147 get extensions 1 -o yaml
Пример вывода:
{
"metadata": {
"created": "2026-04-23T11:21:14Z",
"id": 1,
"namespace": "runtime",
"owner": "runtime.ExtensionStatusController",
"phase": "running",
"type": "ExtensionStatuses.runtime.talos.dev",
"updated": "2026-04-23T11:21:14Z",
"version": 1
},
"node": "192.168.0.147",
"spec": {
"image": "1.sqsh",
"metadata": {
"author": "Basealt LLC",
"compatibility": {
"talos": {
"version": "\u003e= v1.0.0"
}
},
"description": "minimal util-linux package\n",
"name": "util-linux-tools",
"version": "2.39.2"
}
}
}
talos.platform — определяет платформу развертывания. Возможные значения: akamai, aws, azure, container, digitalocean, equinixMetal, gcp, hcloud, metal, nocloud, openstack, oracle, scaleway, upcloud, vmware, vultr;
slab_nomerge — рекомендуется в соответствии с требованиями Kernel Self Protection Project (KSPP);
pti=on — включает Kernel Page Table Isolation и рекомендуется KSPP.
init_on_alloc=1/0 — рекомендуется KSPP. По умолчанию включён в конфигурации ядра, но может быть отключён для повышения производительности за счёт снижения уровня безопасности;
init_on_free=0/1 — рекомендуется KSPP. По умолчанию отключён, но может быть включён для повышения безопасности за счёт производительности.
ip используется для начальной настройки сети: IP-адресов, маршрутов, DNS- и NTP-серверов.

ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>:<ntp0-ip>где:
client-ip — статический IP-адрес машины;
server-ip — IP-адрес сервера, который используется для дополнительных сетевых задач на раннем этапе загрузки системы (например, для загрузки с сервера TFTP или NFS). Для загрузки с локального диска можно не указывать;
gw-ip — IP-адрес шлюза по умолчанию;
netmask — сетевая маска;
hostname — имя хоста (можно не указывать);
device — сетевой интерфейс (актуальное имя: ens19, enp0s3 и т.д.);
autoconf — режим автоматической настройки сети (dhcp — использовать DHCP; off — отключить автоматическую настройку);
dns0-ip, dns1-ip — адрес DNS-сервера;
ntp0-ip — адрес NTP-сервера.
ip:
ip=192.168.0.100::192.168.0.1:255.255.255.0::ens19:off
ip=172.20.0.2::172.20.0.1:255.255.255.0::eth0.100:::::
ip=:::::::<dns0-ip>:<dns1-ip>:<ntp0-ip>
ip=[2001:db8::a]:[2001:db8::b]:[fe80::1]::controlplane1:eth1::[2001:4860:4860::6464]:[2001:4860:4860::64]:[2001:4860:4806::]
[ffff:ffff:ffff:ffff::0]
ip=:::::eth0.3:dhcp
ip=eth0.3:dhcp
bond используется для начальной настройки bonding-интерфейсов.
bond=<bondname>:<bondslaves>:<options>:<mtu>
bond=bond0 bond=bond0: bond=bond0:: bond=bond0::: bond=bond0:eth0,eth1 bond=bond0:eth0,eth1:balance-rr
bond=bond1:eth3,eth4:mode=802.3ad,xmit_hash_policy=layer2+3:1450Будет создан bond:
vlan используется для создания VLAN-интерфейса на раннем этапе загрузки.
vlan=eth0.100:eth0 ip=172.20.0.2::172.20.0.1:255.255.255.0::eth0.100:::::
net.ifnames=0 отключает предсказуемые имена сетевых интерфейсов.
net.ifnames=0
panic определяет задержку перед автоматической перезагрузкой после критической ошибки ядра.
panic=10где 10 — задержка в секундах.
talos.config указывает URL конфигурации машины.
talos.platform=metal
http://test.alt/metadata?h=${hostname}&m=${mac}&s=${serial}&u=${uuid}
После подстановки:
http://test.alt/metadata?h=myTestHostname&m=52%3A2f%3Afd%3Adf%3Afc%3Ac0&s=0OCZJ19N65&u=40dcbd19-3b10-444e-bfff-aaee44a51fda
http://test.alt/metadata?uuid -> http:/test.alt/metadata?uuid=40dcbd19-3b10-444e-bfff-aaee44a51fda
talos.hostname устанавливает имя хоста на раннем этапе загрузки.
machine configuration, однако этот параметр полезен, если DHCP-сервер требует hostname до получения конфигурации узла.
talos.shutdown определяет тип завершения работы системы.
talos.network.interface.ignore позволяет исключить интерфейс из автоматической настройки.
talos.network.interface.ignore=eth2 talos.network.interface.ignore=eth3
talos.dashboard.disabled=1После этого:
talos.auditd.disabled=1После этого можно использовать собственную службу аудита.
talos.environment позволяет задать переменные окружения.
talos.environment=<key>=<value>Пример:
talos.environment=http_proxy=http://proxy.example.com:8080 talos.environment=https_proxy=http://proxy.example.com:8080
Примечание
talos.dashboard.disabled=1.
Примечание
vga=.



Примечание
talosctl dmesg:
$ talosctl -n 192.168.0.140 dmesg
Пример вывода:
… 192.168.0.140: kern: info: [2026-05-20T09:04:32.286426442Z]: cni0: port 2(vethfc8629cd) entered disabled state 192.168.0.140: kern: info: [2026-05-20T09:04:32.286454534Z]: vethfc8629cd: entered allmulticast mode 192.168.0.140: kern: info: [2026-05-20T09:04:32.286520294Z]: vethfc8629cd: entered promiscuous mode 192.168.0.140: kern: info: [2026-05-20T09:04:32.29266636Z]: cni0: port 2(vethfc8629cd) entered blocking state 192.168.0.140: kern: info: [2026-05-20T09:04:32.292682238Z]: cni0: port 2(vethfc8629cd) entered forwarding state
talosctl logs:
$ talosctl -n 192.168.0.140 services
Пример вывода:
NODE SERVICE STATE HEALTH LAST CHANGE LAST EVENT 192.168.0.140 apid Running OK 1h27m45s ago Health check successful 192.168.0.140 auditd Running OK 1h27m58s ago Health check successful 192.168.0.140 containerd Running OK 1h27m58s ago Health check successful 192.168.0.140 cri Running OK 1h27m41s ago Health check successful 192.168.0.140 dashboard Running ? 1h27m46s ago Process Process(["/sbin/dashboard"]) started with PID 2143 192.168.0.140 etcd Running OK 1h27m30s ago Health check successful 192.168.0.140 kubelet Running OK 1h27m26s ago Health check successful 192.168.0.140 machined Running OK 1h27m58s ago Health check successful 192.168.0.140 syslogd Running OK 1h27m57s ago Health check successful 192.168.0.140 trustd Running OK 1h27m42s ago Health check successful 192.168.0.140 udevd Running OK 1h27m48s ago Health check successfulЖурнал службы machined:
$ talosctl -n 192.168.0.140 logs machined
Пример вывода:
192.168.0.140: uthorized ([os:admin os:operator os:reader] includes [os:admin]) 192.168.0.140: 2026/05/20 10:08:42.674116 machined OK [/machine.MachineService/LoadAvg] 684.822µs unary Success (:authority=localhost;content-type=application/grpc;grpc-accept-encoding=gzip;runtime=Talos;talos-role=os:admin;user-agent=grpc-go/1.79.3) 192.168.0.140: 2026/05/20 10:08:42.674139 machined/authz/authorizer authorized ([os:admin os:operator os:reader] includes [os:admin]) 192.168.0.140: 2026/05/20 10:08:42.674196 machined OK [/machine.MachineService/Version] 61.501µs unary Success (:authority=localhost;content-type=application/grpc;grpc-accept-encoding=gzip;runtime=Talos;talos-role=os:admin;user-agent=grpc-go/1.79.3)
$ talosctl -n 192.168.0.140 containers -k
Пример вывода:
NODE NAMESPACE ID IMAGE PID STATUS 192.168.0.140 k8s.io kube-system/coredns-5d988558b4-bprr7 registry.altlinux.org/p11/pause:latest 3706 SANDBOX_READY 192.168.0.140 k8s.io └─ kube-system/coredns-5d988558b4-bprr7:coredns:12d271240d6a registry.altlinux.org/p11/coredns:v1.13.1 3729 CONTAINER_RUNNING 192.168.0.140 k8s.io kube-system/coredns-5d988558b4-lcqkq registry.altlinux.org/p11/pause:latest 3546 SANDBOX_READY 192.168.0.140 k8s.io └─ kube-system/coredns-5d988558b4-lcqkq:coredns:e8d4666636d8 registry.altlinux.org/p11/coredns:v1.13.1 3570 CONTAINER_RUNNING 192.168.0.140 k8s.io kube-system/kube-apiserver-controlplane-01 registry.altlinux.org/p11/pause:latest 2534 SANDBOX_READY 192.168.0.140 k8s.io └─ kube-system/kube-apiserver-controlplane-01:kube-apiserver:22ba4d5e9dc7 registry.altlinux.org/p11/kube-apiserver:v1.35.0 2628 CONTAINER_RUNNING …
$ talosctl -n 192.168.0.140 logs syslogd
machine:
logging:
destinations:
- endpoint: "udp://127.0.0.1:12345/"
format: "json_lines"
- endpoint: "tcp://<IP_сервера>:5044/"
format: "json_lines"
json_lines:
{
"msg": "2026/04/22 10:53:06.280578 [talos] apply config request: mode auto(no_reboot)",
"talos-level": "info",
"talos-service": "machined",
"talos-time": "2026-04-22T10:53:06.280622837Z"
}
msg, talos-level, talos-service и talos-time присутствуют всегда; также могут добавляться дополнительные поля.
extraTags в конфигурации машины:
machine:
logging:
destinations:
- endpoint: "udp://127.0.0.1:12345/"
format: "json_lines"
extraTags:
cluster: "prod-k8s-01"
role: "controlplane"
extraTags добавляются к каждому отправляемому сообщению без изменений.
logging-patch.yaml с конфигурацией:
$ cat > logging-patch.yaml << 'EOF'
machine:
logging:
destinations:
- endpoint: "tcp://192.168.0.100:5044/"
format: "json_lines"
EOF
$ talosctl patch machineconfig -n <IP_узла> --patch @logging-patch.yaml
или сразу ко всем нодам в кластере:
$ talosctl patch machineconfig --patch @logging-patch.yaml
talos.logging.kernel, который указывается в machine.installer.extraKernelArgs:
machine:
install:
extraKernelArgs:
- talos.logging.kernel=tcp://host:5044/
apiVersion: v1alpha1 kind: KmsgLogConfig name: remote-log url: tcp://host:5044/
json_lines.
{
"clock":19686864,
"facility":"user",
"msg":"[talos] task startAllServices (1/1): done, 4.607407038s\n",
"priority":"warning",
"seq":880,
"talos-level":"warn",
"talos-time":"2026-04-22T12:43:48.747807524Z"
}
Поля:
clock — время относительно момента загрузки ядра;
talos-level — уровень логирования;
talos-time — метка времени, вычисленная н а основе clock.
extraKernelArgs в конфигурации машины применяются только при обновлении ALT Orchestra, а не при обычном применении конфигурации (при этом обновление до той же версии допускается).
kernel-logging-patch.yaml с конфигурацией:
$ cat > kernel-logging-patch.yaml << 'EOF'
machine:
install:
extraKernelArgs:
- talos.logging.kernel=tcp://192.168.0.100:5044/
EOF
$ talosctl patch machineconfig -n <IP_узла> --patch @kernel-logging-patch.yaml
$ talosctl upgrade -n <IP_узла> \
-image factory.altlinux.space/alt-orchestra-metal-installer/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba:v11.0
$ talosctl -n 192.168.0.140 processes | sed 's| |\n|g' | grep -E "(audit-policy|audit-log)"
Пример вывода:
--audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/log/audit/kube/kube-apiserver.log --audit-policy-file=/system/config/kubernetes/kube-apiserver/auditpolicy.yaml
$ talosctl -n 192.168.0.140 cat /system/config/kubernetes/kube-apiserver/auditpolicy.yaml
Пример вывода:
apiVersion: audit.k8s.io/v1 kind: Policy metadata: creationTimestamp: null rules: - level: Metadata
$ talosctl get mc -n 192.168.0.140 v1alpha1 \
-o jsonpath='{.spec}' 2>/dev/null | \
yq '.cluster.apiServer.auditPolicy'
Пример вывода:
{
"apiVersion": "audit.k8s.io/v1",
"kind": "Policy",
"rules": [
{
"level": "Metadata"
}
]
}
$ talosctl -n 192.168.0.140 cat /var/log/audit/kube/kube-apiserver.log | \
tail -n 1 | jq
Пример вывода:
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "35da1bd4-458d-4ae3-8d94-48a43f191b6a",
"stage": "ResponseComplete",
"requestURI": "/apis/coordination.k8s.io/v1/namespaces/kube-system/leases/kube-scheduler?timeout=5s",
"verb": "get",
"user": {
"username": "system:kube-scheduler",
"groups": [
"system:kube-scheduler",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=1c78e3fa4db5aa8c23483a739b010dde1e044a80a7b03afa108f90ab00913b16"
]
}
},
"sourceIPs": [
"fdda:e7b2:9f17:0:a00:27ff:fee4:406d"
],
"userAgent": "kube-scheduler/v1.33.6 (linux/amd64) kubernetes/1e09fec/leader-election",
"objectRef": {
"resource": "leases",
"namespace": "kube-system",
"name": "kube-scheduler",
"apiGroup": "coordination.k8s.io",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestReceivedTimestamp": "2026-04-16T15:58:38.860528Z",
"stageTimestamp": "2026-04-16T15:58:38.863596Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"system:kube-scheduler\" of ClusterRole \"system:kube-scheduler\" to User \"system:kube-scheduler\""
}
}
[
{
"op": "replace",
"path": "/cluster/apiServer/auditPolicy/rules/0/level",
"value": "RequestResponse"
}
]
$talosctl -n 192.168.0.140 patch machineconfig\ -p '[{"op":"replace","path":"/cluster/apiServer/auditPolicy/rules/0/level","value":"RequestResponse"}]' $talosctl -n 192.168.0.141 patch machineconfig\ -p '[{"op":"replace","path":"/cluster/apiServer/auditPolicy/rules/0/level","value":"RequestResponse"}]'
$ talosctl -n 192.168.0.140 cat /system/config/kubernetes/kube-apiserver/auditpolicy.yaml
Пример вывода:
apiVersion: audit.k8s.io/v1 kind: Policy metadata: creationTimestamp: null rules: - level: RequestResponse
$ talosctl get mc -n 192.168.0.140 v1alpha1 \
-o jsonpath='{.spec}' 2>/dev/null | yq '.cluster.apiServer.auditPolicy'
Пример вывода:
{
"apiVersion": "audit.k8s.io/v1",
"kind": "Policy",
"rules": [
{
"level": "RequestResponse"
}
]
}
$ kubectl --kubeconfig ./kubeconfig create sa test
$ talosctl -n 192.168.0.140 cat /var/log/audit/kube/kube-apiserver.log | \
tail -n 1 | jq
Пример вывода:
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "4fe3c9a3-76e7-445a-a8f3-db0e31761652",
"stage": "ResponseComplete",
"requestURI": "...",
"verb": "..."
...
}
talosctl, который взаимодействует с API узла.
talosctl rollback либо соответствующего API-вызова (смена записи загрузки с последующей перезагрузкой).
Примечание
talosctl upgrade.
Таблица 17.1. Параметры команды talosctl upgrade
|
Параметр
|
Описание
|
|---|---|
-n, --nodes
|
IP-адреса или имена узлов, которые необходимо обновить
|
--image, -i
|
Образ установщика ALT Orchestra, используемый для обновления (по умолчанию:
altlinux.space/alt-orchestra/installer:<LAST_VERSION>)
|
--stage, -s
|
Отложить применение обновления до следующей перезагрузки (артефакты сохраняются на диск, обновление выполняется на раннем этапе загрузки)
|
--force, -f
|
Принудительно выполнить обновление, пропустив проверки состояния etcd (может привести к потере данных)
|
--reboot-mode, -m
|
Режим перезагрузки:
|
--insecure
|
Выполнить обновление через незащищённый режим обслуживания (без аутентификации, только шифрование). Требуется при работе в режиме maintenance
|
--endpoints, -e
|
Переопределить адреса endpoints из конфигурации ALT Orchestra
|
--talosconfig
|
Путь к файлу конфигурации ALT Orchestra (по умолчанию
$HOME/.talos/config)
|
--context
|
Контекст подключения (например, при использовании прокси или SideroV1)
|
--debug
|
Включить отладочный вывод (в том числе из журналов ядра). Автоматически включает
--wait
|
--wait
|
Ожидать завершения операции и отслеживать её прогресс (по умолчанию true)
|
--timeout
|
Максимальное время ожидания завершения операции (по умолчанию 30m)
|
$ talosctl -n <IP-адрес-узла> upgrade --image <новый-образ>
$ talosctl upgrade -n <IP-адрес-узла> \
--image factory.altlinux.space/alt-orchestra-metal-installer/<идентификатор>:<новая версия>
Пример:
$ talosctl upgrade -n 192.168.0.140 \
--image factory.altlinux.space/alt-orchestra-metal-installer/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba:v11.0

$ talosctl upgrade -n <IP-адрес-узла> \
--image factory.altlinux.space/alt-orchestra-metal-installer/<новый идентификатор>:v11.0
Пример:
$talosctl -n 192.168.0.146 get extensionsNODE NAMESPACE TYPE ID VERSION NAME VERSION 192.168.0.147 runtime ExtensionStatus 0 1 schematic 376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba $talosctl upgrade -n 192.168.0.146\ --image factory.altlinux.space/alt-orchestra-metal-installer/ea2358d7be66761ea85e66f01f11936df9c93b7647ddc9cd89c0e5e5131c4080:v11.0 $talosctl -n 192.168.0.146 get extensionsNODE NAMESPACE TYPE ID VERSION NAME VERSION 192.168.0.146 runtime ExtensionStatus 0 1 qemu-guest-agent 9.1.2 192.168.0.146 runtime ExtensionStatus 1 1 util-linux-tools 2.39.2 192.168.0.146 runtime ExtensionStatus 2 1 schematic ea2358d7be66761ea85e66f01f11936df9c93b7647ddc9cd89c0e5e5131c4080
$ talosctl -n <IP-адрес-узла> version
$ talosctl -n <IP-адрес-узла> health
--stage.
Примечание
Примечание
lifecycle.preStop подa в её манифесте.
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
…
kube-flannel-k4mw5 1/1 Running 0 19h
kube-flannel-szd6s 1/1 Running 2 (4h37m ago) 5h58m
kube-flannel-t5hsc 1/1 Running 0 6h28m
…
Наличие подов с именем kube-flannel в пространстве имён kube-system указывает на использование Flannel в качестве сетевого плагина.
cluster:
network:
cni:
name: flannel
flannel:
# extraArgs — список строк ([]string), дополнительные аргументы для «flanneld»
extraArgs:
- --iface-can-reach=192.168.0.1
Адрес 192.168.0.1 в параметре --iface-can-reach приведён для примера. Его необходимо заменить на доступный из вашей сети адрес. При запуске flanneld будет определён IP-адрес узла и сетевой интерфейс, используемый для маршрута к указанному адресу.
Примечание
none. Например, с помощью патча конфигурации:
$ cat <<EOF > patch.yaml
cluster:
network:
cni:
name: none
proxy: #если вместо kube-proxy будет использоваться cilium-envoy
disabled: true
EOF
$ talosctl gen config $CLUSTER_NAME https://$CONTROL_PLANE_IP:6443 \
--output-dir orchestra \
--install-image $INSTALLERIMAGE \
--with-secrets secrets.yaml \
--config-patch @patch.yaml
Примечание
$talosctl apply-config --insecure\ --nodes 192.168.0.140 \ --file orchestra/controlplane.yaml $talosctl apply-config --insecure\ --nodes 192.168.0.145 \ --file orchestra/worker.yaml
$export TALOSCONFIG="$HOME/.talos/config"$talosctl config merge orchestra/talosconfig$talosctl --talosconfig $TALOSCONFIG config endpoint $CONTROL_PLANE_IP$talosctl --talosconfig $TALOSCONFIG config node $CONTROL_PLANE_IP$talosctl bootstrap\ --nodes $CONTROL_PLANE_IP \ --talosconfig $TALOSCONFIG
$talosctl kubeconfig .$export KUBECONFIG=./kubeconfig
# apt-get install helm
$helm repo add cilium https://helm.cilium.io/$helm repo update
$ helm install \
cilium \
cilium/cilium \
--version VERSION \
--namespace kube-system \
--set ipam.mode=kubernetes \
--set kubeProxyReplacement=false \
--set securityContext.capabilities.ciliumAgent="{CHOWN,KILL,NET_ADMIN,NET_RAW,IPC_LOCK,SYS_ADMIN,SYS_RESOURCE,DAC_OVERRIDE,FOWNER,SETGID,SETUID}" \
--set securityContext.capabilities.cleanCiliumState="{NET_ADMIN,SYS_ADMIN,SYS_RESOURCE}" \
--set cgroup.autoMount.enabled=false \
--set cgroup.hostRoot=/sys/fs/cgroup
$ helm install \
cilium \
cilium/cilium \
--version VERSION \
--namespace kube-system \
--set ipam.mode=kubernetes \
--set kubeProxyReplacement=true \
--set securityContext.capabilities.ciliumAgent="{CHOWN,KILL,NET_ADMIN,NET_RAW,IPC_LOCK,SYS_ADMIN,SYS_RESOURCE,DAC_OVERRIDE,FOWNER,SETGID,SETUID}" \
--set securityContext.capabilities.cleanCiliumState="{NET_ADMIN,SYS_ADMIN,SYS_RESOURCE}" \
--set cgroup.autoMount.enabled=false \
--set cgroup.hostRoot=/sys/fs/cgroup \
--set k8sServiceHost=localhost \
--set k8sServicePort=7445
… --set gatewayAPI.enabled=true \ --set gatewayAPI.enableAlpn=true \ --set gatewayAPI.enableAppProtocol=true
values.yaml:
-f https://altlinux.space/cloud/charts/raw/branch/master/cilium/<branch>/<version>/values.yaml
-f https://altlinux.space/cloud/charts/src/branch/master/cilium/sisyphus/1.18.2/values.yaml
$ helm search repo cilium/cilium –versions
Примечание
helm install выполняется с рабочей станции администратора, на которой настроен kubeconfig. Helm использует текущий kubeconfig для подключения к Kubernetes API. После этого Kubernetes автоматически развернёт компоненты Cilium на соответствующих узлах с помощью DaemonSet.
NAME: cilium LAST DEPLOYED: Mon May 25 12:35:04 2026 NAMESPACE: kube-system STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: You have successfully installed Cilium with Hubble. Your release version is 1.19.3.
# apt-get install cilium-cli
$ cilium status
Ожидаемый вывод:
/¯¯\
/¯¯\__/¯¯\ Cilium: OK
\__/¯¯\__/ Operator: OK
/¯¯\__/¯¯\ Envoy DaemonSet: OK
\__/¯¯\__/ Hubble Relay: disabled
\__/ ClusterMesh: disabled
DaemonSet cilium Desired: 2, Ready: 2/2, Available: 2/2
DaemonSet cilium-envoy Desired: 2, Ready: 2/2, Available: 2/2
Deployment cilium-operator Desired: 2, Ready: 2/2, Available: 2/2
Containers: cilium Running: 2
cilium-envoy Running: 2
cilium-operator Running: 2
clustermesh-apiserver
hubble-relay
Cluster Pods: 2/2 managed by Cilium
Helm chart version: 1.19.3
Image versions cilium quay.io/cilium/cilium:v1.19.3@sha256:2e61680593cddca8b6c055f6d4c849d87a26a1c91c7e3b8b56c7fb76ab7b7b10: 2
cilium-envoy quay.io/cilium/cilium-envoy:v1.36.6-1776000132-2437d2edeaf4d9b56ef279bd0d71127440c067aa@sha256:ba0ab8adac082d50d525fd2c5ba096c8facea3a471561b7c61c7a5b9c2e0de0d: 2
cilium-operator quay.io/cilium/operator-generic:v1.19.3@sha256:205b09b0ed6accbf9fe688d312a9f0fcfc6a316fc081c23fbffb472af5dd62cd
$ cilium connectivity test
Данная команда запускает набор встроенных тестов в пространстве имён default.
Error creating: pods "client-69748f45d8-9b9jg" is forbidden: violates PodSecurity "baseline:latest": non-default capabilities (container "client" must not include "NET_RAW" in securityContext.capabilities.add)Такое поведение является ожидаемым. Для обхода ограничения необходимо добавить метку
pod-security.kubernetes.io/enforce=privileged для пространства имён, в котором выполняются тесты. Например:
$ kubectl label namespace cilium-test \
pod-security.kubernetes.io/enforce=privileged
После этого команду cilium connectivity test можно выполнить повторно.
custom и укажите URL-адреса манифестов в параметре urls:
cluster:
network:
cni:
name: custom
urls:
- <URL_TO_MANIFEST>
- …
где:
name: custom — включает пользовательский CNI;
urls — список URL-адресов манифестов Kubernetes, которые будут автоматически применены при загрузке кластера.
none и укажите содержимое манифеста в параметре inlineManifests:
cluster:
network:
cni:
name: none
inlineManifests:
- name: namespace-ci
contents: |
<MANIFEST_DATA>
…
где:
name: none — отключает автоматическую установку встроенного CNI;
inlineManifests — список локальных Kubernetes-манифестов, которые будут применены при запуске кластера;
contents — содержимое Kubernetes-манифеста в формате YAML.
cryptsetup. При включении шифрования система выполняет дополнительные этапы инициализации.
Таблица 21.1. Поддерживаемые методы шифрования
|
Метод
|
Описание
|
|---|---|
|
static
|
Шифрование с использованием статического пароля (наименее защищённый способ). Для раздела STATE пароль хранится в незашифрованном разделе META
|
|
nodeID
|
Ключ генерируется на основе UUID узла (обеспечивает базовую защиту, не предназначен для защиты от атак с физическим доступом)
|
|
kms
|
Ключ запечатывается с использованием сетевого KMS (надёжно, но требует сетевого доступа до расшифровки)
|
|
tpm
|
Ключ запечатывается с использованием TPM (наиболее надёжный вариант, особенно в сочетании с Secure Boot)
|
Примечание
Примечание
machine:
systemDiskEncryption:
ephemeral:
provider: luks2
keys:
- nodeID: {}
slot: 0
state:
provider: luks2
keys:
- nodeID: {}
slot: 0
Примечание
state:
keys:
- nodeID: {} # тип ключа
slot: 1 # слот
ephemeral:
keys:
- static:
passphrase: supersecret
slot: 0
slot.
Таблица 21.2. Типы ключей
|
Тип
|
Описание
|
|---|---|
|
nodeID
|
Генерируется из UUID узла и метки раздела
|
|
static
|
Указывается напрямую в конфигурации
|
|
kms
|
Получается через сетевой KMS
|
|
tpm
|
Запечатывается с использованием TPM (с учётом состояния Secure Boot)
|
Примечание
static для раздела STATE, так как пароль сохраняется в незашифрованном разделе META.
ephemeral:
keys:
- static:
passphrase: oldkey
slot: 0
- static:
passphrase: newkey
slot: 1
$ talosctl apply-config -n <IP-адрес-узла> -f config.yaml
ephemeral:
keys:
- static:
passphrase: newkey
slot: 1
$ talosctl apply-config -n <IP-адрес-узла> -f config.yaml
config.yaml.
staged:
$ talosctl apply-config -n <IP-адрес-узла> -f config.yaml --mode=staged
$ talosctl reset --system-labels-to-wipe EPHEMERAL -n <IP-адрес-узла> --reboot=true
$ talosctl reset --system-labels-to-wipe STATE -n <IP-адрес-узла> --reboot=true
--insecure:
$ talosctl apply-config --insecure -n <IP-адрес-узла> -f config.yaml
$ talosctl get disks
Пример вывода:
NODE NAMESPACE TYPE ID VERSION SIZE READ ONLY TRANSPORT 192.168.0.140 runtime Disk loop0 2 4.1 kB true 192.168.0.140 runtime Disk loop1 2 98 MB true 192.168.0.140 runtime Disk sda 11 GB false virtio
$ talosctl get disk sda -o yaml
Пример вывода:
node: 192.168.0.140
metadata:
namespace: runtime
type: Disks.block.talos.dev
id: sda
version: 2
owner: block.DisksController
phase: running
created: 2026-04-22T08:25:37Z
updated: 2026-04-22T08:25:48Z
spec:
dev_path: /dev/sda
size: 10737418240
pretty_size: 11 GB
io_size: 512
sector_size: 512
readonly: false
cdrom: false
model: QEMU HARDDISK
modalias: scsi:t-0x00
bus_path: /pci0000:00/0000:00:05.0/0000:01:01.0/virtio4/host2/target2:0:0/2:0:0:0
sub_system: /sys/class/block
transport: virtio
rotational: true
symlinks:
- /dev/disk/by-diskseq/11
- /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0
- /dev/disk/by-path/pci-0000:01:01.0-scsi-0:0:0:0
DiscoveredVolume:
$ talosctl get discoveredvolumes
Пример вывода:
NODE ID TYPE SIZE DISCOVERED LABEL PARTITIONLABEL 192.168.0.140 loop1 disk 98 MB squashfs 192.168.0.140 sda disk 11 GB gpt 192.168.0.140 sda1 partition 105 MB vfat EFI EFI 192.168.0.140 sda2 partition 1.0 MB BIOS 192.168.0.140 sda3 partition 1.0 GB xfs BOOT BOOT 192.168.0.140 sda4 partition 1.0 MB talosmeta META 192.168.0.140 sda5 partition 105 MB xfs STATE STATE 192.168.0.140 sda6 partition 9.5 GB xfs EPHEMERAL EPHEMERAL
VolumeConfig, а текущее состояние хранится в ресурсе VolumeStatus.
$ talosctl get volumeconfigs
Пример вывода:
NODE NAMESPACE TYPE ID VERSION 192.168.0.140 runtime VolumeConfig /etc/cni 2 192.168.0.140 runtime VolumeConfig /etc/kubernetes 2 192.168.0.140 runtime VolumeConfig /opt 2 192.168.0.140 runtime VolumeConfig /usr/libexec/kubernetes 2 192.168.0.140 runtime VolumeConfig /var/lib 2 .. 192.168.0.140 runtime VolumeConfig /var/run/lock 2 192.168.0.140 runtime VolumeConfig EPHEMERAL 2 192.168.0.140 runtime VolumeConfig ETCD 2 192.168.0.140 runtime VolumeConfig META 2 192.168.0.140 runtime VolumeConfig STATE 3
machine.disks машинной конфигурации.
$ talosctl get volumeconfig STATE -o yaml
Пример вывода:
node: 192.168.0.140
metadata:
namespace: runtime
type: VolumeConfigs.block.talos.dev
id: STATE
version: 3
owner: block.VolumeConfigController
phase: running
created: 2026-04-22T08:25:36Z
updated: 2026-04-22T08:25:49Z
finalizers:
- block.VolumeManagerController
spec:
type: partition
provisioning:
wave: -1
diskSelector:
match: system_disk
partitionSpec:
minSize: 104857600
maxSize: 104857600
grow: false
label: STATE
typeUUID: 0FC63DAF-8483-4772-8E79-3D69D8477DE4
filesystemSpec:
type: xfs
label: STATE
locator:
match: volume.partition_label == "STATE"
mount:
targetPath: /system/state
selinuxLabel: system_u:object_r:system_state_t:s0
projectQuotaSupport: false
fileMode: 448
$ talosctl get volumestatus
Пример вывода:
NODE ID VERSION TYPE PHASE LOCATION SIZE 192.168.0.140 /etc/cni 3 overlay ready 192.168.0.140 /etc/kubernetes 3 overlay ready 192.168.0.140 /var/lib 2 directory ready ... 192.168.0.140 EPHEMERAL 6 partition ready /dev/sda6 9.5 GB 192.168.0.140 ETCD 2 directory ready 192.168.0.140 META 3 partition ready /dev/sda4 1.0 MB 192.168.0.140 STATE 6 partition ready /dev/sda5 105 MB
Таблица 22.1. Этапы жизненного цикла тома
|
Состояние
|
Описание
|
|---|---|
|
waiting
|
Том ожидает подготовки
|
|
missing
|
Диски обнаружены, но том не найден
|
|
located
|
Том найден без предварительной подготовки
|
|
provisioned
|
Том подготовлен (разделён, при необходимости изменён размер)
|
|
prepared
|
Зашифрованный том открыт
|
|
ready
|
Том отформатирован и готов к монтированию
|
|
closed
|
Зашифрованный том закрыт
|
Примечание
Примечание
/var), необходимо добавить в машинную конфигурацию:
apiVersion: v1alpha1
kind: VolumeConfig
name: EPHEMERAL
provisioning:
diskSelector:
match: disk.transport == 'nvme'
minSize: 2GB
maxSize: 40GB
grow: false
VolumeConfig являются необязательными. Если поле не указано, используется значение по умолчанию:
provisioning:
diskSelector:
match: system_disk
minSize: 2GiB
grow: true
diskSelector позволяет выбрать диск для размещения тома. Это выражение на языке Common Expression Language (CEL), которое вычисляется для каждого доступного диска.
talosctl get disks -o yaml):
dev_path: /dev/sda size: 10737418240 pretty_size: 11 GB io_size: 512 sector_size: 512 readonly: false …
Примечание
u для констант:
disk.size > 10u * GiB
disk.transport == 'nvme' — только NVMe-диски;
disk.transport == 'scsi' && disk.size < 2u * TiB — SCSI-диски меньше 2 ТиБ;
disk.serial.startsWith('abcd') && !cdrom — диски с заданным серийным номером, кроме CD-ROM.
minSize и maxSize задают границы размера тома:
minSize;
maxSize не задан, том займёт всё доступное место;
grow: true том будет автоматически расширяться при каждой загрузке.
minSize, он не будет выбран для размещения тома.
https://myK8s.mydomain.io:6443
Примечание
kube.cluster1.mydomain.com IN A 192.168.0.10 kube.cluster1.mydomain.com IN A 192.168.0.11 kube.cluster1.mydomain.com IN A 192.168.0.12
https://kube.cluster1.mydomain.com:6443
Примечание
[
{
"op": "add",
"path": "/machine/network/interfaces",
"value": [
{
"deviceSelector": {
"physical": true
},
"dhcp": true,
"vip": {
"ip": "192.168.0.100"
}
}
]
}
]
$Примерный вывод:talosctl -n 192.168.0.140 patch machineconfig\ -p '[{"op":"add","path":"/machine/network/interfaces","value":[{"deviceSelector":{"physical":true},"dhcp":true,"vip":{"ip":"192.168.0.100"}}]}]' $talosctl -n 192.168.0.141 patch machineconfig\ -p '[{"op":"add","path":"/machine/network/interfaces","value":[{"deviceSelector":{"physical":true},"dhcp":true,"vip":{"ip":"192.168.0.100"}}]}]' $talosctl -n 192.168.0.142 patch machineconfig\ -p '[{"op":"add","path":"/machine/network/interfaces","value":[{"deviceSelector":{"physical":true},"dhcp":true,"vip":{"ip":"192.168.0.100"}}]}]'
patched MachineConfigs.config.talos.dev/v1alpha1 at the node 192.168.0.140 Applied configuration without a reboot
$ talosctl get addresses 2>/dev/null | grep 192.168.0.100
Примерный вывод:
192.168.0.140 network AddressStatus ens19/192.168.0.100/32 1 192.168.0.100/32 ens19
$ cp ~/.kube/config ~/vipk8sconfig
$ sed -i 's|192.168.1.2|192.168.1.100|g' ~/vipk8sconfig
$ echo 'talosctl get addresses -e <Адреса Control Plane, кроме узла с VIP> | \
grep 192.168.0.100' > get.sh
$watch -n 5 ./get.sh$watch KUBECONFIG=~/vipk8sconfig kubectl get nodes -o wide
kubectl через виртуальный IP-адрес наблюдается следующее:
Unable to connect to the server: dial tcp 192.168.1.100:6443: i/o timeout
[
{
"op": "remove",
"path": "/machine/network/interfaces"
}
]
$talosctl -n 192.168.0.140 patch machineconfig\ -p '[{"op":"remove","path":"/machine/network/interfaces"}]' $talosctl -n 192.168.0.141 patch machineconfig\ -p '[{"op":"remove","path":"/machine/network/interfaces"}]' $talosctl -n 192.168.0.142 patch machineconfig\ -p '[{"op":"remove","path":"/machine/network/interfaces"}]'
$ talosctl get addresses 2>/dev/null | grep 192.168.0.100
$talosctl -n 192.168.0.140 health$talosctl -n 192.168.0.141 health$talosctl -n 192.168.0.142 health$kubectl get nodes
kubectl к к Kubernetes API.
Secret в etcd в виде данных, закодированных в Base64. Это не является шифрованием: любой, кто имеет доступ к каталогу данных etcd или возможность чтения данных через API etcd, может получить секреты в открытом виде. Включение шифрования данных «на диске» (encryption at rest) обеспечивает шифрование секретов перед их записью в etcd и повышает уровень защиты конфиденциальной информации.
EncryptionConfiguration. В конфигурации указывается:
aescbc — шифрование AES-CBC с дополнением PKCS#7. Надёжный вариант для большинства сценариев;
aesgcm — шифрование AES-GCM. Работает быстрее, чем aescbc, но требует аккуратной ротации ключей;
secretbox — использует алгоритмы XSalsa20 и Poly1305. Современный и производительный вариант;
identity — отключает шифрование.
cluster.aescbcEncryptionSecret;
cluster.secretboxEncryptionSecret.
EncryptionConfiguration и подключает его к kube-apiserver.
Примечание
cluster.aescbcEncryptionSecret и cluster.secretboxEncryptionSecret:
$ talosctl -n 192.168.0.140 get machineconfig v1alpha1 -o yaml | \
yq -r .spec | yq .cluster | grep secretboxEncryptionSecret
Ожидаемый вывод:
grep encryption-provider
- --encryption-provider-config=/system/secrets/kubernetes/kube-apiserver/encryptionconfig.yaml
EncryptionConfiguration:
$ talosctl -n 192.168.0.140 read \
/system/secrets/kubernetes/kube-apiserver/encryptionconfig.yaml
Ожидаемый вывод:
apiVersion: v1
kind: EncryptionConfig
resources:
- providers:
- secretbox:
keys:
- name: key2
secret: ghq0LEtxJEa6AnyYYwNEypSNYHWLYPVrZA8JvH6zlKk=
- identity: {}
resources:
- secrets
$ kubectl create secret generic my-secret \
--from-literal=key1=supersecret \
--from-literal=key2=topsecret
$talosctl -n 192.168.0.140 read /system/secrets/etcd/ca.crt > ca.crt$talosctl -n 192.168.0.140 read /system/secrets/etcd/server.crt > server.crt$talosctl -n 192.168.0.140 read /system/secrets/etcd/server.key > server.key
Примечание
# apt-get install etcd
$ ETCDCTL_API=3 etcdctl \
--endpoints=https://192.168.0.140:2379 \
--cacert=./ca.crt \
--cert=./server.crt \
--key=./server.key \
get /registry/secrets/default/my-secret
При включённом шифровании вывод будет содержать префикс:
k8s:enc:secretbox:v1:Если шифрование отключено, содержимое секрета будет отображаться в открытом виде.
/var.
/dev, /proc, /run, /sys и /tmp;
/system — слой для поддержки изменяемых файлов, таких как /etc/hosts и /etc/resolv.conf. Он монтируется поверх стандартных путей и обеспечивает возможность записи только для ограниченного набора файлов. Например, при загрузке ALT Orchestra формирует /system/etc/hosts, а затем монтирует его поверх /etc/hosts. Это означает, что вместо предоставления записи во весь каталог /etc, доступными для записи становятся только отдельные файлы.

/system полностью пересоздаётся при каждой загрузке. Для данных, которые должны сохраняться между загрузками (например, /etc/kubernetes), ALT Orchestra использует файловые системы overlayfs. Такие каталоги размещаются в /var/ на разделе EPHEMERAL с файловой системой XFS.
/var/ является пользователь kubernetes, за исключением каталогов, использующих overlayfs. Этот каталог доступен для записи и используется такими сервисами, как etcd, kubelet и CRI. Его содержимое сохраняется между перезагрузками и обновлениями.
/system на управляющих узлах содержит следующие подкаталоги:
drwxr-xr-x 0 0 60 Jan 26 15:06:30 config/kubernetes/... drwx------ 0 0 160 Jan 26 15:06:30 etc/... drwx--x--x 0 0 80 Jan 26 15:06:30 libexec/apid/... drwxr-xr-x 0 0 80 Jan 26 15:06:23 overlays/... drwxr-xr-x 0 0 60 Jan 26 15:06:23 resolved/resolv.conf drwxr-x--x 0 0 140 Jan 26 15:06:30 run/... drwx------ 0 0 80 Jan 26 15:06:30 secrets/... drwxr-xr-x 0 0 80 Jan 26 15:06:17 state/... drwx------ 0 0 60 Jan 26 15:06:24 var/lib/containerd/...
config/ и secrets/.
/system/state монтируется на раздел STATE и содержит следующие файлы:
config.yaml node-identity.yaml platform-network.yaml
config.yaml — содержит конфигурацию узла (<type>.yaml), полученную сервисом apid при выполнении команды talosctl apply-config;
node-identity.yaml — содержит уникальный идентификатор узла:
nodeId: xxx…
platform-network.yaml — содержит сведения о платформе и сетевых параметрах узла, например:
addresses: []
links: []
routes: []
hostnames: []
resolvers: []
timeServers: []
operators: []
externalIPs: []
metadata:
platform: metal
instanceId: <UUID>
/system/var, смонтированный на раздел EPHEMERAL, содержит слои загруженных образов и выполняемых контейнеров.
Таблица 32.1. Компоненты, специфичные для ALT Orchestra
|
Компонент
|
Описание
|
|---|---|
|
apid
|
При взаимодействии с ALT Orchestra пользователь напрямую работает с gRPC API, предоставляемым компонентом apid. Он выступает шлюзом для взаимодействия со всеми компонентами системы и перенаправляет запросы в machined
|
|
containerd
|
Стандартная в отрасли среда выполнения контейнеров, ориентированная на простоту, надёжность и переносимость
|
|
machined
|
Замена традиционного процесса init в Linux, разработанная специально для запуска Kubernetes и не позволяющая запускать произвольные пользовательские сервисы
|
|
kernel
|
Ядро Linux, поставляемое с ALT Orchestra, настроенное в соответствии с рекомендациями проекта Kernel Self Protection Project (KSPP)
|
|
trustd
|
Для запуска и эксплуатации кластера Kubernetes требуется определённый уровень доверия между узлами. Основанный на концепции «корня доверия» (Root of Trust), trustd отвечает за установление доверия внутри системы
|
|
udevd
|
Управляет файлами устройств в /dev и обрабатывает действия в пользовательском пространстве при подключении и отключении устройств
|
talosctl поведение apid определяется двумя параметрами:
-e или --endpoints — указывает узел ALT Orchestra (точнее, его apid), который будет обрабатывать соединение. Обычно это публично доступный сервер;
-n или --nodes — указывает узел(ы) ALT Orchestra, которые должны ответить на запрос.
--nodes не указан, используется первый endpoint.
Примечание
$ talosctl -e 192.168.0.202 memory
NODE TOTAL USED FREE SHARED BUFFERS CACHE AVAILABLE
192.168.0.202 7938 1768 2390 145 53 3724 6571
В этом случае talosctl подключается apid на узле 192.168.0.202, который затем перенаправляет запрос в API machined.
$ talosctl -e 192.168.0.202 -n node02 memory
NODE TOTAL USED FREE SHARED BUFFERS CACHE AVAILABLE
node02 7938 1768 2390 145 53 3724 6571
В этом случае apid на узле 192.168.0.202 получает запрос и пересылает его экземпляру apid на узле node02, который уже обращается к локальному API machined.
-n или перечислив узлы через запятую:
$ talosctl -e 192.168.0.202 -n node01 -n node02 -n node03 memory
NODE TOTAL USED FREE SHARED BUFFERS CACHE AVAILABLE
node01 7938 871 4071 137 49 2945 7042
node02 257844 14408 190796 18138 49 52589 227492
node03 257844 1830 255186 125 49 777 254556
В этом случае apid на 192.168.0.202 пересылает запросы узлам node01, node02 и node03, а их локальные экземпляры apid обращаются к своим экземплярам machined.
/dev.
cluster.discovery конфигурации ALT Orchestra:
cluster:
discovery:
enabled: true
registries:
service:
disabled: true # Отключает службу реестра
kubernetes:
disabled: false # Включает реестр Kubernetes (при необходимости)
$ kubectl --kubeconfig ./kubeconfig describe node <имя узла>
Annotations:
extensions.talos.dev/schematic: 376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba
flannel.alpha.coreos.com/backend-data: {"VNI":1,"VtepMAC":"fa:50:25:ae:1f:89"}
flannel.alpha.coreos.com/backend-type: vxlan
flannel.alpha.coreos.com/kube-subnet-manager: true
flannel.alpha.coreos.com/public-ip: 192.168.0.145
node.alpha.kubernetes.io/ttl: 0
talos.dev/owned-annotations: ["extensions.talos.dev/schematic"]
volumes.kubernetes.io/controller-managed-attach-detach: true
https://discovery.altlinux.space/
$ talosctl get identities -o yaml
Пример вывода:
node: 192.168.0.140
metadata:
namespace: cluster
type: Identities.cluster.talos.dev
id: local
version: 1
owner: cluster.NodeIdentityController
phase: running
created: 2026-05-20T09:02:08Z
updated: 2026-05-20T09:02:08Z
spec:
nodeId: yMCuCL2m2rLfDm6TdKCzjYxEd7rYbjRa3gbwx6LYsRT
nodeId — уникальный идентификатор узла (32 байта, кодированные в base62).
STATE (файл node-identity.yaml). Идентификатор сохраняется при перезагрузках и обновлениях, и сбрасывается только при выполнении команды talosctl reset.
$ talosctl get affiliates

cluster-raw:
$ talosctl get affiliates --namespace=cluster-raw

service/… — данные из службы обнаружения (https://discovery.altlinux.space);
k8s/… — данные из реестра Kubernetes (если он включён).
$ talosctl get members

Примечание


talosctl, выполняемой на рабочем компьютере администратора;

Примечание
$ talosctl gen config <clusterName> https://<endpoint>:6443
controlplane.yaml — конфигурация управляющего узла (Control Plane);
worker.yaml — конфигурация рабочих узлов (Worker Node);
talosconfig — настройки подключения к API.

talosconfig записываются параметры доступа к кластеру (включая сертификаты).
controlplane.yaml — данные для развёртывания управляющих узлов.
worker.yaml — данные для развёртывания рабочих узлов.
/dev/sda.
$ talosctl apply-config --insecure --nodes $CONTROL_PLANE_IP \
--talosconfig=./talosconfig --file ./controlplane.yaml
$ talosctl apply-config --insecure --nodes $WORKER_IP \
--talosconfig=./talosconfig --file ./worker.yaml
talosctl apply-config устанавливают соединение с сервисом apid по порту 50000 и передаёт ему конфигурационный YAML-файл узла.

talosconfig при этом не передаётся в apid — он используется только утилитой talosctl для аутентификации и установления соединения с узлом ALT Orchestra.
.machine.install.image конфигурационного файла и выполняет установку системы.


Таблица 38.1. Разделы диска
|
Номер
|
Начало
|
Размер
|
Файловая система
|
Имя
|
Флаги
|
|---|---|---|---|---|---|
|
1
|
1049kB
|
105MB
|
fat32
|
EFI
|
загрузочный, esp
|
|
2
|
106MB
|
1049kB
|
|
BIOS
|
bios_grub, legacy_boot
|
|
3
|
107MB
|
1049MB
|
xfs
|
BOOT
|
|
|
4
|
1156MB
|
1049kB
|
|
META
|
|
|
5
|
1157MB
|
105MB
|
xfs
|
STATE
|
|
|
6
|
1261MB
|
xxxGB
|
xfs
|
EPHEMERAL
|
|
config.yaml.
/var, куда загружаются образы, указанные в конфигурации. Из образов (например, kubelet и etcd) извлекаются бинарные файлы и конфигурации, необходимые для запуска компонентов как системных сервисов.

$ talosctl -e <endpoint> -n <endpoint> --talosconfig=./talosconfig bootstrap
kubeconfig, содержащий параметры подключение к кластеру. Он создаётся командой:
$ talosctl --talosconfig $TALOSCONFIG kubeconfig .
kubectl) для доступа к кластеру.

kubeconfig можно наблюдать за процессом инициализации кластера с помощью команды:
$ kubectl --kubeconfig kubeconfig get all -A
Данная команда позволяет отслеживать состояние всех ресурсов Kubernetes во всех пространствах имён (namespace).
Примечание
kubectl должен быть установлен пакет kubernetes<Версия>-client, например kubernetes1.35-client.
$ kubectl get nodes --kubeconfig kubeconfig
Пример вывода:
NAME STATUS ROLES AGE VERSION alt-orchestra-b76-zal Ready <none> 3m52s v1.35.0 alt-orchestra-gtm-tnz Ready control-plane 4m6s v1.35.0
$ kubectl --kubeconfig kubeconfig get pods --namespace kube-system
Пример вывода:
NAME READY STATUS RESTARTS AGE coredns-5966c6bdcd-dv275 1/1 Running 0 17h coredns-5966c6bdcd-rzldw 1/1 Running 0 17h kube-apiserver-controlplane-01 1/1 Running 0 8m48s kube-controller-manager-controlplane-01 1/1 Running 2 (9m10s ago) 8m46s kube-flannel-9zqwx 1/1 Running 2 (17h ago) 2d kube-flannel-hpvbq 1/1 Running 2 (21h ago) 23h kube-flannel-rkszh 1/1 Running 2 (17h ago) 2d15h kube-flannel-rqsn8 1/1 Running 1 (17h ago) 41h kube-proxy-gxfvm 1/1 Running 0 7m56s kube-proxy-m2bjx 1/1 Running 0 17h kube-proxy-sdz7k 0/1 Pending 0 17h kube-proxy-sz9tf 1/1 Running 0 17h kube-scheduler-controlplane-01 1/1 Running 3 (8m58s ago) 8m48s