39

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

4

7 回答 7

59

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

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

于 2016-08-31T22:45:50.083 回答
17

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

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

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

于 2019-06-10T10:15:13.733 回答
12

如果您使用它查看您的服务kubectl describe service NAME,应该会显示分配的端口(在 NodePort 字段中)。

于 2016-06-06T04:52:25.833 回答
8

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

kubectl describe service -A

仅获取服务端点:

kubectl get endpoints -A

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

于 2020-06-25T13:53:18.437 回答
6

...并且您可以使用JsonPath交替执行相同的解决方案...

  • myservice获取内部端口对应的外部端口(“nodePort”)1234

     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
于 2019-02-15T23:22:46.430 回答
5
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>
于 2021-04-27T09:06:20.767 回答
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
于 2021-05-01T20:58:52.963 回答