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

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

    Мы создадим NPM-коннектор и используем его для выполнения npm install и npm publish без прямого обращения с учетными данными на стороне клиента.

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

    15 минут

    Требования

    • Kubernetes-кластер с установленной системой Connectors (компоненты Operator, ConnectorsCore и ConnectorsNPM). Подробности об установке этих компонентов смотрите в Installation Guide.
    • Адрес NPM-реестра и учетные данные
    • Базовые знания Kubernetes и NPM
    • NPM-реестр должен поддерживать публикацию и загрузку пакетов.

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

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

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

    Шаг 1: Создание Namespace

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

    kubectl create ns connectors-npm-demo

    Шаг 2: Создание учетных данных NPM Registry и коннектора

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

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

    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 # Замените на имя пользователя вашего NPM-реестра
      password: your-registry-password # Замените на пароль вашего NPM-реестра
    ---
    apiVersion: connectors.alauda.io/v1alpha1
    kind: Connector
    metadata:
      name: npm-connector
    spec:
      connectorClassName: npm
      address: https://nexus.example.com/repository/npm # Замените на адрес вашего NPM-репозитория, в который будет деплоиться пакет.
      auth:
        name: basicAuth
        secretRef:
          name: npm-registry-secret
    EOF

    Проверьте, что коннектор находится в статусе "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: Создание 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-коннектор работает следующим образом:

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

    Для демонстрации этого механизма давайте посмотрим на сгенерированный файл .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 # Замените на ваш образ с 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-реестру, прокси-сервер перехватывает эти запросы, внедряет учетные данные аутентификации из npm-connector и пересылает аутентифицированные запросы на бэкенд npm-реестра.

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

    Файлы .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 используют прокси коннектора в качестве NPM-реестра. Когда NPM/Yarn клиент запрашивает адрес, прокси перенаправляет запрос на бэкенд npm-реестр и внедряет информацию об аутентификации при прохождении запроса через прокси.

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

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

    После успешного выполнения операций npm install и npm publish с использованием npm-коннектора вы можете:

    Ссылки