K8S基本操作-44-Network Policy
Network Policy
K8S Network Policy 是一種 Kubernetes 的功能,可以讓你控制 Pod 之間或 Pod 與外部網路的通訊規則。你可以使用 Network Policy 來定義哪些 Pod 可以互相連接,或者哪些 Pod 可以存取特定的 IP 或埠。Network Policy 可以幫助你提高 Pod 的安全性和隔離性。
- 如果你想要使用 Network Policy,你需要在你的集群中安裝一個支援它的網路插件,例如 Calico、Cilium 或 Weave Net。
Network Policy 是一種資源物件,你可以使用 YAML 檔案來定義它的規範。一個 Network Policy 的規範包含以下幾個部分:
-
podSelector:用來選擇這個 Network Policy 適用的 Pod,可以使用標籤或名稱空間來過濾。
-
policyTypes:用來指定這個 Network Policy 是適用於入口(Ingress)還是出口(Egress)的流量,或者兩者都適用。入口流量是指進入 Pod 的流量,出口流量是指離開 Pod 的流量。
-
ingress:用來定義允許進入 Pod 的流量的規則,可以使用 from 和 ports 來指定來源和目的地的條件。
-
egress:用來定義允許離開 Pod 的流量的規則,可以使用 to 和 ports 來指定來源和目的地的條件。
Network Policy 相關指令
# 檢查當前所有 Network Policy
kubectl get networkpolicies
# 輸出成 YAML
kubectl get networkpolicies payroll-policy -o yaml
# 描述 Network Policy 結構
kubectl describe networkpolicies payroll-policy
Network Policy 範例1
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
namespace: default
name: payroll-policy
spec:
ingress:
- from:
- podSelector:
matchLabels:
name: internal
ports:
- port: 8080
protocol: TCP
podSelector:
matchLabels:
name: payroll
policyTypes:
- Ingress
這一段在描述,只有從 Labels: internal,的 Pod 可以而來:
- from:
- podSelector:
matchLabels:
name: internal
到達目標 Port 8080 採用 TCP:
ports:
- port: 8080
protocol: TCP
該 Policy 僅作用在有 Label: payroll 的 Pod ,型態是由外向內送:
podSelector:
matchLabels:
name: payroll
policyTypes:
- Ingress
Network Policy 範例2
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: internal-policy
namespace: default
spec:
podSelector:
matchLabels:
name: internal
policyTypes:
- Egress
- Ingress
ingress:
- {}
egress:
- to:
- podSelector:
matchLabels:
name: mysql
ports:
- protocol: TCP
port: 3306
- to:
- podSelector:
matchLabels:
name: payroll
ports:
- protocol: TCP
port: 8080
- ports:
- port: 53
protocol: UDP
- port: 53
protocol: TCP
spec: policyTypes: - Egress - Ingress 表示這個網路政策包含出站和入站的規則。
spec: ingress: - {} 表示這個網路政策允許任何來源的入站流量到達目標 Pod。這是一個空的規則,表示沒有任何限制。
spec: egress: - to: - podSelector: matchLabels: name: mysql ports: - protocol: TCP port: 3306 表示這個網路政策允許目標 Pod 透過 TCP 協定連接到 default 命名空間中標籤為 name: mysql 的 Pod 的 3306 埠。這是一個出站規則,表示只允許特定的目的地和埠。
spec: egress: - to: - podSelector: matchLabels: name: payroll ports: - protocol: TCP port: 8080 表示這個網路政策允許目標 Pod 透過 TCP 協定連接到 default 命名空間中標籤為 name: payroll 的 Pod 的 8080 埠。這也是一個出站規則,表示只允許特定的目的地和埠。
spec: egress: - ports: - port: 53 protocol: UDP - port: 53 protocol: TCP 表示這個網路政策允許目標 Pod 透過 UDP 或 TCP 協定連接到任何目的地的 53 埠。這是一個出站規則,表示只允許特定的埠,但不限制目的地。53 埠通常用於 DNS 查詢。
總結一下,這個網路政策的作用是:
- 允許 default 命名空間中的 internal 標籤的 Pod 接收任何來源的入站流量。
- 限制 default 命名空間中的 internal 標籤的 Pod 只能發送出站流量到 default 命名空間中的 mysql 或 payroll 標籤的 Pod 的特定埠,或者到任何目的地的 53 埠。