# Services Сервис используется для подключения подов к внешней сети. Сервис использует метки для выбора подов. Все указанные метки должны быть на поде (дополнительные метки пода игнорируются) В сервисе - раздел selector ``` spec: replicas: 10 template: metadata: labels: project: tkb zone: prod --- apiVersion: v1 kind: Service metadata: name: tkb spec: ports: - port: 8080 selector: project: tkb zone: prod ``` **Типы сервисов** **ClusterIP** Используется для доступности подов внутри кластера. Доступность по имени сервиса. **NodePort Services** Используется для доступа приложений снаружи кластера. Добавляет указанный порт на каждую ноду. ``` apiVersion: v1 kind: Service metadata: name: skippy <<==== Registered with the internal cluster DNS (ClusterIP) spec: type: NodePort <<==== Service type ports: - port: 8080 <<==== ClusterIP port targetPort: 9000 <<==== Application port in container nodePort: 30050 <<==== External port on every cluster node (NodePort) selector: app: hello-world ``` В данном примере изнутри под доступен по порту 8080, снаружи - по порту 30050. Диапазон портов 30000-32767. **LoadBalancer Services** Используется для сервисов со стартовым диапазоном портов, наиболее часто. ``` apiVersion: v1 kind: Service metadata: name: lb <<==== Registered with cluster DNS spec: type: LoadBalancer ports: - port: 8080 <<==== Load balancer port targetPort: 9000 <<==== Application port inside container selector: project: tkb ``` Мой кубер использует flannel, а для корректной работы LoadBalancer нужен балансировщик, например MetalLB. Стек в случае балансировщика: [![k8s_services_1.JPG](http://bobrobotirk.ru/uploads/images/gallery/2025-03/scaled-1680-/k8s-services-1.JPG)](http://bobrobotirk.ru/uploads/images/gallery/2025-03/k8s-services-1.JPG) **Headless сервисы** Сервисы без IP адреса. Их цель - создать DNS записи для StatefulSet подов. Клиенты запрашивают DNS имена подов и направляют непосредственно им запросы вместо использования кластерного IP. Пример сервиса: ``` apiVersion: v1 kind: Service <<==== Normal Kubernetes Service metadata: name: dullahan labels: app: web spec: ports: - port: 80 name: web clusterIP: None <<==== Make this a headless Service selector: app: web ``` **Структура YAML файла** Верхний уровень
ПараметрОписание
kindТип, в данном случае Service
specСпецификация
spec
ПараметрОписание
typeтип (ClusterIP, NodePort, LoadBalancer)
portsport - порт фронтенда targetPort - порт на бэке
selectorправила выбора меток
Пример yaml файла ``` apiVersion: v1 kind: Service metadata: name: cloud-lb spec: type: LoadBalancer ports: - port: 9000 targetPort: 8080 selector: chapter: services ``` **Основные команды**
КомандаДоп. пар.Описание
kubectl expose deployment dep\_name --type=LoadBalancer Ручное создание сервиса. Вот только не поехало.
kubectl get svc -o wide Информация по сервисам
kubectl get endpointslices Список ендпоинтов
kubectl describe endpointslice epname Описание ендпоинта