Соединение подов с помощью сервисов Kubernetes

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

Введение

В Kubernetes поды являются эфемерными объектами: они могут быть удалены и созданы заново в любой момент. Это создает проблему для сетевого взаимодействия, так как прямое подключение к поду затруднено. Для решения этой задачи в Kubernetes предусмотрена абстракция более высокого уровня — Сервис (Service). Сервис предоставляет стабильный IP-адрес и DNS-имя для группы подов, позволяя другим компонентам легко подключаться к ним. В этой лабораторной работе вы научитесь объединять поды в сеть с помощью сервисов в 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 для сброса среды, если это необходимо.

Создание пода

Первым шагом будет создание простого пода. Создайте файл с именем /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

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

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

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

Создание сервиса

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

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

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

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

Это создаст сервис с именем my-service, который выбирает поды с меткой app=nginx и открывает порт 80.

Тестирование сервиса

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

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

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

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

Это создаст под с именем test-pod-1, содержащий один контейнер с образом Busybox.

Теперь обратитесь к сервису из пода Busybox с помощью wget:

minikube kubectl -- exec test-pod-1 -- wget -qO- http://my-service

Эта команда вернет стандартную страницу Nginx, что подтверждает корректную работу сервиса.

Обновление сервиса

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

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

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

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

Это обновит сервис, чтобы он выбирал поды с меткой app=busybox. На данный момент у сервиса нет конечных точек (endpoints), так как ни один из существующих подов еще не имеет такой метки.

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

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

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

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

Прежде чем менять метки, убедитесь, что у сервиса нет соответствующих конечных точек:

minikube kubectl -- get endpoints my-service

В выводе должно быть указано <none>, так как ни один под в данный момент не имеет метки app=busybox.

Это происходит потому, что селектор сервиса теперь ищет app=busybox, а ваш под с сервером Nginx по-прежнему помечен как app=nginx. Чтобы исправить это, переименуйте исходный под сервера, чтобы сервис снова указывал на контейнер Nginx.

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

minikube kubectl -- label pod my-pod-1 app=busybox --overwrite

Это обновит метку на my-pod-1, чтобы она соответствовала селектору сервиса.

Теперь снова протестируйте сервис из my-pod-2:

minikube kubectl -- exec my-pod-2 -- wget -qO- http://my-service

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

Резюме

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