Поиск по сайту:

Kubernetes: ClusterIP, NodePort или Ingress? Когда использовать каждый


Kubernetes поддерживает несколько способов получения внешнего трафика в ваш кластер. ClusterIPs, NodePorts и Ingresses — это три широко используемых ресурса, каждый из которых играет роль в маршрутизации трафика. Каждый из них позволяет предоставлять услуги с уникальным набором функций и компромиссов.

Основы

Рабочие нагрузки Kubernetes по умолчанию не видны в сети. Вы делаете контейнеры доступными для внешнего мира, создавая службу. Ресурсы службы направляют трафик в контейнеры внутри модулей.

Служба — это абстрактный механизм для предоставления модулей в сети. Каждой службе назначается тип — ClusterIP, NodePort или LoadBalancer. Они определяют, как внешний трафик достигает службы.

IP кластера

ClusterIP — это служба Kubernetes по умолчанию. Ваша служба будет отображаться на ClusterIP, если вы вручную не определите другой тип.

ClusterIP обеспечивает сетевое подключение внутри вашего кластера. Обычно к нему нельзя получить доступ извне. Вы используете эти службы для внутреннего сетевого взаимодействия между вашими рабочими нагрузками.

apiVersion: v1
kind: Service
spec:
  selector:
    app: my-app
  type: ClusterIP
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP

Этот пример манифеста определяет службу ClusterIP. Трафик на порт 80 на ClusterIP будет перенаправлен на порт 80 ваших модулей (targetPort). В сервис будут добавлены модули с полем метаданных app: my-app.

Вы можете увидеть назначенный IP-адрес, запустив kubectl get services. Другие рабочие нагрузки в вашем кластере могут использовать этот IP-адрес для взаимодействия с вашей службой.

Вы можете вручную установить ClusterIP на определенный IP-адрес, используя поле spec.clusterIp:

spec:
  type: ClusterIP
  clusterIp: 123.123.123.123

Значение clusterIp должно быть действительным IP-адресом в пределах диапазона, настроенного для вашего кластера. Это определяется настройкой service-cluster-ip-range на сервере API Kubernetes.

NodePort

NodePort публично предоставляет услугу на фиксированном номере порта. Это позволяет вам получить доступ к сервису из-за пределов вашего кластера. Вам потребуется использовать IP-адрес кластера и номер NodePort, например 123.123.123.123:30000.

Создание NodePort откроет этот порт на каждом узле в вашем кластере. Kubernetes автоматически направит трафик порта на службу, с которой он связан.

Вот пример манифеста службы NodePort:

apiVersion: v1
kind: Service
spec:
  selector:
    app: my-app
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP

Определения NodePort имеют те же обязательные свойства, что и службы ClusterIP. Единственное отличие заключается в изменении на type: NodePort. Поле targetPort по-прежнему необходимо, так как порты NodePort поддерживаются службой ClusterIP.

Применение приведенного выше манифеста назначит вашему NodePort случайный номер порта из диапазона, доступного для Kubernetes. Обычно по умолчанию это порты 30000-32767. Вы можете указать порт вручную, задав поле ports.nodePort:

spec:
  ports:
    - name: http
      port: 80
      targetPort: 80
      nodePort: 32000
      protocol: TCP

Это направит трафик с порта 32000 на порт 80 в ваших модулях.

NodePorts не всегда идеально подходят для общедоступных сервисов. Они используют нестандартные порты, которые не подходят для большей части HTTP-трафика. Вы можете использовать NodePort для быстрой настройки службы для разработки или предоставления службы TCP или UDP на ее собственном порту. При обслуживании пользователей в производственной среде вместо этого вы захотите использовать альтернативу.

Вход

Ingress на самом деле является совершенно другим ресурсом для службы. Обычно вы используете входы перед вашими службами для обеспечения конфигурации маршрутизации HTTP. Они позволяют настраивать внешние URL-адреса, виртуальные хосты на основе домена, SSL и балансировку нагрузки.

Для настройки Ingress требуется, чтобы в вашем кластере существовал Ingress Controller. Доступен широкий выбор контроллеров. У большинства крупных облачных провайдеров есть собственный Ingress Controller, который интегрируется с их инфраструктурой балансировки нагрузки. nginx-ingress — это популярный автономный вариант, использующий веб-сервер NGINX в качестве обратного прокси-сервера для получения трафика к вашим службам.

Вы создаете Ingress, используя тип ресурса Ingress. Аннотация kubernetes.io/ingress.class позволяет указать, какой тип Ingress вы создаете. Это полезно, если вы используете несколько контроллеров кластера.

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /
            backend:
              serviceName: my-service
              servicePort: 80
    - host: another-example.com
      http:
        paths:
          - path: /
            backend:
              serviceName: second-service
              servicePort: 80

Этот манифест определяет две конечные точки Ingress. Первое правило host направляет трафик example.com на порт 80 в службе my-service. Второе правило настраивает another-example.com для сопоставления с модулями, которые являются частью second-service.

Вы можете настроить SSL, задав поле tls в spec Ingress:

spec:
  tls:
    - hosts:
      - example.com
      - another-example.com

Для этого вам понадобится эмитент, например Cert Manager, в вашем кластере. Эмитент получит SSL-сертификаты для ваших доменов при создании Ingress.

Входы следует использовать, когда вы хотите обрабатывать трафик из нескольких доменов и URL-адресов. Вы настраиваете свои конечные точки с помощью декларативных операторов. Контроллер Ingress предоставит ваши маршруты и сопоставит их с сервисами.

Балансировщики нагрузки

Последний тип службы — LoadBalancer. Эти сервисы автоматически интегрируются с балансировщиками нагрузки, предоставляемыми общедоступными облачными средами. Вам нужно будет настроить собственный балансировщик нагрузки, если вы самостоятельно размещаете свой кластер.

Балансировщики нагрузки используются для сопоставления внешних IP-адресов со службами в вашем кластере. В отличие от Ingress, здесь нет автоматической фильтрации или маршрутизации. Трафик на внешний IP и порт будет направляться прямо на ваш сервис. Это означает, что они подходят для всех типов трафика.

Реализация каждого балансировщика нагрузки зависит от поставщика. Некоторые облачные платформы предлагают больше возможностей, чем другие. Имейте в виду, что создание балансировщика нагрузки часто приводит к дополнительным расходам на ваш счет.

apiVersion: v1
kind: Service
spec:
  selector:
    app: my-app
  type: LoadBalancer
  loadBalancerIP: 123.123.123.123
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP

Манифесты балансировщика нагрузки похожи на другие типы служб. Трафик на указанный вами port балансировщика нагрузки будет приниматься через targetPort в ваших модулях.

Ваша облачная среда создаст новый балансировщик нагрузки для обработки вашего трафика. Некоторые провайдеры позволяют запрашивать определенный внешний IP-адрес с помощью поля spec.loadBalancerIP. Вы получите случайный IP-адрес, если он не поддерживается.

Заключение

ClusterIPs, NodePorts, Ingresses и Load Balancers направляют внешний трафик к службам в вашем кластере. Каждый из них предназначен для различных вариантов использования. Некоторые из ваших сервисов будут иметь наибольший смысл с NodePort, в то время как другим потребуется Ingress, обычно когда вы хотите предоставить URL-адрес.

Все четыре варианта работают в тандеме с более широкой концепцией «сервис». Они являются привратниками, которые обеспечивают сетевой доступ к вашим услугам. Затем эти сервисы выполняют последний прыжок в ваши модули. Два уровня абстракции полностью отделяют маршрутизацию от ваших рабочих нагрузок: ваши модули просто предоставляют порты, которые сервисы делают общедоступными.




Все права защищены. © Linux-Console.net • 2019-2024