Kubernetes Ingress – это ресурс для добавления правил маршрутизации трафика из внешних источников в службы в кластере kubernetes.
В этой серии руководств по вв Kubernetes вы изучите концепцию ресурсов ingress и контроллеров ingress , используемых для маршрутизации внешнего трафика в развертке Kubernetes.
Кроме того, мы рассмотрим расширенную ingress маршрутизацию с использованием ingress шлюза службы ISTIO.
Как правило, пользовательская развертка Nginx или HAproxy kubernetes будет представлено как служба для перенаправления внешнего трафика во внутренние службы кластера, где правила маршрутизации будут закрепляться в поде и добавляться в виде configmap.
Ingress Kubenetes действует аналогичным образом, за исключением того, что правила маршрутизации будут поддерживаться как объект Ingress Kubernetes.
Он обладает огромным преимуществом конфигурации правил динамической маршрутизации без повторного развертывания подов прокси.
- Учебное пособие по Kubernetes Ingress
- Kubernetes Ingress:
- Kubernetes Ingress Controller
- Как настроить Ingress на Kubernetes с помощью Nginx Controller
- Настройка службы LoadBalancer для Ingress контроллера
- Сопоставьте доменное имя с IP-адресом Loadbalancer
- Настройка приложения A
- Создание объекта IngressKubernetes
Учебное пособие по Kubernetes Ingress
Чтобы начать, вам нужно понять две ключевые вещи.
- Kubernetes Ingress
- Kubernetes Ingress Controller.
Давайте рассмотрим каждый из этих понятий.
Kubernetes Ingress:
Kubernetes Ingress – это собственный ресурс kubernetes, с которым вы можете создавать правила маршрутизации трафика от внешнего источника к конечным точкам различных служб, расположенных внутри кластера.
Для маршрутизации правил, указанных в объекте Ingress, требуется ingress controller.
Объект Ingress выглядит следующим образом.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
namespace: dev
spec:
rules:
- host: test.apps.example.com
http:
paths:
- backend:
serviceName: hello-service
servicePort: 80
Приведенная выше настройка означает, что все вызовы test.apps.example.com должны попадать в службу с именем hello-serviceresiding в пространстве имен dev.
Ключевые вещи, которые должны помочь понять объект ingress.
- Вы должны создать правила Ingress в том же пространстве имен, в котором развернуты службы. Вы не можете направлять трафик на службу в другом пространстве имен, где у вас нет Ingress объекта.
- Ingress объект требует ingress controller для маршрутизации трафика.
- Внешний трафик не будет попадать на Ingress API, вместо этого он будет попадать на службу ingress controller
Kubernetes Ingress Controller
- Nginx Ingress Controller (Community & From Nginx Inc)
- Traefik
- HAproxy
- Contour
- GKE Ingress Controller
В этой серии руководств мы рассмотрим все типы ingress решений, поддерживаемых Kubernetes.
Как настроить Ingress на Kubernetes с помощью Nginx Controller
Есть два nginx ingress controller
- Nginx ingress controller от kubernetes community
- Nginx ingress controller от Nginx Inc
Мы будем использовать контроллер Nginx от комьюнити kubernetes.
Ingress controller требует определенное пространство имен, учетную запись службы, cluster role bindings, конфигурацию и т. д.
Вы можете создать все упомянутые объекты kubernetes, используя файл yaml из официального Ingress репозитория.
Давайте развернем ingress controller, используя файл mandatory.yaml
из официального репозитория.
Он содержит сводный список объектов kubernetes, необходимых для контроллера Nginx.
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
kubectl get pods -n ingress-nginx
Настройка службы LoadBalancer для Ingress контроллера
Следующим шагом является создание службы типа Loadbalancer для предоставления развертывания контроллера nginx вне кластера.
Шаг 1: Создайте каталог проекта локально и переключитесь на этот каталог.
mkdir ingress-deployment && cd ingress-deployment
Шаг 2: Создайте файл с именем nginx-ingress.yaml
vi nginx-ingress.yaml
Шаг 3: Скопируйте следующее содержимое в файл.
Заметка:
Аннотации под Lables очень важны для интеграции с nginx controller deployment.
kind: Service
apiVersion: v1
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
externalTrafficPolicy: Local
type: LoadBalancer
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
ports:
- name: http
port: 80
targetPort: http
- name: https
port: 443
targetPort: https
kubectl apply -f nginx-ingress.yaml
kubectl get svc -n ingress-nginx
Сопоставьте доменное имя с IP-адресом Loadbalancer
Чтобы наши настройки Ingress работали, нам нужно сопоставить доменное имя с IP-адресом балансировщика нагрузки.
Вы можете сделать это двумя способами.
Сингл DNS-сопоставление:
Вы можете сопоставить один домен напрямую как A запись с IP-адресом балансировщика нагрузки.
Используя этот вариант, вы можете иметь только один домен для Ingress контроллера и маршрутизацию трафика по нескольким путям.
Например
www.example.com --> Loadbalancer IP
Вы можете использовать базовую маршрутизацию, используя эту модель.
http://www.example.com/app1
http://www.example.com/app2
http://www.example.com/app1/api
http://www.example.com/app2/api
Подстановочное DNS-сопоставление:
Если вы сопоставите подстановочный DNS с балансировщиком нагрузки, у вас могут быть динамические конечные точки DNS через Ingress.
*.apps.example.com
Таким образом, вы можете иметь несколько динамических поддоменов через один Ingress Controller, и каждый DNS может иметь собственную маршрутизацию на основе базовой маршрутизации.
#URL one
http://demo1.apps.example.com/api
http://demo1.apps.example.com/api/v1
http://demo1.apps.example.com/api/v2
#URL two
http://demo2.apps.example.com/api
http://demo2.apps.example.com/api/v1
http://demo2.apps.example.com/api/v2
Настройка приложения A
В целях тестирования мы развернем демонстрационное приложение и добавим в него сервис ClusterIp.
kubectl create namespace dev
Шаг 2: Создайте файл с именем hello-app.yaml
Шаг 3: Скопируйте следующее содержимое и сохраните файл.
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-app
namespace: dev
spec:
selector:
matchLabels:
app: hello
replicas: 3
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello
image: "gcr.io/google-samples/hello-app:2.0"
Шаг 4. Создайте развертывание с помощью kubectl
kubectl create -f hello-app.yaml
Проверьте состояние развертывания.
kubectl get deployments -n dev
Шаг 5: Создайте файл с именем hello-app-service.yaml
Шаг 6: Скопируйте следующее содержимое и сохраните файл.
apiVersion: v1
kind: Service
metadata:
name: hello-service
namespace: dev
labels:
app: hello
spec:
type: ClusterIP
selector:
app: hello
ports:
- port: 80
targetPort: 8080
protocol: TCP
Шаг 7: Создайте сервис, используя kubectl.
kubectl create -f hello-app-service.yaml
Проверьте статус сервиса
kubectl get svc -n dev
Создание объекта Ingress Kubernetes
Теперь давайте создадим Ingress объект для доступа к нашему приложению через DNS.
Объект Ingress – это не что иное, как настройка правил маршрутизации.
Если вам интересно, как ingress объект подключен к контроллеру Nginx -> под ingress контроллера подключается к ingress API для проверки правил и соответствующим образом обновляет свой файл nginx.conf.
Шаг 1: Создайте файл с именем ingress.yaml
Шаг 2: Скопируйте следующее содержимое и сохраните файл.
Замените test.apps.example.info вашим доменным именем. Здесь предполагается, что у вас есть DNS в формате * .apps.example.info.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
namespace: dev
spec:
rules:
- host: test.apps.example.info
http:
paths:
- backend:
serviceName: hello-service
servicePort: 80
kubectl describe ingress -n dev
Теперь, если вы попытаетесь получить доступ к домену test.apps.example.info (замените его на свое доменное имя), вы сможете получить доступ к нашему развернутому образцу приложения.
Очень классно все описано. Спасибо )
Всегда рады!
Для маршрутизации правил, указанных во объекте – во объекте – это сильно
Поправили
Приведенная выше настройка означает, что все вызовы test.apps.example.com должны попадать в службу с именем hello-serviceresiding в пространстве имен dev.
НО:
serviceName: hello-service
Спасибо, поправиили
Сервис ClusterIP имеет name hello-service, а в Ingress трафик идет на Сервис serviceName: hello-serviceresiding.
Надо заменить на serviceName: hello-service
Спасибо, поправили