Налаштування Ingress у Minikube з використанням NGINX Ingress Controller

Ingress — це API-обʼєкт, який визначає правила, що дозволяють зовнішній доступ до Serviceʼів у кластері. Ingress-контролер виконує правила, встановлені в Ingress.

Ця сторінка показує, як налаштувати простий Ingress, який маршрутизує запити до Service 'web' або 'web2' залежно від HTTP URI.

Перш ніж ви розпочнете

Це завдання передбачає, що ви використовуєте minikube для запуску локального Kubernetes кластера. Відвідайте сторінкуВстановлення інструментів, щоб дізнатися, як встановити minikube.

Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:

Версія вашого Kubernetes сервера має бути не старішою ніж 1.19. Для перевірки версії введіть kubectl version. Якщо ви використовуєте старішу версію Kubernetes, використовуйте документацію для цієї версії.

Створіть кластер minikube

Якщо ви ще не налаштували кластер локально, виконайте minikube start, щоб створити кластер.

Увімкніть Ingress-контролер

  1. Для увімкнення NGINX Ingress Controller, виконайте наступну команду:

    minikube addons enable ingress
    
  2. Переконайтеся, що NGINX Ingress Controller працює:

    kubectl get pods -n ingress-nginx
    

    Вивід подібний до:

    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

  1. Створіть 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
    
  2. Опублікуйте Deployment:

    kubectl expose deployment web --type=NodePort --port=8080
    

    Вивід має бути:

    service/web exposed
    
  3. Переконайтеся, що 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
    
  4. Відвідайте 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.

  1. Створіть файл 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
  2. Створіть обʼєкт Ingress, виконавши наступну команду:

    kubectl apply -f https://k8s.io/examples/service/networking/example-ingress.yaml
    

    Вивід має бути:

    ingress.networking.k8s.io/example-ingress created
    
  3. Переконайтеся, що IP-адреса встановлена:

    kubectl get ingress
    

    Ви повинні побачити IPv4-адресу у стовпці ADDRESS; наприклад:

    NAME              CLASS   HOSTS                 ADDRESS        PORTS   AGE
    example-ingress   nginx   hello-world.example   172.17.0.15    80      38s
    
  4. Перевірте, що Ingress-контролер спрямовує трафік, дотримуючись інструкцій для вашої платформи:

    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
    
  5. За бажанням ви також можете відвідати hello-world.example зі свого оглядача.

    Додайте рядок у кінець файлу /etc/hosts на вашому компʼютері (потрібні права адміністратора):

    Знайдіть зовнішню IP-адресу, як вказано у звіті minikube

      minikube ip 
    

      172.17.0.15 hello-world.example
    

    127.0.0.1 hello-world.example
    

    Після цього ваш вебоглядач надсилатиме запити на URL-адреси hello-world.example до Minikube.

Створіть другий Deployment

  1. Створіть інший 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
    
  2. Опублікуйте другий Deployment:

    kubectl expose deployment web2 --port=8080 --type=NodePort
    

    Вивід має бути:

    service/web2 exposed
    

Редагування поточного Ingress

  1. Відредагуйте поточний маніфест example-ingress.yaml та додайте наступні рядки в кінці:

    - path: /v2
      pathType: Prefix
      backend:
        service:
          name: web2
          port:
            number: 8080
    
  2. Застосуйте зміни:

    kubectl apply -f example-ingress.yaml
    

    Ви маєте побачити:

    ingress.networking/example-ingress configured
    

Перевірка вашого Ingress

  1. Отримайте доступ до першої версії застосунку 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
    
  2. Отримайте доступ до другої версії застосунку 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
    

Що далі

Змінено June 20, 2024 at 12:44 PM PST: Sync changest from andygol/k8s-website (36d05bc8a1)