本頁面說明如何使用完整網域名稱 (FQDN),控管 Pod 與 Google Kubernetes Engine (GKE) 叢集外部資源之間的輸出通訊。用於設定 FQDN 的自訂資源是 FQDNNetworkPolicy 資源。
事前準備
開始之前,請確認您已執行下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
需求條件和限制
FQDNNetworkPolicy 資源有下列規定和限制:
- 叢集必須使用 GKE Dataplane V2。
- 您必須在 GKE 叢集中使用 kube-dns 或 Cloud DNS 其中一種 DNS 供應商。不支援自訂 kube-dns 或 Core DNS 部署作業。
- Google Cloud CLI 462.0.0 以上版本。
- 不支援 Windows 節點集區。
- 不支援 Cloud Service Mesh。
- 如果應用程式中有硬式編碼 IP 位址,請使用 Kubernetes
NetworkPolicy的IPBlock欄位,而非FQDNNetworkPolicy。 - 非叢集 DNS 名稱伺服器 (例如
resolv.conf中的替代名稱伺服器) 傳回的結果,不視為可在 GKE 資料層的許可清單中程式化的有效結果。 FQDNNetworkPolicy最多可解析 50 個 IPv4 和 IPv6 IP 位址。- 您無法在
FQDNNetworkPolicy中,允許流量傳送至 ClusterIP 或無頭 Service 做為輸出目的地,因為 GKE 會先將 Service 虛擬 IP 位址 (VIP) 轉譯為後端 Pod IP 位址,再評估網路政策規則。請改用以 Kubernetes 標籤為基礎的NetworkPolicy。 - 每個主機名稱最多可有 100 個 IP 位址。
- 節點間透明加密功能不支援 FQDN 網路政策。
- 使用模式比對的 FQDN 網路政策,只會比對與萬用字元相同層級的子網域。舉例來說,
pattern: *.company.com與api.company.com或store.company.com相符,但與eu.api.company.com或company.com不符。
啟用 FQDN 網路政策
您可以在新的或現有叢集上啟用 FQDN 網路政策。
在新叢集中啟用 FQDN 網路政策
使用 --enable-fqdn-network-policy 旗標建立叢集:
gcloud container clusters create CLUSTER_NAME \
--enable-fqdn-network-policy
將 CLUSTER_NAME 替換為叢集名稱。
在現有叢集中啟用 FQDN 網路政策
無論是 Autopilot 還是 Standard 叢集,請使用
--enable-fqdn-network-policy旗標更新叢集:gcloud container clusters update CLUSTER_NAME \ --enable-fqdn-network-policy將
CLUSTER_NAME替換為叢集名稱。僅限 Standard 叢集:重新啟動 GKE Dataplane V2
anetdDaemonSet:kubectl rollout restart ds -n kube-system anetd
建立 FQDNNetworkPolicy
將下列資訊清單儲存為
fqdn-network-policy.yaml:apiVersion: networking.gke.io/v1alpha1 kind: FQDNNetworkPolicy metadata: name: allow-out-fqdnnp spec: podSelector: matchLabels: app: curl-client egress: - matches: - pattern: "*.yourdomain.com" - name: "www.google.com" ports: - protocol: "TCP" port: 443這個資訊清單具有下列屬性:
name: www.google.com:完整網域名稱。允許與 www.google.com 相關聯的名稱伺服器提供的 IP 位址。您必須指定name或pattern,或兩者皆指定。pattern: "*.yourdomain.com":允許名稱伺服器提供符合這個模式的 IP 位址。您可以使用下列規則運算式做為模式鍵:^([a-zA-Z0-9*]([-a-zA-Z0-9_*]*[a-zA-Z0-9*])*\.?)*$。比對條件會累加。您可以使用多個pattern欄位。您必須指定name或pattern,或兩者皆指定。protocol: "TCP"和port: 443:指定通訊協定和通訊埠。如果 Pod 嘗試使用這個通訊協定和通訊埠組合建立與 IP 位址的連線,名稱解析會正常運作,但資料層會封鎖傳出連線。這是選填欄位。
確認網路政策已選取工作負載:
kubectl describe fqdnnp輸出結果會與下列內容相似:
Name: allow-out-fqdnnp Labels: <none> Annotations: <none> API Version: networking.gke.io/v1alpha1 Kind: FQDNNetworkPolicy Metadata: ... Spec: Egress: Matches: Pattern: *.yourdomain.com Name: www.google.com Ports: Port: 443 Protocol: TCP Pod Selector: Match Labels: App: curl-client Events: <none>
刪除FQDNNetworkPolicy
您可以使用 kubectl delete fqdnnp 指令刪除 FQDNNetworkPolicy:
kubectl delete fqdnnp FQDN_POLICY_NAME
將 FQDN_POLICY_NAME 替換為 FQDNNetworkPolicy 名稱。
GKE 會從政策強制執行中刪除規則,但現有連線會保持運作,直到按照 conntrack 標準通訊協定指南關閉為止。
FQDN 網路政策的運作方式
FQDNNetworkPolicies 是僅限輸出的政策,可控管所選 Pod 能將流量傳送至哪些端點。與 Kubernetes NetworkPolicy 類似,選取工作負載的 FQDNNetworkPolicy 會為未指定為允許輸出目的地的端點建立隱含拒絕規則。FQDNNetworkPolicies 可與 Kubernetes NetworkPolicies 搭配使用,詳情請參閱「FQDNNetworkPolicy 和 NetworkPolicy」。
FQDNNetworkPolicies會在 IP 位址和通訊埠層級強制執行。不會使用任何第 7 層通訊協定資訊 (例如 HTTP 要求中的 Request-URI) 強制執行。系統會使用 GKE 叢集 DNS 供應商提供的 DNS 資訊,將指定的網域名稱轉譯為 IP 位址。
DNS 要求
選取工作負載的有效 FQDNNetworkPolicy 不會影響工作負載提出 DNS 要求的能力。nslookup 或 dig 等指令適用於任何網域,不受政策影響。不過,如果後續要求傳送至 IP 位址支援的網域,但該網域不在許可清單中,系統就會捨棄要求。
舉例來說,如果 FQDNNetworkPolicy 允許輸出至 www.github.com,則系統會允許所有網域的 DNS 要求,但會捨棄傳送至支援 twitter.com 的 IP 位址的流量。
存留時間到期
FQDNNetworkPolicy 會遵循 DNS 記錄提供的存留時間。如果 Pod 在 DNS 記錄的存留時間 (TTL) 結束後,嘗試連線至已過期的 IP 位址,系統會拒絕新的連線。如果 conntrack 判定連線仍處於活躍狀態,則持續時間超過 DNS 記錄存留時間的長期連線,不應發生流量中斷的情況。
FQDNNetworkPolicy 和 NetworkPolicy
如果 FQDNNetworkPolicy 和 NetworkPolicy 同時套用至同一個 Pod,也就是 Pod 的標籤與政策中設定的標籤相符,只要輸出流量符合其中一項政策,就會允許輸出流量。指定 IP 位址或標籤選取器的輸出 NetworkPolicies 與 FQDNNetworkPolicies 之間沒有階層關係。
共用 IP 位址端點 (負載平衡器、CDN、VPN 閘道等)
許多網域沒有專屬 IP 位址,而是使用共用 IP 位址。如果應用程式是由負載平衡器或 CDN 提供,這種情況尤其常見。舉例來說,Google Cloud API (compute.googleapis.com、container.googleapis.com 等) 沒有各 API 專屬的 IP 位址。而是使用共用範圍公開所有 API。
設定 FQDNNetworkPolicies 時,請務必考量允許的網域是否使用專屬 IP 位址或共用 IP 位址。由於 FQDNNetworkPolicies 是在 IP 位址和通訊埠層級強制執行,因此無法區分由相同 IP 位址提供的多個網域。如果允許存取由共用 IP 位址支援的網域,Pod 就能與該 IP 位址提供的所有其他網域通訊。舉例來說,如果允許流量傳送至 compute.googleapis.com,Pod 也能與其他 Google Cloud API 通訊。
CNAME 追蹤
如果 FQDNNetworkPolicy 中的 FQDN 物件包含 DNS 記錄中有 CNAME 的網域,您必須使用 Pod 可直接查詢的所有網域名稱 (包括所有可能的別名) 設定 FQDNNetworkPolicy,確保 FQDNNetworkPolicy 行為可靠。
如果 Pod 查詢 example.com,則應在規則中寫入 example.com。即使從上游 DNS 伺服器收到別名鏈結 (例如 example.com 到 example.cdn.com 到 1.2.3.4),FQDN 網路政策仍會允許流量通過。