Разворачивание и настройка корневой и кэширующей инфраструктуры alt-orchestra c помощью RPM-пакета image-factory: различия между версиями

Материал из ALT Linux Wiki
Строка 176: Строка 176:


Скопируйте файл описания сервиса <tt>docker-registry</tt> в файл описания сервиса <tt>docker-cache-registry</tt>:
Скопируйте файл описания сервиса <tt>docker-registry</tt> в файл описания сервиса <tt>docker-cache-registry</tt>:
<pre>
<syntaxhighlight lang="bash">
cp /lib/systemd/system/docker-registry.service /lib/systemd/system/docker-cache-registry.service
# cp /lib/systemd/system/docker-registry.service /lib/systemd/system/docker-cache-registry.service
</pre>
</syntaxhighlight>


Удалите инициализацию переменной <tt>REGISTRY_PROXY_REMOTEURL</tt> и измените описание файла конфигурации на <tt>/etc/docker-registry/cache-config.yml</tt>:
Удалите инициализацию переменной <tt>REGISTRY_PROXY_REMOTEURL</tt> и измените описание файла конфигурации на <tt>/etc/docker-registry/cache-config.yml</tt>:
Строка 194: Строка 194:


Скопируйте файл конфигурации сервиса:
Скопируйте файл конфигурации сервиса:
<pre>
<syntaxhighlight lang="bash">
cp /etc/docker-registry/config.yml /etc/docker-registry/cache-config.yml
# cp /etc/docker-registry/config.yml /etc/docker-registry/cache-config.yml
</pre>
</syntaxhighlight>
и подправьте его, указав порт <tt>5001</tt>:
и подправьте его, указав порт <tt>5001</tt>:
<pre>
<pre>
Строка 215: Строка 215:


Запустите новый сервис <tt>docker-cache-registry.service</tt>:
Запустите новый сервис <tt>docker-cache-registry.service</tt>:
<pre>
<syntaxhighlight lang="bash">
# systemctl daemon-reload
# systemctl daemon-reload
# systemctl enable --now docker-cache-registry.service
# systemctl enable --now docker-cache-registry.service
</pre>
</syntaxhighlight>
Проверьте  работу сервисов:
Проверьте  работу служб:
<pre>
<syntaxhighlight lang="bash">
netstat -nlpt | grep 500[01]
$ netstat -nlpt | grep 500[01]
tcp        0      0 :::5000                    :::*                        LISTEN      23898/docker-regist  
tcp        0      0 :::5000                    :::*                        LISTEN      23898/docker-regist  
tcp        0      0 :::5001                    :::*                        LISTEN      24543/docker-regist
tcp        0      0 :::5001                    :::*                        LISTEN      24543/docker-regist
</pre>
</syntaxhighlight>


=== Разворачивание и настройка image-factory ===
=== Разворачивание и настройка image-factory ===

Версия от 18:14, 20 мая 2025

RPM-пакет image-factory включает в себя:

  • сервис веб-интерфейса image-factory, состоящий из:
  1. бинарная команда интерфейса /usr/bin/image-factory;
  2. конфигурационный файл /etc/sysconfig/image-factory, позволяющий сконфигурировать режим запуска команды;
  3. shell-скрипт /usr/bin/image-factory.sh, конфигурирующий параметры и запускающий команду /usr/bin/image-factory;
  4. systemd-unit /usr/lib/systemd/system/image-factory.service.

На текущий момент версия image-factory для платформы alt-orchestra отличается от upstream-версии 0.6.8 от siderolabs следующим:

  • префиксы образов installer-base, imager, extensions, overlays заменены с siderolabs на alt-orchestra;
  • не поддерживается сборка образов на платформе arm64;
  • произведена локализация и наряду с английским поддерживается русскоязычный интерфейс.

Так как префиксы образов вшиты в код и не конфигурируются, данная версия image-factory поддерживает только инфраструктуру alt-orchestra и не применима к инфраструктуре siderolabs.

Пакет image-factory поддерживает разворачивание как корневой (https://altlinux.space/alt-orchestra), так и кэширующей инфраструктуры у клиентов. Разворачивание кэширующей инфраструктуры у клиентов позволяет существенно уменьшить время разворачивания alt-orchestra-кластера, так как необходимые артефакты (ISO/RAW/QCOW[2]-образы, ядра, образы файловых систем, ...) генерируются на серверах клиентов и доступны в рамках их локальных сетей.

Разворачивание кэширующей инфраструктуры у клиентов

Для оптимизации трафика при развертывании alt-orchestra кластера в локальной сети клиента необходимо на административном сервере клиента поднять на стороне клиента следующие сервисы:

  • image-factory для генерации типов разворачиваний и артефактов;
  • кэширующий docker-регистратор для кэширования генерируемых по запросам клиента артефактов на основе alt-orchestra docker-образов imager, base-installer, extensions, ...;
  • proxy docker-регистратор для кэширования docker-образов kubernetos с сайта registry.altlinux.org.
Client scheme.png

В данной схеме каждый образ docker-регистраторов altlinux.space, registry.altlinux.org скачивается однократно.

Образы altlinux.space кэшируются непосредственно в файловой системе административного сервера клиента. На их основе в дальнейшем image-factory сервер генерирует:

  • схемы разворачивания кластера (schematics);
  • генерируемые по запросам клиента артефакты.

Образы данных артефактов размещаются в кэширующем docker-регистраторе административного сервера клиента. Откуда затем передаются клиентам локальной сети клиента при разворачивании alt-orchestra.

При разворачивании каждого узла alt-orchestra клиента в команде talosctl указывается proxy docker-регистратор административного сервера клиента. При первом разворачивании они скачиваются с docker-регистратора registry.altlinux.org и кэшируются в proxy docker-регистраторе. При разворачивании последующих узлов они в рамках локальной сети клиента скачиваются из proxy docker-регистратора административного сервера клиента.

Разворачивание и настройка proxy-сервера регистратора docker-образов kubernetes

Установите RPM-пакеты docker-registry, net-tools, curl, jq:

# apt-get install -y docker-registry net-tools curl jq

Настройка файла /etc/containers/registries.conf

Добавьте в описание unqualified-search-registries домен registry.altlinux.org:

unqualified-search-registries = ["registry.altlinux.org", ...]

Опишите регистратор образов kubernetes:

[[registry]]
prefix = "registry.altlinux.org/k8s-sisyphus"
location = "registry.altlinux.org/k8s-sisyphus"

Опишите proxy docker-регистратор:

[[registry.mirror]]
location = "localhost:5000/mirror-0.local/k8s-sisyphus"
insecure = true

Настройка сервиса docker-регистратора

Добавьте в секцию Service файла /lib/systemd/system/docker-registry.service описание переменной REGISTRY_PROXY_REMOTEURL:

[Unit]
Description=Docker Registry 2.0 implementation for storing and distributing Docker images
After=network.target

[Service]
Environment="REGISTRY_PROXY_REMOTEURL=https://registry.altlinux.org"
ExecStart=/usr/bin/docker-registry serve /etc/docker-registry/config.yml

[Install]
WantedBy=multi-user.target

Убедитесь, что в файле конфигурации /etc/docker-registry/config.yml указан порт 5000:

version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/docker-registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]

Перезагрузите сервисы и запустите сервис docker-registry:

# systemctl daemon-reload
# systemctl enable --now docker-registry.service

Проверьте работу сервиса:

# systemctl  status docker-registry
● docker-registry.service - Docker Registry 2.0 implementation for storing and distributing Docker images
     Loaded: loaded (/usr/lib/systemd/system/docker-registry.service; enabled; preset: disabled)
     Active: active (running) since Mon 2025-04-21 06:18:09 UTC; 3h 37min ago
   Main PID: 23898 (docker-registry)
      Tasks: 8 (limit: 9471)
     Memory: 111.8M (peak: 120.6M)
        CPU: 1.738s
     CGroup: /system.slice/docker-registry.service
             └─23898 /usr/bin/docker-registry serve /etc/docker-registry/config.yml

апр 21 06:51:29 image-factory docker-registry[23898]: 127.0.0.1 - - [21/Apr/2025:06:51:29 +0000] "GET /v2/ HTTP/1.1" 200 2 "" "containers/5.34.0 (github.com>
апр 21 06:51:29 image-factory docker-registry[23898]: time="2025-04-21T06:51:29.664009384Z" level=info msg="Challenge established with upstream : {https   r>
апр 21 06:51:29 image-factory docker-registry[23898]: time="2025-04-21T06:51:29.676328039Z" level=info msg="response completed" go.version=go1.22.3 http.req>
апр 21 06:51:29 image-factory docker-registry[23898]: 127.0.0.1 - - [21/Apr/2025:06:51:29 +0000] "GET /v2/k8s-sisyphus/kube-apiserver/manifests/latest HTTP/>
апр 21 06:51:29 image-factory docker-registry[23898]: time="2025-04-21T06:51:29.679041754Z" level=info msg="response completed" go.version=go1.22.3 http.req>
апр 21 06:51:29 image-factory docker-registry[23898]: 127.0.0.1 - - [21/Apr/2025:06:51:29 +0000] "GET /v2/k8s-sisyphus/kube-apiserver/manifests/sha256:47201>
апр 21 06:51:29 image-factory docker-registry[23898]: time="2025-04-21T06:51:29.682127544Z" level=info msg="response completed" go.version=go1.22.3 http.req>
апр 21 06:51:29 image-factory docker-registry[23898]: 127.0.0.1 - - [21/Apr/2025:06:51:29 +0000] "GET /v2/k8s-sisyphus/kube-apiserver/blobs/sha256:72b188bab>
апр 21 07:02:18 image-factory docker-registry[23898]: time="2025-04-21T07:02:18.767521547Z" level=info msg="response completed" go.version=go1.22.3 http.req>
апр 21 07:02:18 image-factory docker-registry[23898]: ::1 - - [21/Apr/2025:07:02:18 +0000] "GET /v2?_catalog HTTP/1.1" 301 48 "" "curl/8.12.0"
$ netstat -nlpt | grep 5000
tcp        0      0 :::5000                     :::*                        LISTEN      23898/docker-regist

Скачайте пробный образ:

$ podman pull --tls-verify=false registry.altlinux.org/k8s-sisyphus/kube-apiserver

Проверьте наличие образа в кэше:

$ curl http://localhost:5000/v2/_catalog | jq .
{
  "repositories": [
    ...
    "k8s-sisyphus/kube-apiserver",
    ...
  ]
}

и его теги:

$ curl http://localhost:5000/v2/k8s-sisyphus/kube-apiserver/tags/list | jq .

Настройка talosctl

Для того чтобы при развертывании кластера узлы использовали proxy-сервер для домена registry.altlinux.org, при вызове talosctl необходимо указать patch YAML-файл:

machine:
  registries:
    mirrors:
      registry.altlinux.org:
        endpoints:
          - http://<IP-административного-сервера>:5000

Разворачивание и настройка docker-регистатора кэш образов alt-orchestra

Скопируйте файл описания сервиса docker-registry в файл описания сервиса docker-cache-registry:

# cp /lib/systemd/system/docker-registry.service /lib/systemd/system/docker-cache-registry.service

Удалите инициализацию переменной REGISTRY_PROXY_REMOTEURL и измените описание файла конфигурации на /etc/docker-registry/cache-config.yml:

[Unit]
Description=Docker Registry 2.0 implementation for storing and distributing Docker images
After=network.target

[Service]
ExecStart=/usr/bin/docker-registry serve /etc/docker-registry/cache-config.yml

[Install]
WantedBy=multi-user.target

Скопируйте файл конфигурации сервиса:

# cp /etc/docker-registry/config.yml /etc/docker-registry/cache-config.yml

и подправьте его, указав порт 5001:

version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/docker-registry
http:
  addr: :5001
  headers:
    X-Content-Type-Options: [nosniff]

Запустите новый сервис docker-cache-registry.service:

# systemctl daemon-reload
# systemctl enable --now docker-cache-registry.service

Проверьте работу служб:

$ netstat -nlpt | grep 500[01]
tcp        0      0 :::5000                     :::*                        LISTEN      23898/docker-regist 
tcp        0      0 :::5001                     :::*                        LISTEN      24543/docker-regist

Разворачивание и настройка image-factory

Перед запуском сервиса image-factory отредактируйте файл /etc/sysconfig/image-factory описания окружения запуска:

REGISTRY=altlinux.space
REPOSITORY="$REGISTRY/alt-orchestra"
IMAGE_FACTORY_NAME="image-factory"
PUBLICKEYBASE='alt-orchestra-baseimages-publickey'
PUBLICKEYBASE_IMAGE="$REPOSITORY/$IMAGE_FACTORY_NAME/$PUBLICKEYBASE"
HTTP_PORT=80
MIN_TALOSVERISON=1.9.0
INSECURE_IMAGE_REGISTRY=-insecure-image-registry
CONTAINER_SIGNATURE_SUBJECT_REGEXP='@altlinux\.space$'
CONTAINER_SIGNATURE_ISSUER_REGEXP=''
CONTAINER_SIGNATURE_ISSUER=''
CONTAINER_SIGNATURE_PUBKEY="/var/lib/$IMAGE_FACTORY_NAME/${PUBLICKEYBASE}.key"
CONTAINER_SIGNATURE_PUBKEY_HASHALGO=sha256
ASSET_BUILER_MAX_ONCURRENCY=6
EXTERNAL_URL=''
EXTERNAL_PXE_URL='<IP-адрес или домен image-factory сервера>'
SCHEMATIC_SERVICE_REPOSITORY="$REPOSITORY/$IMAGE_FACTORY_NAME/schematics"
INSECURE_SCHEMATIC_SERVICE_REPOSITORY='-insecure-schematic-service-repository'
INSTALLER_INTERNAL_REPOSITORY="$REPOSITORY"
INSTALLER_EXTERNAL_REPOSITORY="$REPOSITORY"
INSECURE_INSTALLER_INTERNAL_REPOSITORY='-insecure-installer-internal-repository'
TALOS_VERSIONS_RECHECK_INTERVAL="15m0s"
CACHE_SIGNING_KEY_PATH="/var/lib/$IMAGE_FACTORY_NAME/cache-signing-key.key"
CACHE_REPOSITORY="localhost:5001/$IMAGE_FACTORY_NAME/cache"
INSECURE_CACHE_REPOSITORY='-insecure-cache-repository'
METRICS_LISTEN_ADDR=':2122'

Убедитесь, что переменная CACHE_REPOSITORY имеет указанное значение:

CACHE_REPOSITORY="localhost:5001/$IMAGE_FACTORY_NAME/cache"

Укажите в переменной EXTERNAL_PXE_URL IP-адрес или домен image-factory сервера. Так как длина URL загружаемых артефактов (iPXE-скрипт, ядро, файловая система initramfs-amd64.xz) в iPXE ограничена 128 байтами, используйте либо IP-адрес сервера, либо домен или его алиас, который короче IP-адреса. В противном случае URL, формирующийся по шаблону http://<EXTERNAL_PXE_URL>/image/<hash>/<имя_артефакта> может оказаться длинней 128 байт и отрежется при формировании запроса со стороны iPXE-клиента.

Разворачивание сервера сетевой загрузки

Client ipxe scheme.png.png

Для разворачивания alt-orchestra кластера по сети необходима установка сервера сетевой загрузки, включающего в себя:

  • DHCP-сервер (ISC dhcpd) для раздачи IP-адресов узлам кластера и обеспечения iPXE-загрузки;
  • программу talos-img для загрузки нужных артефактов с сервера Image Factory и управления кэшем артефактов на сервере сетевой загрузки;
  • TFTP- и HTTP-сервер для доступа к загруженным артефактам при разворачивании узлов кластера.

Установите пакет netboot-talos и выполните начальную настройку:

# apt-get install netboot-talos
# netboot-setup --iface=ens11 --talos

Остальные операции выполняются под обычным (непривилегированным) пользователем:

$ talos-img --get 376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba v1.10.0-alpha.3
Checking configuration...
Downloading iPXE script...
Downloading Linux kernel...
Downloading initramfs image...
Committing changes to cache...
25042801

$ talos-img --list
Boot-ID   Arch   Talos schematic                                                   Talos release
========  =====  ================================================================  =============
25042801  amd64  376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba  v1.10.0-alpha.3

Разворачивание корневой инфраструктуры (https://altlinux.space/alt-orchestra)

Разворачивание и настройка proxy-сервера регистратора docker-образов kubernetes и docker-регистратора кэша образов image-factory

Так как docker-образы kubernetes (https://registry.altlinux.org) и образы image-factory (https://altlinux.space/alt-orchestra) для разработчиков, тестеров и администраторов доступны в рамках локальной сети, то поднимать proxy и cache docker-регистраторы особого смысла нет.

Для того чтобы снять лишнюю нагрузку с регистратора https://altlinux.space/alt-orchestra, имеет смысл поднять docker-регистратор кэша образов alt-orchestra.

Разворачивание и настройка image-factory

Если в разворачивании docker-регистатора кэша образов alt-orchestra нет необходимости, нужно в переменной CACHE_REPOSITORY указать URL:

CACHE_REPOSITORY="$REPOSITORY/$IMAGE_FACTORY_NAME/cache"