Сценарий
Сервис доступен по IP-адресу каждого узла на статическом порту (NodePort). При создании сервиса NodePort Kubernetes автоматически выделяет внутренний IP-адрес (ClusterIP) кластера. Когда клиенты за пределами кластера обращаются к <NodeIP>:<NodePort>, трафик будет перенаправлен к целевому pod через ClusterIP сервиса NodePort.
Рисунок 1 Доступ NodePort

Примечания и ограничения
- По умолчанию доступ к сервису NodePort осуществляется внутри VPC. Чтобы использовать EIP для доступа к сервису NodePort через публичные сети, привяжите EIP к узлу в кластере заранее.
- После создания сервиса, если настройка affinity переключена с уровня кластера на уровень узла, таблица трассировки соединений не будет очищена. Не изменяйте настройку affinity сервиса после его создания. Чтобы изменить её, создайте сервис заново.
- В кластере CCE Turbo поддержка affinity на уровне узла доступна только когда бекенд сервиса подключён к pod с hostNetwork.
- В режиме сети VPC, когда контейнер A публикуется через сервис NodePort и affinity сервиса установлен на уровень узла (то есть, externalTrafficPolicy установлен на local), контейнер B, развернутый на том же узле, не может получить доступ к контейнеру A через IP-адрес узла и сервис NodePort.
- Когда сервис NodePort создаётся в кластере версии v1.21.7 или новее, порт на узле не отображается с помощью netstat по умолчанию. Если режим переадресации кластера установлен в iptables, выполните команду iptables -t nat -L для просмотра порта. Если режим переадресации кластера установлен в IPVS, выполните команду ipvsadm -Ln для просмотра порта.
Создание сервиса NodePort
- Войдите в консоль CCE и щёлкните название кластера, чтобы открыть консоль кластера.
- В навигационной панели выберите Services & Ingresses. В правом верхнем углу щёлкните Создать сервис.
- Настройте параметры доступа внутри кластера.
- Имя сервиса: Укажите имя сервиса, которое может совпадать с именем рабочей нагрузки.
- Тип сервиса: Выберите NodePort.
- Пространство имён: пространство имён, к которому относится рабочая нагрузка.
- Service Affinity: For details, see externalTrafficPolicy (Service Affinity).
- Уровень кластера: IP-адреса и порты доступа всех узлов кластера могут обращаться к рабочей нагрузке, связанной с сервисом. Доступ к сервису приводит к потере производительности из‑за переадресации маршрутов, и исходный IP-адрес клиента не может быть получен.
- Уровень узла: Только IP-адрес и порт доступа узла, на котором размещена рабочая нагрузка, могут обращаться к рабочей нагрузке, связанной с сервисом. Доступ к сервису не приводит к потере производительности из‑за переадресации маршрутов, и исходный IP-адрес клиента может быть получен.
- Селектор: Добавьте метку и щёлкните Подтвердить. Сервис будет использовать эту метку для выбора pod. Вы также можете щелкнуть Ссылка на метку рабочей нагрузки чтобы использовать метку существующей рабочей нагрузки. В отображаемом диалоговом окне выберите рабочую нагрузку и щёлкните OK.
- IPv6: Эта функция отключена по умолчанию. После её включения IP-адрес сервиса в кластере меняется на IPv6. Этот параметр доступен только в кластерах версии v1.15 и новее с включённым IPv6 (устанавливается при создании кластера).
- Порты
- Протокол: протокол, используемый сервисом.
- Порт сервиса: порт, используемый сервисом. Диапазон номеров портов от 1 до 65535.
- Порт контейнера: порт прослушивания рабочей нагрузки. Например, Nginx использует порт 80 по умолчанию.
- Порт узла: Рекомендуется выбрать Auto. Вы также можете указать порт. Порт по умолчанию находится в диапазоне от 30000 до 32767.
- Щелкните OK.
Использование kubectl
Вы можете настроить доступ к сервису с помощью kubectl. В этом разделе в качестве примера используется рабочая нагрузка Nginx, чтобы описать, как настроить сервис NodePort с помощью kubectl.
- Используйте kubectl для доступа к кластеру. Подробнее см. Доступ к кластеру с помощью kubectl.
- Создайте и отредактируйте nginx-deployment.yaml файл для настройки примерной рабочей нагрузки. Подробнее см. Создание Deployment. nginx-deployment.yaml это пример имени файла. При необходимости вы можете его переименовать.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 - Создайте и отредактируйте nginx-nodeport-svc.yaml файл для настройки параметров сервиса. nginx-nodeport-svc.yaml это пример имени файла. При необходимости вы можете его переименовать.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 - Создать Service.kubectl create -f nginx-nodeport-svc.yaml
Если отображается информация, аналогичная следующей, Service создаётся:
service/nginx-nodeport createdПроверьте созданный Service.
kubectl get svcЕсли отображается информация, аналогичная следующей, Service создан:
# kubectl get svcNAME 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 - Получить доступ к Service. По умолчанию Service типа NodePort можно получить доступ, используя IP-address-of-any-node:node-port. Серверы облака в том же VPC или контейнеры в кластере могут получить доступ к Service. Если к узлу привязан EIP, вы также можете использовать EIP для доступа к Service.
Создать контейнер в кластере и получить к нему доступ, используя IP-address-of-the-node:node-port.
- Получить IP-адрес узла.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 - Создать pod и получить доступ к его контейнеру.kubectl run -i --tty --image nginx:alpine test --rm /bin/sh
- Запустите 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 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>/ #
- Получить IP-адрес узла.