<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Katamarina - PaaS-платформа для построения облачных инфраструктур. – Начало работы с Cozystack</title><link>https://katamarina.ru/docs/cozystack/online_v_1_5/getting-started/</link><description>Recent content in Начало работы с Cozystack on Katamarina - PaaS-платформа для построения облачных инфраструктур.</description><generator>Hugo -- gohugo.io</generator><language>ru</language><atom:link href="https://katamarina.ru/docs/cozystack/online_v_1_5/getting-started/index.xml" rel="self" type="application/rss+xml"/><item><title>Docs: Установка Talos Linux</title><link>https://katamarina.ru/docs/cozystack/online_v_1_5/getting-started/install-talos/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://katamarina.ru/docs/cozystack/online_v_1_5/getting-started/install-talos/</guid><description>
&lt;h1 id="1-установка-talos-linux">1. Установка Talos Linux&lt;/h1>
&lt;h2 id="перед-началом">Перед началом&lt;/h2>
&lt;p>Убедитесь, что у вас есть узлы (bare-metal серверы или виртуальные машины), соответствующие
&lt;a href="https://cozystack.ru/docs/v1.5/getting-started/requirements/" target="_blank">требованиям к оборудованию&lt;/a>.&lt;/p>
&lt;h2 id="цели">Цели&lt;/h2>
&lt;p>На этом шаге вы установите Talos Linux на bare-metal серверы или виртуальные машины, на которых сейчас работает другой дистрибутив Linux.&lt;/p>
&lt;p>В этом руководстве используется &lt;code>boot-to-talos&lt;/code> — простой CLI-инструмент, созданный командой Cozystack для пользователей и команд, внедряющих Cozystack. Существуют и другие способы
&lt;a href="https://cozystack.ru/docs/v1.5/install/talos/" target="_blank">установки Talos Linux для Cozystack&lt;/a>, но они здесь не рассматриваются и описаны в отдельных руководствах.&lt;/p>
&lt;h2 id="установка">Установка&lt;/h2>
&lt;h3 id="1-установите-boot-to-talos">1. Установите boot-to-talos&lt;/h3>
&lt;p>Установите &lt;code>boot-to-talos&lt;/code> с помощью установочного скрипта:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -sSL https://github.com/cozystack/boot-to-talos/raw/refs/heads/main/hack/install.sh | sh -s
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-запустите-установку-talos">2. Запустите установку Talos&lt;/h3>
&lt;p>Запустите &lt;code>boot-to-talos&lt;/code> и укажите значения конфигурации. Убедитесь, что используете сборку Talos от Cozystack, опубликованную в
&lt;a href="https://github.com/cozystack/cozystack/pkgs/container/cozystack%2Ftalos" target="_blank">ghcr.io/cozystack/cozystack/talos&lt;/a>. Для Cozystack v1.5.0 закрепленная версия Talos — &lt;strong>v1.13.0&lt;/strong>. Переопределите значение по умолчанию в installer prompt:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ boot-to-talos
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Target disk &lt;span style="color:#666">[&lt;/span>/dev/sda&lt;span style="color:#666">]&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Talos installer image &lt;span style="color:#666">[&lt;/span>ghcr.io/cozystack/cozystack/talos:v1.11.6&lt;span style="color:#666">]&lt;/span>: ghcr.io/cozystack/cozystack/talos:v1.13.0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Add networking configuration? &lt;span style="color:#666">[&lt;/span>yes&lt;span style="color:#666">]&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Interface &lt;span style="color:#666">[&lt;/span>eth0&lt;span style="color:#666">]&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>IP address &lt;span style="color:#666">[&lt;/span>10.0.2.15&lt;span style="color:#666">]&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Netmask &lt;span style="color:#666">[&lt;/span>255.255.255.0&lt;span style="color:#666">]&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Gateway &lt;span style="color:#666">(&lt;/span>or &lt;span style="color:#4070a0">&amp;#39;none&amp;#39;&lt;/span>&lt;span style="color:#666">)&lt;/span> &lt;span style="color:#666">[&lt;/span>10.0.2.2&lt;span style="color:#666">]&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Configure serial console? &lt;span style="color:#666">(&lt;/span>or &lt;span style="color:#4070a0">&amp;#39;no&amp;#39;&lt;/span>&lt;span style="color:#666">)&lt;/span> &lt;span style="color:#666">[&lt;/span>ttyS0&lt;span style="color:#666">]&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Summary:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Image: ghcr.io/cozystack/cozystack/talos:v1.13.0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Disk: /dev/sda
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Extra kernel args: &lt;span style="color:#bb60d5">ip&lt;/span>&lt;span style="color:#666">=&lt;/span>10.0.2.15::10.0.2.2:255.255.255.0::eth0::::: &lt;span style="color:#bb60d5">console&lt;/span>&lt;span style="color:#666">=&lt;/span>ttyS0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>WARNING: ALL DATA ON /dev/sda WILL BE ERASED!
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Continue? &lt;span style="color:#666">[&lt;/span>yes&lt;span style="color:#666">]&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:03 created temporary directory /tmp/installer-3221603450
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:03 pulling image ghcr.io/cozystack/cozystack/talos:v1.13.0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:03 extracting image layers
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:07 creating raw disk /tmp/installer-3221603450/image.raw &lt;span style="color:#666">(&lt;/span>&lt;span style="color:#40a070">2&lt;/span> GiB&lt;span style="color:#666">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:07 attached /tmp/installer-3221603450/image.raw to /dev/loop0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:07 starting Talos installer
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:07 running Talos installer v1.13.0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:07 WARNING: config validation:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:07 use &lt;span style="color:#4070a0">&amp;#34;worker&amp;#34;&lt;/span> instead of &lt;span style="color:#4070a0">&amp;#34;&amp;#34;&lt;/span> &lt;span style="color:#007020;font-weight:bold">for&lt;/span> machine &lt;span style="color:#007020">type&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:07 created EFI &lt;span style="color:#666">(&lt;/span>C12A7328-F81F-11D2-BA4B-00A0C93EC93B&lt;span style="color:#666">)&lt;/span> size &lt;span style="color:#40a070">104857600&lt;/span> bytes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:07 created BIOS &lt;span style="color:#666">(&lt;/span>21686148-6449-6E6F-744E-656564454649&lt;span style="color:#666">)&lt;/span> size &lt;span style="color:#40a070">1048576&lt;/span> bytes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:07 created BOOT &lt;span style="color:#666">(&lt;/span>0FC63DAF-8483-4772-8E79-3D69D8477DE4&lt;span style="color:#666">)&lt;/span> size &lt;span style="color:#40a070">1048576000&lt;/span> bytes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:07 created META &lt;span style="color:#666">(&lt;/span>0FC63DAF-8483-4772-8E79-3D69D8477DE4&lt;span style="color:#666">)&lt;/span> size &lt;span style="color:#40a070">1048576&lt;/span> bytes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:07 formatting the partition &lt;span style="color:#4070a0">&amp;#34;/dev/loop0p1&amp;#34;&lt;/span> as &lt;span style="color:#4070a0">&amp;#34;vfat&amp;#34;&lt;/span> with label &lt;span style="color:#4070a0">&amp;#34;EFI&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:07 formatting the partition &lt;span style="color:#4070a0">&amp;#34;/dev/loop0p2&amp;#34;&lt;/span> as &lt;span style="color:#4070a0">&amp;#34;zeroes&amp;#34;&lt;/span> with label &lt;span style="color:#4070a0">&amp;#34;BIOS&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:07 formatting the partition &lt;span style="color:#4070a0">&amp;#34;/dev/loop0p3&amp;#34;&lt;/span> as &lt;span style="color:#4070a0">&amp;#34;xfs&amp;#34;&lt;/span> with label &lt;span style="color:#4070a0">&amp;#34;BOOT&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:07 formatting the partition &lt;span style="color:#4070a0">&amp;#34;/dev/loop0p4&amp;#34;&lt;/span> as &lt;span style="color:#4070a0">&amp;#34;zeroes&amp;#34;&lt;/span> with label &lt;span style="color:#4070a0">&amp;#34;META&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:07 copying from io reader to /boot/A/vmlinuz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:07 copying from io reader to /boot/A/initramfs.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:08 writing /boot/grub/grub.cfg to disk
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:08 executing: grub-install --boot-directory&lt;span style="color:#666">=&lt;/span>/boot --removable --efi-directory&lt;span style="color:#666">=&lt;/span>/boot/efi
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:08 installation of v1.13.0 &lt;span style="color:#007020">complete&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:08 Talos installer finished successfully
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:08 remounting all filesystems read-only
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:08 copy /tmp/installer-3221603450/image.raw -&amp;gt; /dev/sda
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:19 installation image copied to /dev/sda
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2025/08/03 00:11:19 rebooting system
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="следующий-шаг">Следующий шаг&lt;/h2>
&lt;p>Продолжите руководство по Cozystack и
&lt;a href="https://cozystack.ru/docs/v1.5/getting-started/install-kubernetes/" target="_blank">установите Kubernetes-кластер с помощью Talm&lt;/a>.&lt;/p>
&lt;p>Дополнительно:&lt;/p>
&lt;ul>
&lt;li>Прочитайте
&lt;a href="https://cozystack.ru/docs/v1.5/guides/talos/" target="_blank">обзор Talos Linux&lt;/a>, чтобы понять, почему Talos Linux — оптимальный выбор ОС для Cozystack и что он даёт платформе.&lt;/li>
&lt;li>Узнайте больше о
&lt;a href="https://cozystack.ru/docs/v1.5/install/talos/boot-to-talos/#about-the-application" target="_blank">&lt;code>boot-to-talos&lt;/code>&lt;/a>.&lt;/li>
&lt;li>Загляните в
&lt;a href="https://github.com/cozystack/boot-to-talos" target="_blank">github.com/cozystack/boot-to-talos&lt;/a> и поставьте проекту звезду.&lt;/li>
&lt;/ul></description></item><item><title>Docs: Установка и bootstrap кластера Kubernetes</title><link>https://katamarina.ru/docs/cozystack/online_v_1_5/getting-started/install-kubernetes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://katamarina.ru/docs/cozystack/online_v_1_5/getting-started/install-kubernetes/</guid><description>
&lt;h1 id="2-установка-и-bootstrap-кластера-kubernetes">2. Установка и bootstrap кластера Kubernetes&lt;/h1>
&lt;h2 id="цели">Цели&lt;/h2>
&lt;p>К началу этого шага у нас уже есть
&lt;a href="https://cozystack.ru/docs/v1.5/getting-started/install-talos/" target="_blank">три узла с установленным Talos Linux&lt;/a>.&lt;/p>
&lt;p>В результате этого шага у вас будет установленный и настроенный Kubernetes-кластер, готовый к установке Cozystack. Также вы получите &lt;code>kubeconfig&lt;/code> для этого кластера и выполните базовые проверки его состояния.&lt;/p>
&lt;h2 id="установка-kubernetes">Установка Kubernetes&lt;/h2>
&lt;p>Установите и выполните bootstrap кластера Kubernetes с помощью
&lt;a href="https://cozystack.ru/docs/v1.5/install/kubernetes/talm/" target="_blank">Talm&lt;/a> — декларативного CLI-инструмента управления конфигурацией с готовыми пресетами для Cozystack.&lt;/p>
&lt;blockquote>
&lt;p>Этот фрагмент руководства сейчас перерабатывается. Здесь появятся упрощённые инструкции по установке Talm без дополнительных опций и редких пограничных случаев, которые описаны в основном руководстве по Talm.&lt;/p>
&lt;/blockquote>
&lt;h2 id="следующий-шаг">Следующий шаг&lt;/h2>
&lt;p>Продолжите руководство по Cozystack и
&lt;a href="https://cozystack.ru/docs/v1.5/getting-started/install-cozystack/" target="_blank">установите Cozystack&lt;/a>.&lt;/p>
&lt;p>Дополнительно:&lt;/p>
&lt;ul>
&lt;li>Загляните в
&lt;a href="https://github.com/cozystack/talm" target="_blank">github.com/cozystack/talm&lt;/a> и поставьте проекту звезду.&lt;/li>
&lt;/ul></description></item><item><title>Docs: Установка и настройка Cozystack</title><link>https://katamarina.ru/docs/cozystack/online_v_1_5/getting-started/install-cozystack/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://katamarina.ru/docs/cozystack/online_v_1_5/getting-started/install-cozystack/</guid><description>
&lt;h1 id="3-установка-и-настройка-cozystack">3. Установка и настройка Cozystack&lt;/h1>
&lt;h2 id="цели">Цели&lt;/h2>
&lt;p>Это руководство описывает установку Cozystack как &lt;strong>готовой к использованию платформы&lt;/strong>. Если вы хотите собрать собственную платформу, устанавливая только нужные компоненты, см.
&lt;a href="https://cozystack.ru/docs/v1.5/install/cozystack/kubernetes-distribution/" target="_blank">руководство BYOP (Build Your Own Platform)&lt;/a>.&lt;/p>
&lt;p>На этом шаге мы установим Cozystack поверх
&lt;a href="https://cozystack.ru/docs/v1.5/getting-started/install-kubernetes/" target="_blank">Kubernetes-кластера, подготовленного на предыдущем шаге&lt;/a>.&lt;/p>
&lt;p>Руководство проведёт вас через следующие этапы:&lt;/p>
&lt;ol>
&lt;li>Установка оператора Cozystack&lt;/li>
&lt;li>Подготовка файла конфигурации Cozystack и его применение&lt;/li>
&lt;li>Настройка хранилища&lt;/li>
&lt;li>Настройка сети&lt;/li>
&lt;li>Развёртывание etcd, ingress и стека мониторинга в корневом tenant’е&lt;/li>
&lt;li>Завершение развёртывания и вход в дашборд Cozystack&lt;/li>
&lt;/ol>
&lt;h2 id="1-установка-оператора-cozystack">1. Установка оператора Cozystack&lt;/h2>
&lt;p>Установите оператор Cozystack с помощью Helm chart из OCI-реестра. Оператор управляет всеми компонентами платформы.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>helm upgrade --install cozystack oci://ghcr.io/cozystack/cozystack/cozy-installer &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --version X.Y.Z &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --namespace cozy-system
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Замените &lt;code>X.Y.Z&lt;/code> на нужную версию Cozystack. Доступные версии перечислены на
&lt;a href="https://github.com/cozystack/cozystack/releases" target="_blank">странице релизов Cozystack&lt;/a>.&lt;/p>
&lt;p>Если установка прерывается из-за того, что &lt;code>cozy-system&lt;/code> уже существует:
Helm отказывается забирать себе namespace, который создал не он, и выводит ошибку &lt;code>invalid ownership metadata&lt;/code> (или &lt;code>namespaces&lt;/code> в зависимости от версии Helm), если &lt;code>cozy-system&lt;/code> остался после ранее прерванной установки или был создан вручную для этой цели.&lt;/p>
&lt;p>Если namespace &lt;strong>не&lt;/strong> управляется другим инструментом (Terraform, Argo CD, другим Helm release и т. д.), повторите команду с флагом &lt;code>--take-ownership&lt;/code> (требуется Helm 3.17+), чтобы Helm смог принять его под управление:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>helm upgrade --install cozystack oci://ghcr.io/cozystack/cozystack/cozy-installer &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --version X.Y.Z &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --namespace cozy-system &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --create-namespace &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> --take-ownership
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>[!CAUTION]
Не используйте &lt;code>--take-ownership&lt;/code>, если &lt;code>cozy-system&lt;/code> уже принадлежит другой системе — Helm незаметно станет новым владельцем, а последующие обновления или удаление релиза Cozystack могут изменить или удалить namespace (и всё, что было принято под управление этим флагом) вопреки ожиданиям этой системы.&lt;/p>
&lt;/blockquote>
&lt;h2 id="2-подготовка-и-применение-platform-package">2. Подготовка и применение Platform Package&lt;/h2>
&lt;h3 id="21-подготовьте-файл-конфигурации">2.1. Подготовьте файл конфигурации&lt;/h3>
&lt;p>Теперь, когда оператор запущен, подготовим для него файл конфигурации. Возьмите пример ниже и сохраните его в файл &lt;code>cozystack-platform.yaml&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#062873;font-weight:bold">apiVersion&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>cozystack.io/v1alpha1&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">kind&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>Package&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">metadata&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">name&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>cozystack.cozystack-platform&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">spec&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">variant&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>isp-full&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">components&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">platform&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">values&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">publishing&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">host&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>example.org&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">apiServerEndpoint&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>api.example.org&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">exposedServices&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- dashboard&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- api&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">networking&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">podCIDR&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#40a070">10.244.0.0&lt;/span>/16&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">podGateway&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#40a070">10.244.0.1&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">serviceCIDR&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#40a070">10.96.0.0&lt;/span>/12&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">joinCIDR&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#40a070">100.64.0.0&lt;/span>/16&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Что нужно сделать:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>Замените &lt;code>example.org&lt;/code> в &lt;code>publishing.host&lt;/code> и &lt;code>publishing.apiServerEndpoint&lt;/code> на маршрутизируемое полное доменное имя (FQDN), которым вы управляете. Если у вас есть только публичные IP-адреса, вы можете использовать сервис
&lt;a href="https://nip.io/" target="_blank">nip.io&lt;/a> с dash-нотацией.&lt;/li>
&lt;li>Используйте для &lt;code>networking.*&lt;/code> те же значения, что и на предыдущем шаге, где вы выполняли bootstrap Kubernetes-кластера через Talos. Чтобы узнать эти значения, вы можете проверить конфигурационные файлы Talos или выполнить команды &lt;code>talosctl&lt;/code>. Значения из примера — это разумные значения по умолчанию, которые подходят для большинства случаев.&lt;/li>
&lt;/ol>
&lt;p>В этой конфигурации есть и другие значения, которые в рамках руководства менять не требуется. Тем не менее, вот что они означают:&lt;/p>
&lt;ul>
&lt;li>&lt;code>metadata.name&lt;/code> должен быть равен &lt;code>cozystack.cozystack-platform&lt;/code>, чтобы совпасть с PackageSource, созданным установщиком.&lt;/li>
&lt;li>&lt;code>publishing.host&lt;/code> используется как основной домен для всех сервисов, создаваемых в Cozystack, например дашборда, Grafana и т. д.&lt;/li>
&lt;li>&lt;code>publishing.apiServerEndpoint&lt;/code> — это endpoint Cluster API. Он используется для генерации kubeconfig-файлов для пользователей. Рекомендуется использовать поддомен от &lt;code>publishing.host&lt;/code>.&lt;/li>
&lt;li>&lt;code>spec.variant: isp-full&lt;/code> означает, что используется наиболее полный набор компонентов Cozystack. Подробнее о вариантах см. в
&lt;a href="https://cozystack.ru/docs/v1.5/operations/configuration/variants/" target="_blank">справочнике по вариантам Cozystack&lt;/a>.&lt;/li>
&lt;li>&lt;code>publishing.exposedServices&lt;/code> перечисляет сервисы, которые должны быть доступны пользователям — здесь это дашборд (UI) и API.&lt;/li>
&lt;li>&lt;code>networking.*&lt;/code> — это внутренняя сетевая конфигурация базового Kubernetes-кластера:
&lt;ul>
&lt;li>&lt;code>networking.podCIDR&lt;/code> — диапазон CIDR, из которого Kube-OVN выделяет IP-адреса pod’ам. Он не должен пересекаться ни с одной физической сетью.&lt;/li>
&lt;li>&lt;code>networking.podGateway&lt;/code> — адрес шлюза, который Kube-OVN назначает подсети pod’ов по умолчанию. Используйте адрес &lt;code>.1&lt;/code> сети &lt;code>podCIDR&lt;/code> (например, &lt;code>10.244.0.1&lt;/code> для &lt;code>10.244.0.0/16&lt;/code>).&lt;/li>
&lt;li>&lt;code>networking.serviceCIDR&lt;/code> — диапазон CIDR для сервисов &lt;code>ClusterIP&lt;/code>. Он &lt;strong>обязательно&lt;/strong> должен совпадать со значением &lt;code>cluster.network.serviceSubnets&lt;/code>, которое вы использовали при bootstrap Kubernetes-кластера: это значение вшивается в kube-apiserver и не может быть легко изменено позже.&lt;/li>
&lt;li>&lt;code>networking.joinCIDR&lt;/code> — диапазон CIDR для &lt;code>join&lt;/code> подсети Kube-OVN, внутренней сети, которая переносит трафик между узлами кластера и pod’ами. Значение по умолчанию &lt;code>100.64.0.0/16&lt;/code> входит в общее адресное пространство
&lt;a href="https://datatracker.ietf.org/doc/html/rfc6598" target="_blank">RFC 6598&lt;/a> (&lt;code>100.64.0.0/10&lt;/code>), зарезервированное для такого внутреннего использования. Меняйте его только если оно пересекается с вашей физической сетью. Подробнее см. в
&lt;a href="https://kubeovn.github.io/docs/stable/en/guide/subnet/#join-subnet" target="_blank">справочнике по Kube-OVN join subnet&lt;/a>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>Подробнее об этом файле конфигурации см. в
&lt;a href="https://cozystack.ru/docs/v1.5/operations/configuration/platform-package/" target="_blank">справочнике Platform Package&lt;/a>.&lt;/p>
&lt;p>По умолчанию Cozystack собирает анонимную статистику использования. Подробнее о том, какие данные собираются и как это отключить, см. в
&lt;a href="https://cozystack.ru/docs/v1.5/operations/configuration/telemetry/" target="_blank">документации по телеметрии&lt;/a>.&lt;/p>
&lt;h3 id="22-примените-platform-package">2.2. Примените Platform Package&lt;/h3>
&lt;p>Примените файл конфигурации:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl apply -f cozystack-platform.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Во время установки можно следить за логами оператора:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl logs -n cozy-system -l app.kubernetes.io/name&lt;span style="color:#666">=&lt;/span>cozy-installer -f
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="23-проверьте-статус-установки">2.3. Проверьте статус установки&lt;/h3>
&lt;p>Подождите немного, затем проверьте статус установки:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl get packages.cozystack.io cozystack.cozystack-platform
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Повторяйте проверку, пока во всех строках не появится &lt;code>True&lt;/code>, как в этом примере:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl get cozystack -A
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Пример вывода:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>cozy-cert-manager cert-manager 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-cert-manager cert-manager-issuers 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-cilium cilium 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-cluster-api capi-operator 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-cluster-api capi-providers 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-dashboard dashboard 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-grafana-operator grafana-operator 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-kamaji kamaji 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-kubeovn kubeovn 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-kubevirt-cdi kubevirt-cdi 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-kubevirt-cdi kubevirt-cdi-operator 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-kubevirt kubevirt 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-kubevirt kubevirt-operator 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-linstor linstor 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-linstor piraeus-operator 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-mariadb-operator mariadb-operator 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-metallb metallb 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-monitoring monitoring 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-postgres-operator postgres-operator 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-rabbitmq-operator rabbitmq-operator 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-redis-operator redis-operator 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-telepresence telepresence 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cozy-victoria-metrics-operator victoria-metrics-operator 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>tenant-root tenant-root 4m1s True Release reconciliation succeeded
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Список компонентов в вашей установке может отличаться от приведённого выше, так как он зависит от выбранного варианта и версии Cozystack.
Когда у всех компонентов появится &lt;code>READY: True&lt;/code>, можно переходить к настройке подсистем.&lt;/p>
&lt;h2 id="3-настройка-хранилища">3. Настройка хранилища&lt;/h2>
&lt;p>Kubernetes нужен слой хранилища для предоставления persistent volumes приложениям, но собственного такого механизма у него нет. В качестве подсистемы хранения Cozystack использует
&lt;a href="https://github.com/LINBIT/linstor-server" target="_blank">LINSTOR&lt;/a>.
Далее мы получим доступ к интерфейсу LINSTOR, создадим storage pool’ы и определим storage class’ы.&lt;/p>
&lt;h3 id="31-проверьте-устройства-хранения">3.1. Проверьте устройства хранения&lt;/h3>
&lt;p>Настройте alias для доступа к LINSTOR:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#007020">alias&lt;/span> &lt;span style="color:#bb60d5">linstor&lt;/span>&lt;span style="color:#666">=&lt;/span>&lt;span style="color:#4070a0">&amp;#39;kubectl exec -n cozy-linstor deploy/linstor-controller -- linstor&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Выведите список узлов и проверьте их готовность:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>linstor node list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Выведите список доступных пустых устройств:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>linstor physical-disk list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="32-создайте-storage-poolы">3.2. Создайте storage pool’ы&lt;/h3>
&lt;p>Создайте storage pool’ы на основе ZFS:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>linstor storage-pool create zfs srv1 data data
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>linstor storage-pool create zfs srv2 data data
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>linstor storage-pool create zfs srv3 data data
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>
&lt;a href="https://github.com/LINBIT/linstor-server/issues/463#issuecomment-3401472020" target="_blank">Рекомендуется&lt;/a> установить для ZFS storage pool’ов &lt;code>failmode=continue&lt;/code>, чтобы обработкой отказов диска занимался DRBD, а не ZFS.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl &lt;span style="color:#007020">exec&lt;/span> -ti -n cozy-linstor ds/linstor-satellite.srv1 -- zpool &lt;span style="color:#007020">set&lt;/span> &lt;span style="color:#bb60d5">failmode&lt;/span>&lt;span style="color:#666">=&lt;/span>&lt;span style="color:#007020;font-weight:bold">continue&lt;/span> data
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl &lt;span style="color:#007020">exec&lt;/span> -ti -n cozy-linstor ds/linstor-satellite.srv2 -- zpool &lt;span style="color:#007020">set&lt;/span> &lt;span style="color:#bb60d5">failmode&lt;/span>&lt;span style="color:#666">=&lt;/span>&lt;span style="color:#007020;font-weight:bold">continue&lt;/span> data
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl &lt;span style="color:#007020">exec&lt;/span> -ti -n cozy-linstor ds/linstor-satellite.srv3 -- zpool &lt;span style="color:#007020">set&lt;/span> &lt;span style="color:#bb60d5">failmode&lt;/span>&lt;span style="color:#666">=&lt;/span>&lt;span style="color:#007020;font-weight:bold">continue&lt;/span> data
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Проверьте результат, выведя список storage pool’ов:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>linstor storage-pool list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Пример вывода:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">StoragePool&lt;/th>
&lt;th style="text-align:left">Node&lt;/th>
&lt;th style="text-align:left">Driver&lt;/th>
&lt;th style="text-align:left">PoolName&lt;/th>
&lt;th style="text-align:left">FreeCapacity&lt;/th>
&lt;th style="text-align:left">TotalCapacity&lt;/th>
&lt;th style="text-align:left">CanSnapshots&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">DfltDisklessStorPool&lt;/td>
&lt;td style="text-align:left">srv1&lt;/td>
&lt;td style="text-align:left">DISKLESS&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">False&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">DfltDisklessStorPool&lt;/td>
&lt;td style="text-align:left">srv2&lt;/td>
&lt;td style="text-align:left">DISKLESS&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">False&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">DfltDisklessStorPool&lt;/td>
&lt;td style="text-align:left">srv3&lt;/td>
&lt;td style="text-align:left">DISKLESS&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">False&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">data&lt;/td>
&lt;td style="text-align:left">srv1&lt;/td>
&lt;td style="text-align:left">ZFS&lt;/td>
&lt;td style="text-align:left">data&lt;/td>
&lt;td style="text-align:left">96.41 GiB&lt;/td>
&lt;td style="text-align:left">99.50 GiB&lt;/td>
&lt;td style="text-align:left">True&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">data&lt;/td>
&lt;td style="text-align:left">srv2&lt;/td>
&lt;td style="text-align:left">ZFS&lt;/td>
&lt;td style="text-align:left">data&lt;/td>
&lt;td style="text-align:left">96.41 GiB&lt;/td>
&lt;td style="text-align:left">99.50 GiB&lt;/td>
&lt;td style="text-align:left">True&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">data&lt;/td>
&lt;td style="text-align:left">srv3&lt;/td>
&lt;td style="text-align:left">ZFS&lt;/td>
&lt;td style="text-align:left">data&lt;/td>
&lt;td style="text-align:left">96.41 GiB&lt;/td>
&lt;td style="text-align:left">99.50 GiB&lt;/td>
&lt;td style="text-align:left">True&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="33-создайте-storage-classы">3.3. Создайте storage class’ы&lt;/h3>
&lt;p>Наконец, можно создать несколько storage class’ов, один из которых будет классом по умолчанию.
Создайте файл с описанием storage class’ов. Ниже приведён разумный пример по умолчанию с двумя классами: &lt;code>local&lt;/code> (по умолчанию) и &lt;code>replicated&lt;/code>.&lt;/p>
&lt;p>&lt;code>storageclasses.yaml&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0e84b5;font-weight:bold">---&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">apiVersion&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>storage.k8s.io/v1&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">kind&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>StorageClass&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">metadata&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">name&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>local&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">annotations&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">storageclass.kubernetes.io/is-default-class&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#4070a0">&amp;#34;true&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">provisioner&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>linstor.csi.linbit.com&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">parameters&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">linstor.csi.linbit.com/storagePool&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>data&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">linstor.csi.linbit.com/layerList&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>storage&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">linstor.csi.linbit.com/allowRemoteVolumeAccess&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#4070a0">&amp;#34;true&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">volumeBindingMode&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>WaitForFirstConsumer&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">allowVolumeExpansion&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">true&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#0e84b5;font-weight:bold">---&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">apiVersion&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>storage.k8s.io/v1&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">kind&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>StorageClass&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">metadata&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">name&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>replicated&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">provisioner&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>linstor.csi.linbit.com&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">parameters&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">linstor.csi.linbit.com/storagePool&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>data&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">linstor.csi.linbit.com/autoPlace&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#4070a0">&amp;#34;3&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">linstor.csi.linbit.com/layerList&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>drbd storage&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">linstor.csi.linbit.com/allowRemoteVolumeAccess&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#4070a0">&amp;#34;true&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">property.linstor.csi.linbit.com/DrbdOptions/auto-quorum&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>suspend-io&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">property.linstor.csi.linbit.com/DrbdOptions/Resource/on-no-data-accessible&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>suspend-io&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">property.linstor.csi.linbit.com/DrbdOptions/Resource/on-suspended-primary-outdated&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>force-secondary&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">property.linstor.csi.linbit.com/DrbdOptions/Net/rr-conflict&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>retry-connect&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">volumeBindingMode&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>Immediate&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">allowVolumeExpansion&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">true&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Примените конфигурацию storage class’ов:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl apply -f storageclasses.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Убедитесь, что storage class’ы были успешно созданы:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl get storageclasses
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Пример вывода:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">NAME&lt;/th>
&lt;th style="text-align:left">PROVISIONER&lt;/th>
&lt;th style="text-align:left">RECLAIMPOLICY&lt;/th>
&lt;th style="text-align:left">VOLUMEBINDINGMODE&lt;/th>
&lt;th style="text-align:left">ALLOWVOLUMEEXPANSION&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">local (default)&lt;/td>
&lt;td style="text-align:left">linstor.csi.linbit.com&lt;/td>
&lt;td style="text-align:left">Delete&lt;/td>
&lt;td style="text-align:left">WaitForFirstConsumer&lt;/td>
&lt;td style="text-align:left">true&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">replicated&lt;/td>
&lt;td style="text-align:left">linstor.csi.linbit.com&lt;/td>
&lt;td style="text-align:left">Delete&lt;/td>
&lt;td style="text-align:left">Immediate&lt;/td>
&lt;td style="text-align:left">true&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="4-настройка-сети">4. Настройка сети&lt;/h2>
&lt;p>Далее мы настроим способ доступа к кластеру Cozystack. На этом шаге есть два варианта в зависимости от доступной инфраструктуры:&lt;/p>
&lt;ul>
&lt;li>Для собственного bare metal или self-hosted ВМ выбирайте вариант с MetalLB. MetalLB — это балансировщик нагрузки по умолчанию в Cozystack.&lt;/li>
&lt;li>Для ВМ и выделенных серверов у облачных провайдеров выбирайте настройку через публичные IP.
&lt;a href="https://metallb.universe.tf/installation/clouds/" target="_blank">Большинство облачных провайдеров не поддерживают MetalLB&lt;/a>.&lt;/li>
&lt;/ul>
&lt;p>Загляните в раздел
&lt;a href="https://cozystack.ru/docs/v1.5/install/providers/" target="_blank">provider-specific installation&lt;/a>. Возможно, там уже есть инструкции для вашего провайдера, подходящие для развёртывания production-ready кластера.&lt;/p>
&lt;h3 id="4a-настройка-metallb">4.a Настройка MetalLB&lt;/h3>
&lt;p>В Cozystack используются три типа IP-адресов:&lt;/p>
&lt;ol>
&lt;li>IP-адреса узлов: постоянные и действуют только внутри кластера.&lt;/li>
&lt;li>Виртуальный floating IP: используется для доступа к одному из узлов кластера и также действует только внутри кластера.&lt;/li>
&lt;li>IP-адреса внешнего доступа: используются LoadBalancer’ами для публикации сервисов за пределами кластера.&lt;/li>
&lt;/ol>
&lt;p>Сервисы с внешними IP могут публиковаться в двух режимах: L2 и BGP. Режим L2 проще, но требует, чтобы все узлы находились в одном L2-сегменте. Режим BGP более надёжен и масштабируем, но требует поддержки BGP со стороны сетевого оборудования.&lt;/p>
&lt;p>Выберите диапазон неиспользуемых IP-адресов для сервисов; в примере используется диапазон &lt;code>192.168.100.200-192.168.100.250&lt;/code>. Если вы используете режим L2, эти IP должны либо принадлежать той же сети, что и узлы, либо до них должен быть настроен проброс трафика (маршрутизация).&lt;/p>
&lt;p>Для режима BGP также потребуются IP-адреса BGP peer’ов и локальные и удалённые номера AS. В примере ниже используется &lt;code>192.168.20.254&lt;/code> как IP peer’а и номера AS 65000 и 65001 как локальный и удалённый соответственно.&lt;/p>
&lt;p>Создайте и примените файл с описанием пула адресов &lt;code>metallb-ip-address-pool.yml&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#062873;font-weight:bold">apiVersion&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>metallb.io/v1beta1&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">kind&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>IPAddressPool&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">metadata&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">name&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>cozystack&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">namespace&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>cozy-metallb&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">spec&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">addresses&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#60a0b0;font-style:italic"># используется для публикации сервисов за пределами кластера&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- &lt;span style="color:#40a070">192.168.100.200-192.168.100.250&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">autoAssign&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">true&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">avoidBuggyIPs&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">false&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl apply -f metallb-ip-address-pool.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Создайте и примените ресурсы, необходимые для L2- или BGP-анонса.
L2Advertisement использует имя ресурса IPAddressPool, который мы создали на предыдущем шаге.&lt;/p>
&lt;p>&lt;code>metallb-l2-advertisement.yml&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#062873;font-weight:bold">apiVersion&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>metallb.io/v1beta1&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">kind&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>L2Advertisement&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">metadata&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">name&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>cozystack&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">namespace&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>cozy-metallb&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">spec&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">ipAddressPools&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- cozystack&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Примените изменения:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl apply -f metallb-l2-advertisement.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Теперь, когда MetalLB настроен, включите &lt;code>ingress&lt;/code> в &lt;code>tenant-root&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl patch -n tenant-root tenants.apps.cozystack.io root --type&lt;span style="color:#666">=&lt;/span>merge -p &lt;span style="color:#4070a0">&amp;#39;{&amp;#34;spec&amp;#34;:{&amp;#34;components&amp;#34;:{&amp;#34;ingress&amp;#34;:{&amp;#34;enabled&amp;#34;:true}}}}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Чтобы убедиться, что всё настроено корректно, проверьте HelmRelease’ы &lt;code>ingress&lt;/code> и &lt;code>ingress-nginx-system&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl get hr -n tenant-root
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Пример корректного вывода:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>ingress 47m True Helm upgrade succeeded for release tenant-root/ingress.v3 with...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ingress-nginx-system 47m True Helm upgrade succeeded for release tenant-root/ingress-nginx-s...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Затем проверьте состояние сервиса &lt;code>root-ingress-controller&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl get svc -n tenant-root root-ingress-controller
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Сервис должен быть развёрнут как &lt;code>TYPE: LoadBalancer&lt;/code> и иметь корректный внешний IP:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">NAME&lt;/th>
&lt;th style="text-align:left">TYPE&lt;/th>
&lt;th style="text-align:left">CLUSTER-IP&lt;/th>
&lt;th style="text-align:left">EXTERNAL-IP&lt;/th>
&lt;th style="text-align:left">PORT(S)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">root-ingress-controller&lt;/td>
&lt;td style="text-align:left">LoadBalancer&lt;/td>
&lt;td style="text-align:left">10.96.16.141&lt;/td>
&lt;td style="text-align:left">192.168.100.200&lt;/td>
&lt;td style="text-align:left">80:31632/TCP, 443:30113/TCP&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="4b-настройка-публичных-ip-узлов">4.b. Настройка публичных IP узлов&lt;/h3>
&lt;p>Если ваш облачный провайдер не поддерживает MetalLB, вы можете опубликовать ingress controller через &lt;code>externalIPs&lt;/code> напрямую.
Если публичные IP привязаны непосредственно к узлам, укажите их. Если публичные IP предоставляются облаком как виртуальные (Elastic IP), укажите IP-адреса &lt;strong>внешних&lt;/strong> сетевых интерфейсов.
В примере используются &lt;code>192.168.100.11&lt;/code>, &lt;code>192.168.100.12&lt;/code> и &lt;code>192.168.100.13&lt;/code>.&lt;/p>
&lt;p>Сначала добавьте внешние IP в Platform Package:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl patch packages.cozystack.io cozystack.cozystack-platform --type&lt;span style="color:#666">=&lt;/span>merge -p &lt;span style="color:#4070a0">&amp;#39;{&amp;#34;spec&amp;#34;:{&amp;#34;components&amp;#34;:{&amp;#34;platform&amp;#34;:{&amp;#34;values&amp;#34;:{&amp;#34;publishing&amp;#34;:{&amp;#34;externalIPs&amp;#34;:[&amp;#34;192.168.100.11&amp;#34;,&amp;#34;192.168.100.12&amp;#34;,&amp;#34;192.168.100.13&amp;#34;]}}}}}}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Затем включите &lt;code>ingress&lt;/code> для корневого tenant’а:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl patch -n tenant-root tenants.apps.cozystack.io root --type&lt;span style="color:#666">=&lt;/span>merge -p &lt;span style="color:#4070a0">&amp;#39;{&amp;#34;spec&amp;#34;:{&amp;#34;components&amp;#34;:{&amp;#34;ingress&amp;#34;:{&amp;#34;enabled&amp;#34;:true}}}}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Наконец, добавьте внешние IP-адреса в список &lt;code>externalIPs&lt;/code> в конфигурации Ingress:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl patch -n tenant-root ingresses.apps.cozystack.io ingress --type&lt;span style="color:#666">=&lt;/span>merge -p &lt;span style="color:#4070a0">&amp;#39;{&amp;#34;spec&amp;#34;:{&amp;#34;externalIPs&amp;#34;:[&amp;#34;192.168.100.11&amp;#34;,&amp;#34;192.168.100.12&amp;#34;,&amp;#34;192.168.100.13&amp;#34;]}}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>После этого ваш Ingress будет доступен по указанным IP-адресам. Проверьте это так:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl get svc -n tenant-root root-ingress-controller
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Сервис должен быть развёрнут как &lt;code>TYPE: ClusterIP&lt;/code> и содержать полный список внешних IP:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">NAME&lt;/th>
&lt;th style="text-align:left">TYPE&lt;/th>
&lt;th style="text-align:left">CLUSTER-IP&lt;/th>
&lt;th style="text-align:left">EXTERNAL-IP&lt;/th>
&lt;th style="text-align:left">PORT(S)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">root-ingress-controller&lt;/td>
&lt;td style="text-align:left">ClusterIP&lt;/td>
&lt;td style="text-align:left">10.96.91.83&lt;/td>
&lt;td style="text-align:left">192.168.100.11, 192.168.100.12, 192.168.100.13&lt;/td>
&lt;td style="text-align:left">80/TCP, 443/TCP&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="5-завершение-установки">5. Завершение установки&lt;/h2>
&lt;h3 id="51-настройте-сервисы-корневого-tenantа">5.1. Настройте сервисы корневого tenant’а&lt;/h3>
&lt;p>Включите &lt;code>etcd&lt;/code> и &lt;code>monitoring&lt;/code> для корневого tenant’а:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl patch -n tenant-root tenants.apps.cozystack.io root --type&lt;span style="color:#666">=&lt;/span>merge -p &lt;span style="color:#4070a0">&amp;#39;{&amp;#34;spec&amp;#34;:{&amp;#34;components&amp;#34;:{&amp;#34;monitoring&amp;#34;:{&amp;#34;enabled&amp;#34;:true},&amp;#34;etcd&amp;#34;:{&amp;#34;enabled&amp;#34;:true}}}}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="52-проверьте-состояние-и-состав-кластера">5.2. Проверьте состояние и состав кластера&lt;/h3>
&lt;p>Проверьте созданные persistent volume’ы:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl get pvc -A
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Пример вывода:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">NAME&lt;/th>
&lt;th style="text-align:left">STATUS&lt;/th>
&lt;th style="text-align:left">VOLUME&lt;/th>
&lt;th style="text-align:left">CAPACITY&lt;/th>
&lt;th style="text-align:left">&amp;hellip;&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">data-etcd-0&lt;/td>
&lt;td style="text-align:left">Bound&lt;/td>
&lt;td style="text-align:left">pvc-4cbd29cc-a29f-453d-b412-451647cd04bf&lt;/td>
&lt;td style="text-align:left">10Gi&lt;/td>
&lt;td style="text-align:left">&amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">data-etcd-1&lt;/td>
&lt;td style="text-align:left">Bound&lt;/td>
&lt;td style="text-align:left">pvc-1579f95a-a69d-4a26-bcc2-b15ccdbede0d&lt;/td>
&lt;td style="text-align:left">10Gi&lt;/td>
&lt;td style="text-align:left">&amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">data-etcd-2&lt;/td>
&lt;td style="text-align:left">Bound&lt;/td>
&lt;td style="text-align:left">pvc-907009e5-88bf-4d18-91e7-b56b0dbfb97e&lt;/td>
&lt;td style="text-align:left">10Gi&lt;/td>
&lt;td style="text-align:left">&amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">grafana-db-1&lt;/td>
&lt;td style="text-align:left">Bound&lt;/td>
&lt;td style="text-align:left">pvc-7b3f4e23-228a-46fd-b820-d033ef4679af&lt;/td>
&lt;td style="text-align:left">10Gi&lt;/td>
&lt;td style="text-align:left">&amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">grafana-db-2&lt;/td>
&lt;td style="text-align:left">Bound&lt;/td>
&lt;td style="text-align:left">pvc-ac9b72a4-f40e-47e8-ad24-f50d843b55e4&lt;/td>
&lt;td style="text-align:left">10Gi&lt;/td>
&lt;td style="text-align:left">&amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">vmselect-cachedir-vmselect-longterm-0&lt;/td>
&lt;td style="text-align:left">Bound&lt;/td>
&lt;td style="text-align:left">pvc-622fa398-2104-459f-8744-565eee0a13f1&lt;/td>
&lt;td style="text-align:left">2Gi&lt;/td>
&lt;td style="text-align:left">&amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">vmselect-cachedir-vmselect-longterm-1&lt;/td>
&lt;td style="text-align:left">Bound&lt;/td>
&lt;td style="text-align:left">pvc-fc9349f5-02b2-4e25-8bef-6cbc5cc6d690&lt;/td>
&lt;td style="text-align:left">2Gi&lt;/td>
&lt;td style="text-align:left">&amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">vmselect-cachedir-vmselect-shortterm-0&lt;/td>
&lt;td style="text-align:left">Bound&lt;/td>
&lt;td style="text-align:left">pvc-7acc7ff6-6b9b-4676-bd1f-6867ea7165e2&lt;/td>
&lt;td style="text-align:left">2Gi&lt;/td>
&lt;td style="text-align:left">&amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">vmselect-cachedir-vmselect-shortterm-1&lt;/td>
&lt;td style="text-align:left">Bound&lt;/td>
&lt;td style="text-align:left">pvc-e514f12b-f1f6-40ff-9838-a6bda3580eb7&lt;/td>
&lt;td style="text-align:left">2Gi&lt;/td>
&lt;td style="text-align:left">&amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">vmstorage-db-vmstorage-longterm-0&lt;/td>
&lt;td style="text-align:left">Bound&lt;/td>
&lt;td style="text-align:left">pvc-e8ac7fc3-df0d-4692-aebf-9f66f72f9fef&lt;/td>
&lt;td style="text-align:left">10Gi&lt;/td>
&lt;td style="text-align:left">&amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">vmstorage-db-vmstorage-longterm-1&lt;/td>
&lt;td style="text-align:left">Bound&lt;/td>
&lt;td style="text-align:left">pvc-68b5ceaf-3ed1-4e5a-9568-6b95911c7c3a&lt;/td>
&lt;td style="text-align:left">10Gi&lt;/td>
&lt;td style="text-align:left">&amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">vmstorage-db-vmstorage-shortterm-0&lt;/td>
&lt;td style="text-align:left">Bound&lt;/td>
&lt;td style="text-align:left">pvc-cee3a2a4-5680-4880-bc2a-85c14dba9380&lt;/td>
&lt;td style="text-align:left">10Gi&lt;/td>
&lt;td style="text-align:left">&amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">vmstorage-db-vmstorage-shortterm-1&lt;/td>
&lt;td style="text-align:left">Bound&lt;/td>
&lt;td style="text-align:left">pvc-d55c235d-cada-4c4a-8299-e5fc3f161789&lt;/td>
&lt;td style="text-align:left">10Gi&lt;/td>
&lt;td style="text-align:left">&amp;hellip;&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Убедитесь, что все pod’ы запущены:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl get pod -n tenant-root
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>пример вывода:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">NAME&lt;/th>
&lt;th style="text-align:left">READY&lt;/th>
&lt;th style="text-align:left">STATUS&lt;/th>
&lt;th style="text-align:left">RESTARTS&lt;/th>
&lt;th style="text-align:left">AGE&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">etcd-0&lt;/td>
&lt;td style="text-align:left">1/1&lt;/td>
&lt;td style="text-align:left">Running&lt;/td>
&lt;td style="text-align:left">0&lt;/td>
&lt;td style="text-align:left">2m1s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">etcd-1&lt;/td>
&lt;td style="text-align:left">1/1&lt;/td>
&lt;td style="text-align:left">Running&lt;/td>
&lt;td style="text-align:left">0&lt;/td>
&lt;td style="text-align:left">106s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">etcd-2&lt;/td>
&lt;td style="text-align:left">1/1&lt;/td>
&lt;td style="text-align:left">Running&lt;/td>
&lt;td style="text-align:left">0&lt;/td>
&lt;td style="text-align:left">82s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">grafana-db-1&lt;/td>
&lt;td style="text-align:left">1/1&lt;/td>
&lt;td style="text-align:left">Running&lt;/td>
&lt;td style="text-align:left">0&lt;/td>
&lt;td style="text-align:left">119s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">grafana-db-2&lt;/td>
&lt;td style="text-align:left">1/1&lt;/td>
&lt;td style="text-align:left">Running&lt;/td>
&lt;td style="text-align:left">0&lt;/td>
&lt;td style="text-align:left">13s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">grafana-deployment-74b5656d6-5dcvn&lt;/td>
&lt;td style="text-align:left">1/1&lt;/td>
&lt;td style="text-align:left">Running&lt;/td>
&lt;td style="text-align:left">0&lt;/td>
&lt;td style="text-align:left">90s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">grafana-deployment-74b5656d6-q5589&lt;/td>
&lt;td style="text-align:left">1/1&lt;/td>
&lt;td style="text-align:left">Running&lt;/td>
&lt;td style="text-align:left">1 (105s ago)&lt;/td>
&lt;td style="text-align:left">111s&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Получите публичный IP ingress controller:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl get svc -n tenant-root root-ingress-controller
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Пример вывода:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">NAME&lt;/th>
&lt;th style="text-align:left">TYPE&lt;/th>
&lt;th style="text-align:left">CLUSTER-IP&lt;/th>
&lt;th style="text-align:left">EXTERNAL-IP&lt;/th>
&lt;th style="text-align:left">PORT(S)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">root-ingress-controller&lt;/td>
&lt;td style="text-align:left">LoadBalancer&lt;/td>
&lt;td style="text-align:left">10.96.16.141&lt;/td>
&lt;td style="text-align:left">192.168.100.200&lt;/td>
&lt;td style="text-align:left">80:31632/TCP, 443:30113/TCP&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="53-доступ-к-дашборду-cozystack">5.3 Доступ к дашборду Cozystack&lt;/h3>
&lt;p>Если вы включили &lt;code>dashboard&lt;/code> в список &lt;code>publishing.exposedServices&lt;/code> вашего Platform Package (как показано на шаге 2), дашборд Cozystack уже доступен.
Если в исходной конфигурации его не было, обновите Platform Package:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl patch packages.cozystack.io cozystack.cozystack-platform --type&lt;span style="color:#666">=&lt;/span>json -p &lt;span style="color:#4070a0">&amp;#39;[{&amp;#34;op&amp;#34;:&amp;#34;add&amp;#34;,&amp;#34;path&amp;#34;:&amp;#34;/spec/components/platform/values/publishing/exposedServices/-&amp;#34;,&amp;#34;value&amp;#34;:&amp;#34;dashboard&amp;#34;}]&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Откройте &lt;code>dashboard.example.org&lt;/code>, чтобы перейти в системный дашборд, где &lt;code>example.org&lt;/code> — домен, указанный вами для &lt;code>tenant-root&lt;/code>. Там вы увидите окно входа, ожидающее токен аутентификации.&lt;/p>
&lt;p>Получите токен аутентификации для &lt;code>tenant-root&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl get secret -n tenant-root tenant-root -o go-template&lt;span style="color:#666">=&lt;/span>&lt;span style="color:#4070a0">&amp;#39;{{ printf &amp;#34;%s\n&amp;#34; .data.token | base64decode }}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Войдите с этим токеном. Теперь вы можете пользоваться дашбордом как администратор.
Дальше вы сможете:&lt;/p>
&lt;ul>
&lt;li>Настроить OIDC и использовать его вместо токенов для аутентификации.&lt;/li>
&lt;li>Создавать пользовательские tenant’ы и выдавать пользователям доступ через токены или OIDC.&lt;/li>
&lt;/ul>
&lt;h3 id="54-доступ-к-метрикам-в-grafana">5.4 Доступ к метрикам в Grafana&lt;/h3>
&lt;p>Используйте &lt;code>grafana.example.org&lt;/code> для доступа к системному мониторингу, где &lt;code>example.org&lt;/code> — домен, указанный для &lt;code>tenant-root&lt;/code>. В этом примере &lt;code>grafana.example.org&lt;/code> доступен по адресу 192.168.100.200.&lt;/p>
&lt;p>логин: &lt;code>admin&lt;/code>
получите пароль:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl get secret -n tenant-root grafana-admin-password -o go-template&lt;span style="color:#666">=&lt;/span>&lt;span style="color:#4070a0">&amp;#39;{{ printf &amp;#34;%s\n&amp;#34; .data.password | base64decode }}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="следующий-шаг">Следующий шаг&lt;/h2>
&lt;p>Продолжите руководство по Cozystack и
&lt;a href="https://cozystack.ru/docs/v1.5/getting-started/create-tenant/" target="_blank">создайте пользовательский tenant&lt;/a>.&lt;/p></description></item><item><title>Docs: Создание пользовательского tenant'а</title><link>https://katamarina.ru/docs/cozystack/online_v_1_5/getting-started/create-tenant/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://katamarina.ru/docs/cozystack/online_v_1_5/getting-started/create-tenant/</guid><description>
&lt;h1 id="4-создание-пользовательского-tenantа-и-настройка-доступа">4. Создание пользовательского tenant&amp;rsquo;а и настройка доступа&lt;/h1>
&lt;h2 id="цели">Цели&lt;/h2>
&lt;p>На этом шаге вы создадите пользовательский tenant — пространство, в котором пользователи смогут развёртывать приложения и виртуальные машины. Вы также получите учётные данные tenant’а и войдёте как пользователь с доступом к этому tenant’у.&lt;/p>
&lt;h2 id="предварительные-требования">Предварительные требования&lt;/h2>
&lt;p>Перед началом:&lt;/p>
&lt;ul>
&lt;li>Завершите предыдущие шаги руководства, чтобы получить работающий
&lt;a href="https://cozystack.ru/docs/v1.5/getting-started/install-cozystack/" target="_blank">кластер Cozystack&lt;/a>, в котором уже настроены хранилище, сеть и управляющий дашборд.&lt;/li>
&lt;li>Убедитесь, что у вас есть доступ к дашборду, как описано на
&lt;a href="https://cozystack.ru/docs/v1.5/getting-started/install-cozystack/" target="_blank">предыдущем шаге руководства&lt;/a>.&lt;/li>
&lt;li>Если вы используете OIDC, пользователи и роли уже должны быть настроены. Подробности о работе со встроенным OIDC-сервером см. в
&lt;a href="https://cozystack.ru/docs/v1.5/operations/oidc/" target="_blank">руководстве по OIDC&lt;/a>.&lt;/li>
&lt;/ul>
&lt;p>Во время
&lt;a href="https://cozystack.ru/docs/v1.5/getting-started/install-kubernetes/" target="_blank">установки Kubernetes&lt;/a> для Cozystack вы должны были получить административный файл &lt;code>kubeconfig&lt;/code> для нового кластера. Держите его под рукой — позже он может пригодиться для диагностики. Однако для повседневной работы лучше создать отдельные пользовательские учётные данные.&lt;/p>
&lt;h2 id="введение">Введение&lt;/h2>
&lt;p>Tenant’ы — это механизм изоляции в Cozystack. Они используются для разделения клиентов, команд или окружений. У каждого tenant’а есть собственный набор приложений и один или несколько вложенных Kubernetes-кластеров. Пользователи tenant’а имеют полный доступ к своим кластерам. При необходимости вы можете настроить квоты для каждого tenant’а, чтобы ограничить потребление ресурсов и избежать перерасхода.&lt;/p>
&lt;p>Чтобы узнать о tenant’ах больше, прочитайте руководство
&lt;a href="https://cozystack.ru/docs/v1.5/guides/concepts/#tenant-system" target="_blank">Core Concepts&lt;/a>.&lt;/p>
&lt;h2 id="создание-tenantа">Создание tenant’а&lt;/h2>
&lt;p>Tenant’ы создаются с помощью приложения Cozystack с именем &lt;code>Tenant&lt;/code>. После установки в Cozystack уже существует встроенный tenant &lt;code>tenant-root&lt;/code>. Этот корневой tenant зарезервирован для администраторов платформы и должен использоваться только для создания дочерних tenant’ов. Технически установить приложения в &lt;code>tenant-root&lt;/code> можно, но для production-окружений это &lt;strong>не рекомендуется&lt;/strong>.&lt;/p>
&lt;h3 id="через-дашборд">Через дашборд&lt;/h3>
&lt;ol>
&lt;li>Откройте дашборд от имени пользователя &lt;code>tenant-root&lt;/code>.&lt;/li>
&lt;li>Убедитесь, что текущий контекст установлен в &lt;code>tenant-root&lt;/code>. При необходимости переключите контекст и перезагрузите страницу.&lt;/li>
&lt;li>Перейдите на вкладку &lt;strong>Catalog&lt;/strong>.&lt;/li>
&lt;li>Найдите приложение &lt;strong>Tenant&lt;/strong> и откройте его.&lt;/li>
&lt;li>Ознакомьтесь с документацией, затем нажмите кнопку &lt;strong>Deploy&lt;/strong>, чтобы перейти к странице параметров.&lt;/li>
&lt;li>Заполните поле &lt;code>name&lt;/code> tenant’а. Это единственный параметр, который нельзя изменить позже.&lt;/li>
&lt;li>(Необязательно) Заполните доменное имя в &lt;code>host&lt;/code>. Это доменное имя уже должно существовать. Убедитесь, что пользователь tenant’а имеет достаточный контроль над доменом для настройки DNS-записей. Если оставить поле пустым, по умолчанию будет использован домен &lt;code>&amp;lt;name&amp;gt;.&amp;lt;cozystack-domain&amp;gt;&lt;/code>.&lt;/li>
&lt;li>Отметьте флажки для установки системных приложений: &lt;code>etcd&lt;/code>, &lt;code>monitoring&lt;/code>, &lt;code>ingress&lt;/code> и &lt;code>seaweedfs&lt;/code>. Пользователи tenant’а &lt;strong>не смогут&lt;/strong> устанавливать или удалять эти приложения — это могут делать только администраторы.
Параметр &lt;code>etcd&lt;/code> требуется для вложенного Kubernetes. Выберите его до установки приложения &lt;strong>Kubernetes&lt;/strong> в tenant’е. Отключайте его только если уверены, что tenant не будет использовать вложенный Kubernetes.&lt;/li>
&lt;li>По умолчанию ресурсные квоты не задаются. Это означает отсутствие ограничений на использование ресурсов. При необходимости можно определить квоты, чтобы избежать их перерасхода.&lt;/li>
&lt;li>Нажмите &lt;strong>Deploy&lt;/strong>, чтобы установить приложение tenant’а в корневой tenant.&lt;/li>
&lt;/ol>
&lt;h3 id="через-kubectl">Через kubectl&lt;/h3>
&lt;p>Создайте манифест HelmRelease для tenant’а. В качестве отправной точки можно взять манифест, созданный через дашборд:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#062873;font-weight:bold">apiVersion&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>helm.toolkit.fluxcd.io/v2&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">kind&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>HelmRelease&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">metadata&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">name&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>tenant-team1&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">namespace&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>tenant-root&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">spec&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">chart&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">spec&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">chart&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>tenant&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">reconcileStrategy&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>Revision&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">sourceRef&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">kind&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>HelmRepository&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">name&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>cozystack-apps&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">namespace&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>cozy-public&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">version&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#40a070">1.9.1&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">interval&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>0s&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">values&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">etcd&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">true&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">host&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>team1.example.org&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">ingress&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">true&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">monitoring&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">false&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">resourceQuotas&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>{}&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">seaweedfs&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020;font-weight:bold">false&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Примените манифест:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic"># Используйте kubeconfig корневого tenant&amp;#39;а&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#007020">export&lt;/span> &lt;span style="color:#bb60d5">KUBECONFIG&lt;/span>&lt;span style="color:#666">=&lt;/span>./kubeconfig-tenant-root
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic"># Примените манифест&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl -n tenant-root apply -f hr-tenant-team1.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>&lt;strong>Примечание об изоляции:&lt;/strong>
Сетевые политики Cilium в Cozystack v1.0+ всегда изолируют соседние tenant’ы друг от друга — поля &lt;code>isolated&lt;/code> больше нет ни в форме дашборда, ни в значениях HelmRelease. Pod’ы внутри namespace tenant’а также по умолчанию не могут обращаться к &lt;code>kube-apiserver&lt;/code>, а при создании tenant’а с &lt;code>etcd: true&lt;/code> ещё и к собственному &lt;code>etcd&lt;/code>. Чтобы разрешить pod’у один из этих путей, добавьте ему метку &lt;code>policy.cozystack.io/allow-to-apiserver: &amp;quot;true&amp;quot;&lt;/code> или &lt;code>policy.cozystack.io/allow-to-etcd: &amp;quot;true&amp;quot;&lt;/code> соответственно. Полную таблицу и пример см. в примечаниях к обновлению:
&lt;a href="https://cozystack.ru/docs/v1.5/operations/upgrades/#tenant-isolated-flag-removed" target="_blank">Tenant isolated flag removed&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;p>Вы можете помогать пользователям tenant’ов с установкой баз данных или вложенных Kubernetes-кластеров. Администратор может переключать контекст в дашборде и получать доступ к любому tenant’у. Пользователи tenant’а, в свою очередь, могут работать только со своим tenant’ом и его дочерними tenant’ами.&lt;/p>
&lt;h2 id="получение-kubeconfig-tenantа">Получение kubeconfig tenant’а&lt;/h2>
&lt;p>Пользователям tenant’а нужен файл kubeconfig для доступа к своему Kubernetes-кластеру. Способ его получения зависит от того, включён ли OIDC в вашей установке Cozystack.&lt;/p>
&lt;h2 id="если-oidc-включён">Если OIDC включён&lt;/h2>
&lt;p>Вы можете получить kubeconfig напрямую из дашборда, как описано в
&lt;a href="https://cozystack.ru/docs/v1.5/operations/oidc/enable_oidc/#step-4-retrieve-kubeconfig" target="_blank">руководстве по OIDC&lt;/a>.&lt;/p>
&lt;h2 id="если-oidc-выключен">Если OIDC выключен&lt;/h2>
&lt;p>В этом случае администратору нужно получить токен service account из namespace tenant’а. Секрет с токеном имеет то же имя, что и tenant.&lt;/p>
&lt;p>Чтобы получить токен для tenant’а с именем &lt;code>team1&lt;/code>, выполните:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl -n tenant-team1 get secret tenant-team1 -o json | jq -r &lt;span style="color:#4070a0">&amp;#39;.data.token | @base64d&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Затем подставьте этот токен в шаблон kubeconfig и сохраните файл под именем &lt;code>kubeconfig-tenant-&amp;lt;name&amp;gt;.yaml&lt;/code>.&lt;/p>
&lt;p>Обязательно задайте namespace по умолчанию равным имени tenant’а. Многие GUI-клиенты будут показывать ошибки доступа, если namespace не указан явно.&lt;/p>
&lt;p>Тот же токен можно использовать и для входа пользователя tenant’а в дашборд Cozystack, если OIDC отключён.&lt;/p>
&lt;h2 id="получение-kubeconfig-вложенного-kubernetes">Получение kubeconfig вложенного Kubernetes&lt;/h2>
&lt;p>Как правило, администраторам &lt;strong>не нужно&lt;/strong> получать kubeconfig для вложенных Kubernetes-кластеров. Такие кластеры устанавливаются самим пользователем tenant’а внутри его namespace. Пользователи tenant’а полностью контролируют свои вложенные Kubernetes-окружения.&lt;/p>
&lt;p>Чтобы получить доступ к вложенному Kubernetes-кластеру, пользователь tenant’а может скачать kubeconfig прямо со страницы соответствующего приложения в дашборде.&lt;/p></description></item><item><title>Docs: Требования</title><link>https://katamarina.ru/docs/cozystack/online_v_1_5/getting-started/requirements/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://katamarina.ru/docs/cozystack/online_v_1_5/getting-started/requirements/</guid><description>
&lt;h1 id="требования-и-набор-инструментов">Требования и набор инструментов&lt;/h1>
&lt;h2 id="набор-инструментов">Набор инструментов&lt;/h2>
&lt;p>На вашей рабочей станции должны быть установлены следующие инструменты:&lt;/p>
&lt;ul>
&lt;li>
&lt;a href="https://www.talos.dev/v1.13/talos-guides/install/talosctl/" target="_blank">talosctl&lt;/a>, клиент командной строки для Talos Linux (используйте серию v1.13.x, соответствующую Cozystack 1.5.0).&lt;/li>
&lt;li>
&lt;a href="https://kubernetes.io/docs/tasks/tools/#kubectl" target="_blank">kubectl&lt;/a>, клиент командной строки для Kubernetes.&lt;/li>
&lt;li>
&lt;a href="https://github.com/cozystack/talm?tab=readme-ov-file#installation" target="_blank">Talm&lt;/a>, собственный менеджер конфигурации Talos Linux от Cozystack:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -sSL https://github.com/cozystack/talm/raw/refs/heads/main/hack/install.sh | sh -s
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="требования-к-оборудованию">Требования к оборудованию&lt;/h2>
&lt;p>Для прохождения этого руководства вам потребуется следующая конфигурация:&lt;/p>
&lt;p>&lt;strong>Узлы кластера:&lt;/strong> три bare-metal сервера или виртуальные машины. Требования к оборудованию зависят от вашего сценария использования:&lt;/p>
&lt;h3 id="минимальная">Минимальная&lt;/h3>
&lt;p>Ниже приведены базовые требования для запуска небольшой инсталляции. Минимальная рекомендуемая конфигурация для каждого узла:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Компонент&lt;/th>
&lt;th>Требование&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Хосты&lt;/td>
&lt;td>3x физических хоста (или ВМ с host CPU passthrough)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Architecture&lt;/td>
&lt;td>x86_64&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CPU&lt;/td>
&lt;td>8 ядер&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RAM&lt;/td>
&lt;td>24 ГБ&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Основной диск&lt;/td>
&lt;td>50 ГБ SSD (или RAW для ВМ)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Дополнительный диск&lt;/td>
&lt;td>256 ГБ SSD (raw)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Подходит для:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Dev/Test-сред&lt;/li>
&lt;li>Небольших демонстрационных конфигураций&lt;/li>
&lt;li>1-2 tenants&lt;/li>
&lt;li>До 3 кластеров Kubernetes&lt;/li>
&lt;li>Небольшого числа ВМ или баз данных&lt;/li>
&lt;/ul>
&lt;h3 id="рекомендуемая">Рекомендуемая&lt;/h3>
&lt;p>Для небольших production-сред рекомендуемая конфигурация каждого узла выглядит так:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Компонент&lt;/th>
&lt;th>Требование&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Хосты&lt;/td>
&lt;td>3x физических хоста&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Architecture&lt;/td>
&lt;td>x86_64&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CPU&lt;/td>
&lt;td>16-32 ядра&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RAM&lt;/td>
&lt;td>64 ГБ&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Основной диск&lt;/td>
&lt;td>100 ГБ SSD или NVMe&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Дополнительный диск&lt;/td>
&lt;td>1-2 ТБ SSD или NVMe&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Подходит для:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Небольших и средних production-сред&lt;/li>
&lt;li>5-10 tenants&lt;/li>
&lt;li>5+ кластеров Kubernetes&lt;/li>
&lt;li>Десятков виртуальных машин или баз данных&lt;/li>
&lt;li>S3-совместимого хранилища&lt;/li>
&lt;/ul>
&lt;h3 id="оптимальная">Оптимальная&lt;/h3>
&lt;p>Для средних и крупных production-сред оптимальная конфигурация каждого узла выглядит так:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Компонент&lt;/th>
&lt;th>Требование&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Хосты&lt;/td>
&lt;td>6x+ физических хостов&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Architecture&lt;/td>
&lt;td>x86_64&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CPU&lt;/td>
&lt;td>32-64 ядра&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RAM&lt;/td>
&lt;td>128-256 ГБ&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Основной диск&lt;/td>
&lt;td>200 ГБ SSD или NVMe&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Дополнительный диск&lt;/td>
&lt;td>4-10 ТБ NVMe&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Подходит для:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Крупных production-сред&lt;/li>
&lt;li>20+ tenants&lt;/li>
&lt;li>Десятков кластеров Kubernetes&lt;/li>
&lt;li>Сотен виртуальных машин и баз данных&lt;/li>
&lt;li>S3-совместимого хранилища&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Хранилище:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Основной диск&lt;/strong>: используется для Talos Linux, хранилища etcd и загруженных образов. Требуется низкая задержка.&lt;/li>
&lt;li>&lt;strong>Дополнительный диск&lt;/strong>: используется для данных пользовательских приложений (ZFS pool).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>ОС:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Любой дистрибутив Linux, например Ubuntu.&lt;/li>
&lt;li>Есть и
&lt;a href="https://cozystack.ru/docs/v1.5/install/talos/" target="_blank">другие способы установки&lt;/a>, для которых на старте требуется либо любой Linux, либо вообще не требуется установленная ОС.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>BIOS/UEFI Settings:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Secure Boot.&lt;/strong>
Talos Linux ships pre-signed kernel modules and works with Secure Boot enabled. On non-Talos Ubuntu hosts, the default piraeus-operator flow compiles DRBD in-cluster; the resulting unsigned modules are rejected by kernel lockdown when Secure Boot is enforced. The simplest path is to disable Secure Boot in BIOS/UEFI; alternatively, follow
&lt;a href="https://cozystack.ru/docs/v1.5/install/kubernetes/ubuntu-secure-boot/" target="_blank">Ubuntu + Secure Boot&lt;/a> to pre-install dkms-signed DRBD on the host.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Сеть:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Маршрутизируемый домен с FQDN. Если его нет, можно использовать
&lt;a href="https://nip.io/" target="_blank">nip.io&lt;/a> с dash-нотацией.&lt;/li>
&lt;li>Узлы должны находиться в одном L2-сегменте сети.&lt;/li>
&lt;li>Anti-spoofing должен быть отключён. Это необходимо для MetalLB — балансировщика нагрузки, используемого в Cozystack.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Виртуальные машины:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>В настройках гипервизора должен быть включён CPU passthrough, а модель CPU должна быть установлена в &lt;code>host&lt;/code>.&lt;/li>
&lt;li>Должна быть включена nested virtualization. Это требуется для виртуальных машин и Kubernetes-кластеров tenant’ов.&lt;/li>
&lt;/ul>
&lt;p>Более подробное описание требований к оборудованию для разных сценариев см. в разделе
&lt;a href="https://cozystack.ru/docs/v1.5/install/hardware-requirements/" target="_blank">Требования к оборудованию&lt;/a>&lt;/p></description></item></channel></rss>