如何使用 Kubectl 端口转发访问远程 Kubernetes 应用程序
需要调试在 Kubernetes 集群中运行的应用程序? 端口转发是一种连接到不可公开访问的 Pod 的方法。 您可以使用此技术来检查数据库、监控工具和其他您希望在没有公共路由的情况下在内部部署的应用程序。
端口转发内置在 Kubectl 中。 CLI 可以启动隧道会话,将本地端口上的流量重定向到 Kubernetes 集群中的 Pod。 这是设置它的方法。
端口转发的工作原理
端口转发是一种网络地址转换 (NAT) 规则,可将流量从一个网络路由到另一个网络。 在 Kubernetes 的上下文中,看似被 localhost 终止的请求被重定向到集群的内部网络。
端口转发仅在端口级别运行。 您将特定端口(如 33060)定向到目标网络中的目标端口(如 3306)。 当您将流量发送到本地端口 33060 时,它将自动转发到远程端的端口 3306。
此技术允许您访问未由 NodePort、Ingress 或 LoadBalancer 公开的私有 Kubernetes 工作负载。 您可以将本地流量直接引导至集群,无需为内部工作负载创建 Kubernetes 服务。 这有助于减少您的攻击面。
部署示例应用程序
现在让我们看看 Kubernetes 端口转发的实际应用。 首先创建一个基本部署,您将在下一节中使用端口转发连接到该部署。
我们使用 MySQL 数据库 Pod 作为您可能需要使用此技术的实际示例。 数据库通常不会公开公开,因此 Kubernetes 管理员经常使用端口转发来打开直接连接。
为您的部署创建一个 YAML 文件:
apiVersion:apps/v1 种类:部署元数据:名称:mysql 规格:选择器:matchLabels:app:mysql 模板:元数据:标签:app:mysql 规格:容器:-图像:mysql:8.0 名称:mysql env:-名称:MYSQL_ROOT_PASSWORD值:mysql
确保在生产中使用此清单之前更改 MYSQL_ROOT_PASSWORD 环境变量的值。 运行 kubectl apply 以创建您的 MySQL 部署:
$kubectl apply -f mysql.yaml deployment.apps/mysql created
接下来使用 get pods 命令检查工作负载是否已成功启动:
$kubectl get pods NAME READY STATUS RESTARTS AGE mysql-5f54dd5789-t5fzc 1/1 Running 0 2s Using Kubectl to Port Forward to Kubernetes
尽管 MySQL 现在在您的集群中运行,但您无法从外部访问它。 接下来设置一个端口转发会话,以便您可以使用本地安装的工具(如 mysql CLI)连接到您的数据库。
这是一个简单的例子:
$kubectl port-forward deployment/mysql 33060:3306 Forwarding from 127.0.0.1:33060 -> 3306 Forwarding from [::1]:33060 -> 3306
到端口 33060 的连接将针对运行 MySQL 部署的 Pod 定向到端口 3306。 您现在可以在 Kubernetes 中启动一个针对您的数据库的 MySQL shell 会话:
$mysql –host 127.0.0.1 –port 33060 -u root -p 输入密码:欢迎使用 MySQL 监视器。 命令以 ; 结尾或\g。 您的 MySQL 连接 ID 是 10 服务器版本:8.0.29 MySQL Community Server – GPL
在调试会话期间保持运行 kubectl port-forward 命令的 shell 窗口打开。 当您按下 Ctrl+C 或关闭窗口时,端口转发将终止。
更改本地和远程端口号
端口号绑定的语法是 local:remote。 上面显示的 33060:3306 示例将 localhost 上的端口 33060 映射到目标 Pod 中的 3306。
只指定一个数字,不带冒号,将把它解释为本地和远程端口:
$kubectl 端口转发部署/mysql 3306
您可以将本地端口留空以自动分配随机端口:
$kubectl port-forward deployment/mysql :3306 转发自 127.0.0.1:34923 -> 3306 转发自 [::1]:34923 -> 3306
在这里,您将在本地 MySQL 客户端中使用随机生成的端口号 34923。
更改收听地址
Kubectl 默认将本地端口绑定在 127.0.0.1 (IPv4) 和 ::1 (IPv6) 地址上。 您可以通过在运行 port-forward 命令时提供 –address 标志来指定自己的 IP 集:
# 监听两个 IPv4 地址 $kubectl port-forward deployment/mysql :3306 –address 127.0.0.1,192.168.0.1
该标志只接受 IP 地址和 localhost 关键字。 后者被解释为包括 127.0.0.1 和 ::1,当 –address 被省略时匹配命令的默认值。
概括
端口转发是访问 Kubernetes 集群内的私有应用程序的有用技术。 Kubectl 将流量从本地网络传输到特定 Pod 上的特定端口。 它是一种相对底层的机制,可以处理任何 TCP 连接。 尚不支持 UDP 端口转发。
使用 ad-hoc 端口转发会话是一种安全的方式来调试不需要暴露在外部的工作负载。 为每个新部署创建服务可能允许入侵者和攻击者发现本应受到保护的端点。 Kubectl 中的端口转发让您可以安全地直接连接到您的应用程序,而无需确定它们在哪些节点上运行。