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

NodePort

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

NodePort is a basic Service type in Kubernetes. It adds node port mapping to intra-cluster access. This means the Service is exposed on each node's IP address at a static port. When you create a NodePort Service, Kubernetes automatically allocates a cluster-scoped IP address (ClusterIP). When clients outside the cluster access <node-IP>:<node-port>, the traffic will be forwarded to the target pod through the ClusterIP of the NodePort Service.

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

Figure 1 NodePort Service access


Примечания и ограничения

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

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

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

    Параметр

    Description

    Service Name

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

    Service Type

    Выберите NodePort.

    Namespace

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

    Service Affinity

    Определяет, направлять ли внешний трафик на локальный узел или на конечную точку уровня кластера. Подробнее см. Service Affinity (externalTrafficPolicy).

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

    Selector

    Service будет связан с pod‑ами рабочей нагрузки на основе метки и будет направлять трафик к pod‑ам с этой меткой.

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

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

    IPv6

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

    Port

    • Protocol: протокол, поддерживаемый Service.
    • Container Port: порт, на котором прослушивают контейнеры Service. Диапазон портов от 1 до 65535. Порт необходимо определить исходя из образа контейнера. Например, порт по умолчанию для Nginx — 80, а порт по умолчанию для MySQL — 3306.
    • Service Port: порт, используемый для доступа к ClusterIP Service. При необходимости можно задать пользовательский порт. Диапазон портов от 1 до 65535.
    • Node Port: порт, используемый для доступа к узлу по его IP‑адресу. Рекомендуется выбрать Auto. Также можно указать порт вручную. Диапазон портов по умолчанию — от 30000 до 32767.

  4. Нажмите OK. Затем получите доступ к Service через \u003cnode-IP-address\u003e:\u003cnode-port\u003e. Облачные серверы в той же VPC, что и кластер, или контейнеры внутри кластера могут обращаться к этому IP‑адресу. Если к узлу привязан EIP, его также можно использовать для доступа.

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

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

  1. Используйте kubectl для доступа к кластеру. Подробнее см. Accessing a Cluster Using kubectl.
  2. Создайте и отредактируйте файл nginx-deployment.yaml для настройки образца нагрузки. Подробнее см. Creating a 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. Создайте Service.

    kubectl create -f nginx-nodeport-svc.yaml

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

    service/nginx-nodeport created

    Проверьте созданный Service.

    kubectl get svc

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

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

    Создайте контейнер в кластере и получите к нему доступ, используя IP-address-of-the-node: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. Создайте pod и получите доступ к его контейнеру.
      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>
      / #

NodePort — документация Cloud Container Engine руководство пользователя облако Cloud.ru