Введение
В этом лабораторном занятии вы научитесь использовать Ingress для маршрутизации внешнего трафика к службам, работающим в кластере Kubernetes.
Kubernetes Ingress - это мощный инструмент для управления внешним доступом к службам в кластере Kubernetes. Ingress действует как балансировщик нагрузки уровня 7, позволяя маршрутизировать трафик к разным службам на основе входящего URL-пути или имени хоста.
В этом лабораторном занятии мы создадим пример приложения и сделаем его доступным для внешнего мира с помощью Ingress. Мы будем использовать nginx-ingress в качестве контроллера Ingress, который является популярным и широко используемым решением для Kubernetes Ingress.
Запуск кластера Minikube
Перед созданием ресурсов вам нужен работающий кластер Kubernetes. Minikube - это легковесная среда Kubernetes, которая запускается на вашем локальном компьютере.
Перейдите в рабочую директорию:
Откройте терминал и перейдите в папку проекта по умолчанию:
cd /home/labex/projectЗапустите Minikube:
Запустите Minikube для инициализации кластера Kubernetes:
minikube start- Эта команда настраивает однодневный кластер Kubernetes на вашем локальном компьютере.
- В зависимости от производительности вашей системы Minikube может запускаться несколько минут.
Проверьте, что Minikube запущен:
Проверьте статус кластера Minikube:
minikube status- Проверьте, чтобы компоненты, такие как
kubeletиapiserver, были перечислены какRunning(работающие). - Если кластер не запущен, запустите команду
minikube startснова.
- Проверьте, чтобы компоненты, такие как
Если у вас возникли проблемы при запуске Minikube, используйте minikube delete для сброса среды при необходимости.
Установка контроллера Ingress Nginx
Сначала нам нужно установить контроллер nginx-ingress в нашем кластере. Мы можем сделать это, создав Deployment и Service, которые будут отвечать за запуск контроллера Ingress.
Создайте пространство имен (namespace) для контроллера Ingress:
kubectl create namespace ingress-nginx
Установите чарт ingress-nginx с помощью kubectl:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/cloud/deploy.yaml
Проверьте, что поды (pods) контроллера ingress-nginx запущены:
kubectl get pods -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-zjfqx 0/1 ContainerCreating 0 2s
ingress-nginx-admission-patch-8rvzw 0/1 ContainerCreating 0 2s
ingress-nginx-controller-6bdb654777-qz8fb 0/1 ContainerCreating 0 2s
Создание примерного приложения
Далее мы создадим примерное приложение, которое будем предоставлять доступ к внешнему миру с помощью Ingress.
Создайте Deployment для примерного приложения:
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample-app
spec:
replicas: 3
selector:
matchLabels:
app: sample-app
template:
metadata:
labels:
app: sample-app
spec:
containers:
- name: sample-app
image: nginx
ports:
- containerPort: 80
Этот YAML-файл называется sample-app.yaml. Примените этот Deployment к вашему кластеру с помощью следующей команды:
kubectl apply -f sample-app.yaml
Создайте Service для примерного приложения:
apiVersion: v1
kind: Service
metadata:
name: sample-app
spec:
selector:
app: sample-app
ports:
- name: http
port: 80
targetPort: 80
Этот YAML-файл называется service-sample-app.yaml. Примените этот Service к вашему кластеру с помощью следующей команды:
kubectl apply -f service-sample-app.yaml
Создание ресурса Ingress
Теперь, когда мы настроили контроллер Ingress и запустили бэкенд-сервис, мы можем создать правила для ресурса Ingress.
В этом примере мы создадим простое правило для маршрутизации трафика для домена test.local к нашему бэкенд-сервису:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: test.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: sample-app
port:
name: http
Этот YAML-файл называется ingress.yaml. Примените ресурс Ingress к кластеру:
kubectl apply -f ingress.yaml
Тестирование ресурса Ingress
Наконец, мы можем протестировать ресурс Ingress, чтобы убедиться, что все работает правильно.
Сначала определите IP-адрес узла (node):
kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
minikube Ready control-plane 93s v1.26.1 192.168.49.2 <none> Ubuntu 20.04.5 LTS 5.15.0-56-generic docker://20.10.23
Эта команда получит адрес узла Kubernetes. IP-адрес, помеченный как INTERNAL-IP.
Далее, добавьте запись в файл /etc/hosts, чтобы сопоставить домен test.local с IP-адресом узла:
echo "<IP_ADDRESS> test.local" | sudo tee -a /etc/hosts
Замените <IP_ADDRESS> на внутренний IP-адрес узла. Например:
echo "192.168.49.2 test.local" | sudo tee -a /etc/hosts
Затем получите NodePort сервиса для ingress-nginx.
kubectl get services -n ingress-nginx
Эта команда отобразит список сервисов в пространстве имен (namespace) ingress-nginx. Найдите сервис nginx-ingress-controller и запишите его NodePort.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.104.99.158 <pending> 80:32518/TCP,443:31620/TCP 2m45s
ingress-nginx-controller-admission ClusterIP 10.100.46.109 <none> 443/TCP 2m45s
Наконец, используйте curl для выполнения HTTP-запроса к конечной точке Ingress:
curl test.local:NodePort
Например:
curl test.local:32518
Замените <NodePort> на NodePort сервиса nginx-ingress-controller.
Если все настроено правильно, вы должны увидеть приветственную страницу Nginx.
Вы также можете протестировать Ingress, используя веб-браузер для посещения test.local:<NodePort>/nginx.
Поздравляем! Вы успешно настроили ресурс Ingress в Kubernetes и протестировали его, чтобы убедиться, что он работает правильно.
Резюме
В этом практическом занятии мы прошли процесс настройки и конфигурации контроллера Ingress Nginx в Kubernetes. Мы также создали примерное приложение и использовали Ingress для маршрутизации внешнего трафика к нашему сервису Nginx. Это только начало того, что вы можете сделать с сетевыми возможностями Kubernetes, и мы рекомендуем вам проводить дальнейшие исследования.


