kubectl 端口转发如何工作?
How kubectl port-forward works?
kubectl
公开可用于为应用程序创建服务并分配 IP 地址以从 Internet 访问它的命令。
据我所知,要访问 Kubernetes 集群中的任何应用程序,都应该创建一个服务资源,并且应该有一个可以从外部网络访问的 IP 地址。
但是在 port-forward
的情况下 kubectl
如何在没有可从外部访问的 IP 地址的情况下创建与应用程序的连接?
首先,注意并记住在 Kubernetes 中,每个 pod 都从 10.* 获取自己的 IP 地址,这仅在集群内可用。现在,kubectl 的 port-forward
功能只是将流量从本地主机上的指定端口传输到指定 pod 上的指定端口。 API 服务器在某种意义上成为本地端口和 Kubernetes 集群之间的临时网关。
kubectl port-forward
将到本地端口的连接转发到 pod 上的端口。与 kubectl proxy
相比,kubectl port-forward
更通用,因为它可以转发 TCP 流量,而 kubectl proxy
只能转发 HTTP 流量。
kubectl port-forward
可用于 testing/debugging 目的,因此您可以在本地访问您的服务而无需公开它。
下面是 pod
的名称,它将把它的端口 6379
转发到 localhost:6379
。
kubectl port-forward redis-master-765d459796-258hz 6379:6379
与
相同
kubectl port-forward pods/redis-master-765d459796-258hz 6379:6379
或
kubectl port-forward deployment/redis-master 6379:6379
或
kubectl port-forward rs/redis-master 6379:6379
或
kubectl port-forward svc/redis-master 6379:6379
kubectl port-forward
使特定 Kubernetes API request。这意味着系统 运行 它需要访问 API 服务器,任何流量都将通过单个 HTTP 连接传输。
这对调试非常有用(如果一个特定的 pod 出现问题,您可以直接连接到它;在微服务环境中,您可以与后端服务对话,否则您不会公开)但它不是设置服务对象的替代方法。当我使用 kubectl port-forward
时,它明显比通过服务连接到 pod 慢,而且我发现该命令在几分钟后就停止了。同样,这些对于调试来说不是大问题,但它们不是我想要的生产系统。
如果你想转发到本地主机的不同端口。试试这个
kubectl port-forward <pod-name> <locahost-port>:<pod-port>
kubectl port-forward sample-pod-sadasds-sxawdd 8090:6379
以上命令从 pod 6379 转发到 localhost 8090
port-forward 命令,将一个(或多个)本地端口转发到 pod。
此命令非常有用,例如在 blue/green 部署中,您希望对行为不当的 pod 进行故障排除。
为了更进一步,您甚至可以在 Jenkins 的 CI/CD 管道内对 pods 执行一些初步测试,您认为它可能更容易出错,方法是使用多个条件,声明式管道。
使用示例:
本地监听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
本地监听随机端口,转发到pod中的5000
kubectl port-forward pod/mypod :5000
在本地主机上监听8888端口并选择IP,转发到pod中的5000
kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000
本地监听5000和6000端口,转发数据to/frompod中的5000和6000端口
kubectl port-forward pod/mypod 5000 6000
本地监听5000和6000端口,转发数据to/from部署选择的pod中的5000和6000端口
kubectl port-forward deployment/mydeployment 5000 6000
本地监听5000和6000端口,转发数据to/from服务选择的pod中的5000和6000端口
kubectl port-forward service/myservice 5000 6000
要访问集群内的内容,有几个不同的选项可供选择,
- 带有 Ingress-Nginx 的集群 IP 服务
- NodePort 服务将 pod 直接暴露给外界。
以上两种方法都需要写配置文件,如果你想访问一个pod而不写配置文件那么就到了第三种选择。
- 端口转发: 我们可以在我们的终端上 运行 一个命令,告诉我们的 kubernets 集群将端口转发到我们集群内非常特定的 pod当我们使用这个端口转发的东西时,它会导致我们的集群本质上表现得好像它内部有一个节点端口服务 运行ning 一样。它将把这个 pod 或它上面的一个非常特定的端口暴露给外界,并允许我们直接从我们的本地机器连接到它。
让我们举个例子:
const stan = nats.connect('ticketing', 'abc', {
url: 'http://localhost:5000',
});
我们的目标是在 kubernets 集群中建立 stan 和 pod 之间的连接。
首先我们需要 pod 名称,您可以通过命令 kubectl get pods
获取名称
kubectl get pods
我假设我的 pod 名称是 nats-depl-855d477f4d-xgbd7,并且可以通过集群 IP 服务访问它
apiVersion: v1
kind: Service
metadata:
name: nats-srv
spec:
selector:
app: nats
ports:
- name: client
protocol: TCP
port: 4222
targetPort: 4222
现在建立连接 运行 下面的命令:
kubectl port-forward nats-depl-855d477f4d-xgbd7 5000:4222
5000: 是我本地机器的端口
4222 : 是我要访问的pod的端口
kubectl
公开可用于为应用程序创建服务并分配 IP 地址以从 Internet 访问它的命令。
据我所知,要访问 Kubernetes 集群中的任何应用程序,都应该创建一个服务资源,并且应该有一个可以从外部网络访问的 IP 地址。
但是在 port-forward
的情况下 kubectl
如何在没有可从外部访问的 IP 地址的情况下创建与应用程序的连接?
首先,注意并记住在 Kubernetes 中,每个 pod 都从 10.* 获取自己的 IP 地址,这仅在集群内可用。现在,kubectl 的 port-forward
功能只是将流量从本地主机上的指定端口传输到指定 pod 上的指定端口。 API 服务器在某种意义上成为本地端口和 Kubernetes 集群之间的临时网关。
kubectl port-forward
将到本地端口的连接转发到 pod 上的端口。与 kubectl proxy
相比,kubectl port-forward
更通用,因为它可以转发 TCP 流量,而 kubectl proxy
只能转发 HTTP 流量。
kubectl port-forward
可用于 testing/debugging 目的,因此您可以在本地访问您的服务而无需公开它。
下面是 pod
的名称,它将把它的端口 6379
转发到 localhost:6379
。
kubectl port-forward redis-master-765d459796-258hz 6379:6379
与
相同kubectl port-forward pods/redis-master-765d459796-258hz 6379:6379
或
kubectl port-forward deployment/redis-master 6379:6379
或
kubectl port-forward rs/redis-master 6379:6379
或
kubectl port-forward svc/redis-master 6379:6379
kubectl port-forward
使特定 Kubernetes API request。这意味着系统 运行 它需要访问 API 服务器,任何流量都将通过单个 HTTP 连接传输。
这对调试非常有用(如果一个特定的 pod 出现问题,您可以直接连接到它;在微服务环境中,您可以与后端服务对话,否则您不会公开)但它不是设置服务对象的替代方法。当我使用 kubectl port-forward
时,它明显比通过服务连接到 pod 慢,而且我发现该命令在几分钟后就停止了。同样,这些对于调试来说不是大问题,但它们不是我想要的生产系统。
如果你想转发到本地主机的不同端口。试试这个
kubectl port-forward <pod-name> <locahost-port>:<pod-port>
kubectl port-forward sample-pod-sadasds-sxawdd 8090:6379
以上命令从 pod 6379 转发到 localhost 8090
port-forward 命令,将一个(或多个)本地端口转发到 pod。
此命令非常有用,例如在 blue/green 部署中,您希望对行为不当的 pod 进行故障排除。
为了更进一步,您甚至可以在 Jenkins 的 CI/CD 管道内对 pods 执行一些初步测试,您认为它可能更容易出错,方法是使用多个条件,声明式管道。
使用示例:
本地监听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
本地监听随机端口,转发到pod中的5000
kubectl port-forward pod/mypod :5000
在本地主机上监听8888端口并选择IP,转发到pod中的5000
kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000
本地监听5000和6000端口,转发数据to/frompod中的5000和6000端口
kubectl port-forward pod/mypod 5000 6000
本地监听5000和6000端口,转发数据to/from部署选择的pod中的5000和6000端口
kubectl port-forward deployment/mydeployment 5000 6000
本地监听5000和6000端口,转发数据to/from服务选择的pod中的5000和6000端口
kubectl port-forward service/myservice 5000 6000
要访问集群内的内容,有几个不同的选项可供选择,
- 带有 Ingress-Nginx 的集群 IP 服务
- NodePort 服务将 pod 直接暴露给外界。
以上两种方法都需要写配置文件,如果你想访问一个pod而不写配置文件那么就到了第三种选择。
- 端口转发: 我们可以在我们的终端上 运行 一个命令,告诉我们的 kubernets 集群将端口转发到我们集群内非常特定的 pod当我们使用这个端口转发的东西时,它会导致我们的集群本质上表现得好像它内部有一个节点端口服务 运行ning 一样。它将把这个 pod 或它上面的一个非常特定的端口暴露给外界,并允许我们直接从我们的本地机器连接到它。
让我们举个例子:
const stan = nats.connect('ticketing', 'abc', {
url: 'http://localhost:5000',
});
我们的目标是在 kubernets 集群中建立 stan 和 pod 之间的连接。
首先我们需要 pod 名称,您可以通过命令 kubectl get pods
获取名称kubectl get pods
我假设我的 pod 名称是 nats-depl-855d477f4d-xgbd7,并且可以通过集群 IP 服务访问它
apiVersion: v1
kind: Service
metadata:
name: nats-srv
spec:
selector:
app: nats
ports:
- name: client
protocol: TCP
port: 4222
targetPort: 4222
现在建立连接 运行 下面的命令:
kubectl port-forward nats-depl-855d477f4d-xgbd7 5000:4222
5000: 是我本地机器的端口
4222 : 是我要访问的pod的端口