Модуль 8 / 19
Ingress и Gateway API
Содержание
1. Цели модуля
Вы научитесь различать Service, Ingress и Gateway API, работать с GatewayClass, Gateway и HTTPRoute и диагностировать отклонённый маршрут.
2. Теория: Ingress и Gateway API
Ingress API остаётся доступным, но его спецификация заморожена. ingress-nginx выведен из сопровождения в марте 2026 года и больше не получает security fixes; для новых систем выбирайте поддерживаемую Gateway API implementation.
GatewayClass задаёт controller, Gateway — listeners платформы, HTTPRoute — правила приложения. CRDs без controller не создают data plane.
3. Теория: маршрутизация и границы доступа
Listener ограничивает protocol, port, hostname и namespaces. HTTPRoute через parentRefs сопоставляет hostname/path и направляет запрос в Service.
allowedRoutes управляет присоединением routes, а backend другого namespace требует ReferenceGrant. Conditions Accepted, Programmed и ResolvedRefs являются главным контрактом диагностики.
4. Методические указания
- Выбирайте поддерживаемую conformant implementation
- Фиксируйте версии controller и CRDs
- Предпочитайте Same или namespace selector вместо All
- Читайте Conditions до controller logs
- Проверяйте Host header и SNI
- Не переносите vendor annotations без проверки
5. Лабораторная работа: controller
Для kind используем учебный cloud-provider-kind v0.11.1. Docker socket даёт высокие полномочия, поэтому этот способ не предназначен для production.
docker run -d --name cloud-provider-kind --rm --network host -v /var/run/docker.sock:/var/run/docker.sock registry.k8s.io/cloud-provider-kind/cloud-controller-manager:v0.11.1
docker logs cloud-provider-kind
kubectl get gatewayclass cloud-provider-kind6. Лабораторная работа: Gateway и HTTPRoute
Сохраните манифест как gateway-lab.yaml.
apiVersion: v1
kind: Namespace
metadata: {name: lab-gateway}
---
apiVersion: apps/v1
kind: Deployment
metadata: {name: echo, namespace: lab-gateway}
spec:
replicas: 2
selector:
matchLabels: {app: echo}
template:
metadata:
labels: {app: echo}
spec:
containers:
- name: echo
image: registry.k8s.io/gateway-api/echo-basic:v20251204-v1.4.1
---
apiVersion: v1
kind: Service
metadata: {name: echo, namespace: lab-gateway}
spec:
selector: {app: echo}
ports: [{name: http, port: 3000, targetPort: 3000}]
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata: {name: course, namespace: lab-gateway}
spec:
gatewayClassName: cloud-provider-kind
listeners:
- {name: http, protocol: HTTP, port: 80, hostname: "*.course.test", allowedRoutes: {namespaces: {from: Same}}}
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata: {name: echo, namespace: lab-gateway}
spec:
parentRefs: [{name: course}]
hostnames: [app.course.test]
rules:
- matches:
- path: {type: PathPrefix, value: /}
backendRefs: [{name: echo, port: 3000}]kubectl apply -f gateway-lab.yaml
kubectl rollout status deployment/echo -n lab-gateway --timeout=120s
kubectl wait gateway/course -n lab-gateway --for=condition=Programmed --timeout=120s
kubectl get gateway,httproute -n lab-gateway
kubectl get httproute echo -n lab-gateway -o jsonpath='{range .status.parents[*].conditions[*]}{.type}{"="}{.status}{" reason="}{.reason}{"\n"}{end}'
curl --fail -H 'Host: app.course.test' "http://$(kubectl get gateway course -n lab-gateway -o jsonpath='{.status.addresses[0].value}')/"Критерий: Gateway Programmed=True с address, route Accepted=True и ResolvedRefs=True, curl получает ответ echo.
7. Диагностика: BackendNotFound
Сломайте backend reference и подтвердите ResolvedRefs=False с reason BackendNotFound.
kubectl patch httproute echo -n lab-gateway --type=json -p='[{"op":"replace","path":"/spec/rules/0/backendRefs/0/name","value":"missing"}]'
kubectl get httproute echo -n lab-gateway -o jsonpath='{range .status.parents[*].conditions[*]}{.type}{"="}{.status}{" reason="}{.reason}{"\n"}{end}'
kubectl get service,endpointslice -n lab-gateway
kubectl describe httproute echo -n lab-gateway
docker logs --tail 100 cloud-provider-kind
kubectl patch httproute echo -n lab-gateway --type=json -p='[{"op":"replace","path":"/spec/rules/0/backendRefs/0/name","value":"echo"}]'
kubectl delete namespace lab-gateway
docker stop cloud-provider-kindЦепочка: GatewayClass → Gateway → HTTPRoute parents → listener/hostname → backendRefs/ReferenceGrant → Service/EndpointSlice → logs.
8. Контроль и шпаргалка
- Почему HTTPRoute не работает без controller?
- Кому принадлежат Gateway и HTTPRoute?
- Когда нужен ReferenceGrant?
- Чем Programmed отличается от Accepted?
Модуль освоен, если вы прослеживаете listener → route → Service → EndpointSlice и исправляете BackendNotFound.
PDF для работы офлайн
Скачайте оформленную версию модуля для чтения без подключения к сети.