• Русский
  • OCI Connector

    OCI Connector — это независимый от платформы коннектор, который позволяет подключаться к любому OCI Registry, например Docker Hub, Harbor и т. д. Вы можете использовать OCI Connector для безопасного доступа к приватным OCI repositories в CI/CD pipelines или для выполнения OCI-операций в контейнеризованных workload без предоставления учетных данных. Кроме того, вы можете централизованно управлять конфигурациями доступа к OCI, избегая необходимости дублировать конфигурации учетных данных OCI в каждом namespace.

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

    • Требования к доступу для OCI Registry
    • Как создать OCI Connector на основе типа OCI Connector
    • Возможности proxy и конфигурации OCI Connector

    Требования к OCI Registry

    OCI Registry, к которому требуется доступ, должен соответствовать следующим условиям:

    1. Требования к реализации интерфейсов:

    2. Требования к способу аутентификации:

    Создание OCI Connector на основе типа OCI Connector

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

    apiVersion: connectors.alauda.io/v1alpha1
    kind: Connector
    metadata:
      name: dockerhub-demo
    spec:
      connectorClassName: oci
      address: https://index.docker.io
      auth:
        name: tokenAuth

    spec.connectorClassName

    Используйте константное значение oci.

    description

    Вы можете добавить описательную информацию к OCI Connector через поле annotations.

    • cpaas.io/description: описание OCI Connector.

    Например:

    apiVersion: connectors.alauda.io/v1alpha1
    kind: Connector
    metadata:
      name: dockerhub-demo
      annotations:
        cpaas.io/description: "Connect to Docker Hub for team public repository access"

    Address

    spec.address указывает адрес доступа к OCI Registry, например: https://index.docker.io.

    Authentication

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

    • tokenAuth: аутентификация на основе Token (необязательно)
      • Соответствующий тип учетных данных: cpaas.io/distribution-registry-token. Этот тип учетных данных используется для процесса аутентификации, определенного в CNCF Distribution Token Authentication Specification, и учетные данные должны предоставлять информацию username и password.

    Использование аутентификации на основе Token

    Например:

    apiVersion: connectors.alauda.io/v1alpha1
    kind: Connector
    metadata:
      name: dockerhub-demo
    spec:
      connectorClassName: oci
      address: https://index.docker.io
      # . . .
      auth:
        name: tokenAuth
        secretRef:
          name: oci-secret
    ---
    apiVersion: v1
    stringData:
      password: your-password
      username: your-username
    kind: Secret
    metadata:
      name: oci-secret
    type: cpaas.io/distribution-registry-token

    Если целевой OCI Registry не требует аутентификации, вы можете опустить информацию об аутентификации. Пример конфигурации приведен ниже:

    apiVersion: connectors.alauda.io/v1alpha1
    kind: Connector
    metadata:
      name: dockerhub-demo
    spec:
      connectorClassName: oci
      address: https://index.docker.io
      auth:
        name: tokenAuth

    Требуемые разрешения токена

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

    Например:

    • Операции pull образов: если вам нужно только выполнять pull образов с помощью этого коннектора, токену требуются только права на чтение целевых repositories.
    • Операции pull и push образов: если вам нужно выполнять push образов с помощью этого коннектора, токен должен иметь как права на чтение, так и права на запись в целевых repositories. Иными словами, токен должен позволять выполнять как pull из registry, так и push в него.

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

    Proxy и конфигурация

    Чтобы предоставить клиентам возможность получать доступ к OCI repositories без учетных данных, тип OCI Connector предлагает proxy server, который автоматически подставляет информацию аутентификации.

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

    Чтобы упростить использование, тип OCI Connector предоставляет информацию о конфигурации, которую можно монтировать в Pods через CSI. В Pod при выполнении OCI-операций proxy service может использоваться автоматически для выполнения OCI-операций.

    Proxy

    Адрес Proxy

    При создании Connector система:

    1. Автоматически создаст Service для proxy.
    2. Запишет адрес proxy в поле status.proxy.httpAddress.

    Вы можете использовать этот адрес proxy для операций push и pull образов.

    Например:

    apiVersion: connectors.alauda.io/v1alpha1
    kind: Connector
    metadata:
      name: dockerhub-demo
      namespace: default
    spec:
      address: https://index.docker.io
      auth:
        name: tokenAuth
        secretRef:
          name: dockerhub-demo
      connectorClassName: oci
    status:
      conditions:
      # . . .
      proxy:
        httpAddress:
          url: http://c-dockerhub-demo.default.svc.cluster.local/namespaces/oci-connector-demo/connectors/oci-connector

    Forward Proxy

    Вы можете монтировать информацию о 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"

    Reverse Proxy

    При использовании reverse proxy вам нужно изменить адрес целевого образа на адрес proxy.

    Пример: index.docker.io/test/abc:v1 → c-dockerhub-demo.default.svc.cluster.local/namespaces/oci-connector-demo/connectors/oci-connector/test/abc:v1

    и смонтировать файлы конфигурации учетных данных в Pod, а также настроить адрес proxy в insecure-registries.

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

    docker-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.
    • В файле конфигурации текущий connector по умолчанию будет установлен в insecure-registries.

    Например:

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

    Вы можете монтировать эту информацию о конфигурации в Pods с помощью connectors-csi и, в сочетании с возможностями proxy, выполнять операции push или pull образов без секретов.

    Дополнительно