Модуль 5.2: Інгрес
Складність:
[MEDIUM]— Важливий для зовнішнього доступу, кілька концепційЧас на виконання: 45–55 хвилин
Передумови: Модуль 5.1 (Сервіси), розуміння HTTP та DNS
Що ви зможете робити
Розділ «Що ви зможете робити»Після завершення цього модуля ви зможете:
- Створити ресурси Інгрес з правилами маршрутизації на основі хосту та шляху
- Налаштувати завершення TLS та кілька бекенд-Сервісів в одному Інгресі
- Діагностувати збої маршрутизації Інгресу, перевіряючи логи контролера, анотації та стан бекенд-Сервісів
- Пояснити зв’язок між ресурсами Інгрес, IngressClasses та контролерами Інгресу
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»Інгрес забезпечує HTTP/HTTPS-маршрутизацію ззовні кластера до Сервісів усередині. Замість того, щоб відкривати кілька Сервісів типу LoadBalancer (дорого) або використовувати NodePort (негарні URL), Інгрес дає вам маршрутизацію на основі хосту/шляху з єдиною точкою входу.
Іспит CKAD перевіряє:
- Створення ресурсів Інгрес
- Маршрутизацію на основі хосту та шляху
- Завершення TLS
- Розуміння контролерів Інгресу
Аналогія з рецепцією готелю
Інгрес — це як рецепція готелю. Гості (запити) прибувають до одного входу (Інгрес) і просять різні послуги: «ресторан» іде до Сервісу їдальні, «спа» — до Сервісу оздоровлення, «кімната 203» — до Сервісу конкретного гостя. Рецепціоніст (контролер Інгресу) направляє кожного в потрібне місце залежно від запиту.
Компоненти Інгресу
Розділ «Компоненти Інгресу»Контролер Інгресу
Розділ «Контролер Інгресу»Контролер Інгресу — це під, який відстежує ресурси Інгрес і налаштовує маршрутизацію. Поширені контролери:
- Envoy Gateway (референсна реалізація Gateway API)
- Traefik (підтримує і Ingress, і Gateway API)
- Kong (підтримує і Ingress, і Gateway API)
- Cilium (CNI з вбудованою підтримкою Ingress і Gateway API)
- NGINX Gateway Fabric (наступник ingress-nginx)
Примітка: Популярний контролер ingress-nginx було відкликано 31 березня 2026 року, і він більше не отримує оновлень. Для нових розгортань використовуйте Gateway API (див. CKA Модуль 3.5) з одним із контролерів вище.
Важливо: Ресурси Інгрес нічого не роблять без контролера!
# Перевірити, чи є контролер Інгресуk get pods -n ingress-nginx# абоk get pods -A | grep -i ingressРесурс Інгрес
Розділ «Ресурс Інгрес»Інгрес — це ресурс Kubernetes, що визначає правила маршрутизації:
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: my-ingressspec: rules: - host: myapp.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-service port: number: 80Типи шляхів
Розділ «Типи шляхів»Prefix (найпоширеніший)
Розділ «Prefix (найпоширеніший)»Збіг за префіксом URL-шляху:
pathType: Prefixpath: /api# Збігається: /api, /api/, /api/users, /api/users/123Exact
Розділ «Exact»Збіг лише з точним шляхом:
pathType: Exactpath: /api# Збігається: лише /api# НЕ збігається: /api/, /api/usersImplementationSpecific
Розділ «ImplementationSpecific»Залежить від IngressClass (специфічний для контролера).
Шаблони маршрутизації
Розділ «Шаблони маршрутизації»Маршрутизація на основі хосту
Розділ «Маршрутизація на основі хосту»Різні хости до різних сервісів:
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: host-routingspec: 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Маршрутизація на основі шляху
Розділ «Маршрутизація на основі шляху»Різні шляхи до різних сервісів:
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: path-routingspec: rules: - host: example.com 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Типовий бекенд
Розділ «Типовий бекенд»Перехоплює всі запити без збігу:
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: with-defaultspec: defaultBackend: service: name: default-service port: number: 80 rules: - host: example.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 80TLS/HTTPS
Розділ «TLS/HTTPS»Створення TLS-секрету
Розділ «Створення TLS-секрету»# Створити TLS-секрет із сертифіката та ключаk create secret tls my-tls-secret \ --cert=path/to/tls.crt \ --key=path/to/tls.keyІнгрес із TLS
Розділ «Інгрес із TLS»apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: tls-ingressspec: tls: - hosts: - secure.example.com secretName: my-tls-secret rules: - host: secure.example.com http: paths: - path: / pathType: Prefix backend: service: name: secure-service port: number: 80Візуалізація
Розділ «Візуалізація»┌─────────────────────────────────────────────────────────────┐│ Потік Інгресу │├─────────────────────────────────────────────────────────────┤│ ││ Інтернет ││ │ ││ ▼ ││ ┌─────────────────────────────────────┐ ││ │ Контролер Інгресу │ ││ │ (nginx, traefik тощо) │ ││ │ │ ││ │ Читає правила Інгресу │ ││ │ Маршрутизує за хостом/шляхом │ ││ └─────────────────────────────────────┘ ││ │ ││ │ api.example.com/users ││ │ ││ ▼ ││ ┌─────────────────────────────────────┐ ││ │ Ресурс Інгрес │ ││ │ │ ││ │ rules: │ ││ │ - host: api.example.com │ ││ │ paths: │ ││ │ - /users → user-svc:80 │ ││ │ - /orders → order-svc:80 │ ││ │ - host: web.example.com │ ││ │ paths: │ ││ │ - / → frontend-svc:80 │ ││ └─────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌──────────┐ ┌──────────┐ ┌──────────┐ ││ │ user-svc │ │order-svc │ │frontend │ ││ │ :80 │ │ :80 │ │svc :80 │ ││ └──────────┘ └──────────┘ └──────────┘ ││ │└─────────────────────────────────────────────────────────────┘IngressClass
Розділ «IngressClass»Визначає, який контролер обслуговує Інгрес:
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: my-ingressspec: ingressClassName: nginx # Який контролер rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: my-service port: number: 80# Переглянути доступні IngressClassk get ingressclassАнотації
Розділ «Анотації»Специфічна для контролера поведінка через анотації:
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: annotated-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/ssl-redirect: "true"spec: rules: - host: example.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 80Поширені анотації NGINX:
nginx.ingress.kubernetes.io/rewrite-target: Перезапис URLnginx.ingress.kubernetes.io/ssl-redirect: Примусовий HTTPSnginx.ingress.kubernetes.io/proxy-body-size: Максимальний розмір тіла запиту
Швидка довідка
Розділ «Швидка довідка»# Створити Інгрес імперативно (обмежено)k create ingress my-ingress \ --rule="host.example.com/path=service:port"
# Переглянути Інгресk get ingressk describe ingress NAME
# Отримати адресу Інгресуk get ingress NAME -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
# Перевірити IngressClassk get ingressclass
# Переглянути логи контролераk logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginxЧи знали ви?
Розділ «Чи знали ви?»-
Інгрес — це лише конфігурація, не сервіс. Фактичну маршрутизацію виконують поди контролера Інгресу.
-
Для одного хосту може існувати кілька ресурсів Інгрес. Контролери зазвичай обʼєднують їх.
-
Анотація
kubernetes.io/ingress.classзастаріла. Використовуйтеspec.ingressClassNameнатомість (Kubernetes 1.18+). -
Інгрес не може маршрутизувати не-HTTP трафік. Для TCP/UDP використовуйте Сервіси типу LoadBalancer або новіший Gateway API.
Типові помилки
Розділ «Типові помилки»| Помилка | Чим це шкодить | Рішення |
|---|---|---|
| Контролер Інгресу не встановлено | Інгрес нічого не робить | Встановити nginx-ingress або аналог |
| Неправильний pathType | Маршрути не збігаються | Використовуйте Prefix для більшості випадків |
| Невідповідність назви/порту Сервісу | Помилки 503 | Перевірте, що сервіс існує та порт збігається |
| Відсутній host у правилах | Збігається з усіма хостами | Додайте явний host або використовуйте обережно |
| TLS-секрет у неправильному просторі імен | TLS не працює | Секрет має бути в тому ж просторі імен, що й Інгрес |
Тест
Розділ «Тест»-
Яка різниця між ресурсом Інгрес і контролером Інгресу?
Відповідь
Ресурс Інгрес — це обʼєкт Kubernetes, що визначає правила маршрутизації. Контролер Інгресу — це запущений під, який читає ресурси Інгрес і налаштовує фактичну маршрутизацію (наприклад, конфігурацію NGINX). -
Як направити трафік до різних сервісів на основі URL-шляху?
Відповідь
Використовуйте кілька шляхів у правилах Інгресу: ```yaml 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 ``` -
Що потрібно для завершення HTTPS в Інгресі?
Відповідь
TLS-секрет, що містить сертифікат і ключ, на який посилається специфікація Інгресу: ```yaml spec: tls: - hosts: - example.com secretName: tls-secret ``` -
Що станеться, якщо контролер Інгресу не встановлено?
Відповідь
Ресурси Інгрес створюються, але не мають жодного ефекту. Маршрутизація не відбувається, бо немає нічого, що відстежувало б і реалізовувало правила.
Практична вправа
Розділ «Практична вправа»Завдання: Створити Інгрес із маршрутизацією на основі шляху.
Підготовка:
# Створити два деплойментиk create deployment web --image=nginxk create deployment api --image=nginx
# Створити сервісиk expose deployment web --port=80k expose deployment api --port=80
# Дочекатися подівk wait --for=condition=Ready pod -l app=web --timeout=60sk wait --for=condition=Ready pod -l app=api --timeout=60sЧастина 1: Простий Інгрес
cat << 'EOF' | k apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: simple-ingressspec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: web port: number: 80EOF
k get ingress simple-ingressk describe ingress simple-ingressЧастина 2: Маршрутизація на основі шляху
cat << 'EOF' | k apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: path-ingressspec: rules: - http: paths: - path: /web pathType: Prefix backend: service: name: web port: number: 80 - path: /api pathType: Prefix backend: service: name: api port: number: 80EOF
k describe ingress path-ingressЧастина 3: Маршрутизація на основі хосту
cat << 'EOF' | k apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: host-ingressspec: rules: - host: web.local http: paths: - path: / pathType: Prefix backend: service: name: web port: number: 80 - host: api.local http: paths: - path: / pathType: Prefix backend: service: name: api port: number: 80EOF
k describe ingress host-ingressПрибирання:
k delete ingress simple-ingress path-ingress host-ingressk delete deployment web apik delete svc web apiПрактичні вправи
Розділ «Практичні вправи»Вправа 1: Простий Інгрес (Ціль: 2 хвилини)
Розділ «Вправа 1: Простий Інгрес (Ціль: 2 хвилини)»k create deployment drill1 --image=nginxk expose deployment drill1 --port=80
cat << 'EOF' | k apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: drill1spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: drill1 port: number: 80EOF
k get ingress drill1k delete ingress drill1 deploy drill1 svc drill1Вправа 2: Маршрутизація на основі хосту (Ціль: 3 хвилини)
Розділ «Вправа 2: Маршрутизація на основі хосту (Ціль: 3 хвилини)»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: drill2spec: rules: - host: app1.local http: paths: - path: / pathType: Prefix backend: service: name: app1 port: number: 80 - host: app2.local http: paths: - path: / pathType: Prefix backend: service: name: app2 port: number: 80EOF
k describe ingress drill2k delete ingress drill2 deploy app1 app2 svc app1 app2Вправа 3: Маршрутизація на основі шляху (Ціль: 3 хвилини)
Розділ «Вправа 3: Маршрутизація на основі шляху (Ціль: 3 хвилини)»k create deployment frontend --image=nginxk create deployment backend --image=nginxk expose deployment frontend --port=80k expose deployment backend --port=80
cat << 'EOF' | k apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: drill3spec: rules: - host: myapp.local http: paths: - path: /frontend pathType: Prefix backend: service: name: frontend port: number: 80 - path: /backend pathType: Prefix backend: service: name: backend port: number: 80EOF
k get ingress drill3k delete ingress drill3 deploy frontend backend svc frontend backendВправа 4: Інгрес із типовим бекендом (Ціль: 3 хвилини)
Розділ «Вправа 4: Інгрес із типовим бекендом (Ціль: 3 хвилини)»k create deployment default-app --image=nginxk create deployment api-app --image=nginxk expose deployment default-app --port=80k expose deployment api-app --port=80
cat << 'EOF' | k apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: drill4spec: defaultBackend: service: name: default-app port: number: 80 rules: - http: paths: - path: /api pathType: Prefix backend: service: name: api-app port: number: 80EOF
k describe ingress drill4k delete ingress drill4 deploy default-app api-app svc default-app api-appВправа 5: Створити Інгрес імперативно (Ціль: 2 хвилини)
Розділ «Вправа 5: Створити Інгрес імперативно (Ціль: 2 хвилини)»k create deployment drill5 --image=nginxk expose deployment drill5 --port=80
# Створити інгрес імперативноk create ingress drill5 --rule="drill5.local/=drill5:80"
k get ingress drill5k describe ingress drill5
k delete ingress drill5 deploy drill5 svc drill5Вправа 6: Інгрес із TLS (Ціль: 4 хвилини)
Розділ «Вправа 6: Інгрес із TLS (Ціль: 4 хвилини)»# Створити самопідписаний сертифікат (для демо)openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /tmp/tls.key -out /tmp/tls.crt \ -subj "/CN=secure.local" 2>/dev/null
# Створити TLS-секретk create secret tls drill6-tls --cert=/tmp/tls.crt --key=/tmp/tls.key
k create deployment drill6 --image=nginxk expose deployment drill6 --port=80
cat << 'EOF' | k apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: drill6spec: tls: - hosts: - secure.local secretName: drill6-tls rules: - host: secure.local http: paths: - path: / pathType: Prefix backend: service: name: drill6 port: number: 80EOF
k describe ingress drill6
k delete ingress drill6 secret drill6-tls deploy drill6 svc drill6rm /tmp/tls.key /tmp/tls.crtНаступний модуль
Розділ «Наступний модуль»Модуль 5.3: Мережеві політики — Контроль комунікації між подами.