【问题标题】:How kubectl port-forward works?kubectl 端口转发如何工作?
【发布时间】:2018-12-30 07:08:32
【问题描述】:

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

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

但如果是port-forwardkubectl 如何在没有可从外部访问的 IP 地址的情况下创建与应用程序的连接?

【问题讨论】:

标签: kubernetes portforwarding kubectl


【解决方案1】:

首先,请注意并记住,在 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 可用于测试/调试目的,因此您可以在本地访问您的服务而不会暴露它。

下面是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

【讨论】:

  • 我仍然没有得到,因为 TCP 流量也使用 IP 本身传输。
  • 示例链接已损坏
  • 如果您有兴趣将整个命名空间或一组基于选择器的服务批量端口转发到本地工作站,您可以尝试 kubefwd github.com/txn2/kubefwd
  • @cjimti 我终于可以摆脱 nodeports 了。这将非常有用!
  • @Ivthillo 使用相同的端口号是个坏主意,因为它会造成混乱。写命令的时候不明白哪个是pods端口,哪个是本地端口。
【解决方案2】:

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

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

【讨论】:

  • 我同意,但我认为这在生产中对安全性也非常有用:通过简单的运行脚本,您可以使用端口转发来访问您不想暴露的管理工具和敏感数据集群外
  • 它是用来在生产环境中使用的吗?
  • 同意它不是用于生产/服务,而是文档说的持续时间:“转发会话在所选 pod 终止时结束,需要重新运行命令才能恢复转发。” kubernetes.io/docs/reference/generated/kubectl/…
【解决方案3】:

如果你想转发到 localhost 中的不同端口。试试这个

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

以上命令从 pod 6379 转发到 localhost 8090

【讨论】:

    【解决方案4】:

    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
    

    在 localhost 上监听 8888 端口并选择 IP,转发到 pod 中的 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
    

    【讨论】:

      【解决方案5】:

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

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

      以上两种方法都需要编写配置文件,如果你想在不编写配置文件的情况下访问一个 pod,那么它会涉及到第三个选项。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-02
        • 2018-11-11
        • 1970-01-01
        • 2022-11-22
        • 2020-07-30
        相关资源
        最近更新 更多