☸️ Учебное пособие по Ingress для начинающих в Kubernetes

Мануал

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

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

 

Добавить комментарий

  1. Олег

    Очень классно все описано. Спасибо )

    Ответить
    1. cryptoparty автор

      Всегда рады!

      Ответить
  2. Алексей

    Для маршрутизации правил, указанных во объекте – во объекте – это сильно

    Ответить
    1. cryptoparty автор

      Поправили

      Ответить
  3. Алексей

    Приведенная выше настройка означает, что все вызовы test.apps.example.com должны попадать в службу с именем hello-serviceresiding в пространстве имен dev.
    НО:
    serviceName: hello-service

    Ответить
    1. cryptoparty автор

      Спасибо, поправиили

      Ответить