介绍
在本实验中,你将学习如何使用 Kubernetes 的 port-forward
命令将本地端口转发到 Pod 上的端口。端口转发是一个关键的调试工具,它允许你安全地访问集群中运行的应用程序,而无需将它们暴露到互联网上。你将从简单的示例开始,逐步过渡到更复杂的场景,包括处理多个端口、多个容器和服务。
在本实验中,你将学习如何使用 Kubernetes 的 port-forward
命令将本地端口转发到 Pod 上的端口。端口转发是一个关键的调试工具,它允许你安全地访问集群中运行的应用程序,而无需将它们暴露到互联网上。你将从简单的示例开始,逐步过渡到更复杂的场景,包括处理多个端口、多个容器和服务。
在创建资源之前,你需要一个正在运行的 Kubernetes 集群。Minikube 是一个轻量级的 Kubernetes 环境,可以在你的本地机器上运行。
导航到工作目录:
打开终端并导航到默认的项目文件夹:
cd /home/labex/project
启动 Minikube:
启动 Minikube 以初始化一个 Kubernetes 集群:
minikube start
验证 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 上的端口。这对于调试应用程序或访问未在集群外部暴露的服务非常有用。
关于终端管理的注意事项:
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
以查看渲染后的页面。
在开始此步骤之前,你需要:
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
此命令将:
两个本地端口都映射到同一个 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:19080
curl http://localhost:19081
由于两个 URL 都转发到同一个容器端口,因此它们都会显示相同的 Nginx 欢迎页面。
在开始此步骤之前:
Ctrl+C
停止它们在本步骤中,你将学习如何将本地端口转发到包含多个容器的 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 内容。
在开始此步骤之前:
Ctrl+C
停止它在本步骤中,你将学习如何将 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 端口转发命令。你练习了以下内容:
这些技能对于在 Kubernetes 集群中调试和测试应用程序至关重要。端口转发提供了一种安全的方式,在开发和故障排除期间访问你的应用程序,而无需将其暴露在公共互联网上。
一些关键要点:
kubectl port-forward
命令运行时有效请记住,端口转发主要是一种调试工具,不应用于生产环境中访问应用程序。对于生产场景,你应该使用适当的 Kubernetes 服务类型(LoadBalancer、NodePort)或 Ingress 控制器。