Как сопоставить порты в сервисе Kubernetes

KubernetesKubernetesBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом руководстве вы получите всестороннее представление о Сервисах Kubernetes, фундаментальном понятии в экосистеме Kubernetes. Вы узнаете о различных типах Сервисов, о том, как предоставить доступ к вашим приложениям в сеть, а также о продвинутых концепциях, связанных с Сервисами Kubernetes.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/BasicCommandsGroup -.-> kubernetes/expose("Expose") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/port_forward("Port-Forward") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/config("Config") subgraph Lab Skills kubernetes/get -.-> lab-418977{{"Как сопоставить порты в сервисе Kubernetes"}} kubernetes/create -.-> lab-418977{{"Как сопоставить порты в сервисе Kubernetes"}} kubernetes/expose -.-> lab-418977{{"Как сопоставить порты в сервисе Kubernetes"}} kubernetes/apply -.-> lab-418977{{"Как сопоставить порты в сервисе Kubernetes"}} kubernetes/describe -.-> lab-418977{{"Как сопоставить порты в сервисе Kubernetes"}} kubernetes/port_forward -.-> lab-418977{{"Как сопоставить порты в сервисе Kubernetes"}} kubernetes/config -.-> lab-418977{{"Как сопоставить порты в сервисе Kubernetes"}} end

Введение в Сервисы Kubernetes

Сервисы Kubernetes - это фундаментальное понятие в экосистеме Kubernetes, которое позволяет предоставить доступ к приложениям, выполняющимся в Pods, в сеть. Сервисы абстрагируют нижележащие Pods, позволяя клиентам подключаться к приложению без необходимости знать детали о Pods.

Типы Сервисов Kubernetes

Kubernetes предлагает несколько типов Сервисов, чтобы удовлетворить разные требования к сети:

  1. ClusterIP: Это стандартный тип Сервиса, который экспонирует Сервис по внутреннему IP-адресу кластера. Этот тип Сервиса доступен только внутри кластера.
graph LR Client --> ClusterIP ClusterIP --> Pods
  1. NodePort: Этот тип Сервиса экспонирует приложение по IP-адресу каждого узла, используя статический порт. Это позволяет внешним клиентам получать доступ к приложению извне кластера.
graph LR Client --> NodePort NodePort --> Nodes Nodes --> Pods
  1. LoadBalancer: Этот тип Сервиса настраивает балансировщик нагрузки для приложения, обычно в облачных средах. Балансировщик нагрузки распределяет трафик между Pods.
graph LR Client --> LoadBalancer LoadBalancer --> Nodes Nodes --> Pods
  1. ExternalName: Этот тип Сервиса сопоставляет Сервис с DNS-имя, не имея никаких Pods или конечных точек. Это полезно для интеграции с внешними сервисами.

Компоненты Сервиса

Kubernetes Service состоит из нескольких ключевых компонентов:

  1. Selector: Selector - это набор меток, которые определяют, какие Pods будут частью Сервиса.
  2. Port: Порт, по которому будет доступен Сервис.
  3. TargetPort: Порт, на котором Pods ожидают подключений.
  4. ClusterIP: Внутренний IP-адрес, назначенный Сервису.
  5. Type: Тип Сервиса, как описано ранее.

Вот пример конфигурации Сервиса:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080
  type: LoadBalancer

В этом примере Сервис будет экспонировать Pods с меткой app: my-app на порту 80, перенаправляя трафик на порт 8080 Pods.

Публикация приложений Kubernetes

После определения Сервиса Kubernetes следующим шагом является публикация вашего приложения для внешнего мира. Kubernetes предоставляет несколько способов достичь этого, каждый из которых имеет свои преимущества и области применения.

Сервис NodePort

Тип Сервиса NodePort экспонирует приложение по IP-адресу каждого узла, используя статический порт. Это позволяет внешним клиентам получать доступ к приложению извне кластера. Вот пример:

apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080

В этом примере Сервис будет доступен по IP-адресу каждого узла, используя случайно назначенный порт в диапазоне от 30000 до 32767.

Сервис LoadBalancer

Тип Сервиса LoadBalancer настраивает балансировщик нагрузки для приложения, обычно в облачных средах. Балансировщик нагрузки распределяет трафик между Pods. Вот пример:

apiVersion: v1
kind: Service
metadata:
  name: my-loadbalancer-service
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080

В этом примере провайдер облака настроит балансировщик нагрузки и конфигурирует его для распределения трафика между Pods.

Ingress

Ingress - это Kubernetes-ресурс, который предоставляет расширенные возможности маршрутизации и балансировки нагрузки. Ingress позволяет опубликовать несколько Сервисов под одним IP-адресом и обрабатывать такие функции, как SSL/TLS-терминирование, маршрутизация по путям и другие. Вот пример конфигурации Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: my-api-service
                port:
                  number: 80
          - path: /web
            pathType: Prefix
            backend:
              service:
                name: my-web-service
                port:
                  number: 80

В этом примере Ingress публикует два разных Сервиса, /api и /web, в домене example.com.

Продвинутые концепции Сервисов Kubernetes

Хотя базовые типы Сервисов Kubernetes покрывают многие сценарии использования, существуют некоторые продвинутые концепции, которые могут обеспечить большую гибкость и контроль над сетевым взаимодействием вашего приложения.

Обнаружение сервисов

Kubernetes предоставляет встроенные механизмы обнаружения сервисов, позволяя Pods находить и взаимодействовать друг с другом. Это достигается с использованием переменных окружения и сервера DNS Kubernetes.

При создании нового Сервиса Kubernetes автоматически назначает ему DNS-имя в формате <service - name>.<namespace>.svc.cluster.local. Затем Pods могут использовать это DNS-имя для подключения к Сервису.

Kubernetes также внедряет переменные окружения для каждого Сервиса, такие как MY_SERVICE_HOST и MY_SERVICE_PORT, которые Pods могут использовать для подключения к Сервису.

Сетевые взаимодействия сервисов

Kubernetes использует компонент kube - proxy для обработки сетевого взаимодействия Сервисов. kube - proxy отвечает за настройку необходимых правил iptables и转发 трафика на соответствующие Pods.

Kubernetes поддерживает несколько моделей сетевого взаимодействия, такие как iptables и ipvs, которые можно настроить в соответствии с вашими требованиями.

Масштабирование сервисов

Сервисы Kubernetes могут автоматически масштабироваться вверх и вниз в зависимости от количества доступных Pods. Когда вы масштабируете свое приложение, добавляя или удаляя Pods, Сервис автоматически调整ит свою балансировку нагрузки для распределения трафика соответственно.

Вы также можете настроить продвинутые параметры масштабирования, такие как горизонтальное масштабирование Pods, чтобы автоматически масштабировать ваше приложение на основе метрик, таких как загрузка ЦП или пользовательские метрики.

Вот пример горизонтального масштабирования Pods:

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: my - hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my - app
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 50

В этом примере горизонтальный масштабировщик Pods автоматически масштабирует развертывание my - app между 2 и 10 Pods в зависимости от средней загрузки ЦП Pods.

Резюме

В этом руководстве вы узнали о различных типах Сервисов Kubernetes, включая ClusterIP, NodePort и LoadBalancer, и о том, как их можно использовать для публикации ваших приложений в сеть. Вы также изучили ключевые компоненты Сервиса Kubernetes и способы их настройки. Изучение Сервисов Kubernetes позволяет эффективно управлять и публиковать приложения, выполняющиеся в Pods, и позволяет клиентам подключаться к вашему приложению без необходимости знать детали о нижележащих Pods.