如何創建 GPC 防火牆規則以允許 GKE 集群之間的流量
背景
我有一個帶有兩個 GKE 集群的 GCP 項目:
public-cluster
和private-cluster
.public-cluster
執行一個 API 網關,該網關執行集中式身份驗證、日誌記錄、速率限制等,並將請求重新路由到執行在private-cluster
. API 網關是使用Ocelot建構的。
public-cluster
面向 Internet 並使用 ingress-nginx 公開一個公共外部 IP 地址,該地址在埠 80/443 上接受 HTTP/s 流量。這樣做的目的
private-cluster
是只能接受來自 80/443 埠的流量public-cluster
。我們不希望從其他任何地方訪問此集群,即沒有直接的 HTTP/s 請求private-cluster
來自 VPC 內部或外部,除非流量來自public-cluster
. 我已經private-cluster
使用內部負載均衡器公開了執行的服務,因此每個服務都有自己的內部 IP。API 網關使用這些內部 IP 將入站請求重新路由到後端微服務。
public-cluster
並且private-cluster
位於同一 VPC 內同一區域內的不同子網上。預期的架構可以在這裡看到:
.
問題
我正在嘗試創建防火牆規則,該規則將阻止所有到 的流量,
private-cluster
除非它來自public-cluster
,如下所示:
一個具有低優先級的入口規則,它拒絕所有流量
private-cluster
(使用網路標籤作為目標)和0.0.0.0/0
源 IP 範圍更高優先級的入口規則,其中:
- 目標=
private-cluster
- 源過濾器 =
public-cluster
- 允許埠 80 和 443 上的 TCP 流量
如果我通過 SSH 連接到該節點上的某個節點並向該節點上的
public-cluster
某個服務發出 curl 請求private-cluster
(使用該服務的內部負載均衡器 IP),則上述防火牆規則正確地允許該流量。但是,如果我從本地電腦向public-cluster
API 網關發出請求,防火牆規則會阻止流量。在這種情況下,防火牆規則中的網路標籤似乎被忽略了。我嘗試了一些方法來使規則生效(所有這些都沒有成功),例如:
- 使用 public-cluster 所在的子網 IP 範圍作為源過濾器 IP 範圍
- 使用子網的網關 IP 作為源過濾器 IP
- 使用
public-cluster
的 nginx 外部 IP 作為源 IP問題
所以,我的問題是:
- 定義此防火牆規則的正確方法是什麼,以便
public-cluster
允許從執行的 API 網關重新路由的請求通過防火牆到達private-cluster
?- 更一般地說,這是 Kubernetes 集群的典型架構模式(即,有一個面向公眾的集群執行一個 API 網關,它將請求重新路由到後端非面向公眾的集群),如果沒有,是否有更好的架構方式?(我很欣賞這是一個非常主觀的問題,但我有興趣了解替代方法)
我通過添加一個防火牆規則來實現這一點,該規則允許埠 80/443 從
public-cluster
的 pod 地址範圍到private-cluster
的網路標籤。
- 獲取
public-clusters
的 pod 地址範圍:gcloud container clusters describe public-cluster --zone europe-west2-a | grep clusterIpv4Cidr
- 創建防火牆規則(替換
--source-ranges=XX.XX.X.X/XX
為 pod 地址範圍):gcloud compute firewall-rules create allow-public-cluster-to-private-cluster \ --direction=INGRESS \ --priority=1000 \ --network=custom-vpc \ --action=ALLOW \ --rules=tcp:80,tcp:443 \ --source-ranges=XX.XX.X.X/XX \ --target-tags=private-cluster