在 Kubernetes 中,Network Policies 是一種強大的工具,用於控制和管理 Pod 之間的網路流量。它們允許你定義哪些 Pod 可以互相通訊,以及哪些 Pod 可以存取 Cluster 外部或從外部接收流量。通過適當設定網路策略,可以大幅增強 Kubernetes Cluster的安全性,防止未經授權的網路存取和內部攻擊。
什麼是 Network Policies:
網路外掛模組的支援:
策略作用範圍:
讓我們利用2張圖是來說明 Kubernetes 中 Pod 之間的網路通訊行為,在沒有設定 Network Policies 和設定了 Network Policies 的情況下的不同。
在 Kubernetes 中,預設情況下,所有 Pod 之間的通訊是開放的,這意味著任何 Pod 都可以與 Cluster 中的其他 Pod 進行通訊。這對於簡單的應用部署來說是相當方便的,但在需要更高網路隔離和安全性的場景中可能會引發風險。
+-----------+ +-----------+
| frontend |--------->| backend |
| |<---------| |
+-----------+ +-----------+
|^ |^
|| by default ||
|| ||
v| v|
+-------------------------+
| database |
+-------------------------+
如上圖所示,三個 Pod:frontend
、backend
和 database
。它們之間的所有網路流量都是被允許的,彼此可以自由通訊。
但是對於database一般為了安全性,我們會希望存取是被嚴格的控管,只讓backend的pod可以存取,在設定了 Network Policies 之後,你可以控制 Pod 之間的網路通訊。在下列這個例子中,已經使用了一個 Network Policy,來限制 frontend
Pod 不能直接存取 database
Pod,而只能通過 backend
Pod。這種設置提高了應用的安全性,確保只有授權的流量可以到達敏感資源。
+-----------+ +-----------+
| frontend |--------->| backend |
| |<---------| |
+-----------+ +-----------+
|X |^
|| Using ||
|| Network Policies ||
X| v|
+-------------------------+
| database |
+-------------------------+
以下是一個基本的 Network Policy,它禁止所有來自其他 Pod 的入站流量,只有來自相同命名空間中的 Pod 允許存取:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-except-namespace
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
ingress:
- from:
- podSelector: {}
podSelector
:選擇哪些 Pod 受到這個策略的影響。在這裡,它應用於所有帶有 role: db
標籤的 Pod。policyTypes
:定義策略的類型。這裡僅設定了 Ingress(入站流量)。ingress.from
:允許來自相同命名空間的所有 Pod 存取。這是一個更具限制性的策略,僅允許來自特定應用(具有特定標籤)的流量:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-app-traffic
namespace: default
spec:
podSelector:
matchLabels:
role: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 80
app: frontend
標籤的 Pod 通過 TCP 端口 80 存取標有 role: backend
標籤的 Pod。以下是控制 Pod 出站流量的範例策略,僅允許 Pod 存取特定的 IP 範圍:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-specific-egress
namespace: default
spec:
podSelector:
matchLabels:
role: api-server
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 443
role: api-server
的 Pod 只通過 TCP 端口 443 存取 10.0.0.0/24
網段的 IP。最小權限原則:
分層策略:
定期稽核和測試:
結合 RBAC 和 Network Policies:
Network Policies 是 Kubernetes 中保護 Pod 網路通訊的重要工具。通過正確設定和管理 Network Policies,你可以有效地限制不必要的內部和外部網路存取,增強整個 Cluster 的安全性。在接下來的課程中,我們將探討 Kubernetes 的監控和記錄管理,這將幫助你進一步了解和管理 Cluster 的運行情況。