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

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

    Мы создадим PyPI коннектор и используем его для выполнения twine upload и pip install без прямой работы с учетными данными на стороне клиента.

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

    15 минут

    Требования

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

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

    ШагОперацияОписание
    1Создать NamespaceСоздать выделенный namespace для демонстрации
    2Настроить учетные данные PyPI реестра и коннекторСоздать секрет аутентификации и ресурс PyPI коннектора
    3Создать Job для выполнения twine uploadСоздать job, который выполняет twine upload через коннектор
    4Создать Job для выполнения pip installСоздать job, который выполняет pip install через коннектор

    Пошаговые действия

    Шаг 1: Создать Namespace

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

    kubectl create ns connectors-pypi-demo

    Шаг 2: Создать учетные данные PyPI реестра и коннектор

    Создайте Secret с учетными данными PyPI реестра и ресурс PyPI коннектора. Ваш PyPI реестр должен быть репозиторием.

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

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

    Проверьте, что коннектор находится в статусе "Ready":

    kubectl get connector pypi-connector -n connectors-pypi-demo

    Вывод должен быть:

    NAME              CLASS   ADDRESS                                                    READY   REASON   AGE
    pypi-connector   pypi   https://nexus.example.com/repository/pypi   True             10s

    Шаг 3: Создать Job для выполнения twine upload

    Создайте job, который использует коннектор для выполнения операций PyPI:

    cat <<'EOF' | kubectl apply -n connectors-pypi-demo -f -
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: twine-upload
    spec:
      backoffLimit: 0
      template:
        spec:
          restartPolicy: Never
          containers:
          - name: twine
            image: python:3-bookworm
            imagePullPolicy: IfNotPresent
            command:
            - "sh"
            - "-c"
            - |
              set -ex
              pip install --upgrade pip build twine
              git clone https://github.com/pypa/sampleproject.git
              cd sampleproject
              python -m build
              python3 -m twine upload --repository connectors-pypi dist/*
            volumeMounts:
            - name: pypirc
              mountPath: /root/.pypirc
              subPath: .pypirc
          volumes:
          - name: pypirc
            csi:
              readOnly: true
              driver: connectors-csi
              volumeAttributes:
                connector.name: "pypi-connector"
                configuration.names: "pypirc"
    EOF

    Вывод должен быть:

    ...
    Successfully built sampleproject-4.0.0.tar.gz and sampleproject-4.0.0-py3-none-any.whl
    + python3 -m twine upload --repository connectors-pypi dist/sampleproject-4.0.0-py3-none-any.whl dist/sampleproject-4.0.0.tar.gz
    Uploading distributions to 
    http://c-pypi-connector.connectors-pypi-demo.svc.cluster.local/
    Uploading sampleproject-4.0.0-py3-none-any.whl
    100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.7/12.7 kB • 00:00 • ?
    Uploading sampleproject-4.0.0.tar.gz
    100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 13.8/13.8 kB • 00:00 • ?

    Ключевые настройки

    volumes[].volumeAttributes

    • connector.name: имя вашего pypi коннектора
    • configuration.names: установлено в "pypirc", что ссылается на конкретный шаблон конфигурации, определённый в классе коннектора pypi. Этот шаблон используется для генерации файла "pypirc" с соответствующими настройками аутентификации.

    Шаг 4: Создать PyPI Job для выполнения pip install

    Создайте job, который использует коннектор для выполнения операций PyPI:

    cat <<'EOF' | kubectl apply -n connectors-pypi-demo -f -
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: pip-install
    spec:
      backoffLimit: 0
      template:
        spec:
          restartPolicy: Never
          containers:
          - name: pip
            image: python:3-bookworm
            imagePullPolicy: IfNotPresent
            command:
            - "sh"
            - "-c"
            - |
              set -ex
              pip install --upgrade sampleproject --no-deps
            volumeMounts:
            - name: pipconf
              mountPath: /root/.pip/pip.conf
              subPath: pip.conf
          volumes:
          - name: pipconf
            csi:
              readOnly: true
              driver: connectors-csi
              volumeAttributes:
                connector.name: "pypi-connector"
                configuration.names: "pipconf"
    EOF

    Вывод должен быть:

    + pip install --upgrade sampleproject --no-deps
    Looking in indexes: http://connectors-pypi-demo-pypi-connector:****@c-pypi-connector.connectors-pypi-demo.svc.cluster.local/simple/
    Collecting sampleproject
      Downloading http://c-pypi-connector.connectors-pypi-demo.svc.cluster.local/packages/sampleproject/4.0.0/sampleproject-4.0.0-py3-none-any.whl (4.7 kB)
    Installing collected packages: sampleproject
    Successfully installed sampleproject-4.0.0

    Что происходит под капотом

    PyPI коннектор работает следующим образом:

    1. Создаёт прокси-сервис, который находится между вашим PyPI клиентом и целевым PyPI реестром
    2. Внедряет информацию для аутентификации при прохождении запросов через прокси
    3. Предоставляет файлы pip.conf и .pypirc для клиента, чтобы выполнять операции PyPI через прокси

    Чтобы продемонстрировать этот механизм, давайте посмотрим сгенерированные файлы pip.conf и .pypirc:

    cat <<EOF | kubectl apply -n connectors-pypi-demo -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: inspect-pypi-deploy
    spec:
      restartPolicy: Never
      containers:
      - name: pip
        image: hub-mirrors.alauda.cn/library/python:3-bookworm # Замените на ваш образ с python
        command: ["sleep", "3600"]
        volumeMounts:
        - name: pipconf
          mountPath: /root/.pip/pip.conf
          subPath: pip.conf
        - name: pypirc
          mountPath: /root/.pypirc
          subPath: .pypirc
      volumes:
      - name: pipconf
        csi:
          readOnly: true
          driver: connectors-csi
          volumeAttributes:
            connector.name: "pypi-connector"
            configuration.names: "pipconf"
      - name: pypirc
        csi:
          readOnly: true
          driver: connectors-csi
          volumeAttributes:
            connector.name: "pypi-connector"
            configuration.names: "pypirc"
    EOF

    Просмотрите сгенерированные файлы в /root/.pip/pip.conf и /root/.pypirc:

    $ kubectl exec -it inspect-pypi-deploy -n connectors-pypi-demo -- ls -l /root/.pip/pip.conf /root/.pypirc
    -r--r--r-- 1 root root 1276 Oct  6 04:07 /root/.pip/pip.conf
    -r--r--r-- 1 root root 1251 Oct  6 04:07 /root/.pypirc

    Просмотрите содержимое файлов pip.conf и .pypirc:

    $ kubectl exec -it inspect-pypi-deploy -n connectors-pypi-demo -- cat /root/.pip/pip.conf
    [global]
    index-url = http://connectors-pypi-demo-pypi-connector:eyJhbGciOiJSUzI1NiIsImtpZCI6IklNVm9ZVWR6Y05PNWotUlRCQWRyTlVPak05WWxTanIwYnNJSjdtRTlHcXMifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiLCJodHRwOi8vYy1weXBpLWNvbm5lY3Rvci5jb25uZWN0b3JzLXB5cGktZGVtby5zdmMuY2x1c3Rlci5sb2NhbCJdLCJleHAiOjE3NTk3MjU0NTIsImlhdCI6MTc1OTcyMzY1MiwiaXNzIjoiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiLCJqdGkiOiI4NjVhZmIwZi0xYTJkLTRiODAtOWY4Mi03YjMxOWUxNzFmYzIiLCJrdWJlcm5ldGVzLmlvIjp7Im5hbWVzcGFjZSI6ImNvbm5lY3RvcnMtcHlwaS1kZW1vIiwic2VydmljZWFjY291bnQiOnsibmFtZSI6ImRlZmF1bHQiLCJ1aWQiOiI4ZjMyMzhjNC0wMTFjLTRkZTktOTcxYS1lYTRkZTQ2NTQyZmEifX0sIm5iZiI6MTc1OTcyMzY1Miwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmNvbm5lY3RvcnMtcHlwaS1kZW1vOmRlZmF1bHQifQ.BPbpWNz1A4JUjKkQFgeglIoW3YKydMiR_0r2V3R7awSnac6lQiEMrmJQ2MgAKbrzysmi_tfku6bLjk7Jkq_OmPdSwiwFvh6Ixxpe2lk7Ej10hCibxNTrqnsPVV9upS1WyKaci7nwvtV5qH2smjcpNB38sjX-pi5nCblGKXbj4Gt0F11-OVyPOD6FJayhEYmT3bi-GXJGi3da7vYR1v-L3c3JF4RiV4xQ_FpnBgdzD9_C9WZuXAHSp8oXxzGRra7kqhjpCO10GMmExvT9mfKr-z5f1CZdMcbsiGRkxkZ6EH-W8Q4DQ09a3Thnmq_lBd5xriwqldBEN8_1Cnh6A70Wrw@c-pypi-connector.connectors-pypi-demo.svc.cluster.local/simple/
    timeout = 30
    
    [install]
    trusted-host = c-pypi-connector.connectors-pypi-demo.svc.cluster.local
    
    $ kubectl exec -it inspect-pypi-deploy -n connectors-pypi-demo -- cat /root/.pypirc
    [distutils]
    index-servers = connectors-pypi
    
    [connectors-pypi]
    repository = http://c-pypi-connector.connectors-pypi-demo.svc.cluster.local/ # proxy address
    username = connectors-pypi-demo-pypi-connector # Имя пользователя pypi прокси
    password = eyJhbGciOiJSUzI1NiIsImtpZCI6IklNVm9ZVWR6Y05PNWotUlRCQWRyTlVPak05WWxTanIwYnNJSjdtRTlHcXMifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiLCJodHRwOi8vYy1weXBpLWNvbm5lY3Rvci5jb25uZWN0b3JzLXB5cGktZGVtby5zdmMuY2x1c3Rlci5sb2NhbCJdLCJleHAiOjE3NTk3MjU0NTIsImlhdCI6MTc1OTcyMzY1MiwiaXNzIjoiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiLCJqdGkiOiIxNmFmM2Q0Yi1hYjUyLTQwNDgtYjAxYS1hMGRmZTM2MDI1NTAiLCJrdWJlcm5ldGVzLmlvIjp7Im5hbWVzcGFjZSI6ImNvbm5lY3RvcnMtcHlwaS1kZW1vIiwic2VydmljZWFjY291bnQiOnsibmFtZSI6ImRlZmF1bHQiLCJ1aWQiOiI4ZjMyMzhjNC0wMTFjLTRkZTktOTcxYS1lYTRkZTQ2NTQyZmEifX0sIm5iZiI6MTc1OTcyMzY1Miwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmNvbm5lY3RvcnMtcHlwaS1kZW1vOmRlZmF1bHQifQ.U3SpoP9QL1HsxENBcSiC-0vPG2BME6qEzflv6OXSlu1KiU8iGejfcAW-OvTDKwVJq2rwjJf2mQkEIs7aySrJAJ241dAoqEQ68pZ3zpZwcxNquuK7q7jP1PSNnupw4h_T250m5LfUenp3p3bir-TkxZbmATNUCHeVyrKxIJQj8f0UuZZ5CF_gBBUSOU8geI70oTwmfE7cVExd75UttUHWOFkP-wQYFdQG1Mq05DA2xCvPt0gajmOIBLTTjKVahY5v9nBfJsnJHNtRu12xG-dFULpy3BVU0wEkH8pWA6iegXw4xNj2nB6rGK4EIvPrcMZYXX_Fpnigucnw_0wtwE-syg # Токен прокси.

    Поток аутентификации

    Pod inspect-pypi-deploy не содержит оригинальных токенов кластера. Когда maven выполняет HTTPS-запросы к maven реестру, прокси-сервер перехватывает эти запросы, внедряет учетные данные аутентификации из pypi-connector и пересылает аутентифицированные запросы на backend сервер pypi реестра.

    Настройка Volume

    Файлы pip.conf и .pypirc монтируются в Pod через Connectors CSI Driver.

      volumes:
      - name: pipconf
        csi:
          readOnly: true
          driver: connectors-csi
          volumeAttributes:
            connector.name: "pypi-connector"
            configuration.names: "pipconf"
      - name: pypirc
        csi:
          readOnly: true
          driver: connectors-csi
          volumeAttributes:
            connector.name: "pypi-connector"
            configuration.names: "pypirc"

    В приведённом выше примере файлы pip.conf и .pypirc монтируются в Pod через Connectors CSI Driver.

    • Файлы pip.conf и .pypirc используют прокси коннектора в качестве PyPI реестра. Когда PyPI клиент запрашивает адрес, прокси перенаправляет запрос на backend pypi реестр и внедряет информацию для аутентификации при прохождении запроса через прокси.

    Для параметров volumes смотрите Using Connectors CSI Driver to mount pip.conf and .pypirc file в документе PyPI Connector Concepts.

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

    После успешного выполнения операций mvn deploy с использованием maven коннектора вы можете:

    Ссылки