Облачная платформаВсе платформы

NodePort

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

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

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

Figure 1 NodePort Service access


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

  • По умолчанию Service типа NodePort доступен внутри VPC. Чтобы использовать EIP для доступа к Service типа NodePort через публичные сети, привяжите EIP к узлу кластера заранее.
  • После создания Service, если настройка affinity переключена с уровня кластера на уровень узла, таблица трассировки соединений не будет очищена. Не изменяйте настройку Service 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. Настройте параметры.

    Параметр

    Описание

    Имя Service

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

    Тип Service

    Выберите NodePort.

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

    Выберите пространство имён, к которому относится workload.

    Service Affinity

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

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

    Selector

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

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

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

    IPv6

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

    Порт

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

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

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

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

  1. Используйте kubectl для доступа к кластеру. Подробнее см. Accessing a Cluster Using kubectl.
  2. Создайте и отредактируйте nginx-deployment.yaml файл для настройки примера workload. Подробнее см. 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 TCPTCP or UDPUDP.
    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:nginxapp:nginx label.
    app: nginx
    type: NodePort # Service type. NodePortNodePort указывает, что Service доступен через порт узла.

  4. Создайте workload.

    kubectl create -f nginx-deployment.yaml

    Если отображается информация, похожая на нижеуказанную, workload создан:

    deployment/nginx created

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

    kubectl get pod

    Если отображается информация, похожая на нижеуказанную, workload работает:

    NAME READY STATUS RESTARTS AGE
    nginx-2601814895-znhbr 1/1 Running 0 15snginx-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. По умолчанию Service типа NodePort доступен через IP-address-of-any-node:node-port. Облачные серверы в том же VPC или контейнеры внутри кластера могут обращаться к Service. Если к узлу привязан 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>
      / #