https://zhuanlan.zhihu.com/p/343868046
下面是 NetworkPolicy 的一個示例,如需完整說明,可參看結構定義文檔:
1apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: network-policy-sample namespace: default spec: podSelector: matchLabels: role: db policyTypes: - Ingress - Egress ingress: - from: - ipBlock: cidr: 172.17.0.0/16 except: - 172.17.1.0/24 - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 6379 egress: - to: - ipBlock: cidr: 10.0.0.0/24 ports: - protocol: TCP port: 5978
1apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: network-policy-sample namespace: default spec: podSelector: matchLabels: role: db policyTypes: - Ingress - Egress ingress: - from: - ipBlock: cidr: 172.17.0.0/16 except: - 172.17.1.0/24 - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 6379 egress: - to: - ipBlock: cidr: 10.0.0.0/24 ports: - protocol: TCP port: 5978
spec: NetworkPolicy 規約 中包含了在一個命名空間中定義特定網絡策略所需的所有信息。
podSelector: 每個 NetworkPolicy 都包括一個 podSelector ,它對該策略所應用的一組 Pod進行選擇。示例中的策略選擇帶有 "role=db" 標簽的 Pod。空的 podSelector 選擇命名空間下的所有 Pod。
policyTypes: 每個 NetworkPolicy 都包含一個 policyTypes 列表,其中包含 Ingress 或 Egress 或兩者兼具。policyTypes 字段表示給定的策略是否應用於進入所選 Pod 的入口流量或者來自所選 Pod的出口流量,或兩者兼有。如果 NetworkPolicy 未指定 policyTypes 則默認情況下始終設置 Ingress,如果NetworkPolicy 有任何出口規則的話則設置 Egress。
ingress: 每個 NetworkPolicy 可包含一個 ingress 規則的白名單列表。每個規則都允許同時匹配 from 和ports 部分的流量。示例策略中包含一條簡單的規則: 它匹配一個單一的端口,來自三個來源中的一個, 第一個通過 ipBlock指定,第二個通過namespaceSelector 指定,第三個通過 podSelector 指定。
egress: 每個 NetworkPolicy 可包含一個 egress 規則的白名單列表。每個規則都允許匹配 to 和 port部分的流量。該示例策略包含一條規則,該規則將單個端口上的流量匹配到 10.0.0.0/24 中的任何目的地。
所以,該網絡策略示例:
隔離 “default” 命名空間下 “role=db” 的 Pod (如果它們不是已經被隔離的話)。
(Ingress 規則)允許以下 Pod 連接到 “default” 命名空間下的帶有 “role=db” 標簽的所有 Pod 的6379 TCP 端口:
“default” 命名空間下任意帶有 “role=frontend” 標簽的 Pod
帶有 “project=myproject” 標簽的任意命名空間中的 Pod
IP 地址范圍為 172.17.0.0–172.17.0.255 和 172.17.2.0–172.17.255.255(即,除了
172.17.1.0/24 之外的所有 172.17.0.0/16)
(Egress 規則)允許從帶有 “role=db” 標簽的命名空間下的任何 Pod 到 CIDR 10.0.0.0/24 下 5978TCP 端口的連接。
具體詳細看博客:https://ghostwritten.blog.csdn.net/article/details/108422856
出口:定義default命名空間下label為db的pod的出口訪問規則,db pod能夠訪問網絡
10.0.0.0/24對外的提供的5987端口
2.2 簡單示例
以 calico 為例看一下 Network Policy 的具體用法。
1) 配置 kubelet 使用 CNI 網絡插件(默認已經配置,無需更改)
kubelet --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin ...
2) 安裝 calio 網絡插件
# 注意修改 CIDR,需要跟 k8s pod-network-cidr 一致,默認為 192.168.0.0/16
# 當前選擇的是小於50節點的安裝方式,具體安裝可查看
# https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
3) 部署應用
部署 nginx 服務
$ kubectl create deployment nginx --image=nginx
deployment "nginx" created
$ kubectl expose deployment nginx --port=80
service "nginx" exposed
測試網絡
$ kubectl get svc,pod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 186d
service/nginx ClusterIP 10.233.27.142 <none> 80/TCP 2s
NAME READY STATUS RESTARTS AGE
pod/nginx-f89759699-kfmbj 1/1 Running 0 62s
$ kubectl run busybox --rm -ti --image=busybox /bin/sh
If you don't see a command prompt, try pressing enter.
/ # wget --spider --timeout=1 nginx
Connecting to nginx (10.233.27.142:80)
remote file exists
/ # exit
4)測試網絡策略
如果只讓那些擁有標簽 access: true 的 Pod 訪問 nginx 服務, 那么可以創建一個如下所示的 NetworkPolicy 對象:
$ cat nginx-policy.yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: access-nginx spec: podSelector: matchLabels: app: nginx ingress: - from: - podSelector: matchLabels: access: "true"
# 不帶 access=true 標簽的 Pod 還是無法訪問 nginx 服務 $ kubectl run busybox --rm -ti --image=busybox /bin/sh If you don't see a command prompt, try pressing enter. / # wget --spider --timeout=1 nginx Connecting to nginx (10.233.27.142:80) wget: download timed out / # # 而帶有 access=true 標簽的 Pod 可以訪問 nginx 服務 $ kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/sh If you don't see a command prompt, try pressing enter. / # wget --spider --timeout=1 nginx Connecting to nginx (10.233.27.142:80) / # exit
★【Network Policy】
分為Ingress和Egress策略控制,都為白名單。
•Ingress為入口請求控制
•Egress為出口請求控制