Введение в Kubernetes Ingress: Полное руководство для начинающих
Что такое Kubernetes Ingress?
Ingress — это объект Kubernetes, который предоставляет правила для управления внешним доступом к сервисам в кластере. Он позволяет определить маршрутизацию HTTP/HTTPS трафика и обеспечивает такие функции, как балансировка нагрузки, управление SSL/TLS сертификатами и виртуальные хосты.
Если в простых словах, Ingress — это "входная дверь" для трафика, который приходит в кластер. Он позволяет настроить доступ к нескольким сервисам через один IP-адрес, распределяя трафик в зависимости от URL, доменного имени или других параметров.
Почему стоит использовать Ingress?
Ingress обладает рядом преимуществ перед другими способами маршрутизации трафика в Kubernetes, такими как NodePort или LoadBalancer:
- Балансировка нагрузки: Ingress обеспечивает распределение трафика между несколькими экземплярами сервиса.
- Маршрутизация на основе URL: Ingress позволяет направлять трафик в зависимости от пути в URL или доменного имени, что особенно полезно для микросервисных приложений.
- Управление SSL/TLS сертификатами: Ingress Controller может автоматически управлять сертификатами, обеспечивая безопасное соединение с помощью HTTPS.
- Меньшая зависимость от облачных провайдеров: Используя Ingress, вы можете организовать маршрутизацию в своем кластере, не полагаясь на специфические облачные LoadBalancer.
Основные компоненты Ingress
Для того чтобы Ingress работал, в Kubernetes используются следующие основные компоненты:
- Ingress Resource: Это объект Kubernetes, в котором описаны правила маршрутизации трафика к сервисам. Определяет, куда направлять запросы на основе URL, доменного имени и других параметров.
- Ingress Controller: Это программный компонент, который обрабатывает правила, указанные в Ingress Resource, и реализует их. Без Ingress Controller объект Ingress сам по себе не будет работать.
Наиболее популярные Ingress Controllers включают:
- NGINX Ingress Controller
- Traefik
- HAProxy
- Istio Gateway (если используется Istio для управления сервисами)
- Contour
Установка и настройка Ingress Controller
Прежде чем можно будет использовать Ingress, необходимо установить Ingress Controller. В данном примере мы рассмотрим установку NGINX Ingress Controller, одного из самых популярных решений.
Шаг 1: Установка NGINX Ingress Controller
Используем команду kubectl для установки NGINX Ingress Controller с помощью манифеста YAML:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
Эта команда загрузит и установит необходимые компоненты для работы NGINX Ingress Controller в вашем кластере. После установки можно проверить статус подов:
kubectl get pods -n ingress-nginx
Вы должны увидеть несколько подов с именами, начинающимися на ingress-nginx.
Шаг 2: Создание простого Ingress Resource
После установки Ingress Controller, мы можем создать Ingress Resource, чтобы настроить маршрутизацию. Для этого нам потребуется:
- Создать приложение (сервис), к которому будем направлять трафик.
- Настроить Ingress Resource.
Давайте начнем с создания простого приложения на базе NGINX.
Пример настройки Ingress для NGINX
1. Создание деплоймента и сервиса
Создадим деплоймент с NGINX, который будет развернут в нашем кластере. Создайте файл nginx-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
Примените файл командой:
kubectl apply -f nginx-deployment.yaml
Теперь создадим сервис, чтобы сделать наш деплоймент доступным внутри кластера:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
Сохраните файл как nginx-service.yaml и примените его:
kubectl apply -f nginx-service.yaml
2. Настройка Ingress Resource
Создадим Ingress Resource, который будет направлять трафик на наш сервис. Для этого создайте файл nginx-ingress.yaml:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: nginx.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
Давайте разберем файл подробнее:
- annotations: В данном примере используется аннотация для перенаправления трафика на корневой путь.
- rules: Правила маршрутизации. В данном случае правило говорит, что все запросы на nginx.example.com будут перенаправляться на сервис nginx-service.
Примените файл командой:
kubectl apply -f nginx-ingress.yaml
Проверка работы Ingress
Чтобы протестировать настройки, добавьте запись в файл /etc/hosts на вашем локальном компьютере, чтобы привязать доменное имя nginx.example.com к IP-адресу вашего Ingress Controller. Найдите IP-адрес, выполнив:
kubectl get services -o wide -w -n ingress-nginx
В файле /etc/hosts добавьте строку:
<IP-адрес Ingress Controller> nginx.example.com
Теперь вы можете открыть в браузере http://nginx.example.com и увидеть страницу приветствия NGINX.
Использование TLS/SSL с Ingress
Для того чтобы включить HTTPS, нужно настроить TLS в Ingress. Это достигается с помощью секретов Kubernetes, содержащих сертификат и ключ. Вот пример настройки:
- Создайте секрет с TLS сертификатом:
kubectl create secret tls nginx-tls --cert=/path/to/tls.crt --key=/path/to/tls.key
- Обновите файл nginx-ingress.yaml, чтобы добавить поддержку TLS:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
tls:
- hosts:
- nginx.example.com
secretName: nginx-tls
rules:
- host: nginx.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
- Примените обновленный файл:
kubectl apply -f nginx-ingress.yaml
Теперь Ingress будет поддерживать HTTPS соединение с сертификатом, указанным в секрете.
Заключение
Kubernetes Ingress — это мощный инструмент для управления внешним доступом к сервисам внутри кластера. С его помощью можно настроить балансировку нагрузки, маршрутизацию на основе доменных имен и URL, а также поддержку HTTPS. В данной статье мы рассмотрели основные шаги по настройке Ingress, от установки Ingress Controller до создания и настройки Ingress Resource.
Часто задаваемые вопросы
1. Чем отличается Ingress от LoadBalancer и NodePort?
LoadBalancer создает внешний балансировщик нагрузки для каждого сервиса, NodePort открывает порт на каждом узле кластера, а Ingress позволяет управлять внешним доступом к нескольким сервисам через один балансировщик.
2. Можно ли использовать несколько Ingress Controllers в одном кластере?
Да, можно, но они должны быть настроены так, чтобы работать с разными правилами или ресурсами.
3. Какие Ingress Controllers лучше использовать?
Самые популярные — это NGINX, Traefik и Istio. Выбор зависит от потребностей и требований кластера.
4. Можно ли настроить Ingress без Ingress Controller?
Нет, Ingress Resource не будет работать без Ingress Controller, который управляет маршрутизацией.
5. Как автоматически управлять сертификатами в Ingress?
Для этого можно использовать cert-manager, который автоматически генерирует и обновляет SSL/TLS сертификаты.
Комментарии