【问题标题】:Is there anyway to get the external ports of the kubernetes cluster反正有没有获取kubernetes集群的外部端口
【发布时间】:2022-03-16 23:44:52
【问题描述】:

我在 kubernetes 的所有节点上的外部端口上公开了一项服务 集群来自:

kubectl create -f nginx-service.yaml

您已在您的所有节点上的外部端口上公开您的服务 簇。如果您想将此服务公开给外部互联网,您可以 需要为服务端口(tcp:30002)设置防火墙规则来服务流量。

请参阅http://releases.k8s.io/release-1.2/docs/user-guide/services-firewalls.md 了解更多详情。 服务“nginx-service”已创建。`

有没有办法获取kubernetes集群的外部端口?

【问题讨论】:

  • 您使用 google cloud 或 aws 或本地 docker 作为您的 kubernetes 提供商吗? ... kubernetes 应该是不可知论者,但在 aws 上它的粗略

标签: kubernetes kubectl


【解决方案1】:

kubectl get svc --all-namespaces -o go-template='{{range .items}}{{range.spec.ports}}{{if .nodePort}}{{.nodePort}}{{"\n"}}{{end}}{{end}}{{end}}'

这会获取所有命名空间中的所有服务,并且基本上是:“对于每个服务,对于每个端口,如果定义了 nodePort,则打印 nodePort”。

【讨论】:

  • 你能在你的答案中添加一些解释吗?它将帮助 OP 了解您发布的内容。
  • kubectl get svc --all-namespaces -o go-template='{{range .items}}{{range.spec.ports}}{{if .nodePort}}{{.nodePort}}{{.}}{{"\n"}}{{end}}{{end}}{{end}}' 这将提供有关列出的每个 NodePort 的更多信息。
  • 什么命令与此命令相同,但针对特定命名空间(没有范围)?
  • kubectl get svc -n -o go-template='{{range .items}}{{range.spec.ports}}{{if .nodePort}}{{.nodePort }}{{"\n"}}{{end}}{{end}}{{end}}'
  • ``` kubectl get svc --all-namespaces -o go-template='{{range .items}}{{range.spec.ports}}{{if .nodePort}}{ {.nodePort}}{{"\t"}}{{.name}}{{"\n"}}{{end}}{{end}}{{end}}' |排序 ``` 如果您还想识别与每个 nodePort 关联的服务(按 nodePorts 升序)
【解决方案2】:

我希望这个答案简短而简单:

kubectl describe service --all-namespaces | grep -i nodeport

但是,使用 go template 是理想的选择,可以用来提取更多细节。

【讨论】:

    【解决方案3】:

    如果您 view your service 使用 kubectl describe service NAME 它应该会显示分配给您的端口(在 NodePort 字段中)。

    【讨论】:

    • 是的,我知道。有没有办法在一个命令或其他命令中获取所有外部端口?
    • 您是指集群中所有服务的节点端口吗?
    • 是的。就像命令 :kubectl get endpoints 一样。 root@jya-SBCR:/home/jya/work# kubectl 获取端点名称端点年龄 ebaserdb-ommp-service 172.16.43.6:3306 10d ebaserdb-service 172.16.43.8:3306 11d ivlm2-service 172.16.43.4:8080 11d kubernetes 10.46 .178.197:6443 26d 能否获取一个集群中所有服务的节点端口?
    • 唯一的方法(据我所知)是编写一个简短的脚本,从kubectl get services 迭代服务并通过kubectl describe service 运行每个服务。
    【解决方案4】:

    获取有关服务端口的扩展信息:

    kubectl describe service -A
    

    仅获取服务端点:

    kubectl get endpoints -A
    

    要通过节点 IP 限制输出,您可以通过网络掩码 grep 或使用更复杂的脚本。

    【讨论】:

      【解决方案5】:

      ...您也可以使用 JsonPath...

      执行相同的解决方案
      • 获取与内部端口1234

        对应的myservice的外部端口(“nodePort”)
         kubectl get svc myservice -o=jsonpath='{.spec.ports[?(@.port==1234)].nodePort}'
        
      • 在一行中获取集群下所有节点的 IP 列表

         kubectl get node -o=jsonpath='{.items[*].status.addresses[?(@.type=="InternalIP")].address}'
        

      显然,这些信息可以很容易地组合成一个方便的 bash 脚本以满足任何特定需求...

      #!/bin/bash
      #
      # discoverService - extract the externally visible Node-IP and port for a specific Service in Kubernetes
      #
      KUBECTL=kubectl
      #
      if [[ $# < 2 || "$1" == "-h" ]]
          then
          echo discoverService SERVICENAME INTERNALPORT
          exit -1
      fi
      SERVICENAME=$1
      INTERNALPORT=$2
      
      EXTPORT=`${KUBECTL} get svc $SERVICENAME -o=jsonpath="{.spec.ports[?(@.port==${INTERNALPORT})].nodePort}"`
      
      EXTIP=`${KUBECTL} get node -o=jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}'`
      
      
      if [[ -z $EXTPORT ]]
          then
          echo -e "ERROR: service=$SERVICENAME internal-port=$INTERNALPORT not found.\n"
          exit -2
      elif [[ -z $EXTIP ]]
          then
          echo -e "ERROR: could not retrieve underlying node IPs.\n"
          exit -2
      fi
      # Success...
      echo $EXTIP:$EXTPORT
      

      【讨论】:

      • nodePort 示例有一个小错字 - 它应该改为:kubectl get svc myservice -o=jsonpath='{.items[*].spec.ports[?(@.port==1234)].nodePort}
      【解决方案6】:
      kubectl get svc --all-namespaces -o go-template='{{range .items}}{{ $save := . }}{{range.spec.ports}}{{if .nodePort}}{{$save.metadata.namespace}}{{"/"}}{{$save.metadata.name}}{{" - "}}{{.name}}{{": "}}{{.nodePort}}{{"\n"}}{{end}}{{end}}{{end}}'
      

      这不仅获取使用的节点端口,还获取节点端口的名称、服务名称和服务的命名空间,格式如下:

      <namespace>/<service name> - <nodeport name>: <nodeport>
      

      【讨论】:

        【解决方案7】:

        对我来说缺少的是 minikube 的实际 IP 地址

        ---->$:kubectl describe service --all-namespaces | grep -i nodeport
        Name:                     my-nodeport-service
        Type:                     NodePort
        NodePort:                 <unset>  30007/TCP
        ---->$:curl $(minikube ip):30007
        

        【讨论】:

          【解决方案8】:

          对于那些也想获取主机IP的人,这里有一个命令:

          • 使用特定的 NAMESPACE(默认为当前上下文)
          • 获取 HostIP
          • 获取 NodePort
          # if want to explicit choose a NAMESPACE uncomment the line bellow and change the value
          # NAMESPACE=default && \
          if [[ -z $NAMESPACE ]]; then NAMESPACE="$(kubectl config view --minify -o jsonpath='{..namespace}')"; fi && \
          kubectl get pod -o=custom-columns=POD_NAME:.metadata.name,IP:.status.hostIP --namespace=${NAMESPACE} && \
          kubectl get svc -o=custom-columns=SVC_NAME:.metadata.name,PORT:.spec.ports[0].nodePort --namespace=${NAMESPACE}
          

          【讨论】:

            猜你喜欢
            • 2021-04-17
            • 2020-12-03
            • 1970-01-01
            • 2020-11-05
            • 2018-08-27
            • 2017-01-10
            • 1970-01-01
            • 2019-06-17
            • 1970-01-01
            相关资源
            最近更新 更多