Kubernetes 端口转发命令

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,你将学习如何使用 Kubernetes 的 port-forward 命令将本地端口转发到 Pod 上的端口。端口转发是一个关键的调试工具,它允许你安全地访问集群中运行的应用程序,而无需将它们暴露到互联网上。你将从简单的示例开始,逐步过渡到更复杂的场景,包括处理多个端口、多个容器和服务。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicsGroup(["`Basics`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicCommandsGroup(["`Basic Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["`Troubleshooting and Debugging 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
    • 查找 kubeletapiserver 等组件是否显示为 Running
    • 如果集群未运行,请重新运行 minikube start

如果启动 Minikube 时遇到问题,可以使用 minikube delete 来重置环境(如有需要)。

探索 kubectl port-forward 命令

kubectl port-forward 命令允许你将一个或多个本地端口转发到 Kubernetes 集群中的 Pod、Deployment 或 Service。它通常用于在不对外暴露服务的情况下进行测试和调试。

运行以下命令以查看 kubectl port-forward 的可用选项:

kubectl port-forward -h

你将看到以下输出:

将一个或多个本地端口转发到 Pod。

使用资源类型/名称(如 deployment/mydeployment)来选择 Pod。如果省略资源类型,则默认为 'pod'。

如果有多个 Pod 符合条件,将自动选择一个 Pod。当所选 Pod 终止时,转发会话结束,需要重新运行命令以恢复转发。

示例:
  ## 在本地监听端口 5000 和 6000,将数据转发到 Pod 中的端口 5000 和 6000
  kubectl port-forward pod/mypod 5000 6000

  ## 在本地监听端口 5000 和 6000,将数据转发到由 Deployment 选择的 Pod 中的端口 5000 和 6000
  kubectl port-forward deployment/mydeployment 5000 6000

  ## 在本地监听端口 8443,将数据转发到由 Service 选择的 Pod 中名为 "https" 的端口的目标端口
  kubectl port-forward service/myservice 8443:https

  ## 在本地监听端口 8888,将数据转发到 Pod 中的端口 5000
  kubectl port-forward pod/mypod 8888:5000

  ## 在所有地址上监听端口 8888,将数据转发到 Pod 中的端口 5000
  kubectl port-forward --address 0.0.0.0 pod/mypod 8888:5000

  ## 在 localhost 和指定 IP 上监听端口 8888,将数据转发到 Pod 中的端口 5000
  kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000

  ## 在本地监听一个随机端口,将数据转发到 Pod 中的端口 5000
  kubectl port-forward pod/mypod :5000

将本地端口转发到 Pod

在这一步骤中,你将学习如何将本地端口转发到 Pod 上的端口。这对于调试应用程序或访问未在集群外部暴露的服务非常有用。

关于终端管理的注意事项:

  • kubectl port-forward 命令将在你的终端中持续运行,并阻止其他操作
  • 你需要打开一个新的终端窗口以在端口转发活动时运行其他命令
  • 要随时停止端口转发,可以在运行该命令的终端中按 Ctrl+C
  1. 首先创建一个包含一个副本和 Nginx 容器的 Deployment:

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

    此命令创建了一个运行官方 Nginx 容器镜像的 Deployment。

  2. 等待 Pod 变为就绪状态:

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

    获取我们将用于端口转发的 Pod 名称:

    kubectl get pod -l app=nginx

    你应该会看到类似以下的输出:

    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-66b6c48dd5-abcd1   1/1     Running   0          30s
  3. 使用 kubectl port-forward 命令将本地端口转发到 Pod:

    首先,获取你的 Pod 名称:

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

    你应该会看到类似以下的输出:

    nginx-748c667d99-pdhzs

    现在使用 Pod 名称设置端口转发:

    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

    你应该会看到 Nginx 欢迎页面的 HTML 内容。

    你还可以打开浏览器并访问 http://localhost:19000 以查看渲染后的页面。

将多个本地端口转发到 Pod

在开始此步骤之前,你需要:

  1. 停止步骤 1 中的端口转发,返回该终端并按 Ctrl+C

在本步骤中,你将学习如何将多个本地端口转发到 Pod。我们将两个不同的本地端口转发到同一个容器端口,这在你希望为同一服务提供不同访问点时非常有用。

  1. 使用以下命令设置端口转发:

    首先,获取你的 Pod 名称(如果尚未获取):

    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

    两个本地端口都映射到同一个 Nginx 容器端口 80,允许你通过不同的本地端口访问相同的 Web 服务器。

  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 欢迎页面。

将本地端口转发到包含多个容器的 Pod

在开始此步骤之前:

  1. 如果你在之前的步骤中有任何正在运行的端口转发命令,请前往这些终端并按 Ctrl+C 停止它们
  2. 我们将从一个新的多容器 Pod 设置重新开始

在本步骤中,你将学习如何将本地端口转发到包含多个容器的 Pod 中的特定容器。这是在微服务架构中使用 sidecar(边车)时的常见场景。

  1. 首先,清理之前的资源:

    kubectl delete deployment nginx
  2. 创建一个包含两个容器(Nginx 和 BusyBox)的 Pod:

    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. 等待 Pod 变为就绪状态:

    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

    你应该会看到 Nginx 欢迎页面的 HTML 内容。

在 Kubernetes 服务中使用端口转发

在开始此步骤之前:

  1. 如果你在步骤 3 中有任何正在运行的端口转发命令,请前往该终端并按 Ctrl+C 停止它
  2. 请注意,我们将在本步骤中创建一个新的 Deployment 和 Service,但你无需删除之前的 Pod,因为它不会干扰我们的新资源

在本步骤中,你将学习如何将 kubectl port-forward 命令与 Kubernetes 服务结合使用。将端口转发到服务与转发到 Pod 不同,因为它允许你访问服务指向的任何 Pod。

  1. 首先,创建一个包含多个副本的新 Deployment:

    kubectl create deployment nginx-service --image=nginx --replicas=3
  2. 等待所有 Pod 变为就绪状态:

    kubectl wait --for=condition=Ready pod -l app=nginx-service
  3. 为 Deployment 创建一个服务:

    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

    你应该会看到 Nginx 欢迎页面的 HTML 内容。尝试多次运行此命令——你可能会注意到响应来自服务背后的不同 Pod。

总结

在本实验中,你学习了如何在各种场景中有效地使用 Kubernetes 端口转发命令。你练习了以下内容:

  1. 将单个本地端口转发到 Pod
  2. 将多个本地端口转发到同一个容器端口
  3. 处理多容器 Pod 并进行端口转发
  4. 将端口转发到 Kubernetes 服务

这些技能对于在 Kubernetes 集群中调试和测试应用程序至关重要。端口转发提供了一种安全的方式,在开发和故障排除期间访问你的应用程序,而无需将其暴露在公共互联网上。

一些关键要点:

  • 端口转发是一种临时连接,仅在 kubectl port-forward 命令运行时有效
  • 你可以将多个本地端口转发到同一个容器端口
  • 端口转发适用于 Pod 和服务
  • 当将端口转发到服务时,请求可能会分布在多个 Pod 之间

请记住,端口转发主要是一种调试工具,不应用于生产环境中访问应用程序。对于生产场景,你应该使用适当的 Kubernetes 服务类型(LoadBalancer、NodePort)或 Ingress 控制器。

您可能感兴趣的其他 Kubernetes 教程