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

Модуль 3.4: Інгрес

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

Opens in Killercoda in a new tab

Складність: [СЕРЕДНЯ] — HTTP/HTTPS маршрутизація

Час на проходження: 45-55 хвилин

Передумови: Модуль 3.1 (Сервіси), Модуль 3.3 (DNS)


Що ви зможете робити

Розділ «Що ви зможете робити»

Після цього модуля ви зможете:

  • Створити ресурси Ingress з правилами маршрутизації на основі шляхів та хостів
  • Налаштувати TLS-термінацію на Ingress за допомогою Secrets
  • Розгорнути та налаштувати Ingress controller (NGINX) і пояснити його роль відносно ресурсу Ingress
  • Дебажити збої маршрутизації Ingress, перевіряючи логи контролера, бекенд-сервіси та анотації

Чому цей модуль важливий

Розділ «Чому цей модуль важливий»

Хоча Сервіси відкривають застосунки в мережу, Інгрес забезпечує HTTP/HTTPS маршрутизацію з такими можливостями, як маршрутизація на основі шляхів, віртуальні хости та TLS-термінація. Замість того, щоб відкривати багато NodePort-ів, ви відкриваєте один Інгрес-контролер, який маршрутизує трафік на основі URL-адрес.

Іспит CKA перевіряє створення Інгресу, маршрутизацію шляхів та розуміння того, як Інгрес з’єднується з Сервісами. Вам потрібно буде швидко створювати ресурси Інгресу та налагоджувати проблеми маршрутизації.

Важливо: Завершення підтримки Ingress-NGINX Controller

Популярний ingress-nginx controller досяг кінця підтримки 31 березня 2026 року. Після цієї дати він не отримує нових релізів, виправлень помилок чи патчів безпеки. Однак сам Ingress API (networking.k8s.io/v1) НЕ застарілий і залишається повністю підтримуваним у Kubernetes. Вам варто вивчити Інгрес (він досі є на іспиті та широко використовується), але для нових розгортань використовуйте Gateway API (Модуль 3.5). Альтернативні контролери, які підтримують і Ingress, і Gateway API, включають Envoy Gateway, Traefik, Kong, Cilium та NGINX Gateway Fabric.

Якщо ви мігруєте з ingress-nginx, використовуйте інструмент Ingress2Gateway 1.0 для перетворення ресурсів Інгресу на ресурси Gateway API: kubectl krew install ingress2gateway

Аналогія з рецепцією готелю

Уявіть Інгрес як стійку рецепції готелю. Гості (HTTP-запити) прибувають через головний вхід (одна IP-адреса). Рецепціоніст (Інгрес-контролер) запитує, куди вони хочуть потрапити — Кімната 101 (шлях /api) веде до API-сервісу, Кімната 202 (шлях /web) веде до веб-сервісу. Одна точка входу, інтелектуальна маршрутизація всередині.


До кінця цього модуля ви зможете:

  • Розуміти різницю між Інгресом, LoadBalancer та NodePort
  • Створювати ресурси Інгресу з правилами шляхів та хостів
  • Налаштовувати TLS-термінацію
  • Налагоджувати проблеми маршрутизації Інгресу
  • Працювати з різними Інгрес-контролерами

  • Інгрес потребує контролер: Ресурс Інгресу сам по собі нічого не робить. Вам потрібен Інгрес-контролер (наприклад, Envoy Gateway, Traefik або Kong), щоб фактично маршрутизувати трафік.

  • Gateway API — рекомендований наступник: Gateway API (розглядається в Модулі 3.5) тепер у статусі GA і є рекомендованим стандартом для нових розгортань. Інгрес залишається підтримуваним і широко використовується, але для нових проєктів варто надавати перевагу Gateway API.

  • Один Інгрес — багато сервісів: Один ресурс Інгресу може маршрутизувати трафік до десятків бекенд-сервісів на основі шляхів та імен хостів.

  • Ingress-NGINX вже не підтримується: Колись домінантний ingress-nginx controller досяг кінця підтримки 31 березня 2026 року. Інструмент Ingress2Gateway 1.0 допомагає мігрувати наявні ресурси Інгресу на Gateway API.


Частина 1: Архітектура Інгресу

Розділ «Частина 1: Архітектура Інгресу»

1.1 Як працює Інгрес

Розділ «1.1 Як працює Інгрес»
┌────────────────────────────────────────────────────────────────┐
│ Архітектура Інгресу │
│ │
│ Зовнішній трафік │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Load Balancer / NodePort │ │
│ │ (Сервіс Інгрес-контролера) │ │
│ └────────────────────────┬────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Інгрес-контролер │ │
│ │ (nginx, traefik тощо) │ │
│ │ │ │
│ │ Читає ресурси Інгресу та налаштовує маршрутизацію │ │
│ └─────────────────────────┬────────────────────────────────┘ │
│ │ │
│ ┌─────────────┼─────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Сервіс │ │ Сервіс │ │ Сервіс │ │
│ │ /api │ │ /web │ │ /docs │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ Поди │ │ Поди │ │ Поди │ │
│ └──────┘ └──────┘ └──────┘ │
│ │
└────────────────────────────────────────────────────────────────┘

1.2 Інгрес проти інших варіантів

Розділ «1.2 Інгрес проти інших варіантів»
МожливістьNodePortLoadBalancerІнгрес
РівеньL4 (TCP/UDP)L4 (TCP/UDP)L7 (HTTP/HTTPS)
Маршрутизація шляхівНіНіТак
Віртуальні хостиНіНіТак
TLS-термінаціяНіОбмеженаТак
ВартістьБезоплатно$ за LBОдин контролер для багатьох сервісів
Зовнішній IPIP вузла:ПортIP хмарного LBIP контролера

1.3 Необхідні компоненти

Розділ «1.3 Необхідні компоненти»
КомпонентПризначенняХто створює
Інгрес-контролерФактично маршрутизує трафікАдміністратор кластера
Ресурс ІнгресуВизначає правила маршрутизаціїРозробник
Бекенд-сервісиЦільові сервісиРозробник
TLS SecretHTTPS-сертифікатиРозробник/cert-manager

Частина 2: Інгрес-контролери

Розділ «Частина 2: Інгрес-контролери»

2.1 Популярні Інгрес-контролери

Розділ «2.1 Популярні Інгрес-контролери»
КонтролерОписНайкраще для
nginxНайпоширеніший, багатий на можливостіЗагальне використання
traefikАвтоматичне виявлення, сучаснийДинамічні середовища
haproxyВисока продуктивністьВисоконавантажені сайти
contourНа основі EnvoyКористувачі service mesh
AWS ALBНативна інтеграція з AWSСередовища AWS

2.2 Встановлення nginx Інгрес-контролера (kind/minikube)

Розділ «2.2 Встановлення nginx Інгрес-контролера (kind/minikube)»
Terminal window
# Для kind
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
# Для minikube
minikube addons enable ingress
# Перевірка встановлення
kubectl get pods -n ingress-nginx
kubectl get svc -n ingress-nginx

2.3 Перевірка стану Інгрес-контролера

Розділ «2.3 Перевірка стану Інгрес-контролера»
Terminal window
# Перевірити поди
k get pods -n ingress-nginx
# Перевірити сервіс
k get svc -n ingress-nginx
# Перевірити IngressClass
k get ingressclass

Частина 3: Створення ресурсів Інгресу

Розділ «Частина 3: Створення ресурсів Інгресу»

3.1 Простий Інгрес (один Сервіс)

Розділ «3.1 Простий Інгрес (один Сервіс)»
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple-ingress
spec:
ingressClassName: nginx # Який контролер використовувати
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service # Цільовий сервіс
port:
number: 80 # Порт сервісу

3.2 Маршрутизація на основі шляхів

Розділ «3.2 Маршрутизація на основі шляхів»
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: path-ingress
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /web
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: default-service
port:
number: 80
┌────────────────────────────────────────────────────────────────┐
│ Маршрутизація на основі шляхів │
│ │
│ Запит: http://mysite.com/api/users │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Інгрес │ │
│ │ │ │
│ │ /api/* ──────────► api-service │ │
│ │ /web/* ──────────► web-service │ │
│ │ /* ──────────► default-service │ │
│ │ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────┘
PathTypeПоведінкаПриклад
ExactТільки точний збіг/api збігається з /api, але не з /api/
PrefixЗбіг за префіксом/api збігається з /api, /api/users
ImplementationSpecificВирішує контролерЗалежить від контролера

3.4 Маршрутизація на основі хостів (віртуальні хости)

Розділ «3.4 Маршрутизація на основі хостів (віртуальні хости)»
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: virtual-host-ingress
spec:
ingressClassName: nginx
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- host: web.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
┌────────────────────────────────────────────────────────────────┐
│ Маршрутизація на основі хостів │
│ │
│ api.example.com ──────────► api-service │
│ web.example.com ──────────► web-service │
│ *.example.com ──────────► default-service (якщо налашт.) │
│ │
└────────────────────────────────────────────────────────────────┘

3.5 Поєднання маршрутизації за хостом та шляхом

Розділ «3.5 Поєднання маршрутизації за хостом та шляхом»
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: combined-ingress
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
- host: admin.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: admin-service
port:
number: 80

Частина 4: Налаштування TLS/HTTPS

Розділ «Частина 4: Налаштування TLS/HTTPS»
Terminal window
# Згенерувати самопідписаний сертифікат (для тестування)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout tls.key -out tls.crt \
-subj "/CN=example.com"
# Створити секрет
k create secret tls example-tls --cert=tls.crt --key=tls.key
# Або за допомогою kubectl
k create secret tls example-tls \
--cert=path/to/tls.crt \
--key=path/to/tls.key
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-ingress
spec:
ingressClassName: nginx
tls:
- hosts:
- example.com
- www.example.com
secretName: example-tls # Назва TLS-секрету
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80

4.3 Потік TLS-конфігурації

Розділ «4.3 Потік TLS-конфігурації»
┌────────────────────────────────────────────────────────────────┐
│ TLS-термінація │
│ │
│ Клієнт (HTTPS) │
│ │ │
│ │ TLS/SSL шифрування │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Інгрес-контролер │ │
│ │ (TLS термінується тут) │ │
│ │ │ │
│ │ Використовує сертифікат із Secret: example-tls │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ │ Звичайний HTTP (всередині кластера) │
│ ▼ │
│ ┌──────────────────┐ │
│ │ Сервіс │ │
│ │ (порт 80) │ │
│ └──────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────┘

Частина 5: Анотації Інгресу

Розділ «Частина 5: Анотації Інгресу»

5.1 Поширені анотації nginx

Розділ «5.1 Поширені анотації nginx»
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: annotated-ingress
annotations:
# Перезапис URL-шляху
nginx.ingress.kubernetes.io/rewrite-target: /
# SSL-перенаправлення
nginx.ingress.kubernetes.io/ssl-redirect: "true"
# Тайм-аути
nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"
nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
# Обмеження швидкості
nginx.ingress.kubernetes.io/limit-rps: "10"
# CORS
nginx.ingress.kubernetes.io/enable-cors: "true"
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
# Маршрутизувати /app/(.*) до бекенду /($1)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rewrite-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /app/(.*)
pathType: ImplementationSpecific
backend:
service:
name: web-service
port:
number: 80

Частина 6: Налагодження Інгресу

Розділ «Частина 6: Налагодження Інгресу»

6.1 Процес налагодження

Розділ «6.1 Процес налагодження»
Інгрес не працює?
├── kubectl get ingress (перевірити ADDRESS)
│ │
│ ├── Немає ADDRESS → Контролер не обробляє
│ │ Перевірте IngressClass
│ │
│ └── Є ADDRESS → Продовжуйте налагодження
├── kubectl describe ingress (перевірити події)
│ │
│ └── Помилки? → Виправити конфігурацію
├── Перевірити бекенд-сервіс
│ kubectl get svc,endpoints
│ │
│ └── Немає endpoints? → Сервіс не має подів
├── Перевірити логи Інгрес-контролера
│ kubectl logs -n ingress-nginx <controller-pod>
└── Тест зсередини кластера
kubectl run test --rm -it --image=curlimages/curl -- \
curl <service>

6.2 Поширені команди для Інгресу

Розділ «6.2 Поширені команди для Інгресу»
Terminal window
# Список інгресів
k get ingress
k get ing # Скорочена форма
# Деталі інгресу
k describe ingress my-ingress
# Отримати YAML інгресу
k get ingress my-ingress -o yaml
# Перевірити IngressClass
k get ingressclass
# Перевірити поди Інгрес-контролера
k get pods -n ingress-nginx
# Переглянути логи контролера
k logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx

6.3 Поширені проблеми

Розділ «6.3 Поширені проблеми»
СимптомПричинаРішення
ADDRESS не призначеноНемає Інгрес-контролераВстановити Інгрес-контролер
ADDRESS є, але 404Шлях не збігаєтьсяПеревірити path та pathType
503 Service UnavailableНемає endpointsПеревірити selector сервісу/поди
Помилка SSLНеправильний/відсутній TLS-секретПереконатися, що секрет існує та відповідає хосту
Неправильний IngressClassКілька контролерівВказати правильний ingressClassName

Частина 7: Бекенд за замовчуванням

Розділ «Частина 7: Бекенд за замовчуванням»

7.1 Налаштування бекенду за замовчуванням

Розділ «7.1 Налаштування бекенду за замовчуванням»
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: default-backend-ingress
spec:
ingressClassName: nginx
defaultBackend: # Перехоплення всього
service:
name: default-service
port:
number: 80
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80

Запити, що не відповідають жодному правилу, спрямовуються до defaultBackend.


ПомилкаПроблемаРішення
Немає IngressClassКонтролер не обробляєДодати ingressClassName до spec
Неправильний pathTypeМаршрути не збігаютьсяВикористовуйте Prefix для більшості випадків
Невідповідність порту сервісуПомилки 503Порт Інгресу має збігатися з портом Сервісу
TLS-секрет у неправильному просторі іменПомилки SSLСекрет має бути в тому ж просторі імен, що й Інгрес
Відсутній Інгрес-контролерADDRESS не призначеноСпочатку встановити контролер

  1. У чому різниця між Інгресом та Сервісом типу LoadBalancer?

    Відповідь Інгрес — це маршрутизація на рівні L7 (HTTP/HTTPS) з правилами на основі шляхів/хостів, тоді як LoadBalancer — це рівень L4 (TCP/UDP) без інтелектуальної маршрутизації. Інгрес може обслуговувати багато сервісів з однією зовнішньою IP-адресою.
  2. Інгрес не показує ADDRESS. Яка ймовірна причина?

    Відповідь Не встановлено Інгрес-контролер, або `ingressClassName` не відповідає жодному встановленому контролеру. Встановіть Інгрес-контролер та перевірте IngressClass.
  3. У чому різниця між pathType: Prefix та pathType: Exact?

    Відповідь `Prefix` збігається з будь-яким шляхом, що починається з вказаного префікса (`/api` збігається з `/api/users`). `Exact` вимагає точного збігу (`/api` збігається тільки з `/api`, але не з `/api/`).
  4. Як налаштувати HTTPS для Інгресу?

    Відповідь 1. Створити TLS-секрет із сертифікатом та ключем 2. Додати секцію `tls` до spec Інгресу з хостами та secretName 3. Інгрес-контролер виконає TLS-термінацію
  5. Запити до /app/users мають потрапляти до бекенду як /users. Як це зробити?

    Відповідь Використати анотацію перезапису: `nginx.ingress.kubernetes.io/rewrite-target: /$1` з шляхом `/app/(.*)` та `pathType: ImplementationSpecific`.

Завдання: Створити Інгрес із кількома сервісами та TLS.

Кроки:

  1. Створити бекенд-сервіси:
Terminal window
# API-сервіс
k create deployment api --image=nginx
k expose deployment api --port=80
# Веб-сервіс
k create deployment web --image=nginx
k expose deployment web --port=80
  1. Створити Інгрес на основі шляхів:
Terminal window
cat << 'EOF' | k apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: multi-path-ingress
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
EOF
  1. Перевірити Інгрес:
Terminal window
k get ingress
k describe ingress multi-path-ingress
  1. Тестування маршрутизації (якщо Інгрес-контролер встановлено):
Terminal window
# Отримати адресу Інгресу
INGRESS_IP=$(k get ingress multi-path-ingress -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
# Тестування шляхів (зсередини кластера, якщо потрібно)
k run test --rm -it --image=curlimages/curl --restart=Never -- \
curl -H "Host: example.com" http://$INGRESS_IP/api
  1. Створити Інгрес на основі хостів:
Terminal window
cat << 'EOF' | k apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: host-ingress
spec:
ingressClassName: nginx
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api
port:
number: 80
- host: web.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
EOF
  1. Створити TLS-секрет (самопідписаний для тестування):
Terminal window
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout tls.key -out tls.crt \
-subj "/CN=example.com"
k create secret tls example-tls --cert=tls.crt --key=tls.key
  1. Створити TLS Інгрес:
Terminal window
cat << 'EOF' | k apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-ingress
spec:
ingressClassName: nginx
tls:
- hosts:
- secure.example.com
secretName: example-tls
rules:
- host: secure.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
EOF
  1. Прибирання:
Terminal window
k delete ingress multi-path-ingress host-ingress tls-ingress
k delete deployment api web
k delete svc api web
k delete secret example-tls
rm tls.key tls.crt

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

  • Вмію створювати Інгрес із маршрутизацією за шляхами
  • Вмію створювати Інгрес із маршрутизацією за хостами
  • Вмію налаштовувати TLS на Інгресі
  • Розумію IngressClass
  • Вмію налагоджувати проблеми Інгресу

Вправа 1: Базовий Інгрес (Ціль: 3 хвилини)

Розділ «Вправа 1: Базовий Інгрес (Ціль: 3 хвилини)»
Terminal window
# Створити сервіс
k create deployment drill-app --image=nginx
k expose deployment drill-app --port=80
# Створити Інгрес
cat << 'EOF' | k apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: drill-ingress
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: drill-app
port:
number: 80
EOF
# Перевірити
k get ingress drill-ingress
k describe ingress drill-ingress
# Прибирання
k delete ingress drill-ingress
k delete deployment drill-app
k delete svc drill-app

Вправа 2: Інгрес із кількома шляхами (Ціль: 4 хвилини)

Розділ «Вправа 2: Інгрес із кількома шляхами (Ціль: 4 хвилини)»
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
# Створити Інгрес
cat << 'EOF' | k apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: multi-path
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
EOF
# Перевірити
k describe ingress multi-path
# Прибирання
k delete ingress multi-path
k delete deployment api web
k delete svc api web

Вправа 3: Інгрес на основі хостів (Ціль: 4 хвилини)

Розділ «Вправа 3: Інгрес на основі хостів (Ціль: 4 хвилини)»
Terminal window
# Створити сервіси
k create deployment app1 --image=nginx
k create deployment app2 --image=nginx
k expose deployment app1 --port=80
k expose deployment app2 --port=80
# Створити Інгрес
cat << 'EOF' | k apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: host-based
spec:
ingressClassName: nginx
rules:
- host: app1.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app1
port:
number: 80
- host: app2.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app2
port:
number: 80
EOF
# Перевірити
k get ingress host-based
k describe ingress host-based
# Прибирання
k delete ingress host-based
k delete deployment app1 app2
k delete svc app1 app2

Вправа 4: TLS Інгрес (Ціль: 5 хвилин)

Розділ «Вправа 4: TLS Інгрес (Ціль: 5 хвилин)»
Terminal window
# Створити сервіс
k create deployment secure-app --image=nginx
k expose deployment secure-app --port=80
# Згенерувати сертифікат
openssl req -x509 -nodes -days 1 -newkey rsa:2048 \
-keyout tls.key -out tls.crt -subj "/CN=secure.local"
# Створити секрет
k create secret tls tls-secret --cert=tls.crt --key=tls.key
# Створити Інгрес із TLS
cat << 'EOF' | k apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-ingress
spec:
ingressClassName: nginx
tls:
- hosts:
- secure.local
secretName: tls-secret
rules:
- host: secure.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: secure-app
port:
number: 80
EOF
# Перевірити
k describe ingress tls-ingress
# Прибирання
k delete ingress tls-ingress
k delete deployment secure-app
k delete svc secure-app
k delete secret tls-secret
rm tls.key tls.crt

Вправа 5: Перевірка IngressClass (Ціль: 2 хвилини)

Розділ «Вправа 5: Перевірка IngressClass (Ціль: 2 хвилини)»
Terminal window
# Список IngressClass
k get ingressclass
# Деталі
k describe ingressclass nginx
# Перевірити, який є типовим
k get ingressclass -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.annotations.ingressclass\.kubernetes\.io/is-default-class}{"\n"}{end}'

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

Розділ «Вправа 6: Інгрес із анотаціями (Ціль: 4 хвилини)»
Terminal window
# Створити сервіс
k create deployment annotated-app --image=nginx
k expose deployment annotated-app --port=80
# Створити Інгрес із анотаціями
cat << 'EOF' | k apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: annotated-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: annotated-app
port:
number: 80
EOF
# Перевірити анотації
k get ingress annotated-ingress -o yaml | grep -A5 annotations
# Прибирання
k delete ingress annotated-ingress
k delete deployment annotated-app
k delete svc annotated-app

Вправа 7: Налагодження Інгресу (Ціль: 4 хвилини)

Розділ «Вправа 7: Налагодження Інгресу (Ціль: 4 хвилини)»
Terminal window
# Створити Інгрес із неправильною назвою сервісу (навмисно зламаний)
cat << 'EOF' | k apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: broken-ingress
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nonexistent-service
port:
number: 80
EOF
# Налагодження
k describe ingress broken-ingress
# Шукайте попередження про бекенд
# Перевірити логи Інгрес-контролера (якщо встановлено)
k logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx --tail=10
# Виправлення: створити відсутній сервіс
k create deployment fix-app --image=nginx
k expose deployment fix-app --port=80 --name=nonexistent-service
# Перевірити
k describe ingress broken-ingress
# Прибирання
k delete ingress broken-ingress
k delete deployment fix-app
k delete svc nonexistent-service

Вправа 8: Виклик — Повне налаштування Інгресу

Розділ «Вправа 8: Виклик — Повне налаштування Інгресу»

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

  1. Створити деплойменти: api та frontend (nginx)
  2. Відкрити обидва як ClusterIP-сервіси на порту 80
  3. Створити Інгрес із:
    • Шлях /api маршрутизує до api-сервісу
    • Шлях / маршрутизує до frontend-сервісу
    • Хост: myapp.local
  4. Створити TLS-секрет та додати HTTPS
  5. Перевірити за допомогою describe
  6. Прибрати все
Terminal window
# ВАШЕ ЗАВДАННЯ: Виконайте за 7 хвилин
Рішення
Terminal window
# 1. Створити деплойменти
k create deployment api --image=nginx
k create deployment frontend --image=nginx
# 2. Відкрити як ClusterIP
k expose deployment api --port=80
k expose deployment frontend --port=80
# 3. Створити Інгрес
cat << 'EOF' | k apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: challenge-ingress
spec:
ingressClassName: nginx
rules:
- host: myapp.local
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80
EOF
# 4. Додати TLS
openssl req -x509 -nodes -days 1 -newkey rsa:2048 \
-keyout tls.key -out tls.crt -subj "/CN=myapp.local"
k create secret tls myapp-tls --cert=tls.crt --key=tls.key
# Оновити Інгрес із TLS
cat << 'EOF' | k apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: challenge-ingress
spec:
ingressClassName: nginx
tls:
- hosts:
- myapp.local
secretName: myapp-tls
rules:
- host: myapp.local
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80
EOF
# 5. Перевірити
k describe ingress challenge-ingress
# 6. Прибирання
k delete ingress challenge-ingress
k delete deployment api frontend
k delete svc api frontend
k delete secret myapp-tls
rm tls.key tls.crt

Модуль 3.5: Gateway API — Наступне покоління Kubernetes Інгресу.