kubectl端口转发如何工作?

时间:2018-07-22 19:16:11

标签: kubernetes portforwarding kubectl

kubectl暴露命令可用于为应用程序创建服务,并分配IP地址以从Internet访问它。

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

但是在端口转发的情况下,kubectl如何在没有可从外部访问的IP地址的情况下创建与应用程序的连接?

5 个答案:

答案 0 :(得分:22)

kubectl port-forward将到本地端口的连接转发到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

kubectl port-forward deployment/redis-master 6379:6379 

kubectl port-forward rs/redis-master 6379:6379 

kubectl port-forward svc/redis-master 6379:6379

Here也是一些小型端口转发示例,用于在不公开数据库服务(群集)的情况下进行访问。

答案 1 :(得分:17)

kubectl port-forward进行特定的Kubernetes API request。这意味着运行它的系统需要访问API服务器,并且所有流量都将通过单个HTTP连接进行隧道传输。

具有此功能对于调试确实很有用(如果一个特定的Pod正在起作用,则可以直接连接到它;在微服务环境中,您可以与本来不会公开的后端服务进行对话),但这不是替代方法设置服务对象。当我使用kubectl port-forward时,它的速度明显比通过服务连接到Pod慢,而且我发现看到命令在几分钟后就停止了。同样,这些对于调试不是什么大问题,但是对于我的生产系统来说,它们并不是我想要的。

答案 2 :(得分:5)

port-forward命令,将一个(或多个)本地端口转发到Pod。

该命令非常有用,例如在蓝色/绿色部署中,您需要对行为异常的Pod进行故障排除。

进一步讲,您甚至可以对Jenkins的CI / CD管道内部使用多个条件的声明式管道,对可能会更容易出错的Pod进行一些初步测试。

用法示例:

在本地侦听端口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,向/从容器中的端口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

答案 3 :(得分:2)

要访问集群内的某些内容,有几个不同的选项可供使用,

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

以上两种方法都需要编写配置文件,如果您想在不编写配置文件的情况下访问 pod,则需要第三个选项。

  1. 端口转发:我们可以在我们的终端运行一个命令,告诉我们的 kubernets 集群在我们使用这个正在进行的端口转发时,将一个端口从我们集群内的一个非常特定的 pod 上进行端口转发使我们的集群基本上表现得好像它有一个节点端口服务在其中运行。它会将这个 pod 或它上的一个非常特定的端口暴露给外部世界,并允许我们直接从我们的本地机器连接到它。

举个例子:

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

我们的目标是在 stan 和 Kubernetes 集群内的 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 的端口

答案 4 :(得分:0)

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

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

上面的命令从pod 6379转发到localhost 8090