Kubernetes Ingress — это ресурс для добавления правил маршрутизации трафика из внешних источников в службы в кластере kubernetes.

В этой серии руководств по вв Kubernetes вы изучите концепцию ресурсов ingress  и контроллеров ingress , используемых для маршрутизации внешнего трафика в развертке Kubernetes.

Кроме того, мы рассмотрим расширенную ingress маршрутизацию с использованием ingress шлюза службы ISTIO.

Как правило, пользовательская развертка Nginx или HAproxy kubernetes будет представлено как служба для перенаправления внешнего трафика во внутренние службы кластера, где правила маршрутизации будут закрепляться в поде и добавляться в виде configmap.

Ingress Kubenetes действует аналогичным образом, за исключением того, что правила маршрутизации будут поддерживаться как объект Ingress Kubernetes.

Он обладает огромным преимуществом конфигурации правил динамической маршрутизации без повторного развертывания подов прокси.

Учебное пособие по Kubernetes Ingress

Чтобы начать, вам нужно понять две ключевые вещи.

  1. Kubernetes Ingress
  2. 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

Ingress controller обычно является прокси-службой, развернутой в кластере. Это не что иное, как deployment  kubernetes для службы. Ниже приведены виды Ingress controller, доступные для kubernetes.
  1. Nginx Ingress Controller (Community & From Nginx Inc)
  2. Traefik
  3. HAproxy
  4. Contour
  5. GKE Ingress Controller
Как правило, Nginx широко используется в качестве Ingress controller. Вот как работает Ingress controller Nginx.



В этой серии руководств мы рассмотрим все типы 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
Шаг 4: Создайте службу ingress
kubectl apply -f nginx-ingress.yaml
Шаг 5: Проверьте созданный сервис, подключен ли он к внешнему балансировщику нагрузки.
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
В демонстрационных целях мы сопоставили подстановочный DNS с IP-адресом LoadBalancer. В зависимости от вашего провайдера DNS, вы можете сделать эту настройку.

Настройка приложения A

В целях тестирования мы развернем демонстрационное приложение и добавим в него сервис ClusterIp.

Шаг 1: создайте пространство имен с именем dev
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
Шаг 3: Опишите  Ingress объект, созданный для проверки конфигурации.
kubectl describe ingress-n dev

Теперь, если вы попытаетесь получить доступ к домену test.apps.example.info (замените его на свое доменное имя), вы сможете получить доступ к нашему развернутому образцу приложения.