kubernetes實踐之五十九:NetworkPolicy

百聯達發表於2018-06-20
一: 簡介
 1.Kubernetes的一個重要特性就是要把不同node節點的pod連線起來,無視物理節點的限制。但是在某些應用環境中,比如公有云,不同租戶的pod不應該互通,這個時候就需要網路隔離。幸好,Kubernetes提供了NetworkPolicy,支援按Namespace級別的網路隔離。Network Policy提供了基於策略的網路控制,用於隔離應用並減少攻擊面。它使用標籤選擇器模擬傳統的分段網路,並透過策略控制它們之間的流量以及來自外部的流量。

 2.Kubernetes提供了NetworkPolicy,支援按Namespace和按Pod級別的網路訪問控制。它利用label指定namespaces或pod,底層用iptables實現。不是所有的 Kubernetes 網路方案都支援 Network Policy。比如 Flannel 就不支援,Calico 是支援的。

3.

 a.透過kubectl client建立network policy資源;
 b.calico的policy-controller監聽network policy資源,獲取到後寫入calico的etcd資料庫;
 c.node上calico-felix從etcd資料庫中獲取policy資源,呼叫iptables做相應配置。

二: NetworkPolicy 資源配置

點選(此處)摺疊或開啟

  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.   ingress:
  11.   - from:
  12.     - namespaceSelector:
  13.         matchLabels:
  14.           project: myproject
  15.     - podSelector:
  16.         matchLabels:
  17.           role: frontend
  18.     ports:
  19.     - protocol: TCP
  20.       port: 6379
1.podSelector:每個 NetworkPolicy 包含一個 podSelector,它可以選擇一組應用了網路策略的 Pod。由於 NetworkPolicy 當前只支援定義 ingress 規則,這個 podSelector 實際上為該策略定義了一組 “目標Pod”。示例中的策略選擇了標籤為 “role=db” 的 Pod。一個空的 podSelector 選擇了該 Namespace 中的所有 Pod。

2.ingress:每個NetworkPolicy 包含了一個白名單 ingress 規則列表。每個規則只允許能夠匹配上 from 和 ports配置段的流量。示例策略包含了單個規則,它從這兩個源中匹配在單個埠上的流量,第一個是透過namespaceSelector 指定的,第二個是透過 podSelector 指定的。

3. 在 “default” Namespace中 隔離了標籤 “role=db” 的 Pod(如果他們還沒有被隔離); 在 “default” Namespace中,允許任何具有 “role=frontend” 的 Pod,連線到標籤為 “role=db” 的 Pod 的 TCP 埠 6379;允許在 Namespace 中任何具有標籤 “project=myproject” 的 Pod,連線到 “default” Namespace 中標籤為 “role=db” 的 Pod 的 TCP 埠 6379。

三:預設策略
1.透過建立一個可以選擇所有 Pod 但不允許任何流量的 NetworkPolicy,你可以為一個 Namespace 建立一個 “預設的” 隔離策略。

點選(此處)摺疊或開啟

  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4.   name: default-deny
  5. spec:
  6.   podSelector:
2.在 Namespace 中,如果你想允許所有的流量進入到所有的 Pod(即使已經新增了某些策略,使一些 Pod 被處理為 “隔離的”),你可以透過建立一個策略來顯式地指定允許所有流量。

點選(此處)摺疊或開啟

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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2156384/,如需轉載,請註明出處,否則將追究法律責任。

相關文章