Быстрый старт
Этот документ поможет вам быстро понять, как создать NPM-коннектор для подключения к NPM registry и безопасного выполнения операций загрузки/публикации без прямой обработки учетных данных.
Мы создадим NPM-коннектор и будем использовать его для выполнения npm install и npm publish без прямой обработки учетных данных на стороне клиента.
Оценочное время чтения
15 минут
Предварительные требования
- Кластер Kubernetes с установленной системой Connectors (компоненты Operator, ConnectorsCore и ConnectorsNPM). Подробнее об установке этих компонентов см. в Руководстве по установке.
- Адрес NPM registry и учетные данные
- Базовые знания Kubernetes и NPM
- NPM registry должен поддерживать публикацию пакетов и их загрузку.
Обзор процесса
Шаги выполнения
Шаг 1: Создать Namespace
Создайте отдельный namespace для этой демонстрации:
kubectl create ns connectors-npm-demo
Шаг 2: Создать учетные данные NPM registry и коннектор
Создайте Secret, содержащий учетные данные NPM registry, а также ресурс NPM-коннектора. Ваш NPM registry должен быть репозиторием.
Для получения более подробной информации о создании и настройке коннекторов см. Руководство по быстрому старту Connectors.
cat <<EOF | kubectl apply -n connectors-npm-demo -f -
kind: Secret
apiVersion: v1
metadata:
name: npm-registry-secret
type: kubernetes.io/basic-auth
stringData:
username: your-registry-username # Replace with your NPM registry username
password: your-registry-password # Replace with your NPM registry password
---
apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
name: npm-connector
spec:
connectorClassName: npm
address: https://nexus.example.com/repository/npm # Replace with your NPM repository address, we will deploy package to this repository.
params:
- name: registryType
value: "all" # mirror for downloads only, publish for publishing only, all for both
auth:
name: basicAuth
secretRef:
name: npm-registry-secret
EOF
При создании коннектора рекомендуется задать spec.params.registryType, чтобы явно указать роль коннектора: mirror для загрузки зависимостей, publish для публикации пакетов или all для обоих сценариев. Подробнее см. Параметры NPM Connector и Использование нескольких NPM-коннекторов в Tekton Tasks.
Проверьте, что коннектор находится в состоянии "Ready":
kubectl get connector npm-connector -n connectors-npm-demo
Вывод должен показать:
NAME CLASS ADDRESS READY REASON AGE
npm-connector npm https://nexus.example.com/repository/npm True 10s
Шаг 3: Создать Job для выполнения npm install
Создайте job, которая использует коннектор для выполнения операций NPM:
cat <<'EOF' | kubectl apply -n connectors-npm-demo -f -
apiVersion: batch/v1
kind: Job
metadata:
name: npm-install
spec:
backoffLimit: 0
template:
spec:
restartPolicy: Never
containers:
- name: npm-demo
image: node:latest
imagePullPolicy: IfNotPresent
command:
- "sh"
- "-c"
- |
set -ex
git clone --depth 1 https://github.com/kycheng/demo-npm-publish-slack-notifier.git npmdemo
cd npmdemo
npm install --verbose
volumeMounts:
- name: npmrc
mountPath: /root/.npmrc
subPath: .npmrc
volumes:
- name: npmrc
csi:
readOnly: true
driver: connectors-csi
volumeAttributes:
connector.name: "npm-connector"
configuration.names: "npmrc"
EOF
Вывод должен показать:
+ npm install --verbose
npm verbose cli /usr/local/bin/node /usr/local/bin/npm
npm info using npm@11.6.2
npm info using node@v22.21.0
npm verbose title npm install
...
npm http fetch GET 200 https://nexus.example.com/repository/npm/@slack/webhook/-/webhook-5.0.3.tgz 14142ms (cache miss)
npm http fetch GET 200 https://nexus.example.com/repository/npm/@types/node/-/node-14.14.2.tgz 14682ms (cache miss)
npm info run dtrace-provider@0.8.8 install node_modules/dtrace-provider node-gyp rebuild || node suppress-error.js
npm info run dtrace-provider@0.8.8 install { code: 0, signal: null }
added 87 packages in 1m
npm verbose cwd /npmdemo/standalone/npmdemo
npm verbose os Linux 3.10.0-1160.el7.x86_64
npm verbose node v22.21.0
npm verbose npm v11.6.2
npm verbose exit 0
npm info ok
Ключевые настройки:
volumes[].volumeAttributes
connector.name: Имя вашего npm-коннектора
configuration.names: Установите значение "npmrc", которое ссылается на определенный шаблон конфигурации, заданный в npm connectorClass. Этот шаблон используется для генерации файла "npmrc" с соответствующими параметрами аутентификации.
Шаг 4: Создать NPM Job для выполнения npm publish
Создайте job, которая использует коннектор для выполнения операций NPM:
cat <<'EOF' | kubectl apply -n connectors-npm-demo -f -
apiVersion: batch/v1
kind: Job
metadata:
name: npm-publish
spec:
backoffLimit: 0
template:
spec:
restartPolicy: Never
containers:
- name: npm-publish
image: node:latest
imagePullPolicy: IfNotPresent
command:
- "sh"
- "-c"
- |
set -ex
git clone --depth 1 https://github.com/kycheng/demo-npm-publish-slack-notifier.git npmdemo
cd npmdemo
npm publish --verbose
volumeMounts:
- name: npmrc
mountPath: /root/.npmrc
subPath: .npmrc
volumes:
- name: npmrc
csi:
readOnly: true
driver: connectors-csi
volumeAttributes:
connector.name: "npm-connector"
configuration.names: "npmrc"
EOF
Вывод должен показать:
+ npm publish --verbose
npm verbose cli /usr/local/bin/node /usr/local/bin/npm
npm info using npm@10.9.4
npm info using node@v22.21.0
npm verbose title npm publish
...
npm notice
npm notice Publishing to https://nexus.example.com/repository/npm with tag latest and default access
npm http fetch PUT 200 https://nexus.example.com/repository/npm/npm-slack-notifier 659ms
+ npm-slack-notifier@0.1.0
npm verbose cwd /npmdemo
npm verbose os Linux 3.10.0-1160.el7.x86_64
npm verbose node v22.21.0
npm verbose npm v10.9.4
npm verbose exit 0
npm info ok
Что происходит под капотом
NPM-коннектор работает следующим образом:
- Создает proxy service, который находится между вашим NPM client и целевым NPM registry
- Внедряет информацию аутентификации, когда запросы проходят через proxy
- Предоставляет файл
.npmrc для выполнения NPM-операций клиентом через proxy
Чтобы продемонстрировать этот механизм, давайте посмотрим на сгенерированный файл .npmrc:
cat <<EOF | kubectl apply -n connectors-npm-demo -f -
apiVersion: v1
kind: Pod
metadata:
name: inspect-npm-deploy
spec:
restartPolicy: Never
containers:
- name: npm-demo
image: node:lts-bookworm # Replace with your image contains node
command: ["sleep", "3600"]
volumeMounts:
- name: npmrc
mountPath: /root/.npmrc
subPath: .npmrc
- name: yarnrc
mountPath: /root/.yarnrc.yml
subPath: .yarnrc.yml
- name: yarnrc
mountPath: /root/ca.cert
subPath: ca.cert
volumes:
- name: npmrc
csi:
readOnly: true
driver: connectors-csi
volumeAttributes:
connector.name: "npm-connector"
configuration.names: "npmrc"
- name: yarnrc
csi:
readOnly: true
driver: connectors-csi
volumeAttributes:
connector.name: "npm-connector"
configuration.names: "yarnrc"
EOF
Просмотрите сгенерированные файлы в /root/.npmrc и /root/.yarnrc.yml:
$ kubectl exec -it inspect-npm-deploy -n connectors-npm-demo -- ls -l /root/.npmrc
-r--r--r-- 1 root root 1276 Oct 6 04:07 /root/.npmrc
-r--r--r-- 1 root root 1276 Oct 6 04:07 /root/.yarnrc.yml
-r--r--r-- 1 root root 1276 Oct 6 04:07 /root/ca.cert
Просмотрите сгенерированные файлы .npmrc и .yarnrc.yml:
$ kubectl exec -it inspect-npm-deploy -n connectors-npm-demo -- cat /root/.npmrc
# NPM Registry Configuration
registry=https://nexus.example.com/repository/npm
# Configure authentication for private registry access
//nexus.example.com/repository/npm/:_auth=fAd326jYkI123456789xxx
# Set the connector proxy URL for npm registry access
https-proxy=http://connectors-npm-demo%2Fnpm-connector:fAd326jYkI123456789xxx@c-npm-connector.connectors-npm-demo.svc.cluster.local/
proxy=http://connectors-npm-demo%2Fnpm-connector:fAd326jYkI123456789xxx@c-npm-connector.connectors-npm-demo.svc.cluster.local/
# Disable strict SSL verification for internal registries
strict-ssl=false
# Disable npm audit to avoid security warnings during CI/CD
audit=false
# Disable funding messages to reduce output noise
fund=false
$ kubectl exec -it inspect-npm-deploy -n connectors-npm-demo -- cat /root/.yarnrc.yml
# Set the NPM registry server URL for package resolution
npmRegistryServer: "https://nexus.example.com/repository/npm"
# Authentication token for registry access
# This token is automatically generated by the connector
npmAuthIdent: "fAd326jYkI123456789xxx"
# Set the connector proxy URL for npm registry access
httpsProxy: http://connectors-npm-demo%2Fnpm-connector:fAd326jYkI123456789xxx@c-npm-connector.connectors-npm-demo.svc.cluster.local/
httpProxy: http://connectors-npm-demo%2Fnpm-connector:fAd326jYkI123456789xxx@c-npm-connector.connectors-npm-demo.svc.cluster.local/
# Always authenticate to the registry
# This is required for the connector to work correctly, if the npmAlwaysAuth is not set to true, the metadata request will not be authenticated.
npmAlwaysAuth: true
unsafeHttpWhitelist:
- nexus.example.com
# Disable strict SSL verification for internal registries
enableStrictSsl: false
# Set the registry URL for package publishing
# Ensures packages are published to the correct registry
npmPublishRegistry: "https://nexus.example.com/repository/npm"
Поток аутентификации
Pod inspect-npm-deploy не содержит исходных токенов кластера. Когда npm выполняет HTTPS-запросы к npm registry, proxy server перехватывает эти запросы, внедряет учетные данные аутентификации из npm-connector и пересылает аутентифицированные запросы на backend npm registry server.
Тома настроек
Файлы .npmrc и .yarnrc монтируются в Pod через Connectors CSI Driver.
volumes:
- name: npmrc
csi:
readOnly: true
driver: connectors-csi
volumeAttributes:
connector.name: "npm-connector"
configuration.names: "npmrc"
- name: yarnrc
csi:
readOnly: true
driver: connectors-csi
volumeAttributes:
connector.name: "npm-connector"
configuration.names: "yarnrc"
В приведенном выше примере файлы .npmrc и .yarnrc монтируются в Pod через Connectors CSI Driver.
- Файлы
.npmrc и .yarnrc используют proxy коннектора как NPM registry; когда NPM/Yarn Client отправляет запрос по этому адресу, proxy передает запрос в backend npm registry и внедряет информацию аутентификации, когда запросы проходят через proxy.
Для параметров volumes см. Использование Connectors CSI Driver для монтирования файлов .npmrc и .yarnrc в документе NPM Connector Concepts.
Дополнительное чтение
После успешного выполнения операций npm install и npm publish с помощью npm-коннектора вы можете:
Ссылки