现在...
我在 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