You are viewing documentation for Cozystack v1.2. For the latest version, see the v1.4 documentation.
Инициализация кластера в изолированной среде
Введение
В этом руководстве описаны шаги для инициализации кластера Cozystack в изолированной среде.
Установка в air-gapped среде означает, что кластер не имеет прямого доступа к Интернету. Все необходимые ресурсы, такие как образы и metadata, должны быть доступны в частной сети.
Настройка узлов Talos
Для установки с Talm достаточно один раз внести все указанные изменения в ./templates/_helpers.tpl, а затем собрать фактические конфигурационные файлы узлов с помощью talm template.
Для установки с talosctl изменения нужно внести в patch.yaml и patch-controlplane.yaml.
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-кластера, используя тот же формат, что и в примерах выше.
patch-containerd, и secret для отдельного кластера, глобальный secret имеет приоритет, а per-cluster secret игнорируется. Чтобы использовать конфигурацию для отдельного кластера, убедитесь, что глобального secret patch-containerd в namespace cozy-system нет.Подробнее о значениях конфигурации registry см. в руководстве по настройке CRI Plugin