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


