Как настроить NGINX Ingress Controller в Kubernetes

Как настроить NGINX Ingress Controller в Kubernetes

 

Ingress — одна из важных концепций Kubernetes, которая позволяет внешним пользователям получать доступ к контейнерным приложениям, используя полное доменное имя (полное доменное имя). Хотя Ingress не включен и по умолчанию установлен в кластере Kubernetes. Мы должны дать к этой основной концепции , используя контроллеры сторонних Ingress , как Nginx , Traefik , HAProxy и Istio т.д.

В этом руководстве мы продемонстрируем, как настроить и использовать контроллер NGINX Ingress в кластере Kubernetes.

Как настроить NGINX Ingress Controller в Kubernetes

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

Включение контроллера входящего трафика NGINX в Minikube

Minikube — это кластер Kubernetes с одним узлом, мы можем легко включить контроллер входящего трафика nginx в minikube, выполнив команду minikube addons .

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

# minikube addons list

Как настроить NGINX Ingress Controller в Kubernetes

Выполните следующую команду minikube, чтобы включить контроллер входящего трафика,

[root@infoit.com.ua ~]# minikube addons enable ingress
* The 'ingress' addon is enabled
[root@infoit.com.ua ~]#

Если мы повторно запустим команду « minikube addons list », на этот раз мы должны увидеть, что вход включен.

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

[root@infoit.com.ua ~]# kubectl get pods --all-namespaces | grep -i nginx-controller
kube-system      ingress-nginx-controller-7bb4c67d67-gkjj5    1/1     Running            0          20m
[root@infoit.com.ua ~]#

Приведенные выше выходные данные подтверждают, что nginx-controller был включен и успешно запустил свой под в пространстве имен kube-system .

Настройте NGINX Ingress Controller в кластере Kubernetes

Примечание: я предполагаю, что кластер Kubernetes запущен и работает.

Перейдите к главному узлу или узлу плоскости управления и выполните следующую команду kubectl,

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/deploy.yaml

Мы получим следующий результат,

Как настроить NGINX Ingress Controller в Kubernetes

Выполните следующую команду kubectl, чтобы проверить состояние модулей контроллера nginx-ingress,

root@infoit.com.ua:~$ kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-v7ftn        0/1     Completed   0          6m12s
ingress-nginx-admission-patch-njdnf         0/1     Completed   0          6m12s
ingress-nginx-controller-75f84dfcd7-p5dct   1/1     Running     0          6m23s
root@infoit.com.ua:~$

Отлично, приведенный выше вывод подтверждает, что NGINX Ingress Controller был успешно развернут и его модуль в настоящее время работает.

Тестовый контроллер входящего трафика

Чтобы протестировать контроллер Ingress, мы создадим два приложения на основе контейнера httpd и nginx и предоставим эти приложения через соответствующие службы, а затем создадим ресурс входа, который позволит внешним пользователям получать доступ к этим приложениям, используя их соответствующие URL-адреса.

Разверните развертывание на основе httpd и его службу с типом NodePort, прослушивающим порт 80. Создайте следующий файл yaml, который включает раздел развертывания и обслуживания,

[root@infoit.com.ua ~]# vi httpd-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      run: httpd-deployment
  template:
    metadata:
      labels:
        run: httpd-deployment
    spec:
      containers:
      - image: httpd
        name: httpd-webserver

---
apiVersion: v1
kind: Service
metadata:
  name: httpd-service
spec:
  type: NodePort
  selector:
    run: httpd-deployment
  ports:
    - port: 80

Сохраните и закройте файл.

Запустите команду kubectl для развертывания выше развертывания на основе httpd и его службы,

[root@infoit.com.ua ~]# kubectl create -f httpd-deployment.yaml
deployment.apps/httpd-deployment created
service/httpd-service created
[root@infoit.com.ua ~]#

Разверните наше следующее развертывание на основе NGINX и его сервис с NodePort в качестве его типа и порта как 80, содержимое файла yaml, перечисленное ниже,

[root@infoit.com.ua ~]# vi nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-deployment
  template:
    metadata:
      labels:
        run: nginx-deployment
    spec:
      containers:
      - image: nginx
        name: nginx-webserver

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    run: nginx-deployment
  ports:
    - port: 80

Сохраните и выйдите из файла

Теперь выполните следующую команду kubectl для развертывания выше развертывания на основе nginx и его службы,

[root@infoit.com.ua ~]# kubectl create -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
service/nginx-service created
[root@infoit.com.ua ~]#

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

[root@infoit.com.ua ~]# kubectl get deployments.apps httpd-deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
httpd-deployment   1/1     1            1           19m
[root@infoit.com.ua ~]#
[root@infoit.com.ua ~]# kubectl get deployments.apps nginx-deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   1/1     1            1           24m
[root@infoit.com.ua ~]#
[root@infoit.com.ua ~]# kubectl get service nginx-service httpd-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service NodePort 10.103.75.91 <none> 80:30042/TCP 78m
httpd-service NodePort 10.98.6.131 <none> 80:31770/TCP 73m
[root@infoit.com.ua ~]#

Создание и развертывание ресурса Ingress

Создайте следующий файл yaml входящего ресурса, который будет направлять запрос на соответствующий URL-адрес или путь на основе службы. В нашем примере мы используем url или fqdn.

[root@infoit.com.ua ~]# vim myweb-ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: name-based-virtualhost-ingress
spec:
  rules:
  - host: httpd.example.com
    http:
      paths:
      - backend:
          serviceName: httpd-service
          servicePort: 80

  - host: nginx.example.com
    http:
      paths:
      - backend:
          serviceName: nginx-service
          servicePort: 80

Сохраните и закройте файл.

Выполните команду под kubectl, чтобы создать входящий ресурс, указанный выше,

[root@infoit.com.ua ~]# kubectl create -f myweb-ingress.yaml
ingress.networking.k8s.io/name-based-virtualhost-ingress created
[root@infoit.com.ua ~]#

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

[root@infoit.com.ua ~]# kubectl get ingress name-based-virtualhost-ingress
[root@infoit.com.ua ~]# kubectl describe ingress name-based-virtualhost-ingress

Как настроить NGINX Ingress Controller в Kubernetes

Отлично, приведенный выше вывод подтверждает, что входящие ресурсы были созданы успешно.

Перед доступом к этим URL-адресам извне кластера обязательно добавьте следующие записи в файл hosts вашей системы, откуда вы намеревались получить к ним доступ.

192.168.1.190                httpd.example.com
192.168.1.190                nginx.example.com

Теперь попробуйте получить доступ к этим URL-адресам из веб-браузера, введите

http://httpd.example.com

http://nginx.example.com

Как настроить NGINX Ingress Controller в Kubernetes

Как установить Nginx в Ubuntu 20.04 LTS

Отлично, это подтверждает, что мы успешно развернули и настроили контроллер входящего трафика nginx в Kubernetes. Пожалуйста, поделитесь своими ценными отзывами и комментариями.