為了演示 Network Policy,我們先部署一個 httpd 應用,其配置文件 httpd.yaml
為:
httpd 有三個副本,通過 NodePort 類型的 Service 對外提供服務。部署應用:
當前沒有定義任何 Network Policy,驗證應用可以被訪問:
-
啟動一個 busybox Pod,可以訪問 Service,也可以 Ping 到副本 Pod。
-
集群節點可以訪問 Service, 也可以 Ping 到副本 Pod。
-
集群外(192.168.56.1)可以訪問 Service。
現在創建如下 Network Policy:
① 定義將此 Network Policy 中的訪問規則應用於 label 為 run: httpd
的 Pod,即 httpd 應用的三個副本 Pod。
② ingress
中定義只有 label 為 access: "true"
的 Pod 才能訪問應用。
③ 只能訪問 80
端口。
通過 kubectl apply
創建 Network Policy。
驗證 Network Policy 的有效性:
-
busybox Pod 已經不能訪問 Service。
如果 Pod 添加了 labelaccess: "true"
就能訪問到應用,但 Ping 已經被禁止。 -
集群節點已經不能訪問 Service, 也 Ping 不到副本 Pod。
-
集群外(192.168.56.1)已經不能訪問 Service。
如果希望讓集群節點和集群外(192.168.56.1)也能夠訪問到應用,可以對 Network Policy 做如下修改:
應用新的 Network Policy:
現在,集群節點和集群外(192.168.56.1)已經能夠訪問了:
除了通過 ingress
限制進入的流量,也可以用 egress
限制外出的流量。大家可以參考官網相關文檔和示例,這里就不贅述了。
小結
Kubernetes 采用的是扁平化的網絡模型,每個 Pod 都有自己的 IP,並且可以直接通信。
CNI 規范使得 Kubernetes 可以靈活選擇多種 Plugin 實現集群網絡。
Network Policy 則賦予了 Kubernetes 強大的網絡訪問控制機制。
書籍:
1.《每天5分鍾玩轉Kubernetes》
https://item.jd.com/26225745440.html
2.《每天5分鍾玩轉Docker容器技術》
https://item.jd.com/16936307278.html
3.《每天5分鍾玩轉OpenStack》
https://item.jd.com/12086376.html