Перейти до вмісту

Модуль 3.5: Gateway API

Hands-On Lab Available
K8s Cluster advanced 40 min
Launch Lab ↗

Opens in Killercoda in a new tab

Складність: [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 Ключові відмінності»
АспектIngressGateway API
Ресурси1 (Ingress)Декілька (Gateway, HTTPRoute тощо)
ПротоколиHTTP/HTTPSHTTP, HTTPS, TCP, UDP, TLS, gRPC
Рольова модельОдин ресурсРозділення за ролями
РозширюваністьАнотації (непортативні)Типізовані розширення (портативні)
Маршрутизація за заголовкамиЗалежить від контролераНативна підтримка
Розподіл трафікуЗалежить від контролераНативна підтримка
СтатусStableGA з v1.0 (жовт. 2023)

1.2 Ієрархія ресурсів

Розділ «1.2 Ієрархія ресурсів»
┌────────────────────────────────────────────────────────────────┐
│ Gateway API Resource Model │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ GatewayClass │ │
│ │ (Визначає контролер — як IngressClass) │ │
│ │ Створює: постачальник інфраструктури │ │
│ └─────────────────────────┬───────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Gateway │ │
│ │ (Інфраструктура — слухачі, адреси) │ │
│ │ Створює: оператор кластера │ │
│ └─────────────────────────┬───────────────────────────────┘ │
│ │ │
│ ┌─────────────┼─────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │HTTPRoute │ │TCPRoute │ │GRPCRoute │ │
│ │ │ │ │ │ │ │
│ │ Команда │ │ Команда │ │ Команда │ │
│ │ застос. │ │ застос. │ │ застос. │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Сервіси │ │ Сервіси │ │ Сервіси │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
└────────────────────────────────────────────────────────────────┘
РольРесурсиОбов’язки
Постачальник інфраструктуриGatewayClassВизначає спосіб реалізації шлюзів
Оператор кластераGateway, ReferenceGrantНалаштовує інфраструктуру, мережеві політики
Розробник застосунківHTTPRoute, TCPRouteВизначає правила маршрутизації для застосунків

Частина 2: Встановлення Gateway API

Розділ «Частина 2: Встановлення Gateway API»
Terminal window
# 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 installed
kubectl get crd | grep gateway
# gatewayclasses.gateway.networking.k8s.io
# gateways.gateway.networking.k8s.io
# httproutes.gateway.networking.k8s.io

2.2 Варіанти контролерів Gateway

Розділ «2.2 Варіанти контролерів Gateway»
КонтролерТипНайкраще підходить для
IstioService meshПовнофункціональний, для користувачів service mesh
ContourАвтономнийПростий, швидкий
nginxАвтономнийЗнайомий користувачам nginx
CiliumІнтегрований з CNIПродуктивність eBPF
TraefikАвтономнийДинамічна конфігурація

2.3 Встановлення контролера Istio Gateway (приклад)

Розділ «2.3 Встановлення контролера Istio Gateway (приклад)»
Terminal window
# Install Istio with Gateway API support
istioctl 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»
# GatewayClass - created by infrastructure provider
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: example-gateway-class
spec:
controllerName: example.io/gateway-controller
description: "Example Gateway controller"
Terminal window
# List GatewayClasses
k get gatewayclass
k get gc # Short form
# Gateway - created by cluster operator
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: example-gateway
namespace: default
spec:
gatewayClassName: example-gateway-class
listeners:
- name: http
protocol: HTTP
port: 80
allowedRoutes:
namespaces:
from: All # Allow routes from all namespaces

3.3 Gateway з кількома слухачами

Розділ «3.3 Gateway з кількома слухачами»
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: multi-listener-gateway
spec:
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 namespace

3.4 Перевірка статусу Gateway

Розділ «3.4 Перевірка статусу Gateway»
Terminal window
# Get gateway
k get gateway
k get gtw # Short form
# Describe gateway (check conditions)
k describe gateway example-gateway
# Check if gateway is ready
k get gateway example-gateway -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}'

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: simple-route
spec:
parentRefs:
- name: example-gateway # Attach to this Gateway
rules:
- backendRefs:
- name: web-service # Target service
port: 80

4.2 Маршрутизація за шляхом

Розділ «4.2 Маршрутизація за шляхом»
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: path-route
spec:
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: 80

4.3 Маршрутизація за хостом

Розділ «4.3 Маршрутизація за хостом»
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: host-route
spec:
parentRefs:
- name: example-gateway
hostnames:
- "api.example.com"
- "api.example.org"
rules:
- backendRefs:
- name: api-service
port: 80

4.4 Маршрутизація за заголовками

Розділ «4.4 Маршрутизація за заголовками»
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: header-route
spec:
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: 80

4.5 Розподіл трафіку (Canary/Blue-Green)

Розділ «4.5 Розподіл трафіку (Canary/Blue-Green)»
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: canary-route
spec:
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/v1
kind: HTTPRoute
metadata:
name: header-filter-route
spec:
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: 80
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: rewrite-route
spec:
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: 80

5.3 Перенаправлення запиту

Розділ «5.3 Перенаправлення запиту»
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: redirect-route
spec:
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: Маршрутизація між просторами імен»

Дозволяє маршрутам в одному просторі імен посилатися на сервіси в іншому:

# In the target namespace (where the service lives)
apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
name: allow-routes-from-default
namespace: backend-ns
spec:
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 service
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: cross-ns-route
namespace: default
spec:
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/v1
kind: Gateway
metadata:
name: tls-gateway
spec:
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: All
РежимПоведінка
TerminateGateway термінує TLS, надсилає HTTP до бекендів
PassthroughGateway пропускає 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,endpoints
Terminal window
# List all Gateway API resources
k get gatewayclass,gateway,httproute
# Check Gateway status
k describe gateway example-gateway
# Check HTTPRoute status
k describe httproute my-route
# Get HTTPRoute conditions
k get httproute my-route -o jsonpath='{.status.parents[0].conditions}'
СимптомПричинаРішення
Gateway не ReadyНемає контролераВстановити контролер Gateway
HTTPRoute не прикріпленоНеправильні parentRefsПеревірити імʼя/простір імен Gateway
Помилки 404Немає відповідного правилаПеревірити конфігурацію шляху/хоста
Міжпросторова маршрутизація не працюєВідсутній ReferenceGrantСтворити ReferenceGrant

ПомилкаПроблемаРішення
Відсутні CRDРесурси не розпізнаютьсяСпочатку встановити CRD Gateway API
Неправильний gatewayClassNameGateway не обробляєтьсяТочно вказати імʼя GatewayClass
Відсутні parentRefsМаршрут не прикріпленоДодати parentRefs до HTTPRoute
Невідповідність просторів іменМіжпросторова маршрутизація не працюєСтворити ReferenceGrant
Неправильний тип шляхуМаршрути не збігаютьсяВикористовувати PathPrefix, Exact або RegularExpression

  1. Яка основна різниця між Ingress та Gateway API?

    Відповідь Gateway API використовує кілька ресурсів з рольовим розділенням (GatewayClass, Gateway, HTTPRoute) і нативно підтримує багато протоколів. Ingress використовує один ресурс і покладається на анотації для розширених можливостей.
  2. Хто зазвичай створює ресурс Gateway?

    Відповідь Оператор кластера створює Gateway. Постачальники інфраструктури створюють GatewayClass, а розробники застосунків створюють HTTPRoute.
  3. Як налаштувати розподіл трафіку (90/10) у Gateway API?

    Відповідь Використовуйте `weight` у backendRefs: ```yaml backendRefs: - name: stable weight: 90 - name: canary weight: 10 ```
  4. Для чого використовується ReferenceGrant?

    Відповідь ReferenceGrant дозволяє ресурсам в одному просторі імен посилатися на ресурси в іншому просторі імен. Наприклад, дозволяє HTTPRoute у `default` маршрутизувати до Сервісу у `backend-ns`.
  5. Як працює маршрутизація за заголовками у Gateway API?

    Відповідь Використовуйте `matches.headers` у правилах HTTPRoute: ```yaml matches: - headers: - name: X-Version value: v2 ``` Це спрямовує запити з відповідними заголовками до конкретних бекендів.

Завдання: Створити повну конфігурацію Gateway API з маршрутизацією.

Кроки:

  1. Встановити CRD Gateway API (якщо не встановлено):
Terminal window
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml
  1. Створити бекенд-сервіси:
Terminal window
k create deployment api --image=nginx
k create deployment web --image=nginx
k expose deployment api --port=80
k expose deployment web --port=80
  1. Створити GatewayClass (імітація — у реальному кластері контролер надає це):
Terminal window
cat << 'EOF' | k apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: example-class
spec:
controllerName: example.io/gateway-controller
EOF
  1. Створити Gateway:
Terminal window
cat << 'EOF' | k apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: example-gateway
spec:
gatewayClassName: example-class
listeners:
- name: http
protocol: HTTP
port: 80
allowedRoutes:
namespaces:
from: All
EOF
k get gateway
k describe gateway example-gateway
  1. Створити HTTPRoute з маршрутизацією за шляхом:
Terminal window
cat << 'EOF' | k apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: app-routes
spec:
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: 80
EOF
k get httproute
k describe httproute app-routes
  1. Створити HTTPRoute з розподілом трафіку:
Terminal window
# Create canary deployment
k create deployment api-canary --image=nginx
k expose deployment api-canary --port=80
cat << 'EOF' | k apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: canary-route
spec:
parentRefs:
- name: example-gateway
hostnames:
- "canary.example.com"
rules:
- backendRefs:
- name: api
port: 80
weight: 90
- name: api-canary
port: 80
weight: 10
EOF
  1. Переглянути всі ресурси:
Terminal window
k get gatewayclass,gateway,httproute
  1. Очищення:
Terminal window
k delete httproute app-routes canary-route
k delete gateway example-gateway
k delete gatewayclass example-class
k delete deployment api web api-canary
k delete svc api web api-canary

Критерії успіху:

  • Розуміння ієрархії ресурсів Gateway API
  • Вміння створювати Gateway та HTTPRoute
  • Вміння налаштовувати маршрутизацію за шляхом
  • Вміння налаштовувати розподіл трафіку
  • Розуміння рольової моделі

Вправа 1: Перевірка встановлення Gateway API (Ціль: 2 хвилини)

Розділ «Вправа 1: Перевірка встановлення Gateway API (Ціль: 2 хвилини)»
Terminal window
# Check CRDs
k get crd | grep gateway
# List GatewayClasses
k get gatewayclass
# List Gateways
k get gateway -A
# List HTTPRoutes
k get httproute -A

Вправа 2: Створення базового Gateway (Ціль: 3 хвилини)

Розділ «Вправа 2: Створення базового Gateway (Ціль: 3 хвилини)»
Terminal window
# Create GatewayClass
cat << 'EOF' | k apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: drill-class
spec:
controllerName: drill.io/controller
EOF
# Create Gateway
cat << 'EOF' | k apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: drill-gateway
spec:
gatewayClassName: drill-class
listeners:
- name: http
protocol: HTTP
port: 80
allowedRoutes:
namespaces:
from: All
EOF
# Verify
k get gateway drill-gateway
k describe gateway drill-gateway
# Cleanup
k delete gateway drill-gateway
k delete gatewayclass drill-class

Вправа 3: HTTPRoute з маршрутизацією за шляхом (Ціль: 4 хвилини)

Розділ «Вправа 3: HTTPRoute з маршрутизацією за шляхом (Ціль: 4 хвилини)»
Terminal window
# Create services
k create deployment svc1 --image=nginx
k create deployment svc2 --image=nginx
k expose deployment svc1 --port=80
k expose deployment svc2 --port=80
# Create Gateway and GatewayClass
cat << 'EOF' | k apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: path-class
spec:
controllerName: path.io/controller
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: path-gateway
spec:
gatewayClassName: path-class
listeners:
- name: http
protocol: HTTP
port: 80
allowedRoutes:
namespaces:
from: All
EOF
# Create path-based HTTPRoute
cat << 'EOF' | k apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: path-route
spec:
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: 80
EOF
# Verify
k describe httproute path-route
# Cleanup
k delete httproute path-route
k delete gateway path-gateway
k delete gatewayclass path-class
k delete deployment svc1 svc2
k delete svc svc1 svc2

Вправа 4: Розподіл трафіку (Ціль: 4 хвилини)

Розділ «Вправа 4: Розподіл трафіку (Ціль: 4 хвилини)»
Terminal window
# Create stable and canary
k create deployment stable --image=nginx
k create deployment canary --image=nginx
k expose deployment stable --port=80
k expose deployment canary --port=80
# Create Gateway resources
cat << 'EOF' | k apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: split-class
spec:
controllerName: split.io/controller
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: split-gateway
spec:
gatewayClassName: split-class
listeners:
- name: http
protocol: HTTP
port: 80
allowedRoutes:
namespaces:
from: All
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: split-route
spec:
parentRefs:
- name: split-gateway
rules:
- backendRefs:
- name: stable
port: 80
weight: 80
- name: canary
port: 80
weight: 20
EOF
# Verify
k describe httproute split-route
# Cleanup
k delete httproute split-route
k delete gateway split-gateway
k delete gatewayclass split-class
k delete deployment stable canary
k delete svc stable canary

Вправа 5: Маршрутизація за заголовками (Ціль: 4 хвилини)

Розділ «Вправа 5: Маршрутизація за заголовками (Ціль: 4 хвилини)»
Terminal window
# Create versioned services
k create deployment v1 --image=nginx
k create deployment v2 --image=nginx
k expose deployment v1 --port=80
k expose deployment v2 --port=80
# Create Gateway resources with header routing
cat << 'EOF' | k apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: header-class
spec:
controllerName: header.io/controller
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: header-gateway
spec:
gatewayClassName: header-class
listeners:
- name: http
protocol: HTTP
port: 80
allowedRoutes:
namespaces:
from: All
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: header-route
spec:
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: 80
EOF
# Verify
k describe httproute header-route
# Cleanup
k delete httproute header-route
k delete gateway header-gateway
k delete gatewayclass header-class
k delete deployment v1 v2
k delete svc v1 v2

Вправа 6: Маршрутизація за хостом (Ціль: 4 хвилини)

Розділ «Вправа 6: Маршрутизація за хостом (Ціль: 4 хвилини)»
Terminal window
# Create services
k create deployment api --image=nginx
k create deployment web --image=nginx
k expose deployment api --port=80
k expose deployment web --port=80
# Create Gateway with host routing
cat << 'EOF' | k apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: host-class
spec:
controllerName: host.io/controller
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: host-gateway
spec:
gatewayClassName: host-class
listeners:
- name: http
protocol: HTTP
port: 80
allowedRoutes:
namespaces:
from: All
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: api-route
spec:
parentRefs:
- name: host-gateway
hostnames:
- "api.example.com"
rules:
- backendRefs:
- name: api
port: 80
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: web-route
spec:
parentRefs:
- name: host-gateway
hostnames:
- "www.example.com"
rules:
- backendRefs:
- name: web
port: 80
EOF
# Verify
k get httproute
# Cleanup
k delete httproute api-route web-route
k delete gateway host-gateway
k delete gatewayclass host-class
k delete deployment api web
k delete svc api web

Вправа 7: Виклик — повна конфігурація Gateway API

Розділ «Вправа 7: Виклик — повна конфігурація Gateway API»

Без підглядання у рішення:

  1. Встановити CRD Gateway API (за потреби)
  2. Створити GatewayClass з імʼям challenge-class
  3. Створити Gateway з імʼям challenge-gateway на порту 80
  4. Створити розгортання: frontend, backend, admin
  5. Створити HTTPRoutes:
    • /admin → сервіс admin
    • /api → сервіс backend
    • / → сервіс frontend
  6. Перевірити, що всі ресурси створені
  7. Очистити все
Terminal window
# YOUR TASK: Complete in under 8 minutes
Рішення
Terminal window
# 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 Gateway
cat << 'EOF' | k apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: challenge-class
spec:
controllerName: challenge.io/controller
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: challenge-gateway
spec:
gatewayClassName: challenge-class
listeners:
- name: http
protocol: HTTP
port: 80
allowedRoutes:
namespaces:
from: All
EOF
# 4. Create deployments and services
k create deployment frontend --image=nginx
k create deployment backend --image=nginx
k create deployment admin --image=nginx
k expose deployment frontend --port=80
k expose deployment backend --port=80
k expose deployment admin --port=80
# 5. Create HTTPRoutes
cat << 'EOF' | k apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: challenge-routes
spec:
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: 80
EOF
# 6. Verify
k get gatewayclass,gateway,httproute
# 7. Cleanup
k delete httproute challenge-routes
k delete gateway challenge-gateway
k delete gatewayclass challenge-class
k delete deployment frontend backend admin
k delete svc frontend backend admin

Модуль 3.6: Network Policies — Контроль взаємодії між подами.