无论如何要获得kubernetes集群的外部端口

时间:2016-06-06 01:48:23

标签: kubernetes kubectl

我在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集群的外部端口?

7 个答案:

答案 0 :(得分:23)

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

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

答案 1 :(得分:7)

如果您view your service使用kubectl describe service NAME,则应显示已分配的端口(在NodePort字段中)。

答案 2 :(得分:2)

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

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

    对应的 1234 的外部端口(“ 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

答案 3 :(得分:2)

要获取有关服务端口的扩展信息,请执行以下操作:

kubectl describe service -A

仅获取服务端点:

kubectl get endpoints -A

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

答案 4 :(得分:1)

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>

答案 5 :(得分:0)

我希望这个答案简短明了:

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

但是,使用go模板是理想的选择,可用于提取更多细节。

答案 6 :(得分:0)

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

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