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 | Введите имя, которое может совпадать с именем workload. |
Тип Service | Выберите NodePort. |
Пространство имён | Выберите пространство имён, к которому относится workload. |
Service Affinity | Определяет, маршрутизировать ли внешний трафик к локальному узлу или к эндпоинту на уровне кластера. Подробнее см. Service Affinity (externalTrafficPolicy).
|
Selector | Service будет связан с pod‑ами workload на основе метки и направит трафик к pod‑ам с этой меткой. Можно добавить ключ и значение для метки pod и нажать Confirm. Вы также можете нажать Reference Workload Label чтобы использовать метку существующего workload. В открывшемся диалоговом окне выберите workload и нажмите OK. |
IPv6 | Эта функция отключена по умолчанию. После её включения IP‑адрес Service кластера меняется на IPv6‑адрес. Эта опция доступна только в кластерах версии v1.15 и новее с включённым IPv6 (устанавливается при создании кластера). |
Порт |
|
Можно настроить доступ к Service с помощью kubectl. В этом разделе в качестве примера используется workload Nginx, чтобы показать, как настроить Service типа NodePort через 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 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: nginxtype: NodePort # Service type. NodePortNodePort указывает, что Service доступен через порт узла.
kubectl create -f nginx-deployment.yaml
Если отображается информация, похожая на нижеуказанную, workload создан:
deployment/nginx created
Проверьте созданный workload.
kubectl get pod
Если отображается информация, похожая на нижеуказанную, workload работает:
NAME READY STATUS RESTARTS AGEnginx-2601814895-znhbr 1/1 Running 0 15snginx-2601814895-znhbr 1/1 Running 0 15s
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) AGEkubernetes ClusterIP 10.247.0.1 <none> 443/TCP 4d8hnginx-nodeport NodePort 10.247.30.40 <none> 8080:30000/TCP 18s
Создайте контейнер в кластере и обратитесь к нему, используя IP-address-of-the-node: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>/ #