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.
Давайте рассмотрим каждый из этих понятий.
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.- 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Шаг 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: создайте пространство имен с именем devkubectl 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 (замените его на свое доменное имя), вы сможете получить доступ к нашему развернутому образцу приложения.