calico NetworkPolicy on kubernetes


什么是網絡策略

  在Kubernetes平台中,要實現零信任網絡的安全架構,Calico與istio是在Kubernetes集群中構建零信任網絡必不可少的組件。

  而建立和維護整個集群中的“零信任網絡”中,網絡策略的功能在操作上大致可以總結為使用資源配置模板來管理控制平面數據流。說白了講網絡策略就是用來控制Pod間流量的規則。

在Calico中如何編寫網絡策略

要使用網絡策略就需要先了解Calico功能:NetworkPolicyGlobalNetworkPolicy

  NetworkPolicy資源,簡稱np;是命名空間級別資源。規則應用於與標簽選擇器匹配的endpoint的集合。

  GlobalNetworkPolicy資源,簡稱 gnp/gnpsNetworkPolicy功能一樣,是整個集群級別的資源。

  GlobalNetworkPolicyNetworkPolicy資源的管理也與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

NetworkPolicy.spec.ingress|egress

NetworkPolicy.spec.ingress.src|dst

globalnetworkpolicy


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM