← До програми курсу

Модуль 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