# Service и Ingress

> Сетевые объекты Kubernetes — Service даёт группе подов постоянный адрес и балансирует трафик, Ingress маршрутизирует внешние HTTP(S)-запросы к сервисам по домену и пути.

Источник: https://llmdocs.ru/wiki/service-ingress/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Тип**: объекты API Kubernetes (core/v1 Service, networking.k8s.io/v1 Ingress)
- **Типы Service**: ClusterIP, NodePort, LoadBalancer, ExternalName
- **Обнаружение**: DNS-имя <сервис>.<namespace>.svc.cluster.local
- **Реализация Service**: kube-proxy (iptables, IPVS, nftables) или eBPF (Cilium)
- **Ingress GA**: Kubernetes 1.19 (2020)
- **Преемник Ingress**: Gateway API (GA в октябре 2023)
- **Контроллеры Ingress**: ingress-nginx, Traefik, HAProxy, Contour, облачные
**Service** и **Ingress** — объекты [Kubernetes](https://llmdocs.ru/wiki/kubernetes.md), решающие задачу «как достучаться до приложения». [Поды](https://llmdocs.ru/wiki/pod.md) постоянно пересоздаются и каждый раз получают новый IP-адрес, поэтому обращаться к ним напрямую нельзя. **Service** даёт группе подов стабильное имя и виртуальный IP и распределяет между ними запросы.[1] **Ingress** публикует сервисы наружу по HTTP(S): направляет `api.example.com` в один сервис, `example.com/static` — в другой и завершает [TLS](https://llmdocs.ru/wiki/tls.md).[2]

## Service

Service выбирает поды по меткам — теми же селекторами, что использует [Deployment](https://llmdocs.ru/wiki/deployment-replicaset.md). Список адресов готовых подов (прошедших readiness-пробу) хранится в объектах EndpointSlice и обновляется автоматически.

```yaml
apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  selector:
    app: web
  ports:
    - port: 80          # порт сервиса
      targetPort: 8000  # порт контейнера
```

Внутри кластера к сервису обращаются по [DNS](https://llmdocs.ru/wiki/dns.md)-имени: `web` из того же пространства имён или полностью `web.prod.svc.cluster.local`.[3] За разрешение имён отвечает CoreDNS.

### Типы

| Тип | Доступен | Как работает |
|---|---|---|
| `ClusterIP` (по умолчанию) | только внутри кластера | виртуальный IP, трафик распределяется по подам |
| `NodePort` | снаружи, `IP_узла:порт` | порт из диапазона 30000–32767 открывается на всех узлах |
| `LoadBalancer` | снаружи, отдельный IP | облако или MetalLB создаёт внешний балансировщик, ведущий на NodePort |
| `ExternalName` | внутри | DNS-псевдоним (CNAME) на внешний хост |

Особый случай — **headless**-сервис (`clusterIP: None`): виртуального IP нет, DNS возвращает адреса всех подов. Его используют StatefulSet'ы, чтобы обращаться к конкретной реплике (`db-0.db`).

### Как это реализовано

Виртуальный IP сервиса не принадлежит ни одному интерфейсу. На каждом узле компонент **kube-proxy** следит за сервисами и программирует ядро — правила iptables, IPVS или nftables, — которые подменяют адрес назначения на IP одного из подов (по сути [NAT](https://llmdocs.ru/wiki/nat.md)).[4] Сетевые плагины на eBPF, например Cilium, умеют делать то же самое без kube-proxy. Балансировка работает на уровне TCP/UDP-соединений, а не отдельных HTTP-запросов (см. [Балансировка нагрузки](https://llmdocs.ru/wiki/load-balancing.md)).

## Ingress

Создавать по LoadBalancer на каждое приложение дорого и неудобно. Ingress описывает правила маршрутизации HTTP, а реализует их **Ingress-контроллер** — по сути [обратный прокси](https://llmdocs.ru/wiki/reverse-proxy.md) внутри кластера, обычно доступный через единственный LoadBalancer. Сам Kubernetes контроллер не включает — его устанавливают отдельно: ingress-nginx на базе [nginx](https://llmdocs.ru/wiki/nginx.md), Traefik, HAProxy, облачные варианты.

```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt
spec:
  ingressClassName: nginx
  tls:
    - hosts: [example.com]
      secretName: example-com-tls
  rules:
    - host: example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service: {name: api, port: {number: 80}}
          - path: /
            pathType: Prefix
            backend:
              service: {name: web, port: {number: 80}}
```

Сертификат хранится в Secret (см. [ConfigMap и Secret](https://llmdocs.ru/wiki/configmap-secret.md)); его выпуск и продление через [Let's Encrypt](https://llmdocs.ru/wiki/lets-encrypt-acme.md) автоматизирует cert-manager.

Слабое место Ingress — бедная стандартная спецификация: таймауты, переписывание путей, ограничение частоты запросов задаются аннотациями, свои у каждого контроллера, и манифесты плохо переносятся.

## Gateway API

Преемником Ingress стал **Gateway API** (версия 1.0 вышла в октябре 2023 года).[5] Он разделяет роли: оператор кластера описывает `GatewayClass` и `Gateway` (точку входа, порты, сертификаты), а команды приложений — маршруты `HTTPRoute`, `GRPCRoute`, `TLSRoute`. Разделение трафика по весам, сопоставление по заголовкам и межпространственные ссылки входят в стандарт, а не в аннотации. Ingress не удалён и продолжает работать, но новые возможности развиваются в Gateway API; проект ingress-nginx объявил о прекращении сопровождения в марте 2026 года.[6]

## Отладка

```bash
kubectl get svc,endpointslices -l app=web
kubectl describe ingress web
kubectl run tmp --rm -it --image=busybox -- wget -qO- http://web   # запрос изнутри кластера
kubectl port-forward svc/web 8080:80
```

Пустой список endpoints почти всегда означает, что селектор сервиса не совпадает с метками подов или поды не проходят readiness-пробу.

## См. также

- [Pod](https://llmdocs.ru/wiki/pod.md)
- [Service mesh](https://llmdocs.ru/wiki/service-mesh.md)
- [Сетевые плагины (CNI)](https://llmdocs.ru/wiki/cni.md)
- [Обратный прокси (reverse proxy)](https://llmdocs.ru/wiki/reverse-proxy.md)

## Источники

1. [Kubernetes Docs — Service](https://kubernetes.io/docs/concepts/services-networking/service/)
2. [Kubernetes Docs — Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/)
3. [Kubernetes Docs — DNS for Services and Pods](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/)
4. [Kubernetes Docs — Virtual IPs and Service Proxies](https://kubernetes.io/docs/reference/networking/virtual-ips/)
5. [Gateway API](https://gateway-api.sigs.k8s.io/)
6. [Kubernetes Blog — Ingress NGINX Retirement (November 2025)](https://kubernetes.io/blog/2025/11/11/ingress-nginx-retirement/)
