Введение
В этом руководстве вы получите всестороннее представление о Сервисах Kubernetes, фундаментальном понятии в экосистеме Kubernetes. Вы узнаете о различных типах Сервисов, о том, как предоставить доступ к вашим приложениям в сеть, а также о продвинутых концепциях, связанных с Сервисами Kubernetes.
Введение в Сервисы Kubernetes
Сервисы Kubernetes - это фундаментальное понятие в экосистеме Kubernetes, которое позволяет предоставить доступ к приложениям, выполняющимся в Pods, в сеть. Сервисы абстрагируют нижележащие Pods, позволяя клиентам подключаться к приложению без необходимости знать детали о Pods.
Типы Сервисов Kubernetes
Kubernetes предлагает несколько типов Сервисов, чтобы удовлетворить разные требования к сети:
- ClusterIP: Это стандартный тип Сервиса, который экспонирует Сервис по внутреннему IP-адресу кластера. Этот тип Сервиса доступен только внутри кластера.
graph LR
Client --> ClusterIP
ClusterIP --> Pods
- NodePort: Этот тип Сервиса экспонирует приложение по IP-адресу каждого узла, используя статический порт. Это позволяет внешним клиентам получать доступ к приложению извне кластера.
graph LR
Client --> NodePort
NodePort --> Nodes
Nodes --> Pods
- LoadBalancer: Этот тип Сервиса настраивает балансировщик нагрузки для приложения, обычно в облачных средах. Балансировщик нагрузки распределяет трафик между Pods.
graph LR
Client --> LoadBalancer
LoadBalancer --> Nodes
Nodes --> Pods
- ExternalName: Этот тип Сервиса сопоставляет Сервис с DNS-имя, не имея никаких Pods или конечных точек. Это полезно для интеграции с внешними сервисами.
Компоненты Сервиса
Kubernetes Service состоит из нескольких ключевых компонентов:
- Selector: Selector - это набор меток, которые определяют, какие Pods будут частью Сервиса.
- Port: Порт, по которому будет доступен Сервис.
- TargetPort: Порт, на котором Pods ожидают подключений.
- ClusterIP: Внутренний IP-адрес, назначенный Сервису.
- 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.


