You are viewing documentation for Cozystack v1.2. For the latest version, see the v1.4 documentation.

Инициализация кластера в изолированной среде

Инициализация кластера Cozystack в изолированной (air-gapped) среде с mirror’ами container registry.

Введение

В этом руководстве описаны шаги для инициализации кластера Cozystack в изолированной среде.

Установка в air-gapped среде означает, что кластер не имеет прямого доступа к Интернету. Все необходимые ресурсы, такие как образы и metadata, должны быть доступны в частной сети.

Настройка узлов Talos

1. Настройка NTP-серверов

Точная синхронизация времени критически важна для кластера. В конфигурации Talos machine укажите локальные NTP-серверы, доступные внутри вашей частной сети:

machine:
  time:
    servers:
      # example values
      - 192.168.0.4
      - 10.10.0.5

Убедитесь, что эти NTP-серверы доступны с первого узла Talos.

2. Настройка mirror’ов Container Registry

Поскольку кластер не может обращаться к публичным container registries, он должен использовать их локальные mirror’ы. Создание таких mirror’ов выходит за рамки этого руководства.

Обновите конфигурацию machine следующим образом, указав IP-адреса и порты локальных mirror’ов для каждого registry:

machine:
  registries:
    mirrors:
      docker.io:
        endpoints:
          - http://10.0.0.1:8082
      ghcr.io:
        endpoints:
          - http://10.0.0.1:8083
      gcr.io:
        endpoints:
          - http://10.0.0.1:8084
      registry.k8s.io:
        endpoints:
          - http://10.0.0.1:8085
      quay.io:
        endpoints:
          - http://10.0.0.1:8086
      cr.fluentbit.io:
        endpoints:
          - http://10.0.0.1:8087
      docker-registry3.mariadb.com:
        endpoints:
          - http://10.0.0.1:8088
    config:
      "10.0.0.1:8082":
        tls:
          insecureSkipVerify: true
        auth:
          username: myuser
          password: mypass

Значения config.[0].auth.* приведены как пример; используйте реальные учетные данные. Убедитесь, что ваши локальные registry proxies mirror’ят все необходимые образы для компонентов Talos и Kubernetes.

3. Добавление CA-сертификата

Чтобы использовать частный Certificate Authority, добавьте его сертификат на узлы.

# talm: nodes=["10.10.10.10"], endpoints=["10.10.10.10"], templates=["templates/controlplane.yaml"]
# THIS FILE IS AUTOGENERATED. PREFER TEMPLATE EDITS OVER MANUAL ONES.
machine:
# ...
# ...
  discovery:
    enabled: false
  etcd:
    advertisedSubnets:
      - 10.4.100.10/24
  allowSchedulingOnControlPlanes: true
---
apiVersion: v1alpha1
kind: TrustedRootsConfig
name: my-enterprise-ca
certificates: |
  -----BEGIN CERTIFICATE-----
  ...
  -----END CERTIFICATE-----

4. Применение изменений

После внесения описанных выше изменений можно применить конфигурацию и инициализировать кластер:

Использование Talm

Пересоберите конфигурационные файлы узлов и примените их к каждому узлу:

talm template -e <ip> -n <ip> -t templates/controlplane.yaml -i > nodes/node1.yaml
talm apply -f nodes/node1.yaml
# повторите для каждого узла

Затем инициализируйте кластер обычным способом:

talm bootstrap -f nodes/node1.yaml

Подробнее см. в руководстве по настройке Talm.

Использование talosctl

Примените конфигурацию к каждому узлу:

talosctl apply -f controlplane.yaml -n <ip> -e <ip> -i

Затем инициализируйте кластер с помощью одного из узлов:

talosctl bootstrap -n <ip> -e <ip>

Подробнее см. в руководстве по настройке talosctl.

5. Настройка mirror’ов Container Registry для Tenant Kubernetes

Tenant-кластеры Kubernetes в Cozystack используют Kamaji для control plane. Компоненты control plane работают как pods на узлах management-кластера, поэтому они автоматически используют registry mirrors, настроенные для Talos на шаге 2.

Однако tenant worker nodes работают как отдельные виртуальные машины со своим экземпляром containerd. Для этих worker-узлов нужна отдельная конфигурация registry mirror.

Чтобы выполнить эту настройку, сначала нужно развернуть кластер Cozystack версии v0.32.0 или новее (или обновить существующий кластер до этой версии). Проверьте текущую версию кластера командой:

kubectl get deploy -n cozy-system cozystack -oyaml | grep installer

Вариант A: настройка через platform package

Platform package может автоматически сгенерировать secret patch-containerd из раздела registries в platform values.

Добавьте раздел registries в cozystack-platform.yaml:

apiVersion: cozystack.io/v1alpha1
kind: Package
metadata:
  name: cozystack.cozystack-platform
spec:
  variant: isp-full
  components:
    platform:
      values:
        # ... существующие publishing, networking и т. д. ...
        registries:
          mirrors:
            docker.io:
              endpoints:
                - http://10.0.0.1:8082
            ghcr.io:
              endpoints:
                - http://10.0.0.1:8083
            gcr.io:
              endpoints:
                - http://10.0.0.1:8084
            registry.k8s.io:
              endpoints:
                - http://10.0.0.1:8085
            quay.io:
              endpoints:
                - http://10.0.0.1:8086
            cr.fluentbit.io:
              endpoints:
                - http://10.0.0.1:8087
            docker-registry3.mariadb.com:
              endpoints:
                - http://10.0.0.1:8088
          config:
            "10.0.0.1:8082":
              tls:
                insecureSkipVerify: true
              auth:
                username: myuser
                password: mypass

Затем примените его:

kubectl apply -f cozystack-platform.yaml

Это создаст secret patch-containerd в namespace cozy-system, который автоматически копируется в каждый tenant-кластер Kubernetes.

Альтернативно: применить patch к существующему platform package

Если platform package уже развернут, можно добавить registry mirrors с помощью patch:

kubectl patch packages.cozystack.io cozystack.cozystack-platform --type=merge -p '{
  "spec": {
    "components": {
      "platform": {
        "values": {
          "registries": {
            "mirrors": {
              "docker.io": {
                "endpoints": ["http://10.0.0.1:8082"]
              },
              "ghcr.io": {
                "endpoints": ["http://10.0.0.1:8083"]
              },
              "gcr.io": {
                "endpoints": ["http://10.0.0.1:8084"]
              },
              "registry.k8s.io": {
                "endpoints": ["http://10.0.0.1:8085"]
              },
              "quay.io": {
                "endpoints": ["http://10.0.0.1:8086"]
              },
              "cr.fluentbit.io": {
                "endpoints": ["http://10.0.0.1:8087"]
              },
              "docker-registry3.mariadb.com": {
                "endpoints": ["http://10.0.0.1:8088"]
              }
            },
            "config": {
              "10.0.0.1:8082": {
                "tls": {
                  "insecureSkipVerify": true
                },
                "auth": {
                  "username": "myuser",
                  "password": "mypass"
                }
              }
            }
          }
        }
      }
    }
  }
}'

Вариант B: создание secret вручную

Также можно напрямую создать Kubernetes Secret с именем patch-containerd:

apiVersion: v1
kind: Secret
metadata:
  name: patch-containerd
  namespace: cozy-system
type: Opaque
stringData:
  docker.io.toml: |
    server = "https://registry-1.docker.io"
    [host."http://10.0.0.1:8082"]
      capabilities = ["pull", "resolve"]
      skip_verify = true
  ghcr.io.toml: |
    server = "https://ghcr.io"
    [host."http://10.0.0.1:8083"]
      capabilities = ["pull", "resolve"]
      skip_verify = true
  gcr.io.toml: |
    server = "https://gcr.io"
    [host."http://10.0.0.1:8084"]
      capabilities = ["pull", "resolve"]
      skip_verify = true
  registry.k8s.io.toml: |
    server = "https://registry.k8s.io"
    [host."http://10.0.0.1:8085"]
      capabilities = ["pull", "resolve"]
      skip_verify = true
  quay.io.toml: |
    server = "https://quay.io"
    [host."http://10.0.0.1:8086"]
      capabilities = ["pull", "resolve"]
      skip_verify = true
  cr.fluentbit.io.toml: |
    server = "https://cr.fluentbit.io"
    [host."http://10.0.0.1:8087"]
      capabilities = ["pull", "resolve"]
      skip_verify = true
  docker-registry3.mariadb.com.toml: |
    server = "https://docker-registry3.mariadb.com"
    [host."http://10.0.0.1:8088"]
      capabilities = ["pull", "resolve"]
      skip_verify = true

Если registry mirrors требуют аутентификации, добавьте пользовательский header Authorization с учетными данными в Base64:

server = "https://registry-1.docker.io"
[host."http://10.0.0.1:8082"]
  capabilities = ["pull", "resolve"]
  skip_verify = true
  [host."http://10.0.0.1:8082".header]
    Authorization = "Basic bXl1c2VyOm15cGFzcw=="

Чтобы сгенерировать значение в Base64, выполните:

echo -n 'myuser:mypass' | base64

Для динамической или token-based аутентификации (например, Docker Hub) используйте Kubernetes image pull secrets вместо учетных данных в открытом виде.

Как это работает

Secret patch-containerd из namespace cozy-system автоматически копируется в namespace каждого tenant-кластера Kubernetes во время развертывания. Данные secret монтируются в worker node VM как конфигурационные файлы registry для containerd в /etc/containerd/certs.d/<registry>/hosts.toml.

Конфигурация для отдельного кластера

Можно настроить registry mirrors для конкретного tenant-кластера Kubernetes вместо использования глобального secret patch-containerd:

  • Tenant-кластер должен быть развернут с Kubernetes package версии 0.23.1 или новее, которая доступна начиная с Cozystack 0.32.1.
  • Перед развертыванием tenant-кластера создайте Kubernetes Secret с именем kubernetes-<cluster-name>-patch-containerd в namespace tenant-кластера, используя тот же формат, что и в примерах выше.

Подробнее о значениях конфигурации registry см. в руководстве по настройке CRI Plugin

Last modified 2026-04-22: DOCS: update gs and install (8b18a96)