什么是網絡策略
在Kubernetes平台中,要實現零信任網絡的安全架構,Calico與istio是在Kubernetes集群中構建零信任網絡必不可少的組件。
而建立和維護整個集群中的“零信任網絡”中,網絡策略的功能在操作上大致可以總結為使用資源配置模板來管理控制平面數據流。說白了講網絡策略就是用來控制Pod間流量的規則。
在Calico中如何編寫網絡策略
要使用網絡策略就需要先了解Calico功能:NetworkPolicy和GlobalNetworkPolicy。
NetworkPolicy
資源,簡稱np
;是命名空間級別資源。規則應用於與標簽選擇器匹配的endpoint的集合。
GlobalNetworkPolicy
資源,簡稱 gnp
/gnps
與NetworkPolicy
功能一樣,是整個集群級別的資源。
GlobalNetworkPolicy
與 NetworkPolicy
資源的管理也與calico的部署方式有關,使用etcd作為存儲時,資源的管理只能使用 calicoctl
進行管理
NetworkPolicy與GlobalNetworkPolicy的構成
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: allow-tcp-90
spec:
selector: app == 'envoy' # 應用此策略的endpoint
types: # 應用策略的流量方向
- Ingress
- Egress
ingress: # 入口的流量規則
- action: Allow # 流量的行為
protocol: ICMP # 流量的協議
notProtocol: TCP # 匹配流量協議不為 值 的流量
source: # 流量的來源 src與dst的匹配關系為 與,所有的都生效即生效
nets: # 有效的來源IP
selector: # 標簽選擇器
namespaceSelector: # 名稱空間選擇器
ports: # 端口
- 80 # 單獨端口
- 6040:6050 # 端口范圍
destination: # 流量的目標
egress: # 出口的流量規則
- action: Allow
serviceAccountSelector: # 使用與此規則的serviceAccount
NetworkPolicy使用
實例:允許6379流量可以被 role=frontend
的pod訪問
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: allow-tcp-6379
namespace: production
spec:
selector: role == 'database'
types:
- Ingress
- Egress
ingress:
- action: Allow
metadata:
annotations:
from: frontend
to: database
protocol: TCP
source:
selector: role == 'frontend'
destination:
ports:
- 6379
egress:
- action: Allow
實例:禁止ICMP流量
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: allow-tcp-90
spec:
selector: app == 'netbox'
types:
- Ingress
- Egress
ingress:
- action: Deny
protocol: ICMP
egress:
- action: Deny
protocol: ICMP
實例:禁止訪問指定服務
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: allow-tcp-90
spec:
selector: app == 'netbox'
types:
- Ingress
- Egress
ingress:
- action: Allow
egress:
- action: Deny
destination:
selector: app == 'envoy'
GlobalNetworkPolicy
GlobalNetworkPolicy與NetworkPolicy使用方法基本一致,只是作用域的不同,並且可以應用很多高級的網絡策略:
GlobalNetworkPolicy 中提供了一個preDNAT的功能,是kube-proxy對Node port的端口和IP的流量DNAT到所對應的Pod中的時候,為了既允許正常的ingress流量,又拒絕其他的ingress流量,這個時候必須要在DNAT前生效,這種情況需要使用preDNAT。
preDNAT 適用的條件是,流量僅為ingress並且在DNAT之前。
reference
NetworkPolicy.spec.ingress|egress