Облачная платформаAdvanced

NodePort

Эта статья полезна?
Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

NodePort — это базовый тип Service в Kubernetes. Он добавляет сопоставление портов узла для доступа внутри кластера. Это означает, что Service доступен на IP‑адресе каждого узла на статическом порту. При создании Service типа NodePort, Kubernetes автоматически выделяет IP‑адрес, ограниченный кластером (ClusterIP). Когда клиенты вне кластера обращаются <node-IP>:<node-port>, трафик будет перенаправлен к целевому pod через ClusterIP Service типа NodePort.

Если pod‑ы требуют временного доступа или трафик низкий, вы можете создать Service типа NodePort. Например, в тестовой среде вы можете использовать Service типа NodePort при развертывании и отладке веб‑приложения.

Рисунок 1 Доступ к Service типа NodePort


Ограничения

  • По умолчанию Service типа NodePort доступен внутри VPC. Чтобы использовать EIP для доступа к Service типа NodePort через публичные сети, привяжите EIP к узлу в кластере заранее.
  • После создания Сервиса, если настройка аффинити переключена с уровня кластера на уровень узла, таблица трассировки соединения не будет очищена. Не изменяйте настройку аффинити Сервиса после его создания. Чтобы изменить её, создайте Сервис заново.
  • В кластере CCE Turbo поддерживается аффинити уровня узла только когда бэкенд Сервиса подключён к pod с hostNetwork.
  • В режиме сети VPC, когда контейнер A опубликован через сервис NodePort и аффинити сервиса установлена на уровень узла (то есть, externalTrafficPolicy установлена в local), контейнер B, развернутый на том же узле, не может получить доступ к контейнеру A через IP-адрес узла и сервис NodePort.
  • Когда в кластере версии v1.21.7 или новее создаётся сервис NodePort, порт на узле не отображается с помощью netstat по умолчанию. Если режим переадресации кластера установлен в iptables, выполните команду iptables -t nat -L команда для просмотра порта. Если режим перенаправления кластера является IPVS, выполните ipvsadm -Ln команда для просмотра порта.

Использование CCE Console

  1. Войдите в CCE console и нажмите имя кластера, чтобы получить доступ к консоли кластера.
  2. В навигационной панели выберите Сервисы & Ingresses. В правом верхнем углу нажмите Создать Сервис.
  3. Настройте параметры.

    Параметр

    Описание

    Имя Сервиса

    Введите имя, которое может совпадать с именем нагрузки.

    Тип Сервиса

    Выбрать NodePort.

    Пространство имен

    Выберите пространство имен, к которому относится рабочая нагрузка.

    Аффинитет сервиса

    Определяет, направлять ли внешний трафик к локальному узлу или к конечной точке всего кластера. Для получения подробной информации см. Аффинитет сервиса (externalTrafficPolicy).

    • Уровень кластера: IP‑адреса и порты всех узлов в кластере могут обращаться к рабочей нагрузке, связанной с Сервисом. Однако доступ к Сервису может привести к снижению производительности из‑за перенаправления маршрута, и исходный IP‑адрес клиента может быть недоступен.
    • Уровень узла: Только IP‑адрес и порт узла, на котором расположена рабочая нагрузка, могут обращаться к связанной с Сервисом нагрузке. Доступ к Сервису не приведёт к снижению производительности из‑за перенаправления маршрута, и исходный IP‑адрес клиента может быть получен.

    Селектор

    Сервис будет связан с Подами рабочей нагрузки на основе метки и направит трафик к Подам с этой меткой.

    Вы можете добавить ключ и значение для метки Под и нажать Подтвердить.

    Вы также можете нажать Reference Workload Label чтобы использовать метку существующей рабочей нагрузки. В отображаемом диалоговом окне выберите нагрузку и нажмите OK.

    IPv6

    Эта функция отключена по умолчанию. После включения этой функции IP-адрес кластера Сервиса меняется на IPv6-адрес. Эта функция доступна только в кластерах версии v1.15 и выше с включённым IPv6 (настраивается при создании кластера).

    Порт

    • Протокол: протокол, поддерживаемый Сервисом.
    • Порт Контейнера: порт прослушивания контейнеров сервиса. Порт находится в диапазоне от 1 до 65535. Необходимо определить порт на основе образа контейнера. Например, порт по умолчанию для Nginx — 80, а порт по умолчанию для MySQL — 3306.
    • Порт сервиса: порт, используемый для доступа к сервису ClusterIP. При необходимости можно настроить порт. Порт находится в диапазоне от 1 до 65535.
    • Порт узла: порт, используемый для доступа к узлу с помощью IP‑адреса узла. Рекомендуется выбрать Авто. Вы также можете указать порт. Диапазон портов по умолчанию — от 30000 до 32767.

  4. Нажмите ОК. После создания сервиса доступ к нему осуществляется через <node-IP-address>:<node-port>. Облачные серверы в том же VPC, что и кластер, или контейнеры в кластере могут обращаться к этому IP‑адресу. Если EIP привязан к узлу, вы также можете использовать EIP для доступа.

Использование kubectl

Вы можете настроить доступ к Service с помощью kubectl. В этом разделе используется рабочая нагрузка Nginx в качестве примера для описания того, как настроить NodePort Service с помощью kubectl.

  1. Используйте kubectl для доступа к кластеру. Для подробностей см. Доступ к кластеру с помощью kubectl.
  2. Создайте и отредактируйте nginx-deployment.yaml файл для настройки примерной рабочей нагрузки. Для подробностей см. Создание Deployment. nginx-deployment.yaml это пример имени файла. Вы можете переименовать его по мере необходимости.

    vi nginx-deployment.yaml

    Содержимое файла:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - image: nginx:latest
    name: nginx
    imagePullSecrets:
    - name: default-secret

  3. Создайте и отредактируйте nginx-nodeport-svc.yaml файл для настройки параметров Service. nginx-nodeport-svc.yaml это пример имени файла. Вы можете переименовать его при необходимости.

    vi nginx-nodeport-svc.yaml

    Содержимое файла:

    apiVersion: v1
    kind: Service
    metadata:
    labels:
    app: nginx
    name: nginx-nodeport
    spec:
    ports:
    - name: service
    nodePort: 30000 # Node port. The value ranges from 30000 to 32767.
    port: 8080 # Port for accessing a Service
    protocol: TCP # Protocol used for accessing a Service. The value can be TCP or UDP.
    targetPort: 80 # Port used by a Service to access the target container. This port is closely related to the applications running in a container. In this example, the Nginx image uses port 80 by default.
    selector: # Label selector. A Service selects a pod based on the label and forwards the requests for accessing the Service to the pod. In this example, select the pod with the app:nginx label.
    app: nginx
    type: NodePort # Service type. NodePort indicates that the Service is accessed through a node port.

  4. Создать нагрузку.

    kubectl create -f nginx-deployment.yaml

    Если отображается информация, аналогичная следующей, нагрузка была создана:

    deployment/nginx created

    Проверьте созданную нагрузку.

    kubectl get pod

    Если отображается информация, аналогичная следующей, нагрузка работает:

    NAME READY STATUS RESTARTS AGE
    nginx-2601814895-znhbr 1/1 Running 0 15s

  5. Создать службу.

    kubectl create -f nginx-nodeport-svc.yaml

    Если отображается информация, аналогичная следующей, служба создаётся:

    service/nginx-nodeport created

    Проверьте созданную службу.

    kubectl get svc

    Если отображается информация, аналогичная следующей, служба была создана:

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    kubernetes ClusterIP 10.247.0.1 <none> 443/TCP 4d8h
    nginx-nodeport NodePort 10.247.30.40 <none> 8080:30000/TCP 18s

  6. Получить доступ к службе. По умолчанию NodePort Service можно получить доступ, используя IP-address-of-any-node:node-port. Облачные серверы в пределах одного VPC или контейнеры в кластере могут получить доступ к службе. Если к узлу привязан EIP, вы также можете использовать EIP для доступа к службе.

    Создайте контейнер в кластере и получите к нему доступ, используя IP-адрес-узла:node-port.

    1. Получите IP-адрес узла.
      kubectl get node -owide

      Вывод команды:

      NAME STATUS ROLES AGE INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
      10.100.0.136 Ready <none> 152m 10.100.0.136 <none> CentOS Linux 7 (Core) 3.10.0-1160.25.1.el7.x86_64 docker://18.9.0
      10.100.0.5 Ready <none> 152m 10.100.0.5 <none> CentOS Linux 7 (Core) 3.10.0-1160.25.1.el7.x86_64 docker://18.9.0
    2. Создайте Под и получите доступ к его контейнеру.
      kubectl run -i --tty --image nginx:alpine test --rm /bin/sh
    3. Запустите curl команду для доступа к Service.
      curl 10.100.0.136:30000

      Вывод команды:

      / # <!DOCTYPE html>
      <html>
      <head>
      <title>Welcome to nginx!</title>
      <style>
      body {
      width: 35em;
      margin: 0 auto;
      font-family: Tahoma, Verdana, Arial, sans-serif;
      }
      </style>
      </head>
      <body>
      <h1>Welcome to nginx!</h1>
      <p>If you see this page, the nginx web server is successfully installed and
      working. Further configuration is required.</p>
      <p>For online documentation and support please refer to
      <a href="http://nginx.org/">nginx.org</a>.<br/>
      Commercial support is available at
      <a href="http://nginx.com/">nginx.com</a>.</p>
      <p><em>Thank you for using nginx.</em></p>
      </body>
      </html>
      / #