uz
BK
июня 23, 2025
Обновлено июня 23, 2025

Что такое Kubernetes services?

Kubernetes

В предыдущей статье Как развернуть и управлять Kubernetes? мы рассмотрели основы Kubernetes: его архитектуру, ключевые компоненты (такие как Pod, Deployment, Service), а также общие принципы развертывания и управления кластером. Теперь перейдем к углубленному изучению работы с подами (Pod) — минимальными исполняемыми единицами в Kubernetes. Для эффективного управления их взаимодействием и доступностью в Kubernetes используются сервисы (Services), чье общее назначение уже упоминалось ранее.

В этой статье мы детально разберем функционал сервисов на практических примерах: рассмотрим их типы (ClusterIP, NodePort, LoadBalancer), конфигурации в YAML-манифестах, а также сценарии использования для обеспечения стабильной коммуникации между компонентами приложения.

Снова о Kubernetes services

Для начала, вспомним, что такое Kubernetes services. Кратко это объекты, обеспечивающие стабильный доступ к приложениям в кластере, даже если поды (Pods) динамически меняются. Более подробно Kubernetes services — это ключевой механизм, обеспечивающий стабильную сетевую коммуникацию между компонентами приложений в условиях динамически изменяющейся среды кластера. Если кратко, Services выступают как «постоянные точки входа» к группе Pod’ов, даже если сами Pod’ы пересоздаются, масштабируются или перемещаются между узлами. На изображении ниже приведены основные типы Services в K8s:

K8s services
Рисунок 1 – K8s services

Проблемы решаемы K8s Services:

Так как Pod’ы в Kubernetes — эфемерны: их IP-адреса меняются при перезапуске, масштабировании или обновлении. Это создает сложности для компонентов приложения (например, фронтенда и бэкенда), которым требуется стабильный способ взаимодействия.

Именно Services, решает данные проблемы через следующие несколько действий:

  • Фиксированные идентификаторы – Service назначает стабильный IP-адрес (ClusterIP), DNS-имя или внешний IP, которые не зависят от «жизненного цикла» Pod’ов.
  • Балансировка нагрузки – Трафик автоматически распределяется между Pod’ами, выбранными через метки (селекторы, например, `app: backend`).
  • Автообновление – Service динамически отслеживает изменения в наборе Pod’ов через EndpointSlices, обновляя список доступных экземпляров.

Основные типы Kubernetes Services с примерами

ClusterIP предназначен для внутреннего доступа к Pod’ам внутри кластера.

Пример конфигурации:

simple-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376

Команда для создания:

kubectl apply -f simple-service.yaml

Проверка:

kubectl get services # Просмотр ClusterIP
kubectl describe service/my-service # Детали Service и Endpoints

NodePort предназначен для внешнего доступа через статический порт на nodes(30000-32767).

Пример конфигурации:

# nodeport-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app.kubernetes.io/name: MyApp
ports:
- port: 80
targetPort: 9376
nodePort: 30007 # Опционально (по умолчанию: случайный порт из диапазона)

Команда для создания:

kubectl apply -f nodeport-service.yaml

Доступ:

curl http://:30007 # Замените на node IP

LoadBalancer предназначен для публичного доступ через облачный балансировщик нагрузки.

Пример конфигурации:

# loadbalancer-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer
spec:
type: LoadBalancer
selector:
app.kubernetes.io/name: MyApp
ports:
- port: 80
targetPort: 9376

Команда для создания:

kubectl apply -f loadbalancer-service.yaml

Проверка внешнего IP:

kubectl get service/my-loadbalancer -o wide # Просмотр EXTERNAL-IP

ExternalName предназначен для cвязи с внешним ресурсом через DNS CNAME.

Пример конфигурации:

# externalname-service.yaml
apiVersion: v1
kind: Service
metadata:
name: external-db
spec:
type: ExternalName
externalName: my.database.example.com

Команда для создания:

kubectl apply -f externalname-service.yaml

Использование:
Другие Pod’ы обращаются к external-db как к DNS-имени.

Headless Service (без ClusterIP) предназначен для прямого доступа к Pod’ам без балансировки.

Пример конфигурации:

# headless-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-headless
spec:
clusterIP: None
selector:
app.kubernetes.io/name: MyApp
ports:
- port: 80
targetPort: 9376

Команда для создания:

kubectl apply -f headless-service.yaml

Проверка DNS:

nslookup my-headless.default.svc.cluster.local # Возвращает IP всех Pod’ов

Дополнительные примеры:

Конфигурация мультипортовый Service предназначена для упрощение конфигурации для приложений с несколькими портами

apiVersion: v1
kind: Service
metadata:
name: my-multi-port
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 8080
- name: metrics
protocol: TCP
port: 9090
targetPort: 9090

Команда:

kubectl apply -f multi-port-service.yaml

Конфигурация Service без селектора (ручные EndpointSlices) для интеграции с ресурсами вне Kubernetes.

Конфигурация Service:

# service-without-selector.yaml
apiVersion: v1
kind: Service
metadata:
name: my-external-service
spec:
ports:
- name: http
protocol: TCP
port: 80
targetPort: 9376

Конфигурация EndpointSlice для гибкое управление конечными точками (включая внешние системы):

# endpointslice.yaml
apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
name: my-service-1
labels:
kubernetes.io/service-name: my-external-service
addressType: IPv4
ports:
- name: http
protocol: TCP
port: 9376
endpoints:
- addresses: ["10.4.5.6"]
- addresses: ["10.1.2.3"]

Команды:

kubectl apply -f service-without-selector.yaml
kubectl apply -f endpointslice.yaml

Полезные команды:

Просмотр всех Services предназначена для просмотра списка всех Services в текущем namespace:

kubectl get services

Просмотр Endpoints предназначена для просмотра списка Endpoints — IP-адресов и портов Pod’ов, связанных с Service:

kubectl get endpoints

Проверка DNS для Service предназначена для проверки DNS-разрешений имени Service внутри Pod’а:

kubectl exec -it -- nslookup

Удаление Service предназначена для удаления Service из кластера:

kubectl delete service/
Оценка:
5 из 5
Аverage rating : 5
Оценок: 1
100029 Ташкент Улица Якка Чинар, дом 2/1
ООО «ИТГЛОБАЛКОМ ЛАБС»

Вам также может быть интересно...