Firewall

如何創建 GPC 防火牆規則以允許 GKE 集群之間的流量

  • August 13, 2019

背景

我有一個帶有兩個 GKE 集群的 GCP 項目:public-clusterprivate-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-clusterAPI 網關發出請求,防火牆規則會阻止流量。在這種情況下,防火牆規則中的網路標籤似乎被忽略了。

我嘗試了一些方法來使規則生效(所有這些都沒有成功),例如:

  • 使用 public-cluster 所在的子網 IP 範圍作為源過濾器 IP 範圍
  • 使用子網的網關 IP 作為源過濾器 IP
  • 使用public-cluster的 nginx 外部 IP 作為源 IP

問題

所以,我的問題是:

  1. 定義此防火牆規則的正確方法是什麼,以便public-cluster允許從執行的 API 網關重新路由的請求通過防火牆到達private-cluster
  2. 更一般地說,這是 Kubernetes 集群的典型架構模式(即,有一個面向公眾的集群執行一個 API 網關,它將請求重新路由到後端非面向公眾的集群),如果沒有,是否有更好的架構方式?(我很欣賞這是一個非常主觀的問題,但我有興趣了解替代方法)

我通過添加一個防火牆規則來實現這一點,該規則允許埠 80/443 從public-cluster的 pod 地址範圍到private-cluster的網路標籤。

  1. 獲取public-clusters的 pod 地址範圍:
gcloud container clusters describe public-cluster --zone europe-west2-a | grep clusterIpv4Cidr
  1. 創建防火牆規則(替換--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

引用自:https://serverfault.com/questions/977699