例如,我可以连接到集群计算像这样的节点:
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 来检查它们。
答案1
主节点和工作节点分别位于不同的网络中,主节点位于 Google 管理的网络中,工作节点位于您的 VPC 中。在标准集群中,主节点通过外部 IP 与节点通信。在私有集群中,主节点和工作节点通过网络对等互连连接,并通过内部 IP 通信。
这会在通过其他对等网络或 VPN 连接直接连接到主服务器时导致问题,因为到主服务器的网络对等路由不会通过 VPN 和网络对等传播。
对于您的用例,禁用外部主端点完成此操作后,当您运行 get-credentials 命令时,您的 kube 配置将具有内部主端点而不是外部端点。然后,您需要从 VPC 网络(堡垒主机或代理)连接到您的主节点 (kubectl)。
相反,我建议保持外部端点处于活动状态,使用 get-credentials 而不使用 --internal-ip,这样您的 kube 配置将使用外部端点,因此您可以从任何地方进行连接。为了确保您的主服务器是安全的,请使用掌握授权网络定义您将要连接的外部 IP 或 CIDR
我相当确定 kubectl exec 和 logs 命令失败是因为您获取凭据的方式。
最后还有一件事情值得检查,GKE 会自动创建防火墙规则和路由(它们将被称为 gke-...),这些都是为了确保从主服务器到节点的 SSH 隧道正常工作所必需的。