Kubectl 端口前移是如何工作的?

kubectl公开可用于为应用程序创建服务的命令,并分配一个 IP 地址以从因特网访问该服务。

据我所知,要访问 Kubernetes 集群中的任何应用程序,都应该创建一个服务资源,该资源应该有一个可以从外部网络访问的 IP 地址。

但是在 port-forward的情况下,kubectl如何在没有外部可访问的 IP 地址的情况下创建到应用程序的连接?

202026 次浏览

首先,需要注意并记住的是,在 Kubernetes,每个 pod 从10得到自己的 ip 地址。* ,这只能在集群中使用。现在,kubectl 的 port-forward特性只是将流量从本地主机上的指定端口隧道到指定 pod 上的指定端口。然后,API 服务器在某种意义上成为本地端口和 Kubernetes 集群之间的临时网关。

kubectl port-forward将连接转发到本地端口,再转发到吊舱上的端口。与 kubectl proxy相比,kubectl port-forward更通用,因为它可以转发 TCP 流量,而 kubectl proxy只能转发 HTTP 流量。

kubectl port-forward对于测试/调试目的非常有用,因此您可以在本地访问服务,而不必公开它。

下面是 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产生特定的 库伯内特斯空气污染指数请求。这意味着运行它的系统需要访问 API 服务器,任何通信都将通过单个 HTTP 连接进行隧道化。

这对于调试非常有用(如果一个特定的 pod 发生故障,您可以直接连接到它; 在微服务环境中,您可以与后端服务通信,否则不会公开该服务) ,但它不是设置服务对象的替代方案。当我使用 kubectl port-forward时,它明显比通过服务连接到一个吊舱要慢,我发现命令在几分钟后就停止了。同样,这些对于调试来说不是什么大问题,但是它们不是我想要的生产系统。

如果要在本地主机中转发到其他端口,请尝试这样做

kubectl port-forward <pod-name> <locahost-port>:<pod-port>
kubectl port-forward sample-pod-sadasds-sxawdd 8090:6379

上面的命令从吊舱6379转发到本地主机8090

Port-forward 命令将一个(或多个)本地端口转发给一个 pod。

这个命令非常有用,例如在蓝色/绿色部署中,您可能希望对行为不当的 pod 进行故障排除。

为了更进一步,您甚至可以使用多个条件,声明性管道,对您认为在您的 CI/CD 管道中更容易出错的 pods 执行一些初步测试。

用法例子:

本地监听8888端口,转发到5000端口

kubectl port-forward pod/mypod 8888:5000

监听所有地址的端口8888转发到5000

kubectl port-forward --address 0.0.0.0 pod/mypod 8888:5000

监听本地随机端口,转发到5000

kubectl port-forward pod/mypod :5000

在本地主机上侦听端口8888并选择 IP,转发到吊舱中的5000

kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000

在本地监听端口5000和6000,在 pod 中将数据转发到/来自端口5000和6000

kubectl port-forward pod/mypod 5000 6000

在本地侦听端口5000和6000,将数据转发到/从部署选定的 pod 中的端口5000和6000

kubectl port-forward deployment/mydeployment 5000 6000

在本地监听端口5000和6000,将数据转发到服务选择的一个 pod 中的端口5000和6000

kubectl port-forward service/myservice 5000 6000

要访问集群内部的内容,有几个不同的选项可供选择,

  1. 集群 IP 服务
  2. NodePort 服务将吊舱直接暴露给外部世界。

以上两种方法都需要编写配置文件,如果您想访问一个 pod 而不编写配置文件,那么可以选择第三种方法。

  1. 端口转发: 我们可以在终端运行一个命令,告诉我们的库伯网集群在集群内部的一个特定的 pod 上转发一个端口,当我们使用这个端口转发的时候,这个端口转发会导致我们的集群的行为本质上好像它有一个节点端口服务在里面运行一样。它将把这个吊舱或者它上面的一个特定端口暴露给外部世界并且允许我们直接从我们的本地机器连接到它。

让我们举个例子:

const stan = nats.connect('ticketing', 'abc', {
url: 'http://localhost:5000',
});

我们的目标是建立 Stan 和库伯内群内的一个豆荚之间的联系。

首先我们需要豆荚的名字,你可以通过命令 Kubectl 有豆荚得到这个名字

kubectl get pods

我假设我的吊舱名称是 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

是我本地机器的端口

4222: 是我想进入的逃生舱的端口

kubectl port-forward是最简单的与 Pod 通信的方法,但在引擎盖下,这种方法要复杂得多。通讯要经过几个库伯内特组件,所以如果通讯路径中有任何问题,你将无法与吊舱交谈,即使吊舱本身可以通过常规通讯渠道进入。

服务器代理通过 kubectl port-forward命令运行,将连接转发到生活在 主节点中的 Kubernetes API 服务器,然后 API 服务器将连接转发到驻留您的 Pod 的节点上的 忽必烈,然后 忽必烈将连接转发到运行在 Pod 容器中的应用程序。

注意

容器中的应用程序必须绑定到 如果 Kubelet 只监听 吊舱的 eth0网络接口,你无法通过 Kubectl 端口前进命令。

陆兆禧《库伯内特在行动》第二版

小费

kubectl port-forward还允许您将通信转发到 Services,并且还有其他一些有用的特性。