从我的本地主机向 GKE 运行“kubectl”命令 - 但通过堡垒主机进行隧道传输

从我的本地主机向 GKE 运行“kubectl”命令 - 但通过堡垒主机进行隧道传输

现在...

我在 GCP 中有一个 GKE/kubernetes/k8s 集群。我在 GCP 中有一个堡垒主机(Compute Engine VM 实例)。我已将堡垒主机的 IP 列入 GKE 集群的允许名单掌握授权网络部分。因此,为了kubectl向我的 GKE 运行命令,我首先需要通过运行命令通过 SSH 进入我的堡垒主机gcloud beta compute ssh;然后我运行命令gcloud container clusters get-credentials以使用 GKE 进行身份验证,然后从那里我就可以kubectl像平常一样运行命令。


之后...

我希望能够直接从本地开发 CLI 向 GKE 集群运行 kubectl 命令。为了做到这一点,我可以将本地开发机器 IP 作为允许列表条目添加到 GKE 中掌握授权网络,就这些了。然后我可以像平常一样gcloud container clusters get-credentials运行第一个kubectl命令。


然而...

我正在寻找一种方法来避免将我的本地开发机器 IP 列入白名单。每次我将笔记本电脑带到新的地方时,我都必须先从那里更新我的新 IP 的白名单,然后才能在gcloud container clusters get-credentials运行命令之前运行命令kubectl


我想知道...

有没有办法在堡垒主机中分配一个端口号,该端口号可用于安全地调用远程 GKE 集群的 kubectl 命令?然后,我只需使用gcloud compute start-iap-tunnel本地开发 CLI 中的命令(顺便说一下,该命令使用 Cloud IAM 处理所有权限问题)即可在堡垒主机中建立到该特定端口号的 ssh 隧道。这样,对于 GKE 集群来说,它就可以kubectl从堡垒主机(已在其掌握授权网络)。但在幕后,我正在从本地开发 CLI(使用我的 glcoud auth 凭据)与堡垒主机进行身份验证,并kubectl从那里安全地调用命令。


这可能吗?有人有什么想法吗?

答案1

将您的 IP 添加到Master authorized network会更容易。您可以编写一个脚本,获取您的笔记本电脑外部 IP 并将其添加到 GKE 的主授权网络列表中,并在完成后使用相同的脚本删除该 IP。但由于这似乎不是您的偏好,让我详细回答如何使用跳转主机来实现这一点。

首先,你需要一个端口重定向程序在堡垒主机上。这将转发到达堡垒端口的请求,并将其重定向到 GKE 主 IP 地址。我假设您使用的是私有集群 - 两个节点和主 api 服务器都在私有网络中。

在堡垒主机上 -

sudo apt-get update && sudo apt-get install redir -y 
redir --laddr=0.0.0.0 --lport=8443 --caddr=172.16.0.32 --cport=443 -l debug

上述命令将把堡垒端口 8443 上的请求重定向到 GKE 主节点 (172.16.0.3) - 请根据您的设置随意更改。

在您的笔记本电脑上 -

gcloud compute ssh bastion --zone $ZONE --ssh-flag="-L 8443:localhost:8443"

现在,您已创建从笔记本电脑到堡垒主机的 SSH 隧道。对端口 8443 上的 localhost 的调用将被重定向到 GKE api 服务器。

生成 kube 配置 -

gcloud container clusters get-credentials $CLUSTER_NAME [--zone $ZONE | --region $REGION]

最后,更新服务器部分~/.kube/config如下 -

server: https://127.0.0.1:8443

如果你现在运行 kubectl 命令,你仍然会遇到 ssl 证书错误 -

$ kubectl version --short
Client Version: v1.15.11-dispatcher
Unable to connect to the server: x509: certificate is valid for ***, not 127.0.0.1

要验证设置是否正常工作,您可以使用 跳过 tls 验证--insecure-skip-tls-verify。注意 - 出于安全原因,不建议跳过 TLS 验证。

$ kubectl version --short --insecure-skip-tls-verify 
Client Version: v1.15.11-dispatcher
Server Version: v1.15.12-gke.2

解决证书验证问题的一种方法是,在笔记本电脑上创建一个与 GKE api 服务器私有地址匹配的别名 IP 地址。除此之外,请更新您的 kube 配置以匹配此地址。

答案2

您可以使用以下命令将您的请求发送到您的堡垒到 GKE 集群!

**获取集群的凭证 gcloud 容器集群 get-credentials --project $PROJECT --zone $ZONE --internal-ip $CLUSTERNAME

进行隧道施工//安装 tiny proxy 并允许本地主机 sudo vi /etc/tinyproxy/tinyproxy.conf 然后重新启动 tiny proxy

gcloud compute ssh $BASTIONNAME --project $PROJECT --zone $ZONE --tunnel-through-iap -- -L 8888:localhost:8888 -N -q -f

*使用 kubectl 命令 HTTPS_PROXY=localhost:8888 kubectl 获取节点-o wide

相关内容