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

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

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

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

    15 минут

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

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

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

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

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

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

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

    kubectl create ns connectors-pypi-demo

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

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

    Для более подробной информации о создании и настройке connectors обратитесь к 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 registry
      password: your-registry-password # Замените на пароль вашего PyPI registry
    ---
    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

    Проверьте, что connector находится в статусе "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, который использует connector для выполнения операций 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 connector
    • configuration.names: установлено в "pypirc", что ссылается на конкретный шаблон конфигурации, определённый в классе connector pypi. Этот шаблон используется для генерации файла "pypirc" с соответствующими настройками аутентификации.

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

    Создайте job, который использует connector для выполнения операций 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 connector работает следующим образом:

    1. Создаёт прокси-сервис, который находится между вашим PyPI клиентом и целевым PyPI registry
    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: docker-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/ # адрес прокси
    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 registry, прокси-сервер перехватывает эти запросы, внедряет учетные данные аутентификации из pypi-connector и пересылает аутентифицированные запросы на backend сервер pypi registry.

    Настройка томов

    Файлы 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 используют прокси connector в качестве PyPI registry. Когда PyPI клиент обращается к этому адресу, прокси перенаправляет запрос на backend pypi registry и внедряет информацию об аутентификации при прохождении запроса через прокси.

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

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

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

    References