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クラスターの外部ポートを取得する方法はありますか?
kubectl get svc --all-namespaces -o go-template='{{range .items}}{{range.spec.ports}}{{if .nodePort}}{{.nodePort}}{{"\n"}}{{end}}{{end}}{{end}}'
これは、すべてのネームスペースのすべてのサービスを取得し、基本的に「各サービス、各ポート、nodePortが定義されている場合、nodePortを印刷」を行います。
サービスの表示 を使用する場合kubectl describe service NAME
割り当てられたポートが表示されます(NodePortフィールド)。
...また、 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
この答えが短くて簡単であることを願っています:
kubectl describe service --all-namespaces | grep -i nodeport
ただし、goテンプレートの使用は理想的なオプションであり、詳細を抽出するために使用できます。