← Назад к вопросам
Что такое Ingress в OpenShift?
2.0 Middle🔥 151 комментариев
#Docker, Kubernetes и DevOps
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Что такое Ingress в OpenShift/Kubernetes
Ingress — это объект, который управляет внешним доступом к сервисам внутри кластера. Он маршрутизирует HTTP/HTTPS трафик извне на нужные сервисы внутри кластера.
Аналогия
Without Ingress: HTTP трафик → напрямую на IP:порт (сложно, небезопасно)
With Ingress: HTTP трафик → Ingress → маршрутизация → нужный Service
Проблема, которую решает Ingress
Без Ingress
apiVersion: v1
kind: Service
metadata:
name: my-app
spec:
type: LoadBalancer # Создаёт отдельный IP для каждого сервиса
ports:
- port: 80
targetPort: 8080
selector:
app: my-app
Проблемы:
- Каждый сервис получает свой IP адрес (дорого в облаке)
- Нельзя использовать domain names с HTTPS
- Нельзя маршрутизировать по URL path
С Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: "api.example.com"
http:
paths:
- path: /users
pathType: Prefix
backend:
service:
name: users-service
port:
number: 8080
- path: /products
pathType: Prefix
backend:
service:
name: products-service
port:
number: 8080
- host: "admin.example.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: admin-service
port:
number: 8080
Преимущества:
- Один IP для всех сервисов (через Ingress Controller)
- HTTPS поддержка
- Маршрутизация по domain и path
- Более гибко и дёшево
Как работает Ingress
1. Пользователь: curl https://api.example.com/users
↓
2. DNS: api.example.com → 1.2.3.4 (IP Ingress Controller)
↓
3. HTTP request идёт на Ingress Controller (обычно это nginx или другой reverse proxy)
↓
4. Ingress Controller читает Ingress manifest:
"api.example.com + /users → users-service:8080"
↓
5. Маршрутизирует на соответствующий Service (ClusterIP)
↓
6. Service балансирует трафик между Pods
↓
7. Response возвращается пользователю
Компоненты
1. Ingress Manifest (правила маршрутизации)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
spec:
ingressClassName: nginx # Какой Ingress Controller использовать
rules:
- host: "myapp.com"
http:
paths:
- path: "/"
pathType: Prefix
backend:
service:
name: app-service
port:
number: 8080
2. Ingress Controller (реализует правила)
Это обычно nginx, HAProxy или другой reverse proxy, который:
- Читает Ingress манифесты
- Конфигурирует себя для маршрутизации
- Принимает внешний трафик
# В OpenShift обычно уже есть встроенный Router (OpenShift Router = Ingress Controller)
# Проверить:
oc get ingresscontroller -n openshift-ingress
3. Service (бэкенд для Ingress)
apiVersion: v1
kind: Service
metadata:
name: app-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 8080
targetPort: 8080
type: ClusterIP # ← ВАЖНО! ClusterIP, не LoadBalancer
Примеры использования
Пример 1: Простая маршрутизация по domain
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple-ingress
spec:
rules:
- host: "frontend.example.com"
http:
paths:
- path: "/"
pathType: Prefix
backend:
service:
name: frontend
port:
number: 3000
- host: "api.example.com"
http:
paths:
- path: "/"
pathType: Prefix
backend:
service:
name: api
port:
number: 8080
Пример 2: Маршрутизация по path
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: path-based-ingress
spec:
rules:
- host: "myapp.com"
http:
paths:
- path: "/api"
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080
- path: "/admin"
pathType: Prefix
backend:
service:
name: admin-service
port:
number: 8080
- path: "/"
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 3000
Пример 3: HTTPS с TLS
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-ingress
spec:
tls:
- hosts:
- "myapp.com"
- "www.myapp.com"
secretName: myapp-tls-secret # Secret с сертификатом
rules:
- host: "myapp.com"
http:
paths:
- path: "/"
pathType: Prefix
backend:
service:
name: app-service
port:
number: 8080
- host: "www.myapp.com"
http:
paths:
- path: "/"
pathType: Prefix
backend:
service:
name: app-service
port:
number: 8080
Пример 4: Создание TLS Secret
# Из файлов сертификата
kubectl create secret tls myapp-tls-secret \
--cert=path/to/tls.crt \
--key=path/to/tls.key \
-n default
# Или с Let's Encrypt (с cert-manager)
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: myapp-cert
spec:
secretName: myapp-tls-secret
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- myapp.com
- www.myapp.com
OpenShift Route vs Kubernetes Ingress
OpenShift имеет свой собственный объект Route, который похож на Ingress, но более мощный:
# OpenShift Route (специфично для OpenShift)
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: my-route
spec:
host: myapp.example.com
to:
kind: Service
name: my-service
tls:
termination: edge # TLS termination on the edge
insecureEdgeTerminationPolicy: Allow
# Kubernetes Ingress (стандартный)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: "/"
backend:
service:
name: my-service
pathType: разница
paths:
- path: "/api/v1"
pathType: Exact # Точно /api/v1, не /api/v1/users
- path: "/api"
pathType: Prefix # /api, /api/v1, /api/users и т.д.
- path: "/api.*"
pathType: ImplementationSpecific # Зависит от Ingress Controller
Практический пример Java приложения
# 1. Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-app
spec:
replicas: 3
selector:
matchLabels:
app: java-app
template:
metadata:
labels:
app: java-app
spec:
containers:
- name: app
image: my-registry/java-app:1.0
ports:
- containerPort: 8080
---
# 2. Service (ClusterIP)
apiVersion: v1
kind: Service
metadata:
name: java-app-service
spec:
selector:
app: java-app
ports:
- protocol: TCP
port: 8080
targetPort: 8080
type: ClusterIP
---
# 3. Ingress (маршрутизация)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: java-app-ingress
spec:
ingressClassName: nginx
tls:
- hosts:
- "api.mycompany.com"
secretName: api-tls
rules:
- host: "api.mycompany.com"
http:
paths:
- path: "/"
pathType: Prefix
backend:
service:
name: java-app-service
port:
number: 8080
Команды для работы с Ingress
# Посмотреть Ingress
kubectl get ingress
oc get route # В OpenShift
# Описание
kubectl describe ingress my-ingress
oc describe route my-route
# Логи Ingress Controller
kubectl logs -n ingress-nginx deployment/nginx-ingress-controller
# Тестирование
curl https://api.example.com/users # Если уже настроен DNS
curl -H "Host: api.example.com" https://localhost/users # Локально
Когда использовать Ingress
✅ Много микросервисов на одном IP ✅ HTTPS/TLS нужен ✅ Маршрутизация по domain/path ✅ Production системы
❌ Простое приложение с одним Service ❌ Потоковые данные (WebSocket лучше через Service)
Проблемы и troubleshooting
# Ingress не получает внешний IP
$ kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS
my-ingress nginx api.com <pending> 80
# Решение: проверить Ingress Controller
kubectl get ingressclass
kubectl get pods -n ingress-nginx
# Тестировать внутри кластера
kubectl run -it --rm debug --image=busybox --restart=Never -- sh
curl http://java-app-service:8080/
Итог
Ingress — это маршрутизатор трафика для Kubernetes:
- Принимает внешний HTTP/HTTPS
- Маршрутизирует на нужные Services
- Поддерживает multiple domains, paths, TLS
- Экономит IP адреса (один Ingress для всех сервисов)
Для Java разработчика важно понимать, как настроить Ingress для своего приложения в K8s/OpenShift.