端口转发是一种连接到不可公开访问的 Pod 的方法。您可以使用此技术来检查数据库、监控工具和其他您希望在没有公共路由的情况下在内部部署的应用程序。端口转发内置于 Kubectl中。CLI 可以启动隧道会话,将本地端口上的流量重定向到 Kubernetes 集群中的 Pod。这是设置它的方法。

端口转发的工作原理

端口转发是一种网络地址转换 (NAT) 规则,可将流量从一个网络路由到另一个网络。在 Kubernetes 的上下文中,看似被终止的请求localhost被重定向到集群的内部网络。
端口转发仅在端口级别运行。您将特定端口33060(例如目标网络)定向到目标端口3306。当您将流量发送到本地端口33060时,它将自动转发到3306远程端口。

此技术允许您访问未由NodePort、IngressLoadBalancer 公开的私有 Kubernetes 工作负载。您可以将本地流量直接引导至集群,无需为内部工作负载创建 Kubernetes 服务。这有助于减少您的攻击面。

部署示例应用程序

现在让我们看看 Kubernetes 端口转发的实际应用。首先创建一个基本部署,您将在下一节中使用端口转发连接到该部署。

我们使用 MySQL 数据库 Pod 作为您可能需要使用此技术的实际示例。数据库通常不会公开公开,因此 Kubernetes 管理员经常使用端口转发来打开直接连接。

为您的部署创建一个 YAML 文件:

apiVersion: apps/v1 
kind: Deployment 
metadata: 
 name: mysql 
spec: 
   selector: 
    matchLabels: 
     app: mysql 
    template: 
      metadata: 
       labels: 
        app: mysql 
     spec: 
       containers: 
       - image: mysql:8.0 
         name: mysql 
         env: 
         - name: MYSQL_ROOT_PASSWORD 
           value: mysql

MYSQL_ROOT_PASSWORD确保在生产中使用此清单之前更改环境变量的值。运行kubectl apply以创建您的 MySQL 部署:

$ kubectl apply -f mysql.yaml 

deployment.apps/mysql created
123

接下来使用get pods命令检查工作负载是否已成功启动:

$ kubectl get pods 

使用 Kubectl 端口转发到 Kubernetes

尽管 MySQL 现在在您的集群中运行,但您无法从外部访问它。接下来设置一个端口转发会话,以便您可以使用本地安装的工具(如mysqlCLI)连接到您的数据库。

这是一个简单的例子:

$ kubectl port-forward deployment/mysql 33060:3306 
Forwarding from 127.0.0.1:33060 -> 3306 
Forwarding from [::1]:33060 -> 3306
123

到端口 33060 的连接将针对运行 MySQL 部署的 Pod 定向到端口 3306。您现在可以在 Kubernetes 中启动一个针对您的数据库的 MySQL shell 会话:

$ mysql --host 127.0.0.1 --port 33060 -u root -p 

Enter password: 
Welcome to the MySQL monitor. 
Commands end with ; or \g. 
Your MySQL connection id is 10 
Server version: 8.0.29 MySQL Community Server - GPL
1234567

在调试会话期间保持运行kubectl port-forward命令的 shell 窗口打开。当您按下 Ctrl+C 或关闭窗口时,端口转发将终止。

更改本地和远程端口号

端口号绑定的语法是local:remote. 上面显示的33060:3306示例将端口 33060 映射localhost3306目标 Pod 中。

只指定一个数字,不带冒号,将把它解释为本地和远程端口:

$ kubectl port-forward deployment/mysql 3306
1

您可以将本地端口留空以自动分配随机端口:

$ kubectl port-forward deployment/mysql :3306 

Forwarding from 127.0.0.1:34923 -> 3306 
Forwarding from [::1]:34923 -> 3306
1234

在这里,您将在34923本地 MySQL 客户端中使用随机生成的端口号。

更改收听地址

Kubectl 默认绑定127.0.0.1(IPv4)::1(IPv6) 地址上的本地端口。您可以通过在运行命令–address时提供标志来指定自己的 IP 集:port-forward

# Listen on two IPv4 addresses 
$ kubectl port-forward deployment/mysql :3306 --address 127.0.0.1,192.168.0.1
12

该标志只接受 IP 地址和localhost关键字。后者被解释为包含127.0.0.1and ,当省略::1时匹配命令的默认值。

概括

端口转发是访问 Kubernetes 集群内的私有应用程序的有用技术。Kubectl 将流量从本地网络传输到特定 Pod 上的特定端口。它是一种相对底层的机制,可以处理任何 TCP 连接。尚不支持UDP 端口转发。
使用 ad-hoc 端口转发会话是一种安全的方式来调试不需要暴露在外部的工作负载。为每个新部署创建服务可能允许入侵者和攻击者发现本应受到保护的端点。Kubectl 中的端口转发让您可以安全地直接连接到您的应用程序,而无需确定它们在哪些节点上运行。

文章作者: Ezio
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ezio's Blog
code k8s
喜欢就支持一下吧