• Русский
  • Коннектор Harbor

    Коннектор Harbor — это независимый от платформы коннектор, который можно использовать для подключения к любому Harbor registry.

    Вы можете использовать Harbor Connector для безопасного выполнения операций с образами контейнеров в пайплайнах CICD или использовать его в рабочих нагрузках Kubernetes для выполнения операций с образами без учетных данных.

    Кроме того, вы можете централизовать управление конфигурациями доступа Harbor в разных namespace, избавившись от необходимости повторять учетные данные Harbor в каждом namespace.

    Обзор

    В этом документе рассматриваются:

    • Требования к интеграции: предварительные требования к целевым Harbor registry
    • Создание Harbor connector
    • Расширенные возможности: возможности прокси и конфигурации коннектора Harbor

    Требования к интеграции

    Предварительные требования к Harbor Registries

    • Поддерживаются версии Harbor 2.x

    Создание простого коннектора Harbor

    Вот как создать базовый Harbor Connector:

    # Harbor Connector
    apiVersion: connectors.alauda.io/v1alpha1
    kind: Connector
    metadata:
      name: harbor-connector
    spec:
      connectorClassName: harbor
      address: https://harbor.example.com

    Справка по полям

    spec.connectorClassName:

    harbor (constant), указывает имя ConnectorClass для интеграции с Harbor.

    spec.address:

    Адрес целевого Harbor registry, например: https://harbor.example.com.

    spec.auth(optional):

    указывает метод аутентификации Harbor registry

    • spec.auth.name: должно быть basicAuth для Harbor connector.

    • spec.auth.secretRef: указывает secret, содержащий информацию аутентификации Harbor registry; secret должен быть создан в том же namespace, что и коннектор. Если вашему Harbor registry не требуется аутентификация, это поле можно опустить. Тип secret должен быть kubernetes.io/basic-auth.

    Необязательные поля метаданных:

    • cpaas.io/description: информация-описание для Harbor connector, например:

      apiVersion: connectors.alauda.io/v1alpha1
      kind: Connector
      metadata:
        name: harbor-connector
        annotations:
          cpaas.io/description: "Connect to team development Harbor registry"

    Возможности коннектора

    Методы аутентификации

    Коннектор Harbor поддерживает следующие методы аутентификации:

    • Basic Authentication: аутентификация по имени пользователя и паролю, тип secret должен быть kubernetes.io/basic-auth.

    если ваш Harbor registry не требует аутентификации, это поле можно опустить.

    Требуемые права токена

    Требуемые права для настроенных учетных данных зависят от того, как вы планируете использовать их в своих Pods/Pipelines.

    Например:

    • Операции pull и push образов: если вам нужно выполнять pull и push образов с помощью этого коннектора, учетные данные должны иметь права на чтение и запись в целевом Harbor registry.
    • Операции API: настраивайте права в зависимости от операций, которые необходимо выполнять. При настройке учетных данных убедитесь, что у учетной записи есть право доступа к информации о пользователе (/users/current).

    В соответствии с лучшими практиками безопасности мы рекомендуем создавать учетные данные с минимально необходимыми правами. Если требуются дополнительные привилегии, создавайте отдельные коннекторы с более привилегированным secret и используйте изоляцию namespace, чтобы управлять тем, какие пользователи могут получить доступ к каждому коннектору.

    Возможности прокси и конфигурации

    Коннектор Harbor предоставляет возможности прокси, обеспечивающие безопасный доступ к Harbor registries.

    Чтобы клиенты могли получать доступ к Harbor registries без прямой обработки учетных данных, Harbor ConnectorClass предоставляет proxy-сервер, который автоматически подставляет информацию аутентификации.

    Клиенты, имеющие доступ к коннектору, могут использовать этот proxy-сервер для доступа к Harbor registries без необходимости настраивать учетные данные на стороне клиента.

    Адрес прокси

    При создании коннектора Harbor система автоматически создаст Service для проксирования доступа к Harbor registry.

    Система запишет адрес прокси в поле status.proxy.httpAddress.

    Например:

    apiVersion: connectors.alauda.io/v1alpha1
    kind: Connector
    metadata:
      name: harbor-connector
    spec:
      # . . .
    status:
      conditions:
      # . . .
      proxy:
        httpAddress:
          url: http://c-harbor-connector.default.svc.cluster.local

    Прямой прокси

    Вы можете смонтировать информацию о proxy в Pods с помощью CSI, а затем использовать ее через переменные окружения или конфигурационные файлы.

    volumes:
    - name: proxyconfig
      csi:
        readOnly: true
        driver: connectors-csi
        volumeAttributes:
          connector.name: "harbor"

    Затем, перед выполнением операций с контейнерами, используйте информацию о proxy через переменные окружения или конфигурационные файлы.

    export http_proxy=$(cat /{mount-path}/http.proxy)
    export https_proxy=$(cat /{mount-path}/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"

    Конфигурация Harbor CLI

    Используйте harbor-cli-config, когда вам нужно, чтобы workload выполняла команды harbor-cli через коннектор Harbor, не помещая исходные имя пользователя или пароль Harbor в Pod.

    После подключения harbor-cli-config ваша workload получает готовую к использованию настройку Harbor CLI:

    • config.yaml для Harbor CLI
    • .env для переменных окружения proxy коннектора
    • HARBOR_ENCRYPTION_KEY, который требуется Harbor CLI при чтении сгенерированной конфигурации

    Для одного коннектора Harbor подключите его так:

    volumes:
    - name: harbor-cli
      csi:
        readOnly: true
        driver: connectors-csi
        volumeAttributes:
          connector.name: "harbor-connector"
          configuration.names: "harbor-cli-config"

    Для нескольких коннекторов Harbor запросите их одним подключением. Сгенерированный config.yaml включает по одному контексту Harbor CLI для каждого выбранного коннектора, поэтому вы можете переключаться между ними с помощью harbor context switch.

    volumes:
    - name: harbor-cli
      csi:
        readOnly: true
        driver: connectors-csi
        volumeAttributes:
          connectors: "harbor-connector,harbor-connector-2"
          configuration.names: "harbor-cli-config"
    Info

    Функция нескольких коннекторов зависит от флага enable-multi-connector. Подробности о флаге см. в Feature Flags.

    Перед запуском harbor-cli загрузите окружение proxy, добавьте CA proxy в доверенные и экспортируйте смонтированный ключ шифрования:

    set -a; source /mnt/harbor-cli/.env; set +a
    export HARBOR_CLI_CONFIG=/mnt/harbor-cli/config.yaml
    export HARBOR_ENCRYPTION_KEY=$(cat /mnt/harbor-cli/HARBOR_ENCRYPTION_KEY)
    
    harbor-cli project list --name my-project
    
    harbor-cli context switch default/harbor-connector-2
    harbor-cli project list --name my-project

    HARBOR_ENCRYPTION_KEY используется только для того, чтобы Harbor CLI мог читать сгенерированную конфигурацию. Это не исходный secret Harbor, и сгенерированное значение пароля в config.yaml не используется как реальный учетный данные для доступа к Harbor. Реальный доступ по-прежнему проходит через proxy коннектора.

    Обратный прокси

    При использовании обратного прокси необходимо изменить адрес целевого образа на адрес прокси.

    Пример: harbor.example.com/test/abc:v1 → c-harbor-connector.default.svc.cluster.local/namespaces/harbor-connector-demo/connectors/harbor-connector/test/abc:v1

    Кроме того, необходимо смонтировать конфигурационные файлы в Pod и настроить адрес proxy в insecure-registries. По умолчанию предоставляются конфигурационные файлы buildkitd.toml и config.json.

    OCI Connector, созданный на основе типа OCI Connector, предоставляет следующие конфигурации:

    registry-config: конфигурационная информация, требуемая для OCI CLI, например buildkit, buildah и т. д.

    • Предоставляет файл конфигурации config.json.
    • Содержит информацию аутентификации, необходимую для доступа к proxy.

    Например:

    // config.json
    
    {
      "auths": {
          "<proxy address of the connector>": {
              "auth": "<authentication information required to access the connector proxy>"
          }
      }
    }

    buildkitd: конфигурационная информация, требуемая для BuildKit Daemon.

    • Предоставляет файл конфигурации buildkitd.toml.
    • В файле конфигурации текущий коннектор по умолчанию будет установлен как insecure-registries.

    Например:

    insecure-entitlements = [ "network.host", "security.insecure" ]
    [registry."<proxy address of the connector>"]
      http = true

    Дополнительные материалы