Как настроить NGINX Ingress Controller в Kubernetes
Ingress — одна из важных концепций Kubernetes, которая позволяет внешним пользователям получать доступ к контейнерным приложениям, используя полное доменное имя (полное доменное имя). Хотя Ingress не включен и по умолчанию установлен в кластере Kubernetes. Мы должны дать к этой основной концепции , используя контроллеры сторонних Ingress , как Nginx , Traefik , HAProxy и Istio т.д.
В этом руководстве мы продемонстрируем, как настроить и использовать контроллер NGINX Ingress в кластере Kubernetes.
Как показано на рисунке выше, внешние пользователи обращаются к приложениям с помощью контроллера входящего трафика NGINX через полное доменное имя, а внутренний контроллер входа направляет запрос в службу, а затем служба направляет запрос в конечные точки или модули серверной части.
Включение контроллера входящего трафика NGINX в Minikube
Minikube — это кластер Kubernetes с одним узлом, мы можем легко включить контроллер входящего трафика nginx в minikube, выполнив команду minikube addons .
Выполните команду ниже, чтобы проверить состояние контроллера входящего трафика,
# minikube addons list
Выполните следующую команду 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
Мы получим следующий результат,
Выполните следующую команду 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
Отлично, приведенный выше вывод подтверждает, что входящие ресурсы были созданы успешно.
Перед доступом к этим 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 в Kubernetes. Пожалуйста, поделитесь своими ценными отзывами и комментариями.