【问题标题】:kubectl - list all port forwards across all services?kubectl - 列出所有服务的所有端口转发?
【发布时间】:2021-12-02 13:26:51
【问题描述】:

我是 kubernetes 的新手,想知道是否有办法让我使用 kubectl 查看所有当前配置的端口转发列表?

我看到有一个kubectl port-forward 命令,但它似乎没有列出它们,只需设置一个。

【问题讨论】:

    标签: kubernetes kubectl


    【解决方案1】:
    kubectl get svc --all-namespaces -o go-template='{{range .items}}{{range.spec.ports}}{{if .nodePort}}{{.nodePort}}{{"\n"}}{{end}}{{end}}{{end}}'
    

    端口转发列在服务中,上面的命令应该遍历所有这些并打印出来

    【讨论】:

    • 查看this answer,它是基于 Dylan 构建的,了解如何很好地格式化它
    • 在 Windows 上出现此错误:error: error parsing template {{range .items}}{{range.spec.ports}}{{if .nodePort}}{{.nodePort}}{{\n}}{{end}}{{end}}{{end}}, template: output:1: unexpected "\\" in command
    • 在 windows 上,您需要反转引号,以便参数被双引号:kubectl get svc --all-namespaces -o go-template="{{range .items}}{{range.spec.ports}}{{if .nodePort}}{{.nodePort}}{{'\n'}}{{end}}{{end}}{{end}}", @user2233706
    【解决方案2】:

    除了迪伦的回答,小调整配合jq使用。

    kubectl get svc -o json | jq '.items[] | {name:.metadata.name, p:.spec.ports[] } | select( .p.nodePort != null ) | "\(.name): localhost:\(.p.nodePort) -> \(.p.port) -> \(.p.targetPort)"'
    
    "web1: localhost:30329 -> 8080 -> 8080"
    "web2: localhost:30253 -> 8080 -> 8080"
    

    【讨论】:

      【解决方案3】:

      如果问题是关于列出哪些端口已从客户端主机转发到 Kubernetes 集群上的 pod...我不知道有 kubectl / kubectl port-forward 命令。

      最终,kubectl port-forward 最终会调用 /api/v1/namespaces/{namespace}/pods/{name}/portforward endpoint 并通过 SPDY 协议建立与 Kubernetes API servers 之一的连接;然后 kube-apiserver 代理到具体 pod 的连接。当将带有kubectl port-forward 的端口转发到具体的 pod、从部署中选择的 pod 或特定 Kubernetes 服务的 pod 时,似乎就是这种情况。

      鉴于 kube-apiserver 代理连接,使用类似 lsof 的内容检查客户端或服务器端的网络连接仅显示与其连接的代理的端口号(例如,443 或 8443)。然后在客户端,使用 PID,您可以确定它正在侦听哪个端口 - 即被转发的本地端口。

      同样在客户端,仅列出所有使用ps -f | grep 'kubectl' | grep 'port-forward' 之类的kubectl 进程将列出所有当前使用kubectl port-forward 建立的端口转发

      【讨论】:

        【解决方案4】:

        对集群所有命名空间的 Oleg Butuzov 答案的修改。

        kubectl get svc --all-namespaces -o json | jq '.items[] | {name:.metadata.name, ns:.metadata.namespace, p:.spec.ports[] } | select( .p.nodePort != null ) | "\(.ns)/\(.name): localhost:\(.p.nodePort) -> \(.p.port) -> \(.p.targetPort)"'
        # output
        "dbtest/mysql: localhost:31281 -> 3306 -> mysql"
        

        【讨论】:

          【解决方案5】:

          如果问题是关于从客户端到集群建立的端口转发,则可以这样做:

          ps -f | grep 'kubectl' | grep 'port-forward' | awk '{print $10 " " $11}'
          

          【讨论】:

            猜你喜欢
            • 2022-11-22
            • 1970-01-01
            • 2020-06-24
            • 1970-01-01
            • 1970-01-01
            • 2015-01-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多