Advanced

NodePort

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

Сценарий

Сервис доступен по 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

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

    • Имя сервиса: Укажите имя сервиса, которое может совпадать с именем рабочей нагрузки.
    • Тип сервиса: Выберите 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.

  4. Щелкните OK.

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

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

  1. Используйте kubectl для доступа к кластеру. Подробнее см. Доступ к кластеру с помощью kubectl.
  2. Создайте и отредактируйте nginx-deployment.yaml файл для настройки примерной рабочей нагрузки. Подробнее см. Создание 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 файл для настройки параметров сервиса. 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 создан:

    # kubectl get svc
    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, вы также можете использовать 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>
      / #