背景信息
Kubernetes網絡策略(NetworkPolicy)是一種用于控制容器網絡訪問的資源對象。它基于標簽(Label)選擇器定義允許的網絡流量白名單,控制Pod 之間的通信、Pod與外部服務的連接行為。通過網絡策略可以實現細粒度的網絡隔離,提升集群的安全性。Cubecni容器網絡插件的策略路由模式和IPVLAN模式支持網絡策略,獨占ENI模式不支持網絡策略。
開啟網絡策略
Cubecni網絡插件,若開啟網絡策略,會額外消耗一部分系統資源,默認不開啟網絡策略。可在訂購集群時開啟網絡策略,或集群創建后再開啟網絡策略。
訂購集群
訂購集群,若使用Cubecni插件,可選擇開啟網絡策略。
已有集群
Cubecni若不低于v1.1.1版本,可參考如下操作步驟開啟網絡策略:
a. 登錄云容器引擎控制臺,左側導航欄選擇集群;
b. 在集群列表頁面,單擊目標集群名稱,進入集群管理頁面;
c. 左側導航欄,選擇工作負載 -> 守護進程;
d. 命名空間選擇kube-system,找到cubecni服務,點擊右側的更多->查看YAML;
e. 點擊編輯,將環境變量CHAINING_RUN_MODE的值改為on,點擊保存;
f. 等待Cubecni服務重啟,待運行/期望Pod數量相等,說明重啟完成。
備注:如下所示,cubecni-daemon鏡像版本不低于v1.1.1,則支持手動開啟網絡策略。
使用限制
Cubecni IPVLAN模式下,基于eBPF實現NetworkPolicy,有如下限制:
1. IP Blocks即使包含Pod地址,這些Pod地址也不會加入白名單,需通過PodSelector或NamespeceSelector選擇Pod;
2. IP Blocks的except支持不佳,不建議使用except關鍵字;
3. 若配置egress規則,會限制Pod訪問所在節點以及其上HostNetwork類型Pod,即使白名單配置了所在Host地址也無效。
使用示例
網絡策略詳細使用方式可參考,下文以Nginx應用為例,介紹使用方式。
準備示例應用
使用YAMl方式創建示例應用,YAML定義如下:
a. 登錄云容器引擎控制臺,左側導航欄選擇集群;
b. 在集群列表頁面,單擊目標集群名稱,進入集群管理頁面;
c. 左側導航欄,選擇工作負載 -> 無狀態;
d. 選擇default命名空間,點擊新增YAML,默認為一Nginx示例,將image字段替換為{鏡像拉取地址}/open-source/nginx:1.26-alpine-slim,點擊保存;
e. 等待服務啟動完成。
示例一:限制服務只能被帶有特定標簽的應用訪問
通過控制臺操作如下:
1. 登錄云容器引擎控制臺,左側導航欄選擇集群;
2. 在集群列表頁面,單擊目標集群名稱,進入集群管理頁面;
3. 左側導航欄,選擇網絡 -> 網絡策略,選擇default命名空間,點擊創建網絡策略;
創建面板配置說明如下:
| 配置名 | 說明 | 示例 |
|---|---|---|
| 名稱 | 網絡策略的名稱。 | example-1 |
| Pod選擇器 | 單擊+ 選擇工作負載添加標簽,設置使用網絡策略的Pod。 若不配置Pod選擇器,則對命名空間下所有Pod生效。 | 示例設置如下: - 設置工作類型為:Deployment - 設置工作負載為:nginx-deployment - 設置標簽為:app=nginx |
| 來源 | 配置入站規則(igress)列表,用于聲明誰可以訪問目標Pod。每個列表項包含規則和端口。 每個規則表示一組允許的來源,若配置多個規則,則滿足任一規則即允許訪問。 - 規則: 1. podSelector:此選擇器將在與NetworkPolicy相同的名字空間中選擇特定的Pod,將其允許作為入站流量來源; 2. namespaceSelector:此選擇器將選擇特定的名字空間,將所有Pod用作其入站流量來源; 3. ipBlock:此選擇器將選擇特定的IP CIDR范圍用作入站流量來源。 - 端口:支持TCP和UDP協議。 | 本示例不添加任何來源規則。 |
| 去向 | 配置出站規則(egress)列表,用于聲明目標Pod可以訪問哪些地址。每個列表項包含規則和端口。 每個規則表示一組允許的去向,若配置多個規則,則滿足任一規則即允許訪問。 - 規則: 1. podSelector:此選擇器將在與NetworkPolicy相同的名字空間中選擇特定的Pod,將其允許作為出站流量目的地; 2. namespaceSelector:此選擇器將選擇特定的名字空間,將所有Pod用作其出站流量目的地; 3. ipBlock:此選擇器將選擇特定的IP CIDR范圍用作出站流量目的地。 - 端口:支持TCP和UDP協議。 | 本示例不添加任何去向規則。 |
4. 點擊下一步,點擊確認;
5. 在另一個命名空間(例如demo)部署demo服務(可使用Nginx鏡像),登陸容器,測試與示例Nginx的通信。可見,網絡策略沒有允許demo服務訪問,導致訪問會超時:
6. 修改網絡策略為允許demo服務訪問,點擊編輯,在來源右側,單擊+添加,規則設置如下:
| 配置名 | 示例值 |
|---|---|
| 選擇器 | namespaceSelector |
| 命名空間 | demo |
| 標簽 | kubernetes.io/metadata.name: demo |
點擊下一步,點擊確認;
7. 登陸容器,測試與示例Nginx的通信。可見,網絡策略允許demo服務訪問,訪問正常: