Налаштування Ingress у Minikube з використанням NGINX Ingress Controller
Ingress — це API-обʼєкт, який визначає правила, що дозволяють зовнішній доступ до Serviceʼів у кластері. Ingress-контролер виконує правила, встановлені в Ingress.
Ця сторінка показує, як налаштувати простий Ingress, який маршрутизує запити до Service 'web' або 'web2' залежно від HTTP URI.
Перш ніж ви розпочнете
Це завдання передбачає, що ви використовуєте minikube
для запуску локального Kubernetes кластера. Відвідайте сторінкуВстановлення інструментів, щоб дізнатися, як встановити minikube
.
Примітка:
Це завдання використовує контейнер, який вимагає архітектури AMD64. Якщо ви використовуєте minikube на компʼютері з іншою архітектурою процесора, ви можете спробувати використовувати minikube з драйвером, який може емулювати AMD64. Наприклад, драйвер Docker Desktop може це робити.Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Версія вашого Kubernetes сервера має бути не старішою ніж 1.19. Для перевірки версії введітьkubectl version
.
Якщо ви використовуєте старішу версію Kubernetes, використовуйте документацію для цієї версії.Створіть кластер minikube
Якщо ви ще не налаштували кластер локально, виконайте minikube start
, щоб створити кластер.
Увімкніть Ingress-контролер
Для увімкнення NGINX Ingress Controller, виконайте наступну команду:
minikube addons enable ingress
Переконайтеся, що NGINX Ingress Controller працює:
kubectl get pods -n ingress-nginx
Примітка:
Це може зайняти до хвилини, перш ніж ви побачите що ці Podʼи, що працюють нормально.Вивід подібний до:
NAME READY STATUS RESTARTS AGE ingress-nginx-admission-create-g9g49 0/1 Completed 0 11m ingress-nginx-admission-patch-rqp78 0/1 Completed 1 11m ingress-nginx-controller-59b45fb494-26npt 1/1 Running 0 11m
Розгорніть застосунок hello world
Створіть Deployment за допомогою наступної команди:
kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0
Вивід має бути:
deployment.apps/web created
Переконайтеся, що Deployment перебуває у стані Ready:
kubectl get deployment web
Вивід має бути подібний до:
NAME READY UP-TO-DATE AVAILABLE AGE web 1/1 1 1 53s
Опублікуйте Deployment:
kubectl expose deployment web --type=NodePort --port=8080
Вивід має бути:
service/web exposed
Переконайтеся, що Service створено і він доступний на порті вузла:
kubectl get service web
Вивід подібний до:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web NodePort 10.104.133.249 <none> 8080:31637/TCP 12m
Відвідайте Service через NodePort, використовуючи команду
minikube service
. Дотримуйтесь інструкцій для вашої платформи:minikube service web --url
Вивід подібний до:
http://172.17.0.15:31637
Виконайте запит до URL, отриманого у попередньому кроці:
curl http://172.17.0.15:31637
# Команду потрібно виконати в окремому терміналі. minikube service web --url
Вивід подібний до:
http://127.0.0.1:62445 ! Оскільки ви використовуєте драйвер Docker на darwin, термінал має бути відкритий для його запуску.
В іншому терміналі виконайте запит до URL, отриманого у попередньому кроці:
curl http://127.0.0.1:62445
Вивід подібний до:
Hello, world! Version: 1.0.0 Hostname: web-55b8c6998d-8k564
Тепер ви можете отримати доступ до застосунку прикладу через IP-адресу Minikube і NodePort. Наступний крок дозволяє отримати доступ до застосунку, використовуючи ресурс Ingress.
Створіть Ingress
Наступний маніфест визначає Ingress, який надсилає трафік до вашого Service через hello-world.example
.
Створіть файл
example-ingress.yaml
з наступним вмістом:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: ingressClassName: nginx rules: - host: hello-world.example http: paths: - path: / pathType: Prefix backend: service: name: web port: number: 8080
Створіть обʼєкт Ingress, виконавши наступну команду:
kubectl apply -f https://k8s.io/examples/service/networking/example-ingress.yaml
Вивід має бути:
ingress.networking.k8s.io/example-ingress created
Переконайтеся, що IP-адреса встановлена:
kubectl get ingress
Примітка:
Це може тривати кілька хвилин.Ви повинні побачити IPv4-адресу у стовпці
ADDRESS
; наприклад:NAME CLASS HOSTS ADDRESS PORTS AGE example-ingress nginx hello-world.example 172.17.0.15 80 38s
Перевірте, що Ingress-контролер спрямовує трафік, дотримуючись інструкцій для вашої платформи:
Примітка:
Мережа обмежена, якщо використовується драйвер Docker на MacOS (Darwin), і IP вузла не доступний безпосередньо. Щоб Ingress працював, потрібно відкрити новий термінал і виконатиminikube tunnel
. Необхідні дозволиsudo
, тому надайте пароль при запиті.curl --resolve "hello-world.example:80:$( minikube ip )" -i http://hello-world.example
minikube tunnel
Вивід подібний до:
Tunnel successfully started NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ... The service/ingress example-ingress requires privileged ports to be exposed: [80 443] sudo permission will be asked for it. Starting tunnel for service example-ingress.
В іншому терміналі виконайте наступну команду:
curl --resolve "hello-world.example:80:127.0.0.1" -i http://hello-world.example
Ви повинні побачити:Hello, world! Version: 1.0.0 Hostname: web-55b8c6998d-8k564
За бажанням ви також можете відвідати
hello-world.example
зі свого оглядача.Додайте рядок у кінець файлу
/etc/hosts
на вашому компʼютері (потрібні права адміністратора):Знайдіть зовнішню IP-адресу, як вказано у звіті minikube
minikube ip
172.17.0.15 hello-world.example
Примітка:
Змініть IP-адресу відповідно до виводу зminikube ip
.127.0.0.1 hello-world.example
Після цього ваш вебоглядач надсилатиме запити на URL-адреси
hello-world.example
до Minikube.
Створіть другий Deployment
Створіть інший Deployment, виконавши наступну команду:
kubectl create deployment web2 --image=gcr.io/google-samples/hello-app:2.0
Вивід має бути:
deployment.apps/web2 created
Переконайтеся, що Deployment перебуває у стані Ready:
kubectl get deployment web2
Вихід має бути подібний до:
NAME READY UP-TO-DATE AVAILABLE AGE web2 1/1 1 1 16s
Опублікуйте другий Deployment:
kubectl expose deployment web2 --port=8080 --type=NodePort
Вивід має бути:
service/web2 exposed
Редагування поточного Ingress
Відредагуйте поточний маніфест
example-ingress.yaml
та додайте наступні рядки в кінці:- path: /v2 pathType: Prefix backend: service: name: web2 port: number: 8080
Застосуйте зміни:
kubectl apply -f example-ingress.yaml
Ви маєте побачити:
ingress.networking/example-ingress configured
Перевірка вашого Ingress
Отримайте доступ до першої версії застосунку Hello World.
curl --resolve "hello-world.example:80:$( minikube ip )" -i http://hello-world.example
minikube tunnel
Вивід подібний до:
Tunnel successfully started NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ... The service/ingress example-ingress requires privileged ports to be exposed: [80 443] sudo permission will be asked for it. Starting tunnel for service example-ingress.
В іншому терміналі виконайте наступну команду:
curl --resolve "hello-world.example:80:127.0.0.1" -i http://hello-world.example
Вивід подібний до:
Hello, world! Version: 1.0.0 Hostname: web-55b8c6998d-8k564
Отримайте доступ до другої версії застосунку Hello World.
curl --resolve "hello-world.example:80:$( minikube ip )" -i http://hello-world.example/v2
minikube tunnel
Вивід подібний до:
Tunnel successfully started NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ... The service/ingress example-ingress requires privileged ports to be exposed: [80 443] sudo permission will be asked for it. Starting tunnel for service example-ingress.
В іншому терміналі виконайте наступну команду:
curl --resolve "hello-world.example:80:127.0.0.1" -i http://hello-world.example/v2
Вивід подібний до:
Hello, world! Version: 2.0.0 Hostname: web2-75cd47646f-t8cjk
Примітка:
Якщо ви виконали необовʼязковий крок для оновлення/etc/hosts
, ви також можете відвідатиhello-world.example
таhello-world.example/v2
зі свого огляача.
Що далі
- Докладніше про Ingress
- Докладніше про Контролери Ingress
- Докладніше про Service