如何在 local 端使用 kubectl 操作 private GKE 叢集
Private GKE cluster set up with bastion vm
基於安全考量, 通常在創建 GKE 叢集時, 會選擇 Private Cluster 的部署方式, 將 Control Plan 藏在內網裡, 若想要在 local 端使用 kubectl 來操作 GKE 的話, 會須要一個跳板機(Bastion Host) 將請求 轉送給內網的 Control Plan, 架構如下
然而這個做法有個安全疑慮, 就是當對外 IP 不小心被洩露了, 駭客就能透過它連進跳板機來進行惡意的操作
比較好的做法是, Cloud IAP + Private 的 Bastion Host
透過 IAP 的TCP 轉送功能, 就不需要分配對外 IP 給 Bastion Host
實際做法如下
環境建立
Step 1. 建立一個新的 Subnet 給 GKE Cluster 使用
gcloud compute networks create k8s-proxy \
--subnet-mode=custom \
--project=backend
gcloud compute networks subnets create subnet-cluster \
--network=k8s-proxy \
--range=10.50.0.0/16 \
--region=us-central1
gcloud compute firewall-rules create k8s-proxy-ssh \
--network k8s-proxy \
--allow tcp:22
因為 Cloud IAP 會從 35.235.240.0/20 這個網段連進內網, 所以防火牆需要開放從從 35.235.240.0/20 過來的流量
gcloud compute firewall-rules create allow-ssh-ingress-from-iap \
--direction=INGRESS \
--action=allow \
--rules=tcp:22 \
--source-ranges=35.235.240.0/20
Step 2. 建立跳板機
gcloud compute instances create --subnet=subnet-cluster \
--scopes cloud-platform proxy-temp --zone=us-central1-c
CLIENT_IP=$(gcloud compute instances describe proxy-temp \
--format="value(networkInterfaces[0].networkIP)" \
--zone=us-central1-c)
Step 3. 建立 GKE Cluster
注意: 建立時要記得設定 master-authorized-networks, 這樣的話從跳板機連到 Control Plan 才不會被擋住
gcloud container clusters create frobnitz \
--master-ipv4-cidr=172.16.0.64/28 \
--network k8s-proxy \
--subnetwork=subnet-cluster \
--enable-ip-alias \
--enable-private-nodes \
--enable-private-endpoint \
--master-authorized-networks ${CLIENT_IP}/32 \
--enable-master-authorized-networks \
--region=us-central1
Step 4. SSH forwarding proxy
建立 SSH Tunnel, 透過跳板機將地端 Port 8443 與 Control Plan 用的 Port 443 接起來
gcloud beta compute --project backend ssh --zone us-central1-a "proxy-temp" -- -N -L 8443:172.16.0.66:443
Step 5. 修改 kube config
注意:要將 IP 改成 kubernetes.default:8443, 讓 kubectl 使用 https://kubernetes.default:8443 來連 Control Plan, 不然會出現憑證錯誤的訊息
# 先取得 GKE 的 kube config
gcloud container clusters get-credentials frobnitz \
--region us-central1
# 取代原始 IP, 改用 kubernetes.default:8334
sed -e 's/172\.16\.0\.66/kubernetes\.default\:8443/g' ~/.kube/config > newconfig
Step 6. 修改 /etc/hosts
修改 /etc/hosts 檔案, 加入以下內容
127.0.0.1 kubernetes kubernetes.default
指令:
sudo echo "127.0.0.1 kubernetes kubernetes.default" >> /etc/hosts
/etc/hosts 能夠設定 Custom Domain 使其映射到任何想要的 IP 位址, 所以當加入以上的設定後, kubectl 就會以 127.0.0.1:8443 的 IP 位址跟 GKE 連線
Step 7. 測試
KUBECONFIG=~/.kube/newconfig kubectl get pod --all-namespaces
https://gitlab.com/sysops9/gke-private-net.git
留言
張貼留言