• Русский
  • Быстрый старт

    Этот документ поможет вам быстро понять, как создать Harbor connector для подключения к Harbor registry и безопасного выполнения операций с контейнерными образами без прямой работы с учетными данными.

    Мы создадим Harbor connector и используем его для выполнения операций с контейнерными образами без прямого обращения к учетным данным на стороне клиента.

    Оценочное время чтения

    15 минут

    Требования

    • Kubernetes кластер с установленной системой Connectors (компоненты Operator, ConnectorsCore и ConnectorsHarbor). Подробнее об установке этих компонентов смотрите в Installation Guide.
    • Адрес Harbor registry и учетные данные
    • Базовые знания Kubernetes и контейнерных реестров
    • Harbor registry должен быть доступен и поддерживать стандартные API контейнерных реестров

    Обзор процесса

    ШагОперацияОписание
    1Создание NamespaceСоздание выделенного namespace для демонстрации
    2Настройка учетных данных Harbor Registry и ConnectorСоздание секрета аутентификации и ресурса Harbor connector
    3Создание Job для выполнения операций с контейнерамиСоздание job, выполняющего операции с контейнерами через connector
    4Проверка выполненияПроверка успешной сборки и отправки образа

    Шаги выполнения

    Шаг 1: Создание Namespace

    Создайте выделенный namespace для этой демонстрации:

    kubectl create ns connectors-harbor-demo

    Шаг 2: Создание учетных данных Harbor Registry и Connector

    Создайте Secret с учетными данными Harbor registry и ресурс Harbor connector.

    Для более подробной информации о создании и настройке connectors смотрите Connectors Quick Start Guide.

    cat <<EOF | kubectl apply -n connectors-harbor-demo -f -
    kind: Secret
    apiVersion: v1
    metadata:
      name: harbor-secret
    type: kubernetes.io/basic-auth
    stringData:
      username: your-username # Замените на имя пользователя вашего Harbor registry
      password: your-password # Замените на пароль вашего Harbor registry
    ---
    apiVersion: connectors.alauda.io/v1alpha1
    kind: Connector
    metadata:
      name: harbor-connector
    spec:
      connectorClassName: harbor
      address: https://harbor.example.com # Замените на адрес вашего Harbor registry
      auth:
        name: basicAuth
        secretRef:
          name: harbor-secret
    EOF

    Проверьте, что connector готов:

    kubectl get connector harbor-connector -n connectors-harbor-demo

    Шаг 3: Создание Job для выполнения операций с контейнерами

    Создайте ConfigMap с примером Containerfile:

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: containerfile
      namespace: oci-connector-demo
    data:
      Containerfile: |
        FROM scratch
        LABEL maintainer="example@example.com"
        WORKDIR /app
        ENV APP_VERSION="1.0.0"
    EOF

    Создайте Job, который использует connector для сборки и отправки контейнерного образа:

    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
              export http_proxy=$(cat /tmp/http.proxy)
              export https_proxy=$(cat /tmp/https.proxy)
              export HTTP_PROXY=$http_proxy
              export HTTPS_PROXY=$https_proxy
              export no_proxy=localhost,127.0.0.1
              export NO_PROXY=$no_proxy
              echo "Using proxy: http_proxy=$http_proxy, https_proxy=$https_proxy, no_proxy=$no_proxy"
    
              buildctl-daemonless.sh \
              build \
              --progress=plain \
              --frontend=dockerfile.v0 \
              --local context=/workspace \
              --local dockerfile=/workspace \
              --output type=image,name=harbor.example.com/library/image:v1,push=true
            volumeMounts:
            - name: containerfile
              mountPath: /workspace
            - name: proxyconfig
              mountPath: /tmp/
          volumes:
          - name: containerfile
            configMap:
              name: containerfile
          - name: proxyconfig
            csi:
              readOnly: true
              driver: connectors-csi
              volumeAttributes:
                connector.name: "harbor-connector"
    EOF

    Проверьте, что job запущен:

    kubectl get job image-build -n connectors-harbor-demo

    Ключевые параметры в определении volume:

    • connector.name: имя вашего OCI connector
    • configuration.names: указывает, какую конфигурацию генерировать из OCI ConnectorClass:
      • "registry-config": генерирует конфигурацию аутентификации (config.json), необходимую для операций с реестром
      • "buildkitd": генерирует конфигурацию демона BuildKit для доступа к небезопасному реестру
      • если не указано, будет смонтирована конфигурация по умолчанию
    • mountPath: указывает, куда в контейнере монтировать конфигурационный файл:
      • "/root/.docker" для конфигурации аутентификации buildkit

    Шаг 4: Проверка выполнения

    Проверьте логи job, чтобы убедиться, что образ успешно собран и отправлен:

    kubectl logs -f job/image-build -n oci-connector-demo

    Вы должны увидеть процесс сборки и отправки образа в реестр.

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

    Harbor Connector работает следующим образом:

    1. Создает прокси-сервис, который обрабатывает аутентификацию с Harbor registry
    2. Монтирует конфигурацию прокси в Pod через CSI драйвер
    3. Использует конфигурацию прокси через переменные окружения во время операций с контейнерными образами
    4. Прокси-сервис проверяет конфигурацию прокси и внедряет учетные данные аутентификации Harbor registry

    Это позволяет рабочим нагрузкам обращаться к Harbor registry без прямого управления учетными данными.