kubectl port-forward如何工作?

kar*_*yan 36 portforwarding kubernetes kubectl

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

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

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

lvt*_*llo 37

port-forward将连接到本地端口转发到Pod上的端口.与之相比kubectl port-forward,kubectl proxy更通用,因为它可以转发TCP流量,同时kubectl port-forward只能转发HTTP流量.

kubectl proxy 对于测试/调试目的非常有用,因此您可以在本地访问服务而不会暴露它.

下面的名字kubectl port-forward,它会将它的端口pod6379.

kubectl port-forward redis-master-765d459796-258hz 6379:6379 
Run Code Online (Sandbox Code Playgroud)

这是一样的

kubectl port-forward pods/redis-master-765d459796-258hz 6379:6379
Run Code Online (Sandbox Code Playgroud)

要么

kubectl port-forward deployment/redis-master 6379:6379 
Run Code Online (Sandbox Code Playgroud)

要么

kubectl port-forward rs/redis-master 6379:6379 
Run Code Online (Sandbox Code Playgroud)

要么

kubectl port-forward svc/redis-master 6379:6379
Run Code Online (Sandbox Code Playgroud)

这里还有一些小端口转发示例来访问数据库服务(clusterip)而不暴露它.

  • 链接到样本已损坏 (6认同)
  • 我仍然不明白,因为TCP流量也使用IP本身传输。 (2认同)
  • 如果您有兴趣将整个命名空间或基于选择器的一组服务批量端口转发到您的本地工作站,您可以尝试 kubefwd https://github.com/txn2/kubefwd (2认同)
  • @Ivthillo 使用相同的端口号是一个坏主意,因为它会造成混乱。写命令的时候不明白哪个是pods端口,哪个是本地端口。 (2认同)

Dav*_*aze 33

kubectl port-forward提出特定的Kubernetes API请求.这意味着运行它的系统需要访问API服务器,任何流量都将通过单个HTTP连接进行隧道传输.

这对于调试非常有用(如果一个特定的pod正在运行,你可以直接连接到它;在微服务环境中,你可以与你不会暴露的后端服务交谈)但它不是设置的替代方案服务对象.当我使用kubectl port-forward它时,它明显慢于通过服务连接到pod,我发现命令在几分钟后就停止了.这些对于调试来说也不是什么大问题,但它们不是我想要的生产系统.

  • 它是否意味着在生产环境中使用? (2认同)
  • 同意它不适用于生产/服务,但关于文档所说的持续时间:“转发会话在选定的 Pod 终止时结束,需要重新运行命令才能恢复转发。” https://kubernetes.io/docs/reference/ generated/kubectl/kubectl-commands#port-forward (2认同)

Ske*_*tic 15

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

此命令非常有用,例如在蓝/绿部署中,您希望对行为异常的 pod 进行故障排除。

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

用法示例:

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

kubectl port-forward pod/mypod 8888:5000
Run Code Online (Sandbox Code Playgroud)

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

kubectl port-forward --address 0.0.0.0 pod/mypod 8888:5000
Run Code Online (Sandbox Code Playgroud)

Listen on a random port locally, forwarding to 5000 in the pod

kubectl port-forward pod/mypod :5000
Run Code Online (Sandbox Code Playgroud)

Listen on port 8888 on localhost and selected IP, forwarding to 5000 in the pod

kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000
Run Code Online (Sandbox Code Playgroud)

Listen on ports 5000 and 6000 locally, forwarding data to/from ports 5000 and 6000 in the pod

kubectl port-forward pod/mypod 5000 6000
Run Code Online (Sandbox Code Playgroud)

Listen on ports 5000 and 6000 locally, forwarding data to/from ports 5000 and 6000 in a pod selected by the deployment

kubectl port-forward deployment/mydeployment 5000 6000
Run Code Online (Sandbox Code Playgroud)

Listen on ports 5000 and 6000 locally, forwarding data to/from ports 5000 and 6000 in a pod selected by the service

kubectl port-forward service/myservice 5000 6000
Run Code Online (Sandbox Code Playgroud)


Vih*_*ala 8

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

kubectl port-forward <pod-name> <locahost-port>:<pod-port>
Run Code Online (Sandbox Code Playgroud)
kubectl port-forward sample-pod-sadasds-sxawdd 8090:6379
Run Code Online (Sandbox Code Playgroud)

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


Mik*_*laj 7

kubectl port-forward是与 Pod 进行最简单的通信方法,但在底层,这种方法要复杂得多。通信通过多个 Kubernetes 组件,因此如果通信路径中出现任何问题,您将无法与 pod 通信,即使 pod 本身可以通过常规通信通道访问。

\n

服务器代理通过kubectl port-forward命令运行,将连接转发到Kubernetes API 服务器主节点中的,然后API 服务器将连接传递到托管 Pod 的节点上的Kubelet ,然后Kubelet将连接转发到 pod 中运行的应用程序\ 的容器。

\n

笔记

\n
\n

容器中的应用程序必须绑定到环回设备上的端口,\nKubelet 才能访问它。如果它仅侦听\npod\xe2\x80\x99s eth0 网络接口,则\n\nkubectl port-forward 命令\xe2\x80\x99 无法访问它。

\n
\n

Marko Luk\xc5\xa1a“Kubernetes 实战,第二版”

\n

提示

\n

kubectl port-forward允许您将通信转发到服务,并具有其他一些有用的功能。跑步kubectl port-forward --help了解更多。

\n


Lor*_*ord 5

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

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

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

  1. 端口转发:当我们使用此端口转发功能时,我们可以在终端运行一个命令,告诉我们的 kubernets 集群从集群内的一个非常特定的 Pod 端口转发一个端口,这将导致我们的集群本质上表现得像它一样其内部运行有一个节点端口服务。它将向外界公开这个 Pod 或其上的一个非常特定的端口,并允许我们直接从本地计算机连接到它。

让我们看一个例子:

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

我们的目标是在 stan 和 kubernets 集群内的 pod 之间建立连接。

首先我们需要 pod 名称,您可以通过命令kubectl get pods获取名称

kubectl get pods
Run Code Online (Sandbox Code Playgroud)

我假设我的 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
Run Code Online (Sandbox Code Playgroud)

现在要建立连接,运行以下命令:

kubectl port-forward nats-depl-855d477f4d-xgbd7 5000:4222
Run Code Online (Sandbox Code Playgroud)

5000:是我本机的端口

4222:是我想要访问的 Pod 的端口