Модуль 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 для роботи офлайн
Завантажте оформлену версію модуля для читання без підключення до мережі.