Поиск по сайту:

Что такое Ingress Controller и как развернуть Nginx Ingress Controller в кластере Kubernetes на AWS с помощью Helm


На этой странице

  1. Предварительные условия
  2. Что будем делать?
  3. Создание кластера Kubernetes с помощью Kops
  4. Настройка Nginx Ingress Controller с помощью Helm
  5. Создайте набор записей в Route53, указывающий на LoadBalancer, созданный Nginx Ingress Controller.
  6. Создайте файлы определения объектов для примера приложения.
  7. Развертывание примеров приложений
  8. Развертывание входящего объекта
  9. Заключение

Прежде чем мы приступим к установке Nginx Ingress Controller, давайте вкратце посмотрим, что такое Ingress и Ingress Controller. В этой статье основное внимание уделяется настройке. Предполагается, что вы знакомы со всеми предварительными условиями для настройки Nginx Ingress Controller в кластере Kubernetes.

Kubernetes Ingress

Это объект Kubernetes, который управляет внешним доступом к службам в кластере Kubernetes. Он предоставляет маршруты HTTP и HTTPS из-за пределов кластера Kubernetes к службам внутри кластера Kubernetes.

Входной контроллер

Чтобы использовать Ingress, у вас должен быть Ingress Controller в кластере Kubernetes. Он не входит в состав кластера Kubernetes, как другие контроллеры в кластере, и не запускается автоматически в кластере. Мы можем развернуть любое количество Ingress Controllers в кластере Kubernetes. Для этого мы должны аннотировать каждый вход с помощью соответствующего ingress.class. Доступно множество различных типов контроллеров входящего трафика. Ingress Controller — это LoadBalancer для сред Kubernetes. Он используется в качестве решения для управления трафиком в средах Kubernetes.

В этой статье мы увидим установку Nginx Ingress Controller с помощью Helm в кластере Kubernetes, настроенном с помощью Kops. Чтобы узнать больше о Nginx Ingress Controller, посетите официальную документацию здесь.

Предпосылки

  1. Аккаунт AWS (создайте, если у вас его нет).
  2. Kops 1.18.2 установлен на вашем компьютере (нажмите здесь, чтобы узнать, как создать кластер Kubernetes с помощью Kops, и узнать об этом подробнее.)
  3. Helm v3.5.3  (нажмите здесь, чтобы узнать, как установить Helm на Ubuntu Server)
  4. Корзина S3 (нажмите здесь, чтобы узнать, как создать корзину S3 на AWS).
  5. Доменное имя (нажмите здесь, чтобы узнать, как зарегистрировать домен на AWS).
  6. Роль IAM с правами администратора (нажмите здесь, чтобы узнать, как создать роль IAM в AWS).

Что мы будем делать?

  1. Создание кластера Kubernetes с помощью Kops
  2. Настройка Nginx Ingress Controller с помощью Helm
  3. Создайте набор записей в Route53, указывающий на LoadBalancer, созданный Nginx Ingress Controller.
  4. Создайте файлы определения объектов для примера приложения.
  5. Развертывание примера приложения
  6. Развертывание входящего объекта

Создайте кластер Kubernetes с помощью Kops

Прежде чем приступить к созданию кластера, экспортируйте доступ пользователя и секретные ключи AWS IAM с помощью следующих команд.

export AWS_ACCESS_KEY_ID=<your-aws-access-key-here> #Export AWS Access Key
export AWS_SECRET_ACCESS_KEY=<your-aws-secret-key-here> ##Export AWS Secret Key export
Now, export the KOPS_STATE_STORE variable with value as S3 bucket name on your terminal.
KOPS_STATE_STORE=s3://<s3-bucket-name>

Если вы впервые создаете кластер с помощью Kops и используете указанный выше сегмент S3 для хранения конфигурации кластера, вы не должны видеть никаких кластеров при попытке получить кластеры с помощью следующей команды.

kops get clusters

Ознакомьтесь с документацией, указанной в предварительных требованиях, чтобы подробно изучить Kops. Здесь, чтобы создать кластер Kubernetes, выполните следующую команду, заменив значения. Я не буду вдаваться в подробности здесь.

kops create cluster --name <subdomain.domain.com> --state s3://<s3-bucket> --cloud aws --master-size t2.small --master-count 1 --master-zones us-east-1a --node-size t2.small --node-count 2 --zones us-east-1a,us-east-1b,us-east-1c

Вы можете увидеть несколько команд в предложении.

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

До этого момента кластер не был создан, выполните следующую команду, чтобы обновить конфигурацию кластера.

kops update cluster --name kops.devopslee.com

Вам все равно нужно будет выполнить указанную выше команду с параметром --yes, чтобы создать ресурсы кластера.

kops update cluster --name kops.devopslee.com --yes

Проверьте, готов кластер или нет.

kops validate cluster --wait 10m

Вам нужно подождать некоторое время, пока кластер станет работоспособным.

kops validate cluster --wait 10m

Как только кластер станет работоспособным, вы можете проверить модули по умолчанию во всех пространствах имен, используя следующую команду.

kubectl get pods -A

Настройте Nginx Ingress Controller с помощью Helm

Как только кластер Kubernetes будет готов и работоспособен, можно приступать к установке Nginx Ingress Controller с помощью Helm.

Прежде чем продолжить, убедитесь, что у вас установлен Helm версии 3.5.3.

Примечание. Я использовал двоичный файл Helm, присутствующий в моем текущем местоположении, поэтому вы можете видеть ./helm на снимках экрана.

helm version

Добавьте репозиторий и установите диаграмму Nginx Ingress Controller Helm, используя следующие команды. Чтобы понять Helm, обратитесь к документации, упомянутой в разделе предварительных требований.

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install nginx-ingress ingress-nginx/ingress-nginx --set controller.publishService.enabled=true

На приведенном выше снимке экрана видно, что диаграмма Helm установлена.

Вы можете проверить ресурсы, которые были созданы как часть Ingress Controller.

kubectl get pods
kubectl get deployment
kubectl get service

На приведенном выше снимке экрана видно, что служба «nginx-ingress-ingress-nginx-controller» типа LoadBalancer также была создана. Это означает, что LoadBalancer был создан в учетной записи AWS.

Создайте набор записей в Route53, указывающий на LoadBalancer, созданный Nginx Ingress Controller.

Перейдите в свою учетную запись AWS в регионе, где вы создали свой кластер Kubernetes. Проверьте LoadBalancer и скопируйте его DNS-имя.

Теперь перейдите на Route53 и создайте одну запись A в HostedZone.

Как только мы создадим действительную запись, созданная нами запись будет использоваться для маршрутизации трафика в кластер Kubernetes через созданный нами Nginx Ingress Controller. В этом случае kops.devopslee.com будет направлять трафик к Сервисам в кластере Kubernetes через Nginx Ingress Controller.

Создайте файлы определения объекта для примера приложения.

Теперь давайте создадим файлы определения объектов для развертывания примера приложения. Мы развернем 3 приложения, используя 3 развертывания и 3 соответствующих сервиса для развертывания. Затем мы создадим ресурс Ingress с маршрутизацией на основе пути, чтобы направлять трафик в наши приложения с помощью kops.devopslee.com на основе пути.

Создайте 1-nginx-main-app.yaml для приложения 1.

Ссылка на Github: нажмите здесь, чтобы скопировать файл из моего репозитория Github.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx-deploy-main
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-main
  template:
    metadata:
      labels:
        run: nginx-main
    spec:
      containers:
      - image: nginx
        name: nginx


---
apiVersion: v1
kind: Service
metadata:
  name: nginx-deploy-main
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 80
  selector:
    run: nginx-main

Создайте 2-nginx-green-app.yaml для приложения 2.

Ссылка на Github: нажмите здесь, чтобы скопировать файл из моего репозитория Github.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx-deploy-green
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-green
  template:
    metadata:
      labels:
        run: nginx-green
    spec:
      volumes:
      - name: webdata
        emptyDir: {}
      initContainers:
      - name: web-content
        image: busybox
        volumeMounts:
        - name: webdata
          mountPath: "/webdata"
        command: ["/bin/sh", "-c", 'echo "<h1>I am <font color=green>GREEN</font></h1>" > /webdata/index.html']
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: webdata
          mountPath: "/usr/share/nginx/html"


---
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-deploy-green
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 80
  selector:
    run: nginx-green          

Создайте 3-nginx-blue-app.yaml для приложения 3.

Ссылка на Github: нажмите здесь, чтобы скопировать файл из моего репозитория Github.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx-deploy-blue
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-blue
  template:
    metadata:
      labels:
        run: nginx-blue
    spec:
      volumes:
      - name: webdata
        emptyDir: {}
      initContainers:
      - name: web-content
        image: busybox
        volumeMounts:
        - name: webdata
          mountPath: "/webdata"
        command: ["/bin/sh", "-c", 'echo "<h1>I am <font color=blue>BLUE</font></h1>" > /webdata/index.html']
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: webdata
          mountPath: "/usr/share/nginx/html"


---
apiVersion: v1
kind: Service
metadata:
  name: nginx-deploy-blue
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 80
  selector:
    run: nginx-blue

Создайте 4-ingress.yaml для создания правил Ingress на основе пути.

Ссылка на Github: нажмите здесь, чтобы скопировать файл из моего репозитория Github.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: ingress-resource
spec:
  rules:
  - host: kops.devopslee.com
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-deploy-main
          servicePort: 80
      - path: /blue
        backend:
          serviceName: nginx-deploy-blue
          servicePort: 80
      - path: /green
        backend:
          serviceName: nginx-deploy-green
          servicePort: 80

Вы можете найти все эти файлы в моем репозитории Github здесь.

Развертывание примеров приложений

Давайте развернем примеры приложений одно за другим и проверим их состояние.

kubectl apply -f 1-nginx-main-app.yaml
kubectl apply -f 2-nginx-green-app.yaml
kubectl apply -f 3-nginx-blue-app.yaml
kubectl get deployments
kubectl get pods
kubectl get service

Развертывание входящего объекта

Теперь пришло время создать ресурс Ingress маршрутизации на основе пути. В то же время проверьте журналы Nginx Pod.

kubectl logs nginx-ingress-ingress-nginx-controller-5c97c6b4d5-btvpl -f
kubectl apply -f 4-ingress.yaml

Как только ресурс Ingress будет создан, вы увидите, что Nginx загрузил свою конфигурацию.

И теперь 3 разных приложения готовы к доступу с использованием одного и того же имени хоста, например kops.devopslee.com, по разным путям.

URL-адреса для приложений, имя хоста здесь будет другим для вас.

Доступ к nginx-deploy-main можно получить на kops.devopslee.com.

nginx-deploy-green можно найти на kops.devopslee.com/green и

Доступ к nginx-deploy-blue можно найти на kops.devopslee.com/blue.

Вы можете видеть, что 3 разных приложения могут быть доступны с использованием одного и того же имени хоста на основе пути.

Заключение

В этой статье мы рассмотрели шаги по созданию кластера Kubernetes с помощью Kops. Эта статья в основном посвящена настройке Nginx Ingress Controller с помощью Helm и созданию маршрутизации на основе пути с использованием ресурса Ingress. Мы развернули 3 разных примера приложений и попытались получить к ним доступ, используя одно и то же имя хоста и разные пути.