Быстрый старт
Этот документ поможет вам быстро понять, как создать OCI Connector и использовать его для безопасного доступа к реестрам контейнеров без прямой работы с учетными данными.
Содержание
Введение
Применимые сценарии
OCI (Open Container Initiative) Connector предоставляет безопасный способ:
- Доступа к реестрам контейнеров (Docker Hub, Harbor и др.) без встраивания учетных данных в рабочие нагрузки
- Централизованного управления информацией для аутентификации в реестрах
- Использования прокси-механизма для безопасной загрузки и выгрузки образов контейнеров
- Настройки контейнерных инструментов для работы с прокси реестра
Этот подход особенно полезен для:
- CI/CD конвейеров, которым необходимо загружать образы в приватные реестры
- Многочисленных команд, где учетные данные реестра нужно безопасно разделять
- Процессов сборки контейнеров внутри Kubernetes
Оценочное время чтения
15 минут
Примечания
- OCI connector использует интеграцию с CSI драйвером для безопасной инъекции учетных данных реестра.
- Разным контейнерным инструментам (Docker, Buildah и др.) может потребоваться специфическая настройка для доступа к небезопасным реестрам.
- Сгенерированные коннектором конфигурационные файлы действительны в течение 30 минут.
Предварительные требования
- Kubernetes кластер с установленной системой Connectors (Operator, Core и компоненты OCI). Подробности об установке см. в Installation Guide.
- kubectl, настроенный для взаимодействия с вашим кластером
- Учетные данные для доступа к реестру контейнеров (Docker Hub, Harbor и др.)
- Базовые знания ресурсов Kubernetes
Обзор процесса
№ | Шаг операции | Описание |
---|
1 | Создать Namespace | Создать выделенный namespace для демонстрации |
2 | Создать учетные данные реестра и OCI Connector | Настроить коннектор для работы с реестром контейнеров |
3 | Настроить RBAC разрешения | Предоставить необходимые разрешения для использования коннектора |
4 | Создать задачу сборки/публикации контейнера | Запустить задачу, использующую коннектор для взаимодействия с реестром |
5 | Проверить выполнение | Убедиться, что операция с реестром прошла успешно |
Шаги выполнения
Шаг 1: Создать Namespace
Создайте выделенный namespace для этой демонстрации:
kubectl create ns oci-connector-demo
Шаг 2: Создать учетные данные реестра и OCI Connector
Создайте Secret с учетными данными реестра и ресурс OCI Connector. Для более подробной информации о создании и настройке коннекторов смотрите Connectors Quick Start Guide.
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: registry-auth
namespace: oci-connector-demo
type: cpaas.io/distribution-registry-token
stringData:
username: your-username # Замените на имя пользователя вашего реестра
password: your-token # Замените на пароль/токен вашего реестра
---
apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
name: oci-connector
namespace: oci-connector-demo
spec:
connectorClassName: oci
address: "https://index.docker.io" # Замените на адрес вашего реестра
auth:
name: tokenAuth
secretRef:
name: registry-auth
EOF
Проверьте, что коннектор находится в состоянии "Ready":
kubectl get connector oci-connector -n oci-connector-demo
Вывод должен быть таким:
NAME CLASS ADDRESS READY AGE
oci-connector oci https://index.docker.io True 1m
Шаг 3: Создать задачу сборки/публикации контейнера
Создайте ConfigMap с примером Dockerfile:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: dockerfile
namespace: oci-connector-demo
data:
Dockerfile: |
FROM scratch
LABEL maintainer="example@example.com"
WORKDIR /app
ENV APP_VERSION="1.0.0"
EOF
Создайте задачу, которая использует коннектор для сборки и публикации образа контейнера:
cat <<EOF | kubectl apply -f -
apiVersion: batch/v1
kind: Job
metadata:
name: image-build
namespace: oci-connector-demo
spec:
template:
spec:
restartPolicy: Never
containers:
- name: buildkit
image: moby/buildkit:v0.11.0
securityContext:
privileged: true
env:
- name: BUILDKITD_FLAGS
value: "--config /etc/buildkit/buildkitd.toml"
command:
- /bin/sh
- -c
args:
- |
set -ex
buildctl-daemonless.sh \
build \
--progress=plain \
--frontend=dockerfile.v0 \
--local context=/workspace \
--local dockerfile=/workspace \
--output type=image,name=c-oci-connector.oci-connector-demo.svc.cluster.local/namespaces/oci-connector-demo/connectors/oci-connector/your-username/test-image:v1,push=true
volumeMounts:
- name: dockerfile
mountPath: /workspace
- name: docker-config
mountPath: /root/.docker
- name: buildkitd-config
mountPath: /etc/buildkit
volumes:
- name: dockerfile
configMap:
name: dockerfile
- name: docker-config
csi:
readOnly: true
driver: connectors-csi
volumeAttributes:
connector.name: "oci-connector"
configuration.names: "docker-config"
- name: buildkitd-config
csi:
readOnly: true
driver: connectors-csi
volumeAttributes:
connector.name: "oci-connector"
configuration.names: "buildkitd"
EOF
Ключевые параметры в определении томов:
connector.name
: имя вашего OCI коннектора
configuration.names
: указывает, какую конфигурацию генерировать из OCI ConnectorClass:
"docker-config"
: генерирует конфигурацию аутентификации (config.json), необходимую для любых операций с реестром
"buildkitd"
: генерирует конфигурацию демона BuildKit для доступа к небезопасному реестру
mountPath
: указывает, куда монтировать конфигурационный файл в контейнере:
- "/root/.docker" для конфигурации аутентификации Docker
- "/etc/buildkit" для конфигурации BuildKit
Шаг 4: Проверить выполнение
Проверьте логи задачи, чтобы убедиться, что образ был успешно собран и отправлен:
kubectl logs -f job/image-build -n oci-connector-demo
Вы должны увидеть процесс сборки и успешную отправку образа в реестр.
Ожидаемые результаты
После успешного выполнения всех шагов вы увидите:
-
OCI коннектор в состоянии "Ready":
NAME CLASS ADDRESS READY AGE
oci-connector oci https://index.docker.io True 5m
-
Успешную операцию сборки и публикации образа в логах задачи, показывающую, что образ был отправлен в реестр через прокси коннектора.
-
Адрес прокси коннектора в поле статуса:
status:
proxy:
httpAddress:
url: http://c-oci-connector.oci-connector-demo.svc.cluster.local
Как это работает
OCI Connector работает следующим образом:
- Создает прокси-сервис, который находится между вашими рабочими нагрузками и реестром контейнеров
- Внедряет информацию для аутентификации при прохождении запросов через прокси
- Предоставляет конфигурационные файлы для контейнерных инструментов для работы с прокси
Коннектор генерирует три типа конфигурационных файлов, которые служат разным целям:
-
docker-config: создает файл config.json
с необходимой информацией для аутентификации при доступе к прокси-сервису
{
"auths": {
"<proxy-address>": {
"auth": "<auth-token>"
}
}
}
Эта конфигурация обязательна для аутентификации и требуется для всех операций с контейнерами.
-
buildkitd: создает файл buildkitd.toml
, который настраивает BuildKit на доверие к небезопасному прокси реестра
insecure-entitlements = [ "network.host", "security.insecure" ]
[registry."<proxy-address>"]
http = true
Это необходимо только при использовании BuildKit для сборки и публикации образов.
Чтобы просмотреть сгенерированную конфигурацию:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: inspect-config
namespace: oci-connector-demo
spec:
containers:
- name: inspector
image: busybox
command: ["sleep", "3600"]
volumeMounts:
- name: docker-config
mountPath: /mnt/docker
volumes:
- name: docker-config
csi:
readOnly: true
driver: connectors-csi
volumeAttributes:
connector.name: "oci-connector"
configuration.names: "docker-config"
EOF
Просмотрите сгенерированную конфигурацию:
kubectl exec -it inspect-config -n oci-connector-demo -- cat /mnt/docker/config.json
Устранение неполадок
Если операция с контейнером не удалась, проверьте следующее:
-
Статус коннектора: убедитесь, что коннектор находится в состоянии "Ready":
kubectl describe connector oci-connector -n oci-connector-demo
-
Разрешения RBAC: проверьте правильность настройки RoleBinding.
-
Доступ к реестру: убедитесь, что учетные данные имеют доступ к указанному репозиторию.
-
Монтирование конфигурации: проверьте, что конфигурационные тома корректно смонтированы в задаче.
-
Адрес прокси: убедитесь, что вы используете правильный адрес прокси из status.proxy.httpAddress.url
в ссылках на образы.
Следующие шаги
После успешной публикации первого образа с помощью OCI Connector вы можете:
- Использовать коннектор в Kubernetes workload для загрузки приватных образов
- Интегрировать с CI/CD конвейерами для сборки и публикации образов
- Настраивать различные контейнерные инструменты для работы с коннектором
- Использовать коннектор с разными сервисами реестров