天天看點

041.Kubernetes叢集網絡-K8S網絡政策

一 Kubernetes網絡政策

1.1 政策說明

為實作細粒度的容器間網絡通路隔離政策,Kubernetes釋出Network Policy,目前已更新為networking.k8s.io/v1穩定版本。

Network Policy的主要功能是對Pod間的網絡通信進行限制和準入控制,設定方式為将Pod的Label作為查詢條件,設定允許通路或禁止通路的用戶端Pod清單。目前查詢條件可以作用于Pod和Namespace級别。

為了使用Network Policy,Kubernetes引入了一個新的資源對象Network Policy,供使用者設定Pod間網絡通路的政策。但僅定義一個網絡政策是無法完成實際的網絡隔離的,還需要一個政策控制器(Policy Controller)進行政策的實作。

政策控制器由第三方網絡元件提供,目前Calico、Cilium、Kube-router、Romana、WeaveNet等開源項目均支援網絡政策的實作。Network Policy的工作原理如下所示,policy controller需要實作一個API Listener,監聽使用者設定的Network Policy定義,并将網絡通路規則通過各Node的Agent進行實際設定(Agent則需要通過CNI網絡插件實作)。

1.2 網絡政策配置

網絡政策的設定主要用于對目标Pod的網絡通路進行限制,在預設情況下對所有Pod都是允許通路的,在設定了指向Pod的Network Policy網絡政策之後,通路Pod将會被限制。

示例1:

[root@k8smaster01 study]# vi networkpolicy_01.yaml

1 apiVersion:  networking.k8s.io/v1
  2 kind: NetworkPolicy
  3 metadata:
  4   name: test-network-policy
  5   namespace: default
  6 spec:
  7   podSelector:
  8     matchLabels:
  9       role: db
 10   policyTypes:
 11   - Ingress
 12   - Egress
 13   ingress:
 14   - from:
 15     - ipBlock:
 16         cidr: 172.17.0.0/16
 17         except:
 18         - 172.17.1.0/24
 19     - namespacesSelector:
 20         matchLabels:
 21           project: mopoject
 22     - podSelector:
 23         matchLabels:
 24           role: frontend
 25     ports:
 26     - protocol: TCP
 27       port: 6379
 28   egress:
 29   - to:
 30     - ipBlock:
 31         cidr: 10.0.0.0/24
 32       ports:
 33       - protocol: TCP
 34         port: 5978      

參數解釋:

  • podSelector:用于定義該網絡政策作用的Pod範圍,本例的選擇條件為包含“role=db”标簽的Pod。
  • policyTypes:網絡政策的類型,包括ingress和egress兩種,用于設定目标Pod的入站和出站的網絡限制。
  • ingress:定義允許通路目标Pod的入站白名單規則,滿足from條件的用戶端才能通路ports定義的目标Pod端口号。
    • -from:對符合條件的用戶端Pod進行網絡放行,規則包括基于用戶端Pod的Label、基于用戶端Pod所在的Namespace的Label或者用戶端的IP範圍。
    • -ports:允許通路的目标Pod監聽的端口号。
  • egress:定義目标Pod允許通路的“出站”白名單規則,目标Pod僅允許通路滿足to條件的服務端IP範圍和ports定義的端口号。
    • -to:允許通路的服務端資訊,可以基于服務端Pod的Label、基于服務端Pod所在的Namespace的Label或者服務端IP範圍。
    • -ports:允許通路的服務端的端口号。

如上示例的最終效果如下:

  • 該網絡政策作用于Namespace“default”中含有“role=db”Label的全部Pod。
  • 允許與目标Pod在同一個Namespace中的包含“role=frontend”Label的用戶端Pod通路目标Pod。
  • 允許屬于包含“project=myproject”Label的Namespace的用戶端Pod通路目标Pod。
  • 允許從IP位址範圍“172.17.0.0/16”的用戶端Pod通路目标Pod,但是不包括IP位址範圍“172.17.1.0/24”的用戶端。
  • 允許目标Pod通路IP位址範圍“10.0.0.0/24”并監聽5978端口的服務。

注意:關于namespaceSelector和podSelector的說明:在from或to的配置中,namespaceSelector和podSelector可以單獨設定,也可以組合配置。如果僅配置podSelector,則表示與目标Pod屬于相同的Namespace,而組合設定則可以設定Pod所屬的Namespace,例如:

1  - from:
  2     - namespacesSelector:
  3         matchLabels:
  4           project: mopoject
  5     - podSelector:
  6         matchLabels:
  7           role: frontend      

如上表示允許通路目标Pod的來源用戶端Pod應具有如下屬性:屬于有“project=myproject”标簽的Namespace,并且有“role=frontend”标簽。

1.3 Namespace級别政策

在Namespace級别還可以設定一些預設的全局網絡政策,以友善管理者對整個Namespace進行統一的網絡政策設定。

示例1:預設禁止任何用戶端通路該Namespace中的所有Pod。

1 apiVersion: networking.k8s.io/v1
  2 kind: NetworkPolicy
  3 metadata:
  4   name: default-deny
  5 spec:
  6   podSelector: {}
  7   policyTypes:
  8   - Ingress      

示例2:預設允許任何用戶端通路該Namespace中的所有Pod。

1 apiVersion: networking.k8s.io/v1
  2 kind: NetworkPolicy
  3 metadata:
  4   name: allow-all
  5 spec:
  6   podSelector: {}
  7   ingress:
  8   - {}
  9   policyTypes:
 10   - Ingress      

示例3:預設禁止該Namespace中的所有Pod通路外部服務。

1 apiVersion: networking.k8s.io/v1
  2 kind: NetworkPolicy
  3 metadata:
  4   name: default-deny
  5 spec:
  6   podSelector: {}
  7   policyTypes:
  8   - Egress      

示例4:預設允許該Namespace中的所有Pod通路外部服務。

1 apiVersion: networking.k8s.io/v1
  2 kind: NetworkPolicy
  3 metadata:
  4   name: allow-all
  5 spec:
  6   podSelector:{}
  7   egress:
  8   - {}
  9   policyTypes:
 10   - Egress      

示例5:預設禁止任何用戶端通路該Namespace中的所有Pod,同時禁止通路外部服務。

1 apiVersion: networking.k8s.io/v1
  2 kind: NetworkPolicy
  3 metadata:
  4   name: default-deny
  5 spec:
  6   podSelector: {}
  7   policyTypes:
  8   - Ingress
  9   - Egress