Команда перенаправления портов Kubernetes

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

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

Введение

В этом практическом занятии (лабораторной работе) вы узнаете, как использовать команду Kubernetes port-forward для перенаправления локального порта на порт в поде (pod). Перенаправление портов является важным инструментом отладки, которое позволяет безопасно получать доступ к приложениям, запущенным в вашем кластере, не открывая их для доступа из интернета. Вы начнете с простых примеров и постепенно перейдете к более сложным сценариям, включая работу с несколькими портами, несколькими контейнерами и службами (services).


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicsGroup(["Basics"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("Initialization") kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/expose("Expose") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/exec("Exec") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/port_forward("Port-Forward") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/proxy("Proxy") subgraph Lab Skills kubernetes/initialization -.-> lab-18494{{"Команда перенаправления портов Kubernetes"}} kubernetes/get -.-> lab-18494{{"Команда перенаправления портов Kubernetes"}} kubernetes/expose -.-> lab-18494{{"Команда перенаправления портов Kubernetes"}} kubernetes/exec -.-> lab-18494{{"Команда перенаправления портов Kubernetes"}} kubernetes/port_forward -.-> lab-18494{{"Команда перенаправления портов Kubernetes"}} kubernetes/proxy -.-> lab-18494{{"Команда перенаправления портов 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 для сброса среды при необходимости.

Исследование команды kubectl port-forward

Команда kubectl port-forward позволяет перенаправить один или несколько локальных портов на под (pod), развертывание (deployment) или службу (service) в вашем кластере Kubernetes. Она обычно используется для тестирования и отладки служб без их внешнего доступа.

Запустите следующую команду, чтобы просмотреть доступные параметры для kubectl port-forward:

kubectl port-forward -h

Вы увидите следующий вывод:

Перенаправить один или несколько локальных портов на под.

Используйте тип ресурса/имя, например, deployment/mydeployment, чтобы выбрать под. Если тип ресурса не указан, по умолчанию используется 'pod'.

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

Примеры:
  ## Прослушивать порты 5000 и 6000 локально, перенаправляя данные в/из портов 5000 и 6000 в поде
  kubectl port-forward pod/mypod 5000 6000

  ## Прослушивать порты 5000 и 6000 локально, перенаправляя данные в/из портов 5000 и 6000 в поде, выбранном по развертыванию
  kubectl port-forward deployment/mydeployment 5000 6000

  ## Прослушивать порт 8443 локально, перенаправляя на целевой порт (targetPort) порта службы с именем "https" в поде, выбранном по службе
  kubectl port-forward service/myservice 8443:https

  ## Прослушивать порт 8888 локально, перенаправляя на порт 5000 в поде
  kubectl port-forward pod/mypod 8888:5000

  ## Прослушивать порт 8888 на всех адресах, перенаправляя на порт 5000 в поде
  kubectl port-forward --address 0.0.0.0 pod/mypod 8888:5000

  ## Прослушивать порт 8888 на локальном хосте и выбранном IP-адресе, перенаправляя на порт 5000 в поде
  kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000

  ## Прослушивать случайный порт локально, перенаправляя на порт 5000 в поде
  kubectl port-forward pod/mypod :5000

Перенаправление локального порта на под

На этом шаге вы узнаете, как перенаправить локальный порт на порт в поде (pod). Это полезно для отладки приложений или доступа к службам, которые не доступны за пределами кластера.

Примечание о работе с терминалом:

  • Команда kubectl port-forward будет работать в терминале и блокировать его для других операций.
  • Вам нужно будет открыть новое окно терминала, чтобы выполнять дополнительные команды, пока работает перенаправление портов.
  • Чтобы остановить перенаправление портов в любое время, вы можете нажать Ctrl+C в терминале, где она запущена.
  1. Сначала создайте развертывание (deployment) с одним репликой и контейнером Nginx:

    kubectl create deployment nginx --image=nginx --replicas=1

    Эта команда создает развертывание, запускающее официальный образ контейнера Nginx.

  2. Подождите, пока под будет готов к работе:

    kubectl wait --for=condition=Ready pod -l app=nginx

    Получите имя пода, которое будем использовать для перенаправления портов:

    kubectl get pod -l app=nginx

    Вы должны увидеть вывод, похожий на следующий:

    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-66b6c48dd5-abcd1   1/1     Running   0          30s
  3. Используйте команду kubectl port-forward для перенаправления локального порта на под:

    Сначала получите имя вашего пода:

    export POD_NAME=$(kubectl get pods -l app=nginx -o jsonpath='{.items[0].metadata.name}')
    echo $POD_NAME

    Вы должны увидеть вывод, похожий на:

    nginx-748c667d99-pdhzs

    Теперь используйте имя пода для настройки перенаправления портов:

    kubectl port-forward $POD_NAME 19000:80

    Вы должны увидеть вывод, похожий на:

    Forwarding from 127.0.0.1:19000 -> 80
    Forwarding from [::1]:19000 -> 80
  4. Откройте новое окно терминала (поскольку перенаправление портов продолжает работать в текущем терминале) и проверьте перенаправление портов:

    curl http://localhost:19000

    Вы должны увидеть HTML - содержимое приветственной страницы Nginx.

    Вы также можете открыть веб - браузер и перейти по адресу http://localhost:19000, чтобы увидеть отрендеренную страницу.

Перенаправление нескольких локальных портов на под

Перед началом этого шага вам нужно:

  1. Остановить перенаправление портов из Шага 1. Вернитесь в тот терминал и нажмите Ctrl+C.

На этом шаге вы узнаете, как перенаправить несколько локальных портов на под. Мы перенаправим два разных локальных порта на один и тот же порт контейнера, что полезно, когда вы хотите предоставить разные точки доступа к одной и той же службе.

  1. Используйте следующие команды для настройки перенаправления портов:

    Сначала получите имя вашего пода, если вы еще этого не сделали:

    export POD_NAME=$(kubectl get pods -l app=nginx -o jsonpath='{.items[0].metadata.name}')
    echo $POD_NAME

    Вы должны увидеть вывод, похожий на:

    nginx-748c667d99-pdhzs

    Теперь настройте перенаправление портов, чтобы сопоставить два локальных порта (19080 и 19081) с портом 80 контейнера:

    ## Правильный формат: kubectl port-forward POD_NAME LOCAL_PORT:CONTAINER_PORT [LOCAL_PORT:CONTAINER_PORT...]
    kubectl port-forward pod/$POD_NAME 19080:80 19081:80

    Вы должны увидеть вывод, похожий на:

    Forwarding from 127.0.0.1:19080 -> 80
    Forwarding from [::1]:19080 -> 80
    Forwarding from 127.0.0.1:19081 -> 80
    Forwarding from [::1]:19081 -> 80

    Эта команда перенаправляет:

    • Локальный порт 19080 на порт 80 контейнера
    • Локальный порт 19081 на порт 80 контейнера

    Оба локальных порта сопоставлены с одним и тем же портом 80 контейнера Nginx, что позволяет вам получить доступ к одному и тому же веб - серверу через разные локальные порты.

  2. Проверьте перенаправление портов, проверив прослушиваемые порты:

    ss -tulnp | grep 1908

    Вы должны увидеть вывод, похожий на следующий:

    tcp   LISTEN  0       4096         0.0.0.0:19080     0.0.0.0:*
    tcp   LISTEN  0       4096         0.0.0.0:19081     0.0.0.0:*
  3. Теперь вы можете получить доступ к приветственной странице Nginx через любой из портов:

    curl http://localhost:19080
    curl http://localhost:19081

Оба URL - адреса покажут одну и ту же приветственную страницу Nginx, так как они оба перенаправлены на один и тот же порт контейнера.

Перенаправление локального порта на под с несколькими контейнерами

Перед началом этого шага:

  1. Если у вас есть запущенные команды перенаправления портов из предыдущих шагов, перейдите в соответствующие терминалы и нажмите Ctrl+C, чтобы остановить их.
  2. Мы начнем с нуля, настроив новый под с несколькими контейнерами.

На этом шаге вы узнаете, как перенаправить локальный порт на определенный контейнер в поде с несколькими контейнерами. Это распространенный сценарий в архитектурах микросервисов, где используются sidecar - контейнеры.

  1. Сначала очистим предыдущие ресурсы:

    kubectl delete deployment nginx
  2. Создадим под с двумя контейнерами: Nginx и BusyBox:

    cat << EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-busybox
      labels:
        app: nginx-multi
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
      - name: busybox
        image: busybox
        command: ['sh', '-c', 'while true; do sleep 3600; done']
    EOF
  3. Подождем, пока под будет готов к работе:

    kubectl wait --for=condition=Ready pod/nginx-busybox
  4. Проверим, что оба контейнера запущены:

    kubectl get pod nginx-busybox -o wide

    В столбце READY вы должны увидеть 2/2.

  5. Используем команду kubectl port-forward для перенаправления локального порта на контейнер Nginx:

    kubectl port-forward pod/nginx-busybox 19001:80
  6. В новом терминале проверим соединение:

    curl http://localhost:19001

    Вы должны увидеть HTML - содержимое приветственной страницы Nginx.

Использование перенаправления портов с службами Kubernetes

Перед началом этого шага:

  1. Если у вас есть запущенная команда перенаправления портов из Шага 3, перейдите в соответствующий терминал и нажмите Ctrl+C, чтобы остановить ее.
  2. Имейте в виду, что на этом шаге мы создадим новое развертывание (deployment) и службу (service), но вам не нужно удалять предыдущий под (pod), так как он не будет мешать нашим новым ресурсам.

На этом шаге вы узнаете, как использовать команду kubectl port-forward с службами Kubernetes. Перенаправление портов на службу отличается от перенаправления на под, так как оно позволяет вам получить доступ к любому поду, на который указывает служба.

  1. Сначала создайте новое развертывание с несколькими репликами:

    kubectl create deployment nginx-service --image=nginx --replicas=3
  2. Подождите, пока все поды будут готовы:

    kubectl wait --for=condition=Ready pod -l app=nginx-service
  3. Создайте службу для развертывания:

    kubectl expose deployment nginx-service --port=80 --type=ClusterIP --name=nginx-service
  4. Проверьте, что служба создана:

    kubectl get service nginx-service

    Вы должны увидеть вывод, похожий на:

    NAME           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
    nginx-service  ClusterIP   10.96.123.456   <none>        80/TCP    10s
  5. Используйте команду kubectl port-forward для перенаправления локального порта на службу:

    kubectl port-forward service/nginx-service 20000:80
  6. В новом терминале проверьте соединение:

    curl http://localhost:20000

    Вы должны увидеть HTML - содержимое приветственной страницы Nginx. Попробуйте выполнить эту команду несколько раз - вы можете заметить, что ответы приходят от разных подов, скрывающихся за службой.

Итоги

В этом практическом занятии вы узнали, как эффективно использовать команду перенаправления портов Kubernetes в различных сценариях. Вы практиковали:

  1. Перенаправление одного локального порта на под.
  2. Перенаправление нескольких локальных портов на один и тот же порт контейнера.
  3. Работу с подами, содержащими несколько контейнеров, и перенаправлением портов.
  4. Перенаправление портов на службы Kubernetes.

Эти навыки являются важными для отладки и тестирования приложений в кластере Kubernetes. Перенаправление портов обеспечивает безопасный способ доступа к вашим приложениям во время разработки и устранения неполадок без их публикации в Интернете.

Основные выводы:

  • Перенаправление портов представляет собой временное соединение, которое существует только до тех пор, пока выполняется команда kubectl port-forward.
  • Вы можете перенаправить несколько локальных портов на один и тот же порт контейнера.
  • Перенаправление портов работает как с подами, так и со службами.
  • При перенаправлении портов на службу запросы могут быть распределены между несколькими подами.

Не забывайте, что перенаправление портов в первую очередь является инструментом отладки и не должно использоваться для доступа к приложениям в производственной среде. В производственных сценариях вы должны использовать соответствующие типы служб Kubernetes (LoadBalancer, NodePort) или контроллеры Ingress.