Модуль 3.4: Інгрес
Складність:
[СЕРЕДНЯ]— 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 Інгрес проти інших варіантів»| Можливість | NodePort | LoadBalancer | Інгрес |
|---|---|---|---|
| Рівень | L4 (TCP/UDP) | L4 (TCP/UDP) | L7 (HTTP/HTTPS) |
| Маршрутизація шляхів | Ні | Ні | Так |
| Віртуальні хости | Ні | Ні | Так |
| TLS-термінація | Ні | Обмежена | Так |
| Вартість | Безоплатно | $ за LB | Один контролер для багатьох сервісів |
| Зовнішній IP | IP вузла:Порт | IP хмарного LB | IP контролера |
1.3 Необхідні компоненти
Розділ «1.3 Необхідні компоненти»| Компонент | Призначення | Хто створює |
|---|---|---|
| Інгрес-контролер | Фактично маршрутизує трафік | Адміністратор кластера |
| Ресурс Інгресу | Визначає правила маршрутизації | Розробник |
| Бекенд-сервіси | Цільові сервіси | Розробник |
| TLS Secret | HTTPS-сертифікати | Розробник/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)»# Для kindkubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
# Для minikubeminikube addons enable ingress
# Перевірка встановленняkubectl get pods -n ingress-nginxkubectl get svc -n ingress-nginx2.3 Перевірка стану Інгрес-контролера
Розділ «2.3 Перевірка стану Інгрес-контролера»# Перевірити подиk get pods -n ingress-nginx
# Перевірити сервісk get svc -n ingress-nginx
# Перевірити IngressClassk get ingressclassЧастина 3: Створення ресурсів Інгресу
Розділ «Частина 3: Створення ресурсів Інгресу»3.1 Простий Інгрес (один Сервіс)
Розділ «3.1 Простий Інгрес (один Сервіс)»apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: simple-ingressspec: ingressClassName: nginx # Який контролер використовувати rules: - http: paths: - path: / pathType: Prefix backend: service: name: web-service # Цільовий сервіс port: number: 80 # Порт сервісу3.2 Маршрутизація на основі шляхів
Розділ «3.2 Маршрутизація на основі шляхів»apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: path-ingressspec: 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 │ ││ │ │ ││ └────────────────────────────────────────────────────────┘ ││ │└────────────────────────────────────────────────────────────────┘3.3 Типи шляхів
Розділ «3.3 Типи шляхів»| PathType | Поведінка | Приклад |
|---|---|---|
Exact | Тільки точний збіг | /api збігається з /api, але не з /api/ |
Prefix | Збіг за префіксом | /api збігається з /api, /api/users |
ImplementationSpecific | Вирішує контролер | Залежить від контролера |
3.4 Маршрутизація на основі хостів (віртуальні хости)
Розділ «3.4 Маршрутизація на основі хостів (віртуальні хости)»apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: virtual-host-ingressspec: 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/v1kind: Ingressmetadata: name: combined-ingressspec: 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»4.1 Створення TLS Secret
Розділ «4.1 Створення TLS Secret»# Згенерувати самопідписаний сертифікат (для тестування)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
# Або за допомогою kubectlk create secret tls example-tls \ --cert=path/to/tls.crt \ --key=path/to/tls.key4.2 Інгрес з TLS
Розділ «4.2 Інгрес з TLS»apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: tls-ingressspec: 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: 804.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/v1kind: Ingressmetadata: 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: 805.2 Перезапис URL
Розділ «5.2 Перезапис URL»# Маршрутизувати /app/(.*) до бекенду /($1)apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: rewrite-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1spec: 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 Поширені команди для Інгресу»# Список інгресівk get ingressk get ing # Скорочена форма
# Деталі інгресуk describe ingress my-ingress
# Отримати YAML інгресуk get ingress my-ingress -o yaml
# Перевірити IngressClassk get ingressclass
# Перевірити поди Інгрес-контролераk get pods -n ingress-nginx
# Переглянути логи контролераk logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx6.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/v1kind: Ingressmetadata: name: default-backend-ingressspec: 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 не призначено | Спочатку встановити контролер |
Тест
Розділ «Тест»-
У чому різниця між Інгресом та Сервісом типу LoadBalancer?
Відповідь
Інгрес — це маршрутизація на рівні L7 (HTTP/HTTPS) з правилами на основі шляхів/хостів, тоді як LoadBalancer — це рівень L4 (TCP/UDP) без інтелектуальної маршрутизації. Інгрес може обслуговувати багато сервісів з однією зовнішньою IP-адресою. -
Інгрес не показує ADDRESS. Яка ймовірна причина?
Відповідь
Не встановлено Інгрес-контролер, або `ingressClassName` не відповідає жодному встановленому контролеру. Встановіть Інгрес-контролер та перевірте IngressClass. -
У чому різниця між
pathType: PrefixтаpathType: Exact?Відповідь
`Prefix` збігається з будь-яким шляхом, що починається з вказаного префікса (`/api` збігається з `/api/users`). `Exact` вимагає точного збігу (`/api` збігається тільки з `/api`, але не з `/api/`). -
Як налаштувати HTTPS для Інгресу?
Відповідь
1. Створити TLS-секрет із сертифікатом та ключем 2. Додати секцію `tls` до spec Інгресу з хостами та secretName 3. Інгрес-контролер виконає TLS-термінацію -
Запити до
/app/usersмають потрапляти до бекенду як/users. Як це зробити?Відповідь
Використати анотацію перезапису: `nginx.ingress.kubernetes.io/rewrite-target: /$1` з шляхом `/app/(.*)` та `pathType: ImplementationSpecific`.
Практична вправа
Розділ «Практична вправа»Завдання: Створити Інгрес із кількома сервісами та TLS.
Кроки:
- Створити бекенд-сервіси:
# API-сервісk create deployment api --image=nginxk expose deployment api --port=80
# Веб-сервісk create deployment web --image=nginxk expose deployment web --port=80- Створити Інгрес на основі шляхів:
cat << 'EOF' | k apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: multi-path-ingressspec: 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: 80EOF- Перевірити Інгрес:
k get ingressk describe ingress multi-path-ingress- Тестування маршрутизації (якщо Інгрес-контролер встановлено):
# Отримати адресу Інгресу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- Створити Інгрес на основі хостів:
cat << 'EOF' | k apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: host-ingressspec: 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: 80EOF- Створити TLS-секрет (самопідписаний для тестування):
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- Створити TLS Інгрес:
cat << 'EOF' | k apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: tls-ingressspec: 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: 80EOF- Прибирання:
k delete ingress multi-path-ingress host-ingress tls-ingressk delete deployment api webk delete svc api webk delete secret example-tlsrm tls.key tls.crtКритерії успіху:
- Вмію створювати Інгрес із маршрутизацією за шляхами
- Вмію створювати Інгрес із маршрутизацією за хостами
- Вмію налаштовувати TLS на Інгресі
- Розумію IngressClass
- Вмію налагоджувати проблеми Інгресу
Практичні вправи
Розділ «Практичні вправи»Вправа 1: Базовий Інгрес (Ціль: 3 хвилини)
Розділ «Вправа 1: Базовий Інгрес (Ціль: 3 хвилини)»# Створити сервісk create deployment drill-app --image=nginxk expose deployment drill-app --port=80
# Створити Інгресcat << 'EOF' | k apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: drill-ingressspec: ingressClassName: nginx rules: - http: paths: - path: / pathType: Prefix backend: service: name: drill-app port: number: 80EOF
# Перевіритиk get ingress drill-ingressk describe ingress drill-ingress
# Прибиранняk delete ingress drill-ingressk delete deployment drill-appk delete svc drill-appВправа 2: Інгрес із кількома шляхами (Ціль: 4 хвилини)
Розділ «Вправа 2: Інгрес із кількома шляхами (Ціль: 4 хвилини)»# Створити сервісиk create deployment api --image=nginxk create deployment web --image=nginxk expose deployment api --port=80k expose deployment web --port=80
# Створити Інгресcat << 'EOF' | k apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: multi-pathspec: 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: 80EOF
# Перевіритиk describe ingress multi-path
# Прибиранняk delete ingress multi-pathk delete deployment api webk delete svc api webВправа 3: Інгрес на основі хостів (Ціль: 4 хвилини)
Розділ «Вправа 3: Інгрес на основі хостів (Ціль: 4 хвилини)»# Створити сервісиk create deployment app1 --image=nginxk create deployment app2 --image=nginxk expose deployment app1 --port=80k expose deployment app2 --port=80
# Створити Інгресcat << 'EOF' | k apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: host-basedspec: 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: 80EOF
# Перевіритиk get ingress host-basedk describe ingress host-based
# Прибиранняk delete ingress host-basedk delete deployment app1 app2k delete svc app1 app2Вправа 4: TLS Інгрес (Ціль: 5 хвилин)
Розділ «Вправа 4: TLS Інгрес (Ціль: 5 хвилин)»# Створити сервісk create deployment secure-app --image=nginxk 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
# Створити Інгрес із TLScat << 'EOF' | k apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: tls-ingressspec: 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: 80EOF
# Перевіритиk describe ingress tls-ingress
# Прибиранняk delete ingress tls-ingressk delete deployment secure-appk delete svc secure-appk delete secret tls-secretrm tls.key tls.crtВправа 5: Перевірка IngressClass (Ціль: 2 хвилини)
Розділ «Вправа 5: Перевірка IngressClass (Ціль: 2 хвилини)»# Список IngressClassk 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 хвилини)»# Створити сервісk create deployment annotated-app --image=nginxk expose deployment annotated-app --port=80
# Створити Інгрес із анотаціямиcat << 'EOF' | k apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata: 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: 80EOF
# Перевірити анотаціїk get ingress annotated-ingress -o yaml | grep -A5 annotations
# Прибиранняk delete ingress annotated-ingressk delete deployment annotated-appk delete svc annotated-appВправа 7: Налагодження Інгресу (Ціль: 4 хвилини)
Розділ «Вправа 7: Налагодження Інгресу (Ціль: 4 хвилини)»# Створити Інгрес із неправильною назвою сервісу (навмисно зламаний)cat << 'EOF' | k apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: broken-ingressspec: ingressClassName: nginx rules: - http: paths: - path: / pathType: Prefix backend: service: name: nonexistent-service port: number: 80EOF
# Налагодження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=nginxk expose deployment fix-app --port=80 --name=nonexistent-service
# Перевіритиk describe ingress broken-ingress
# Прибиранняk delete ingress broken-ingressk delete deployment fix-appk delete svc nonexistent-serviceВправа 8: Виклик — Повне налаштування Інгресу
Розділ «Вправа 8: Виклик — Повне налаштування Інгресу»Без підглядання у рішення:
- Створити деплойменти:
apiтаfrontend(nginx) - Відкрити обидва як ClusterIP-сервіси на порту 80
- Створити Інгрес із:
- Шлях
/apiмаршрутизує до api-сервісу - Шлях
/маршрутизує до frontend-сервісу - Хост:
myapp.local
- Шлях
- Створити TLS-секрет та додати HTTPS
- Перевірити за допомогою describe
- Прибрати все
# ВАШЕ ЗАВДАННЯ: Виконайте за 7 хвилинРішення
# 1. Створити деплойментиk create deployment api --image=nginxk create deployment frontend --image=nginx
# 2. Відкрити як ClusterIPk expose deployment api --port=80k expose deployment frontend --port=80
# 3. Створити Інгресcat << 'EOF' | k apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: challenge-ingressspec: 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: 80EOF
# 4. Додати TLSopenssl 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
# Оновити Інгрес із TLScat << 'EOF' | k apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: challenge-ingressspec: 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: 80EOF
# 5. Перевіритиk describe ingress challenge-ingress
# 6. Прибиранняk delete ingress challenge-ingressk delete deployment api frontendk delete svc api frontendk delete secret myapp-tlsrm tls.key tls.crtНаступний модуль
Розділ «Наступний модуль»Модуль 3.5: Gateway API — Наступне покоління Kubernetes Інгресу.