← К программе курса

Модуль 8 / 19

Ingress и Gateway API

KUBERNETES

Содержание
01

1. Цели модуля

Вы научитесь различать Service, Ingress и Gateway API, работать с GatewayClass, Gateway и HTTPRoute и диагностировать отклонённый маршрут.

02

2. Теория: Ingress и Gateway API

Ingress API остаётся доступным, но его спецификация заморожена. ingress-nginx выведен из сопровождения в марте 2026 года и больше не получает security fixes; для новых систем выбирайте поддерживаемую Gateway API implementation.

GatewayClass задаёт controller, Gateway — listeners платформы, HTTPRoute — правила приложения. CRDs без controller не создают data plane.

03

3. Теория: маршрутизация и границы доступа

Listener ограничивает protocol, port, hostname и namespaces. HTTPRoute через parentRefs сопоставляет hostname/path и направляет запрос в Service.

allowedRoutes управляет присоединением routes, а backend другого namespace требует ReferenceGrant. Conditions Accepted, Programmed и ResolvedRefs являются главным контрактом диагностики.

04

4. Методические указания

  • Выбирайте поддерживаемую conformant implementation
  • Фиксируйте версии controller и CRDs
  • Предпочитайте Same или namespace selector вместо All
  • Читайте Conditions до controller logs
  • Проверяйте Host header и SNI
  • Не переносите vendor annotations без проверки
05

5. Лабораторная работа: controller

Для kind используем учебный cloud-provider-kind v0.11.1. Docker socket даёт высокие полномочия, поэтому этот способ не предназначен для production.

terminal
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-kind
06

6. Лабораторная работа: Gateway и HTTPRoute

Сохраните манифест как gateway-lab.yaml.

terminal
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}]
terminal
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.

07

7. Диагностика: BackendNotFound

Сломайте backend reference и подтвердите ResolvedRefs=False с reason BackendNotFound.

terminal
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.

08

8. Контроль и шпаргалка

  • Почему HTTPRoute не работает без controller?
  • Кому принадлежат Gateway и HTTPRoute?
  • Когда нужен ReferenceGrant?
  • Чем Programmed отличается от Accepted?

Модуль освоен, если вы прослеживаете listener → route → ServiceEndpointSlice и исправляете BackendNotFound.

PDF для работы офлайн

Скачайте оформленную версию модуля для чтения без подключения к сети.

Скачать PDFPDF