如果我創建了一個沒有外部 IP 的 GKE 集群並且我有一個到 GCP 的 VPN 連接,我如何使用 kubectl 進行 ssh?
我可以(例如)像這樣連接到集群計算節點:
gcloud compute ssh gke-test-deploy-default-pool-xxxxx --internal-ip
但是,如果我嘗試像這樣設置我的 kubectl 憑據:
gcloud container clusters get-credentials test-deploy --internal-ip
它會抱怨:錯誤:(gcloud.container.clusters.get-credentials)集群測試部署不是私有集群。
我可以執行非 ssh 類型的命令
kubectl get pods --all-namespaces
,但如果我這樣做,kubectl exec -it rabbitmq-podnumber -n backbone-testdeploy bash
我會收到此錯誤:來自伺服器的錯誤:錯誤撥號後端:目前沒有打開 SSH 隧道。目標是否能夠接受使用者“gke-xxxxxxx”的 ssh 密鑰
順便說一句,這樣做的重點是在我的集群上使用 Google Cloud NAT,以便在連接到使用 IP 白名單的外部服務(Atlas)時,我為所有 Pod 擁有一致的外部 IP。我可以看到 NAT 為計算實例工作,但我無法連接到 pod 來檢查它們。
主節點和工作節點分別位於不同的網路中,主節點位於 Google 託管的網路中,工作節點位於您的 VPC 中。使用標準集群,主節點通過外部 IP 與節點通信。在私有集群中,主節點和工作節點通過網路對等互連並通過內部 IP 進行通信。
當通過其他對等網路或 VPN 連接直接連接到主伺服器時,這會導致問題,因為到主伺服器的網路對等路由不會通過 VPN 和網路對等互連傳播。
對於您的案例,禁用外部主端點。完成此操作後,當您執行 get-credentials 命令時,您的 kube 配置將具有內部主端點而不是外部端點。然後,您需要從 VPC 網路(堡壘主機或代理)連接到您的主伺服器 (kubectl)。
相反,我建議保持外部端點處於活動狀態,使用 get-credentials 而不使用 –internal-ip,這樣您的 kube 配置將使用外部端點,因此您可以從任何地方連接。為確保您的 master 是安全的,請使用Master Authorized Networks來定義您將要連接的外部 IP 或 CIDR
我相當肯定 kubectl exec 和 logs 命令失敗是因為您獲取憑據的方式。
最後一件事也值得檢查,GKE 會自動創建防火牆規則和路由(它們將被稱為 gke-…),這些是確保從主節點到節點的 SSH 隧道正常工作所必需的。