Подключение подов (Pods) с помощью сервисов (Services) Kubernetes

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

Введение

В Kubernetes поды (Pods) являются временными и могут быть остановлены и пересозданы в любое время. Это представляет проблему в области сетевого взаимодействия, так как напрямую подключиться к поду (Pod) сложно. Чтобы решить эту проблему, Kubernetes предоставляет более высокоуровневую абстракцию, называемую Сервис (Service). Сервис (Service) предоставляет стабильный IP-адрес и DNS-имя для группы подов (Pods), позволяя другим компонентам легко подключаться к ним. В этом лабораторном занятии (LabEx) вы научитесь настраивать сетевое взаимодействие между подами (Pods) и сервисами (Services) в Kubernetes.

Запустите кластер 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 для сброса среды, если это необходимо.

Создание пода (Pod)

Первым шагом является создание простого пода (Pod). Создайте файл с именем /home/labex/project/myapp-pod.yaml со следующим содержимым:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod-1
  labels:
    app: nginx
spec:
  containers:
    - name: my-container
      image: nginx

Сохраните файл и создайте под (Pod), выполнив следующую команду:

kubectl apply -f /home/labex/project/myapp-pod.yaml

Это создаст под (Pod) с именем my-pod-1 с одним контейнером, в котором запущено изображение (image) Nginx.

Создание сервиса (Service)

Вторым шагом является создание сервиса (Service), который будет направлен на под (Pod), созданный на предыдущем шаге. Создайте файл с именем /home/labex/project/service.yaml со следующим содержимым:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: nginx
  ports:
    - name: http
      port: 80
      targetPort: 80

Сохраните файл и создайте сервис (Service), выполнив следующую команду:

kubectl apply -f /home/labex/project/service.yaml

Это создаст сервис (Service) с именем my-service, который будет направлен на поды (Pods) с меткой (label) app=nginx и откроет порт 80.

Тестирование сервиса (Service)

Третий шаг - это тестирование сервиса (Service) путем доступа к нему из другого пода (Pod). Создайте файл с именем /home/labex/project/test-pod-1.yaml со следующим содержимым:

apiVersion: v1
kind: Pod
metadata:
  name: test-pod-1
spec:
  containers:
    - name: my-container
      image: nginx
      command:
        - sleep
        - "3600"

Сохраните файл и создайте тестовый под (Pod), выполнив следующую команду:

kubectl apply -f /home/labex/project/test-pod-1.yaml

Это создаст под (Pod) с именем test-pod-1 с одним контейнером, в котором запущено изображение (image) Nginx.

Далее вы войдете в контейнер и используете curl для доступа к сервису (Service). Выполните следующую команду, чтобы войти в контейнер:

kubectl exec -it test-pod-1 -- sh

Это откроет оболочку (shell) внутри контейнера. Из оболочки (shell) выполните следующую команду, чтобы получить доступ к сервису (Service):

curl http://my-service

Это вернет страницу по умолчанию Nginx, что означает, что сервис (Service) работает корректно.

Обновление сервиса (Service)

Четвертый шаг - это обновление сервиса (Service) для обращения к другому набору подов (Pods). Обновите поле selector в файле /home/labex/project/service.yaml следующим образом:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: busybox
  ports:
    - name: http
      port: 80
      targetPort: 8

Сохраните файл и обновите сервис (Service), выполнив следующую команду:

kubectl apply -f service.yaml

Это обновит сервис (Service) для обращения к подам (Pods) с меткой (label) app=busybox.

Тестирование обновленного сервиса (Service)

Пятый шаг — протестировать обновленный Сервис, обратившись к нему из другого Pod. Создайте новый тестовый Pod с помощью следующей команды:

kubectl run my-pod-2 --image=busybox --restart=Never -- sleep 3600

Это создаст новый Pod с именем my-pod-2 с одним контейнером, работающим с образом Busybox.

Выполните exec в контейнер и используйте curl для доступа к Сервису, как вы это делали на шаге 3. Выполните следующую команду, чтобы выполнить exec в контейнер:

kubectl exec -it my-pod-2 -- sh

На этот раз вы должны получить ошибку, указывающую на то, что соединение было отклонено.

Это связано с тем, что Сервис теперь нацелен на другой набор Pod'ов, чем те, которые запускает тестовый Pod. Чтобы исправить это, вы можете обновить метку Pod'а, чтобы она соответствовала новому селектору в Сервисе.

Выполните следующую команду, чтобы обновить метку тестового Pod'а:

kubectl label pod my-pod-2 app=busybox

Это добавит метку app=busybox к тестовому Pod'у.

Теперь, если вы снова запустите команду curl, вы должны получить страницу Nginx по умолчанию, что указывает на правильную работу Сервиса.

Резюме

В этом лабораторном занятии вы узнали, как подключать поды (Pods) к сервисам (Services) в Kubernetes. Вы создали простой под (Pod), запускающий изображение (image) Nginx, создали сервис (Service), направленный на этот под (Pod), и протестировали сервис (Service), обратившись к нему из другого пода (Pod). Вы также узнали, как обновить сервис (Service) для обращения к другому набору подов (Pods) и как обновить метку (label) пода (Pod), чтобы она соответствовала новому селектору (selector) в сервисе (Service). Сервисы (Services) являются важной частью сетевого взаимодействия в Kubernetes и позволяют вам надежно и масштабируемо подключаться к подам (Pods).