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


