Сетевые взаимодействия с использованием Ingress в Kubernetes

KubernetesBeginner
Практиковаться сейчас

Введение

В этом лабораторном занятии вы научитесь использовать Ingress для маршрутизации внешнего трафика к службам, работающим в кластере Kubernetes.

Kubernetes Ingress - это мощный инструмент для управления внешним доступом к службам в кластере Kubernetes. Ingress действует как балансировщик нагрузки уровня 7, позволяя маршрутизировать трафик к разным службам на основе входящего URL-пути или имени хоста.

В этом лабораторном занятии мы создадим пример приложения и сделаем его доступным для внешнего мира с помощью Ingress. Мы будем использовать nginx-ingress в качестве контроллера Ingress, который является популярным и широко используемым решением для Kubernetes Ingress.

Запуск кластера Minikube

Перед созданием ресурсов вам нужен работающий кластер Kubernetes. Minikube - это легковесная среда Kubernetes, которая запускается на вашем локальном компьютере.

  1. Перейдите в рабочую директорию:

    Откройте терминал и перейдите в папку проекта по умолчанию:

    cd /home/labex/project
  2. Запустите Minikube:

    Запустите Minikube для инициализации кластера Kubernetes:

    minikube start
    • Эта команда настраивает однодневный кластер Kubernetes на вашем локальном компьютере.
    • В зависимости от производительности вашей системы Minikube может запускаться несколько минут.
  3. Проверьте, что 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, и мы рекомендуем вам проводить дальнейшие исследования.