Kubernetes kubectl port forward如何运作?

Kubernetes kubectl port forward如何运作?,kubernetes,portforwarding,kubectl,Kubernetes,Portforwarding,Kubectl,kubectl公开可用于为应用程序创建服务的命令,并分配IP地址以从internet访问该服务 据我所知,要访问Kubernetes集群中的任何应用程序,应该创建一个服务资源,该资源应该具有一个可以从外部网络访问的IP地址 但是在port forward的情况下,kubectl如何在没有外部可访问的IP地址的情况下创建到应用程序的连接?首先,请注意并记住,在Kubernetes中,每个pod都从10.*获得自己的IP地址,这仅在集群中可用。现在,kubectl的端口转发功能只是将流量从本地主机上

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

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


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

首先,请注意并记住,在Kubernetes中,每个pod都从10.*获得自己的IP地址,这仅在集群中可用。现在,kubectl的
端口转发
功能只是将流量从本地主机上的指定端口传输到指定pod上的指定端口。从某种意义上说,API服务器将成为本地端口和Kubernetes集群之间的临时网关


kubectl端口转发
将连接到本地端口的连接转发到pod上的端口。与
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


也是一些小端口转发示例,用于访问数据库服务(clusterip),而不公开它。

kubectl port forward
提供了一个特定的示例。这意味着运行它的系统需要访问API服务器,任何通信都将通过单个HTTP连接进行隧道传输


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

如果您想转发到localhost中的其他端口。试试这个

kubectl port-forward <pod-name> <locahost-port>:<pod-port>

上述命令从pod 6379转发至本地主机8090。端口转发命令将一个(或多个)本地端口转发至pod

该命令非常有用,例如在蓝色/绿色部署中,您可能希望对异常pod进行故障排除

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

用法示例:

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

kubectl port-forward pod/mypod 8888:5000
kubectl port-forward --address 0.0.0.0 pod/mypod 8888:5000
kubectl port-forward pod/mypod :5000
kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000
kubectl port-forward pod/mypod 5000 6000
在8888端口上监听所有地址,转发到pod中的5000

kubectl port-forward pod/mypod 8888:5000
kubectl port-forward --address 0.0.0.0 pod/mypod 8888:5000
kubectl port-forward pod/mypod :5000
kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000
kubectl port-forward pod/mypod 5000 6000
在本地随机端口上监听,转发到pod中的5000

kubectl port-forward pod/mypod 8888:5000
kubectl port-forward --address 0.0.0.0 pod/mypod 8888:5000
kubectl port-forward pod/mypod :5000
kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000
kubectl port-forward pod/mypod 5000 6000
监听本地主机上的8888端口和所选IP,转发到pod中的5000

kubectl port-forward pod/mypod 8888:5000
kubectl port-forward --address 0.0.0.0 pod/mypod 8888:5000
kubectl port-forward pod/mypod :5000
kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000
kubectl port-forward pod/mypod 5000 6000
本地监听端口5000和6000,将数据转发到pod中的端口5000和6000或从端口6000转发数据

kubectl port-forward pod/mypod 8888:5000
kubectl port-forward --address 0.0.0.0 pod/mypod 8888:5000
kubectl port-forward pod/mypod :5000
kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000
kubectl port-forward pod/mypod 5000 6000
本地监听端口5000和6000,将数据转发到部署选择的pod中的端口5000和6000或从端口6000转发数据

kubectl port-forward deployment/mydeployment 5000 6000
本地监听端口5000和6000,在服务选择的pod中向端口5000和6000转发数据或从端口6000转发数据

kubectl port-forward service/myservice 5000 6000

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

  • 具有入口Nginx的群集IP服务
  • NodePort服务将pod直接暴露给外部世界
  • 上述两种方法都需要编写配置文件,如果您想访问pod而不编写配置文件,那么就需要使用第三种方法

  • 端口转发:我们可以在终端上运行一个命令,告诉kubernets集群在使用端口转发功能时,从集群内一个非常特定的pod上端口转发一个端口,这将导致集群的行为基本上就像它内部运行一个节点端口服务一样。它将把这个pod或者它上面的一个非常特殊的端口暴露给外部世界,让我们可以直接从本地机器连接到它
  • 让我们举一个例子:

    const stan = nats.connect('ticketing', 'abc', {
      url: 'http://localhost:5000',
    });
    
    我们的目标是在stan和kubernets集群内的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端口吗

    您已经读过了吗?这是通过API服务器进行的调用。这不是避免需要服务的一般方法。根据我的经验,它既不快,也不特别可靠,但它对调试很有用。@MichaelHausenblas不,刚刚看到它。。。现在有了新的qn,socat port forwarder是如何进行端口转发的?@DavidMaze您可以详细说明一下吗?@karthikeayan发现了另一个有用的链接实际流量正在通过API服务器端点Ex-我仍然没有得到,因为TCP流量也使用IP本身进行传输。如果您对批量端口转发整个端口感兴趣,则断开到示例的链接名称空间或一组基于选择器的服务到您的本地工作站您可以尝试kubefwd@cjimti最后我可以摆脱节点报告。。这将是非常有用的@伊夫蒂洛乌西