Модуль 3.5: Gateway API
Складність:
[MEDIUM]— тема іспиту CKAЧас на виконання: 45–55 хвилин
Передумови: Модуль 3.4 (Ingress)
Що ви зможете робити
Розділ «Що ви зможете робити»Після цього модуля ви зможете:
- Створити ресурси Gateway, HTTPRoute та GRPCRoute для просунутого керування трафіком
- Порівняти Gateway API з Ingress та пояснити, коли використовувати кожен
- Налаштувати розділення трафіку, маршрутизацію на основі заголовків та дзеркалювання запитів
- Пояснити рольову модель Gateway API (провайдер інфраструктури, оператор кластера, розробник застосунку)
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»Gateway API — це поточний стандарт мережевої взаємодії в Kubernetes. Він усуває обмеження Ingress, надаючи багатші можливості маршрутизації, рольовий дизайн та підтримку протоколів, окрім HTTP. Іспит CKA включає Gateway API як ключову компетенцію: «Use the Gateway API to manage Ingress traffic».
Оскільки контролер ingress-nginx припинено (31 березня 2026 року), а Gateway API перебуває у статусі GA з жовтня 2023 року, Gateway API є рекомендованим підходом для всіх нових розгортань. Кожен основний контролер ingress тепер підтримує його: Envoy Gateway, Istio, Cilium, Traefik, Kong та NGINX Gateway Fabric.
Примітка щодо міграції: Якщо ви керуєте наявними ресурсами Ingress, інструмент Ingress2Gateway 1.0 (випущений у березні 2026 року) конвертує ресурси Ingress та понад 30 анотацій ingress-nginx у еквіваленти Gateway API. Див. офіційний посібник з міграції.
Аналогія з аеропортом
Якщо Ingress — це один термінал аеропорту з однією стійкою реєстрації, то Gateway API — це сучасний аеропорт з окремими структурами: оператори інфраструктури керують злітно-посадковими смугами (Gateway), авіакомпанії керують своїми стійками реєстрації (HTTPRoute), а служба безпеки відповідає за політики (policies). Кожна роль має чіткі обов’язки.
Що ви дізнаєтесь
Розділ «Що ви дізнаєтесь»Після завершення цього модуля ви зможете:
- Розуміти різницю між Ingress та Gateway API
- Створювати ресурси Gateway та HTTPRoute
- Налаштовувати маршрутизацію за шляхом та заголовками
- Розуміти рольову модель
- Використовувати Gateway API для керування трафіком
Чи знали ви?
Розділ «Чи знали ви?»-
Gateway API — це офіційний стандарт: Kubernetes SIG Network розробила Gateway API для усунення обмежень Ingress. Оскільки ingress-nginx припинено, а всі основні контролери підтримують Gateway API, він є виробничим стандартом.
-
Підтримка багатьох протоколів: На відміну від Ingress (лише HTTP), Gateway API нативно підтримує TCP, UDP, TLS та gRPC.
-
Рольовий дизайн: Gateway API розділяє зони відповідальності між постачальниками інфраструктури, операторами кластерів та розробниками застосунків.
-
Ingress2Gateway 1.0: Випущений у березні 2026 року, цей офіційний інструмент міграції конвертує ресурси Ingress (включно з понад 30 анотаціями ingress-nginx) у Gateway API. Підтримує вивід для Envoy Gateway, kgateway та інших.
Частина 1: Gateway API проти Ingress
Розділ «Частина 1: Gateway API проти Ingress»1.1 Ключові відмінності
Розділ «1.1 Ключові відмінності»| Аспект | Ingress | Gateway API |
|---|---|---|
| Ресурси | 1 (Ingress) | Декілька (Gateway, HTTPRoute тощо) |
| Протоколи | HTTP/HTTPS | HTTP, HTTPS, TCP, UDP, TLS, gRPC |
| Рольова модель | Один ресурс | Розділення за ролями |
| Розширюваність | Анотації (непортативні) | Типізовані розширення (портативні) |
| Маршрутизація за заголовками | Залежить від контролера | Нативна підтримка |
| Розподіл трафіку | Залежить від контролера | Нативна підтримка |
| Статус | Stable | GA з v1.0 (жовт. 2023) |
1.2 Ієрархія ресурсів
Розділ «1.2 Ієрархія ресурсів»┌────────────────────────────────────────────────────────────────┐│ Gateway API Resource Model ││ ││ ┌─────────────────────────────────────────────────────────┐ ││ │ GatewayClass │ ││ │ (Визначає контролер — як IngressClass) │ ││ │ Створює: постачальник інфраструктури │ ││ └─────────────────────────┬───────────────────────────────┘ ││ │ ││ ▼ ││ ┌─────────────────────────────────────────────────────────┐ ││ │ Gateway │ ││ │ (Інфраструктура — слухачі, адреси) │ ││ │ Створює: оператор кластера │ ││ └─────────────────────────┬───────────────────────────────┘ ││ │ ││ ┌─────────────┼─────────────┐ ││ │ │ │ ││ ▼ ▼ ▼ ││ ┌──────────┐ ┌──────────┐ ┌──────────┐ ││ │HTTPRoute │ │TCPRoute │ │GRPCRoute │ ││ │ │ │ │ │ │ ││ │ Команда │ │ Команда │ │ Команда │ ││ │ застос. │ │ застос. │ │ застос. │ ││ └────┬─────┘ └────┬─────┘ └────┬─────┘ ││ │ │ │ ││ ▼ ▼ ▼ ││ ┌──────────┐ ┌──────────┐ ┌──────────┐ ││ │ Сервіси │ │ Сервіси │ │ Сервіси │ ││ └──────────┘ └──────────┘ └──────────┘ ││ │└────────────────────────────────────────────────────────────────┘1.3 Рольовий дизайн
Розділ «1.3 Рольовий дизайн»| Роль | Ресурси | Обов’язки |
|---|---|---|
| Постачальник інфраструктури | GatewayClass | Визначає спосіб реалізації шлюзів |
| Оператор кластера | Gateway, ReferenceGrant | Налаштовує інфраструктуру, мережеві політики |
| Розробник застосунків | HTTPRoute, TCPRoute | Визначає правила маршрутизації для застосунків |
Частина 2: Встановлення Gateway API
Розділ «Частина 2: Встановлення Gateway API»2.1 Встановлення CRD
Розділ «2.1 Встановлення CRD»# Install Gateway API CRDs (required first)kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml
# Verify CRDs are installedkubectl get crd | grep gateway# gatewayclasses.gateway.networking.k8s.io# gateways.gateway.networking.k8s.io# httproutes.gateway.networking.k8s.io2.2 Варіанти контролерів Gateway
Розділ «2.2 Варіанти контролерів Gateway»| Контролер | Тип | Найкраще підходить для |
|---|---|---|
| Istio | Service mesh | Повнофункціональний, для користувачів service mesh |
| Contour | Автономний | Простий, швидкий |
| nginx | Автономний | Знайомий користувачам nginx |
| Cilium | Інтегрований з CNI | Продуктивність eBPF |
| Traefik | Автономний | Динамічна конфігурація |
2.3 Встановлення контролера Istio Gateway (приклад)
Розділ «2.3 Встановлення контролера Istio Gateway (приклад)»# Install Istio with Gateway API supportistioctl install --set profile=minimal
# Or for quick testing with kind/minikube, use Contour:kubectl apply -f https://projectcontour.io/quickstart/contour-gateway.yamlЧастина 3: GatewayClass та Gateway
Розділ «Частина 3: GatewayClass та Gateway»3.1 GatewayClass
Розділ «3.1 GatewayClass»# GatewayClass - created by infrastructure providerapiVersion: gateway.networking.k8s.io/v1kind: GatewayClassmetadata: name: example-gateway-classspec: controllerName: example.io/gateway-controller description: "Example Gateway controller"# List GatewayClassesk get gatewayclassk get gc # Short form3.2 Gateway
Розділ «3.2 Gateway»# Gateway - created by cluster operatorapiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata: name: example-gateway namespace: defaultspec: gatewayClassName: example-gateway-class listeners: - name: http protocol: HTTP port: 80 allowedRoutes: namespaces: from: All # Allow routes from all namespaces3.3 Gateway з кількома слухачами
Розділ «3.3 Gateway з кількома слухачами»apiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata: name: multi-listener-gatewayspec: gatewayClassName: example-gateway-class listeners: - name: http protocol: HTTP port: 80 hostname: "*.example.com" allowedRoutes: namespaces: from: All - name: https protocol: HTTPS port: 443 hostname: "*.example.com" tls: mode: Terminate certificateRefs: - name: example-tls kind: Secret allowedRoutes: namespaces: from: Same # Only routes from same namespace3.4 Перевірка статусу Gateway
Розділ «3.4 Перевірка статусу Gateway»# Get gatewayk get gatewayk get gtw # Short form
# Describe gateway (check conditions)k describe gateway example-gateway
# Check if gateway is readyk get gateway example-gateway -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}'Частина 4: HTTPRoute
Розділ «Частина 4: HTTPRoute»4.1 Простий HTTPRoute
Розділ «4.1 Простий HTTPRoute»apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: simple-routespec: parentRefs: - name: example-gateway # Attach to this Gateway rules: - backendRefs: - name: web-service # Target service port: 804.2 Маршрутизація за шляхом
Розділ «4.2 Маршрутизація за шляхом»apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: path-routespec: parentRefs: - name: example-gateway rules: - matches: - path: type: PathPrefix value: /api backendRefs: - name: api-service port: 80 - matches: - path: type: PathPrefix value: / backendRefs: - name: web-service port: 804.3 Маршрутизація за хостом
Розділ «4.3 Маршрутизація за хостом»apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: host-routespec: parentRefs: - name: example-gateway hostnames: - "api.example.com" - "api.example.org" rules: - backendRefs: - name: api-service port: 804.4 Маршрутизація за заголовками
Розділ «4.4 Маршрутизація за заголовками»apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: header-routespec: parentRefs: - name: example-gateway rules: - matches: - headers: - name: X-Version value: v2 backendRefs: - name: api-v2 port: 80 - matches: - headers: - name: X-Version value: v1 backendRefs: - name: api-v1 port: 804.5 Розподіл трафіку (Canary/Blue-Green)
Розділ «4.5 Розподіл трафіку (Canary/Blue-Green)»apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: canary-routespec: parentRefs: - name: example-gateway rules: - backendRefs: - name: api-stable port: 80 weight: 90 # 90% to stable - name: api-canary port: 80 weight: 10 # 10% to canary┌────────────────────────────────────────────────────────────────┐│ Розподіл трафіку ││ ││ Вхідний трафік (100%) ││ │ ││ ▼ ││ ┌─────────────────────────────────────────────────────────┐ ││ │ HTTPRoute │ ││ │ │ ││ │ weight: 90 weight: 10 │ ││ │ │ │ │ ││ │ ▼ ▼ │ ││ │ ┌────────┐ ┌────────┐ │ ││ │ │ Stable │ │ Canary │ │ ││ │ │ (90%) │ │ (10%) │ │ ││ │ └────────┘ └────────┘ │ ││ └─────────────────────────────────────────────────────────┘ ││ │└────────────────────────────────────────────────────────────────┘Частина 5: Фільтри HTTPRoute
Розділ «Частина 5: Фільтри HTTPRoute»5.1 Модифікація заголовків запиту
Розділ «5.1 Модифікація заголовків запиту»apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: header-filter-routespec: parentRefs: - name: example-gateway rules: - filters: - type: RequestHeaderModifier requestHeaderModifier: add: - name: X-Custom-Header value: "added-by-gateway" remove: - X-Unwanted-Header backendRefs: - name: web-service port: 805.2 Перезапис URL
Розділ «5.2 Перезапис URL»apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: rewrite-routespec: parentRefs: - name: example-gateway rules: - matches: - path: type: PathPrefix value: /old-api filters: - type: URLRewrite urlRewrite: path: type: ReplacePrefixMatch replacePrefixMatch: /new-api backendRefs: - name: api-service port: 805.3 Перенаправлення запиту
Розділ «5.3 Перенаправлення запиту»apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: redirect-routespec: parentRefs: - name: example-gateway rules: - matches: - path: type: PathPrefix value: /old-path filters: - type: RequestRedirect requestRedirect: scheme: https hostname: new.example.com statusCode: 301Частина 6: Маршрутизація між просторами імен
Розділ «Частина 6: Маршрутизація між просторами імен»6.1 ReferenceGrant
Розділ «6.1 ReferenceGrant»Дозволяє маршрутам в одному просторі імен посилатися на сервіси в іншому:
# In the target namespace (where the service lives)apiVersion: gateway.networking.k8s.io/v1beta1kind: ReferenceGrantmetadata: name: allow-routes-from-default namespace: backend-nsspec: from: - group: gateway.networking.k8s.io kind: HTTPRoute namespace: default # Allow routes from default namespace to: - group: "" kind: Service # Allow referencing services# HTTPRoute in default namespace can now reference backend-ns serviceapiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: cross-ns-route namespace: defaultspec: parentRefs: - name: example-gateway rules: - backendRefs: - name: backend-service namespace: backend-ns # Cross-namespace reference port: 80Частина 7: Налаштування TLS
Розділ «Частина 7: Налаштування TLS»7.1 Gateway з термінацією TLS
Розділ «7.1 Gateway з термінацією TLS»apiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata: name: tls-gatewayspec: gatewayClassName: example-gateway-class listeners: - name: https protocol: HTTPS port: 443 hostname: secure.example.com tls: mode: Terminate certificateRefs: - name: secure-tls # TLS secret kind: Secret allowedRoutes: namespaces: from: All7.2 Режими TLS
Розділ «7.2 Режими TLS»| Режим | Поведінка |
|---|---|
Terminate | Gateway термінує TLS, надсилає HTTP до бекендів |
Passthrough | Gateway пропускає TLS наскрізь, бекенд виконує термінацію |
Частина 8: Діагностика Gateway API
Розділ «Частина 8: Діагностика Gateway API»8.1 Послідовність діагностики
Розділ «8.1 Послідовність діагностики»Проблема з Gateway API? │ ├── kubectl get gatewayclass (перевірити контролер) │ ├── kubectl get gateway (перевірити статус) │ │ │ └── Not Ready? → Перевірити conditions │ ├── kubectl get httproute (перевірити чи прикріплено) │ │ │ └── Не прикріплено? → Перевірити parentRefs │ ├── kubectl describe httproute (перевірити conditions) │ │ │ └── Помилки? → Виправити конфігурацію │ └── Перевірити бекенд-сервіси kubectl get svc,endpoints8.2 Основні команди
Розділ «8.2 Основні команди»# List all Gateway API resourcesk get gatewayclass,gateway,httproute
# Check Gateway statusk describe gateway example-gateway
# Check HTTPRoute statusk describe httproute my-route
# Get HTTPRoute conditionsk get httproute my-route -o jsonpath='{.status.parents[0].conditions}'8.3 Типові проблеми
Розділ «8.3 Типові проблеми»| Симптом | Причина | Рішення |
|---|---|---|
| Gateway не Ready | Немає контролера | Встановити контролер Gateway |
| HTTPRoute не прикріплено | Неправильні parentRefs | Перевірити імʼя/простір імен Gateway |
| Помилки 404 | Немає відповідного правила | Перевірити конфігурацію шляху/хоста |
| Міжпросторова маршрутизація не працює | Відсутній ReferenceGrant | Створити ReferenceGrant |
Типові помилки
Розділ «Типові помилки»| Помилка | Проблема | Рішення |
|---|---|---|
| Відсутні CRD | Ресурси не розпізнаються | Спочатку встановити CRD Gateway API |
| Неправильний gatewayClassName | Gateway не обробляється | Точно вказати імʼя GatewayClass |
| Відсутні parentRefs | Маршрут не прикріплено | Додати parentRefs до HTTPRoute |
| Невідповідність просторів імен | Міжпросторова маршрутизація не працює | Створити ReferenceGrant |
| Неправильний тип шляху | Маршрути не збігаються | Використовувати PathPrefix, Exact або RegularExpression |
Тест
Розділ «Тест»-
Яка основна різниця між Ingress та Gateway API?
Відповідь
Gateway API використовує кілька ресурсів з рольовим розділенням (GatewayClass, Gateway, HTTPRoute) і нативно підтримує багато протоколів. Ingress використовує один ресурс і покладається на анотації для розширених можливостей. -
Хто зазвичай створює ресурс Gateway?
Відповідь
Оператор кластера створює Gateway. Постачальники інфраструктури створюють GatewayClass, а розробники застосунків створюють HTTPRoute. -
Як налаштувати розподіл трафіку (90/10) у Gateway API?
Відповідь
Використовуйте `weight` у backendRefs: ```yaml backendRefs: - name: stable weight: 90 - name: canary weight: 10 ``` -
Для чого використовується ReferenceGrant?
Відповідь
ReferenceGrant дозволяє ресурсам в одному просторі імен посилатися на ресурси в іншому просторі імен. Наприклад, дозволяє HTTPRoute у `default` маршрутизувати до Сервісу у `backend-ns`. -
Як працює маршрутизація за заголовками у Gateway API?
Відповідь
Використовуйте `matches.headers` у правилах HTTPRoute: ```yaml matches: - headers: - name: X-Version value: v2 ``` Це спрямовує запити з відповідними заголовками до конкретних бекендів.
Практична вправа
Розділ «Практична вправа»Завдання: Створити повну конфігурацію Gateway API з маршрутизацією.
Кроки:
- Встановити CRD Gateway API (якщо не встановлено):
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml- Створити бекенд-сервіси:
k create deployment api --image=nginxk create deployment web --image=nginxk expose deployment api --port=80k expose deployment web --port=80- Створити GatewayClass (імітація — у реальному кластері контролер надає це):
cat << 'EOF' | k apply -f -apiVersion: gateway.networking.k8s.io/v1kind: GatewayClassmetadata: name: example-classspec: controllerName: example.io/gateway-controllerEOF- Створити Gateway:
cat << 'EOF' | k apply -f -apiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata: name: example-gatewayspec: gatewayClassName: example-class listeners: - name: http protocol: HTTP port: 80 allowedRoutes: namespaces: from: AllEOF
k get gatewayk describe gateway example-gateway- Створити HTTPRoute з маршрутизацією за шляхом:
cat << 'EOF' | k apply -f -apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: app-routesspec: parentRefs: - name: example-gateway rules: - matches: - path: type: PathPrefix value: /api backendRefs: - name: api port: 80 - matches: - path: type: PathPrefix value: / backendRefs: - name: web port: 80EOF
k get httproutek describe httproute app-routes- Створити HTTPRoute з розподілом трафіку:
# Create canary deploymentk create deployment api-canary --image=nginx
k expose deployment api-canary --port=80
cat << 'EOF' | k apply -f -apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: canary-routespec: parentRefs: - name: example-gateway hostnames: - "canary.example.com" rules: - backendRefs: - name: api port: 80 weight: 90 - name: api-canary port: 80 weight: 10EOF- Переглянути всі ресурси:
k get gatewayclass,gateway,httproute- Очищення:
k delete httproute app-routes canary-routek delete gateway example-gatewayk delete gatewayclass example-classk delete deployment api web api-canaryk delete svc api web api-canaryКритерії успіху:
- Розуміння ієрархії ресурсів Gateway API
- Вміння створювати Gateway та HTTPRoute
- Вміння налаштовувати маршрутизацію за шляхом
- Вміння налаштовувати розподіл трафіку
- Розуміння рольової моделі
Практичні вправи
Розділ «Практичні вправи»Вправа 1: Перевірка встановлення Gateway API (Ціль: 2 хвилини)
Розділ «Вправа 1: Перевірка встановлення Gateway API (Ціль: 2 хвилини)»# Check CRDsk get crd | grep gateway
# List GatewayClassesk get gatewayclass
# List Gatewaysk get gateway -A
# List HTTPRoutesk get httproute -AВправа 2: Створення базового Gateway (Ціль: 3 хвилини)
Розділ «Вправа 2: Створення базового Gateway (Ціль: 3 хвилини)»# Create GatewayClasscat << 'EOF' | k apply -f -apiVersion: gateway.networking.k8s.io/v1kind: GatewayClassmetadata: name: drill-classspec: controllerName: drill.io/controllerEOF
# Create Gatewaycat << 'EOF' | k apply -f -apiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata: name: drill-gatewayspec: gatewayClassName: drill-class listeners: - name: http protocol: HTTP port: 80 allowedRoutes: namespaces: from: AllEOF
# Verifyk get gateway drill-gatewayk describe gateway drill-gateway
# Cleanupk delete gateway drill-gatewayk delete gatewayclass drill-classВправа 3: HTTPRoute з маршрутизацією за шляхом (Ціль: 4 хвилини)
Розділ «Вправа 3: HTTPRoute з маршрутизацією за шляхом (Ціль: 4 хвилини)»# Create servicesk create deployment svc1 --image=nginxk create deployment svc2 --image=nginxk expose deployment svc1 --port=80k expose deployment svc2 --port=80
# Create Gateway and GatewayClasscat << 'EOF' | k apply -f -apiVersion: gateway.networking.k8s.io/v1kind: GatewayClassmetadata: name: path-classspec: controllerName: path.io/controller---apiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata: name: path-gatewayspec: gatewayClassName: path-class listeners: - name: http protocol: HTTP port: 80 allowedRoutes: namespaces: from: AllEOF
# Create path-based HTTPRoutecat << 'EOF' | k apply -f -apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: path-routespec: parentRefs: - name: path-gateway rules: - matches: - path: type: PathPrefix value: /service1 backendRefs: - name: svc1 port: 80 - matches: - path: type: PathPrefix value: /service2 backendRefs: - name: svc2 port: 80EOF
# Verifyk describe httproute path-route
# Cleanupk delete httproute path-routek delete gateway path-gatewayk delete gatewayclass path-classk delete deployment svc1 svc2k delete svc svc1 svc2Вправа 4: Розподіл трафіку (Ціль: 4 хвилини)
Розділ «Вправа 4: Розподіл трафіку (Ціль: 4 хвилини)»# Create stable and canaryk create deployment stable --image=nginxk create deployment canary --image=nginxk expose deployment stable --port=80k expose deployment canary --port=80
# Create Gateway resourcescat << 'EOF' | k apply -f -apiVersion: gateway.networking.k8s.io/v1kind: GatewayClassmetadata: name: split-classspec: controllerName: split.io/controller---apiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata: name: split-gatewayspec: gatewayClassName: split-class listeners: - name: http protocol: HTTP port: 80 allowedRoutes: namespaces: from: All---apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: split-routespec: parentRefs: - name: split-gateway rules: - backendRefs: - name: stable port: 80 weight: 80 - name: canary port: 80 weight: 20EOF
# Verifyk describe httproute split-route
# Cleanupk delete httproute split-routek delete gateway split-gatewayk delete gatewayclass split-classk delete deployment stable canaryk delete svc stable canaryВправа 5: Маршрутизація за заголовками (Ціль: 4 хвилини)
Розділ «Вправа 5: Маршрутизація за заголовками (Ціль: 4 хвилини)»# Create versioned servicesk create deployment v1 --image=nginxk create deployment v2 --image=nginxk expose deployment v1 --port=80k expose deployment v2 --port=80
# Create Gateway resources with header routingcat << 'EOF' | k apply -f -apiVersion: gateway.networking.k8s.io/v1kind: GatewayClassmetadata: name: header-classspec: controllerName: header.io/controller---apiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata: name: header-gatewayspec: gatewayClassName: header-class listeners: - name: http protocol: HTTP port: 80 allowedRoutes: namespaces: from: All---apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: header-routespec: parentRefs: - name: header-gateway rules: - matches: - headers: - name: X-Version value: v2 backendRefs: - name: v2 port: 80 - matches: - headers: - name: X-Version value: v1 backendRefs: - name: v1 port: 80EOF
# Verifyk describe httproute header-route
# Cleanupk delete httproute header-routek delete gateway header-gatewayk delete gatewayclass header-classk delete deployment v1 v2k delete svc v1 v2Вправа 6: Маршрутизація за хостом (Ціль: 4 хвилини)
Розділ «Вправа 6: Маршрутизація за хостом (Ціль: 4 хвилини)»# Create servicesk create deployment api --image=nginxk create deployment web --image=nginxk expose deployment api --port=80k expose deployment web --port=80
# Create Gateway with host routingcat << 'EOF' | k apply -f -apiVersion: gateway.networking.k8s.io/v1kind: GatewayClassmetadata: name: host-classspec: controllerName: host.io/controller---apiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata: name: host-gatewayspec: gatewayClassName: host-class listeners: - name: http protocol: HTTP port: 80 allowedRoutes: namespaces: from: All---apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: api-routespec: parentRefs: - name: host-gateway hostnames: - "api.example.com" rules: - backendRefs: - name: api port: 80---apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: web-routespec: parentRefs: - name: host-gateway hostnames: - "www.example.com" rules: - backendRefs: - name: web port: 80EOF
# Verifyk get httproute
# Cleanupk delete httproute api-route web-routek delete gateway host-gatewayk delete gatewayclass host-classk delete deployment api webk delete svc api webВправа 7: Виклик — повна конфігурація Gateway API
Розділ «Вправа 7: Виклик — повна конфігурація Gateway API»Без підглядання у рішення:
- Встановити CRD Gateway API (за потреби)
- Створити GatewayClass з імʼям
challenge-class - Створити Gateway з імʼям
challenge-gatewayна порту 80 - Створити розгортання:
frontend,backend,admin - Створити HTTPRoutes:
/admin→ сервіс admin/api→ сервіс backend/→ сервіс frontend
- Перевірити, що всі ресурси створені
- Очистити все
# YOUR TASK: Complete in under 8 minutesРішення
# 1. CRDs (if needed)kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml
# 2-3. GatewayClass and Gatewaycat << 'EOF' | k apply -f -apiVersion: gateway.networking.k8s.io/v1kind: GatewayClassmetadata: name: challenge-classspec: controllerName: challenge.io/controller---apiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata: name: challenge-gatewayspec: gatewayClassName: challenge-class listeners: - name: http protocol: HTTP port: 80 allowedRoutes: namespaces: from: AllEOF
# 4. Create deployments and servicesk create deployment frontend --image=nginxk create deployment backend --image=nginxk create deployment admin --image=nginxk expose deployment frontend --port=80k expose deployment backend --port=80k expose deployment admin --port=80
# 5. Create HTTPRoutescat << 'EOF' | k apply -f -apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: challenge-routesspec: parentRefs: - name: challenge-gateway rules: - matches: - path: type: PathPrefix value: /admin backendRefs: - name: admin port: 80 - matches: - path: type: PathPrefix value: /api backendRefs: - name: backend port: 80 - matches: - path: type: PathPrefix value: / backendRefs: - name: frontend port: 80EOF
# 6. Verifyk get gatewayclass,gateway,httproute
# 7. Cleanupk delete httproute challenge-routesk delete gateway challenge-gatewayk delete gatewayclass challenge-classk delete deployment frontend backend admink delete svc frontend backend adminНаступний модуль
Розділ «Наступний модуль»Модуль 3.6: Network Policies — Контроль взаємодії між подами.