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

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

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

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

    15 минут

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

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

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

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

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

    Шаг 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-коннектор работает следующим образом:

    1. Создает proxy service, который находится между вашим NPM client и целевым NPM registry
    2. Внедряет информацию аутентификации, когда запросы проходят через proxy
    3. Предоставляет файл .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-коннектора вы можете:

    Ссылки