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

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

  1. 带有 Ingress-Nginx 的集群 IP 服务
  2. NodePort 服务将 pod 直接暴露给外界。

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

  1. 端口转发: 我们可以在我们的终端上 运行 一个命令,告诉我们的 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的端口