Быстрый старт
Этот документ поможет вам быстро понять, как создать PyPI коннектор для подключения к PyPI реестру и выполнять операции twine и pip безопасно, без прямой работы с учетными данными.
Мы создадим PyPI коннектор и используем его для выполнения twine upload и pip install без прямой работы с учетными данными на стороне клиента.
Оценочное время чтения
15 минут
Требования
- Kubernetes кластер с установленной системой Connectors (компоненты Operator, ConnectorsCore и ConnectorsPyPI). Подробнее об установке этих компонентов смотрите в Installation Guide.
- Адрес PyPI реестра и учетные данные
- Базовые знания Kubernetes и PyPI
Обзор процесса
Пошаговые действия
Шаг 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 коннектор работает следующим образом:
- Создаёт прокси-сервис, который находится между вашим PyPI клиентом и целевым PyPI реестром
- Внедряет информацию для аутентификации при прохождении запросов через прокси
- Предоставляет файлы
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 коннектора вы можете:
Ссылки