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

Параметр | Описание |
|---|---|
Имя Сервиса | Введите имя, которое может совпадать с именем нагрузки. |
Тип Сервиса | Выбрать NodePort. |
Пространство имен | Выберите пространство имен, к которому относится рабочая нагрузка. |
Аффинитет сервиса | Определяет, направлять ли внешний трафик к локальному узлу или к конечной точке всего кластера. Для получения подробной информации см. Аффинитет сервиса (externalTrafficPolicy).
|
Селектор | Сервис будет связан с Подами рабочей нагрузки на основе метки и направит трафик к Подам с этой меткой. Вы можете добавить ключ и значение для метки Под и нажать Подтвердить. Вы также можете нажать Reference Workload Label чтобы использовать метку существующей рабочей нагрузки. В отображаемом диалоговом окне выберите нагрузку и нажмите OK. |
IPv6 | Эта функция отключена по умолчанию. После включения этой функции IP-адрес кластера Сервиса меняется на IPv6-адрес. Эта функция доступна только в кластерах версии v1.15 и выше с включённым IPv6 (настраивается при создании кластера). |
Порт |
|
Вы можете настроить доступ к Service с помощью kubectl. В этом разделе используется рабочая нагрузка Nginx в качестве примера для описания того, как настроить NodePort Service с помощью kubectl.
vi nginx-deployment.yaml
Содержимое файла:
apiVersion: apps/v1kind: Deploymentmetadata:name: nginxspec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:latestname: nginximagePullSecrets:- name: default-secret
vi nginx-nodeport-svc.yaml
Содержимое файла:
apiVersion: v1kind: Servicemetadata:labels:app: nginxname: nginx-nodeportspec:ports:- name: servicenodePort: 30000 # Node port. The value ranges from 30000 to 32767.port: 8080 # Port for accessing a Serviceprotocol: 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: nginxtype: NodePort # Service type. NodePort indicates that the Service is accessed through a node port.
kubectl create -f nginx-deployment.yaml
Если отображается информация, аналогичная следующей, нагрузка была создана:
deployment/nginx created
Проверьте созданную нагрузку.
kubectl get pod
Если отображается информация, аналогичная следующей, нагрузка работает:
NAME READY STATUS RESTARTS AGEnginx-2601814895-znhbr 1/1 Running 0 15s
kubectl create -f nginx-nodeport-svc.yaml
Если отображается информация, аналогичная следующей, служба создаётся:
service/nginx-nodeport created
Проверьте созданную службу.
kubectl get svc
Если отображается информация, аналогичная следующей, служба была создана:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.247.0.1 <none> 443/TCP 4d8hnginx-nodeport NodePort 10.247.30.40 <none> 8080:30000/TCP 18s
Создайте контейнер в кластере и получите к нему доступ, используя IP-адрес-узла:node-port.
kubectl get node -owide
Вывод команды:
NAME STATUS ROLES AGE INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME10.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.010.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
kubectl run -i --tty --image nginx:alpine test --rm /bin/sh
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 andworking. 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>/ #