介绍
在本实验中,你将学习如何使用 Kubernetes 的 port-forward 命令将本地端口转发到 Pod 上的端口。端口转发是一个关键的调试工具,它允许你安全地访问集群中运行的应用程序,而无需将它们暴露到互联网上。你将从简单的示例开始,逐步过渡到更复杂的场景,包括处理多个端口、多个容器和服务。
启动 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 来重置环境(如有需要)。
探索 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
首先创建一个包含一个副本和 Nginx 容器的 Deployment:
kubectl create deployment nginx --image=nginx --replicas=1此命令创建了一个运行官方 Nginx 容器镜像的 Deployment。
等待 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使用
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打开一个新的终端窗口(因为端口转发会在当前终端中持续运行)并验证端口转发:
curl http://localhost:19000你应该会看到 Nginx 欢迎页面的 HTML 内容。
你还可以打开浏览器并访问
http://localhost:19000以查看渲染后的页面。
将多个本地端口转发到 Pod
在开始此步骤之前,你需要:
- 停止步骤 1 中的端口转发,返回该终端并按
Ctrl+C
在本步骤中,你将学习如何将多个本地端口转发到 Pod。我们将两个不同的本地端口转发到同一个容器端口,这在你希望为同一服务提供不同访问点时非常有用。
使用以下命令设置端口转发:
首先,获取你的 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 服务器。
通过检查监听端口来验证端口转发:
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:*现在你可以通过任一端口访问 Nginx 欢迎页面:
curl http://localhost:19080curl http://localhost:19081
由于两个 URL 都转发到同一个容器端口,因此它们都会显示相同的 Nginx 欢迎页面。
将本地端口转发到包含多个容器的 Pod
在开始此步骤之前:
- 如果你在之前的步骤中有任何正在运行的端口转发命令,请前往这些终端并按
Ctrl+C停止它们 - 我们将从一个新的多容器 Pod 设置重新开始
在本步骤中,你将学习如何将本地端口转发到包含多个容器的 Pod 中的特定容器。这是在微服务架构中使用 sidecar(边车)时的常见场景。
首先,清理之前的资源:
kubectl delete deployment nginx创建一个包含两个容器(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等待 Pod 变为就绪状态:
kubectl wait --for=condition=Ready pod/nginx-busybox验证两个容器是否都在运行:
kubectl get pod nginx-busybox -o wide你应该在
READY列下看到2/2。使用
kubectl port-forward命令将本地端口转发到 Nginx 容器:kubectl port-forward pod/nginx-busybox 19001:80在新的终端中验证连接:
curl http://localhost:19001你应该会看到 Nginx 欢迎页面的 HTML 内容。
在 Kubernetes 服务中使用端口转发
在开始此步骤之前:
- 如果你在步骤 3 中有任何正在运行的端口转发命令,请前往该终端并按
Ctrl+C停止它 - 请注意,我们将在本步骤中创建一个新的 Deployment 和 Service,但你无需删除之前的 Pod,因为它不会干扰我们的新资源
在本步骤中,你将学习如何将 kubectl port-forward 命令与 Kubernetes 服务结合使用。将端口转发到服务与转发到 Pod 不同,因为它允许你访问服务指向的任何 Pod。
首先,创建一个包含多个副本的新 Deployment:
kubectl create deployment nginx-service --image=nginx --replicas=3等待所有 Pod 变为就绪状态:
kubectl wait --for=condition=Ready pod -l app=nginx-service为 Deployment 创建一个服务:
kubectl expose deployment nginx-service --port=80 --type=ClusterIP --name=nginx-service验证服务是否已创建:
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使用
kubectl port-forward命令将本地端口转发到服务:kubectl port-forward service/nginx-service 20000:80在新的终端中测试连接:
curl http://localhost:20000你应该会看到 Nginx 欢迎页面的 HTML 内容。尝试多次运行此命令——你可能会注意到响应来自服务背后的不同 Pod。
总结
在本实验中,你学习了如何在各种场景中有效地使用 Kubernetes 端口转发命令。你练习了以下内容:
- 将单个本地端口转发到 Pod
- 将多个本地端口转发到同一个容器端口
- 处理多容器 Pod 并进行端口转发
- 将端口转发到 Kubernetes 服务
这些技能对于在 Kubernetes 集群中调试和测试应用程序至关重要。端口转发提供了一种安全的方式,在开发和故障排除期间访问你的应用程序,而无需将其暴露在公共互联网上。
一些关键要点:
- 端口转发是一种临时连接,仅在
kubectl port-forward命令运行时有效 - 你可以将多个本地端口转发到同一个容器端口
- 端口转发适用于 Pod 和服务
- 当将端口转发到服务时,请求可能会分布在多个 Pod 之间
请记住,端口转发主要是一种调试工具,不应用于生产环境中访问应用程序。对于生产场景,你应该使用适当的 Kubernetes 服务类型(LoadBalancer、NodePort)或 Ingress 控制器。


