web-dev-qa-db-ja.com

とにかく、kubernetesクラスターの外部ポートを取得する方法はありますか

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クラスターの外部ポートを取得する方法はありますか?

20
kevin

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

これは、すべてのネームスペースのすべてのサービスを取得し、基本的に「各サービス、各ポート、nodePortが定義されている場合、nodePortを印刷」を行います。

28
Tim Hockin

サービスの表示 を使用する場合kubectl describe service NAME割り当てられたポートが表示されます(NodePortフィールド)。

8
Robert Bailey

...また、 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
2
Ichthyo

この答えが短くて簡単であることを願っています:

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

ただし、goテンプレートの使用は理想的なオプションであり、詳細を抽出するために使用できます。

2
rajdeepbs29