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

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

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

Введение

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicsGroup(["Basics"]) kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("Initialization") kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/BasicCommandsGroup -.-> kubernetes/set("Set") kubernetes/BasicCommandsGroup -.-> kubernetes/expose("Expose") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/exec("Exec") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/label("Label") subgraph Lab Skills kubernetes/initialization -.-> lab-15815{{"Подключение подов (Pods) с помощью сервисов (Services) Kubernetes"}} kubernetes/get -.-> lab-15815{{"Подключение подов (Pods) с помощью сервисов (Services) Kubernetes"}} kubernetes/create -.-> lab-15815{{"Подключение подов (Pods) с помощью сервисов (Services) Kubernetes"}} kubernetes/set -.-> lab-15815{{"Подключение подов (Pods) с помощью сервисов (Services) Kubernetes"}} kubernetes/expose -.-> lab-15815{{"Подключение подов (Pods) с помощью сервисов (Services) Kubernetes"}} kubernetes/apply -.-> lab-15815{{"Подключение подов (Pods) с помощью сервисов (Services) Kubernetes"}} kubernetes/describe -.-> lab-15815{{"Подключение подов (Pods) с помощью сервисов (Services) Kubernetes"}} kubernetes/exec -.-> lab-15815{{"Подключение подов (Pods) с помощью сервисов (Services) Kubernetes"}} kubernetes/label -.-> lab-15815{{"Подключение подов (Pods) с помощью сервисов (Services) Kubernetes"}} end

Запуск кластера 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)

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

kubectl run my-pod-2 --image=nginx --restart=Never

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

Войдите в контейнер и используйте curl для доступа к сервису (Service), как вы делали на Шаге 3. На этот раз вы должны получить ошибку, указывающую, что соединение было отклонено.

Это происходит потому, что сервис (Service) теперь направлен на другой набор подов (Pods), чем те, которые запущены в тестовом поде (Pod). Чтобы исправить это, вы можете обновить метку (label) пода (Pod), чтобы она соответствовала новому селектору (selector) в сервисе (Service).

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

kubectl label pod my-pod-2 app=busybox

Это добавит метку (label) app=busybox к тестовому поду (Pod).

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

Итоги

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