Команда expose в Kubernetes

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Команда expose в Kubernetes представляет собой простой, но мощный инструмент для предоставления доступа к поду (pod) или развертыванию (deployment) через сеть с использованием сетевого сервиса (network service). В этом практическом занятии (lab) вы пройдете пошагово процесс запуска кластера Kubernetes, создания развертывания, предоставления его в виде сервиса и доступа к этому сервису для проверки его функциональности. По завершении этого практического занятия вы будете четко понимать, как предоставлять доступ к развертываниям и работать с сервисами в Kubernetes.

Это Guided Lab, который предоставляет пошаговые инструкции, чтобы помочь вам учиться и практиковаться. Внимательно следуйте инструкциям, чтобы выполнить каждый шаг и получить практический опыт. Исторические данные показывают, что это лабораторная работа уровня начальный с процентом завершения 97%. Он получил 100% положительных отзывов от учащихся.

Запуск Minikube

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

  1. Откройте терминал и запустите Minikube с помощью следующей команды:

    minikube start

Это инициализирует кластер. При необходимости вы можете указать ограничения по ресурсам с помощью флагов, таких как --cpus и --memory, чтобы обеспечить достаточное количество ресурсов для кластера.

  1. Проверьте, что Minikube запущен:

    minikube status

Вы должны увидеть, что кластер и его компоненты успешно запущены.

Запуск Minikube гарантирует, что Kubernetes готов управлять развертываниями (deployments) и сервисами (services) на последующих шагах.

Создание развертывания (Deployment)

В Kubernetes развертывание (deployment) представляет собой объект ресурса, который гарантирует, что ваше приложение всегда имеет желаемое количество реплик (replicas), запущенных в кластере. Развертывания управляют подами (pods) и помогают поддерживать их состояние в кластере. На этом шаге вы создадите развертывание, которое будет запускать веб - сервер Nginx.

  1. Используйте следующую команду для создания развертывания с именем hello - world с использованием образа nginx:

    kubectl create deployment hello-world --image=nginx

Эта команда создает развертывание с одним подом (pod), в котором запущен веб - сервер Nginx. Флаг --image указывает, какой контейнерный образ использовать. Поскольку количество реплик не указано явно, Kubernetes по умолчанию создаст один под.

  1. Проверьте, было ли развертывание успешно создано, выполнив следующую команду:

    kubectl get deployments

Эта команда выводит список всех развертываний в текущем пространстве имен (namespace), показывая их имена, желаемое количество реплик и статус.

Создание этого развертывания позволяет Kubernetes автоматически управлять созданием подов и их перезапуском, чтобы поддерживать желаемое состояние приложения.

Исследование команды kubectl expose

Команда kubectl expose используется для создания нового сервиса (service) Kubernetes, который делает доступным существующий ресурс, такой как под (pod), развертывание (deployment) или контроллер репликации (replication controller). Она упрощает настройку сети, автоматически создавая сервисы на основе предоставленного ресурса.

Выполните следующую команду, чтобы просмотреть доступные параметры для kubectl expose:

kubectl expose -h

Вы увидите следующий вывод:

Создать новый сервис Kubernetes на основе существующего ресурса.

Находит развертывание, сервис, набор реплик (replica set), контроллер репликации или под по имени и использует селектор этого ресурса в качестве селектора для нового сервиса на указанном порту. Развертывание или набор реплик будут доступны как сервис только в том случае, если их селектор может быть преобразован в селектор, поддерживаемый сервисом, то есть когда селектор содержит только компонент matchLabels. Обратите внимание, что если порт не указан с помощью флага --port и у экспортируемого ресурса есть несколько портов, все они будут использованы новым сервисом. Также, если метки не указаны, новый сервис будет использовать метки из ресурса, который он экспортирует.

Возможные ресурсы включают (без учета регистра):
  pod (po), service (svc), replicationcontroller (rc), deployment (deploy), replicaset (rs)

Примеры:
  ## Создать сервис для реплицированного nginx, который слушает на порту 80 и подключается к контейнерам на порту 8000
  kubectl expose rc nginx --port=80 --target-port=8000

  ## Создать сервис для контроллера репликации, идентифицируемого по типу и имени, указанным в файле "nginx-controller.yaml",
  который слушает на порту 80 и подключается к контейнерам на порту 8000
  kubectl expose -f nginx-controller.yaml --port=80 --target-port=8000

  ## Создать сервис для пода valid-pod, который слушает на порту 444 с именем "frontend"
  kubectl expose pod valid-pod --port=444 --name=frontend

  ## Создать второй сервис на основе вышеуказанного сервиса, экспортируя порт контейнера 8443 как порт 443 с именем
  "nginx-https"
  kubectl expose service nginx --port=443 --target-port=8443 --name=nginx-https

  ## Создать сервис для реплицированного потокового приложения на порту 4100, балансирующий UDP-трафик и имеющий имя 'video-stream'.
  kubectl expose rc streamer --port=4100 --protocol=UDP --name=video-stream

  ## Создать сервис для реплицированного nginx с использованием набора реплик, который слушает на порту 80 и подключается к контейнерам на
  порту 8000
  kubectl expose rs nginx --port=80 --target-port=8000

  ## Создать сервис для развертывания nginx, который слушает на порту 80 и подключается к контейнерам на порту 8000
  kubectl expose deployment nginx --port=80 --target-port=8000

Предоставление доступа к развертыванию (Deployment)

Для того чтобы развертывание было доступно извне кластера Kubernetes, необходимо сделать его доступным в виде сервиса (service). Сервис в Kubernetes представляет собой стабильную сетевую точку доступа, даже если поды (pods), на которых он основан, изменяются.

  1. Выполните следующую команду для создания сервиса типа NodePort с именем hello-service:

    kubectl expose deployment hello-world --name=hello-service --port=80 --target-port=80 --type=NodePort
    • Флаг --port указывает порт, на котором сервис будет доступен для внешних клиентов.
    • Флаг --target-port определяет порт на контейнере, на который сервис будет перенаправлять трафик.
    • Флаг --type=NodePort делает сервис доступным на определенном порту на каждом узле (node) кластера.
  2. Проверьте, был ли сервис успешно создан:

    kubectl get services hello-service

Эта команда отображает детали сервиса, включая его тип и назначенный порт NodePort.

Сервисы типа NodePort позволяют внешним клиентам взаимодействовать с подами в кластере Kubernetes, перенаправляя запросы на правильные порты контейнеров.

Получение деталей сервиса

Для доступа к экспортированному сервису вам нужен порт NodePort, назначенный сервису, и внутренний IP - адрес узла (node) в кластере. Эти детали позволяют внешним клиентам подключаться к вашему приложению.

  1. Получите порт NodePort, назначенный сервису hello-service, выполнив следующую команду:

    kubectl get service hello-service -o jsonpath='{.spec.ports[0].nodePort}'

Эта команда извлекает значение порта NodePort из определения сервиса.

  1. Получите внутренний IP - адрес любого узла в кластере с помощью следующей команды:

    kubectl get nodes -o wide

Обратите внимание на поле INTERNAL - IP в выводе. Этот IP - адрес представляет собой частный сетевой адрес узла.

Имея порт NodePort и внутренний IP - адрес, вы теперь имеете необходимые детали для внешнего доступа к сервису.

Доступ к сервису

Имея порт NodePort и IP - адрес узла, вы можете протестировать сервис с помощью инструмента, такого как curl, или веб - браузера.

  1. Замените <NODE_IP> и <NODE_PORT> значениями, полученными на предыдущем шаге, а затем выполните следующую команду:

    curl <NODE_IP>:<NODE_PORT>
  2. Если все настроено правильно, вы должны увидеть стандартную приветственную страницу Nginx в терминале. Этот вывод подтверждает, что сервис запущен и доступен извне.

<!doctype html>
<html>
  <head>
    <title>Welcome to nginx!</title>
    <style>
      html {
        color-scheme: light dark;
      }
      body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
      }
    </style>
  </head>
  <body>
    <h1>Welcome to nginx!</h1>
    <p>
      If you see this page, the nginx web server is successfully installed and
      working. Further configuration is required.
    </p>

    <p>
      For online documentation and support please refer to
      <a href="http://nginx.org/">nginx.org</a>.<br />
      Commercial support is available at
      <a href="http://nginx.com/">nginx.com</a>.
    </p>

    <p><em>Thank you for using nginx.</em></p>
  </body>
</html>

Доступ к сервису демонстрирует, как Kubernetes управляет маршрутизацией трафика между клиентами и соответствующими портами контейнеров.

Очистка ресурсов

После завершения лабораторной работы важно очистить созданные вами ресурсы, чтобы избежать ненужного потребления ресурсов в вашем кластере Kubernetes.

  1. Удалите сервис hello-service, выполнив следующую команду:

    kubectl delete service hello-service
  2. Удалите развертывание (deployment) hello-world с помощью следующей команды:

    kubectl delete deployment hello-world

Очистка ресурсов гарантирует, что ваш кластер остается в чистоте и готов к будущим экспериментам.

Резюме

В этой лабораторной работе вы научились использовать команду expose в Kubernetes для создания сервиса типа NodePort. Вы сделали доступным развертывание (deployment) Nginx, получили к нему доступ через порт NodePort и проверили его работоспособность. Это упражнение продемонстрировало основные концепции сервисов (services) Kubernetes и то, как они обеспечивают сетевой доступ к вашим рабочим нагрузкам.