先決條件
NetworkPolicy是通過網絡插件實現的,因此用戶必須使用支持網絡策略的網絡解決方案——簡單地創建壹個沒有控制器的資源對象來使其生效是沒有用的。
網絡插件:
es.io/docs/concepts/services-networking/network-policies/
默認情況下,pod是非隔離的,接受來自任何來源的流量。Pod可以通過相關的網絡策略進行隔離。壹旦命名空間中的網絡策略配置選擇了特定的Pod,該Pod將拒絕網絡策略不允許的連接。(命名空間中未被網絡策略選擇的其他pod將繼續接收所有流量。)
必填字段:像所有其他Kubernetes配置壹樣,NetworkPolicy需要apiVersion、kind和元數據。
Spec: NetworkPolicy spec包含在名稱空間中定義特定網絡策略所需的所有信息。
PodSelector:每個網絡策略都包含壹個podSelector,它選擇壹組策略適用的pod。因為NetworkPolicy目前只支持入口規則的定義,所以這裏的podSelector本質上定義了該策略的“目標pod”。示例中的策略選擇標簽為“role=db”的pod。空的podSelector會選擇該名稱空間下的所有pod。
PolicyTypes:每個網絡策略包含壹個策略類型列表,其中包含入口和/或出口。policyTypes字段指示給定策略是應用於進入所選Pod的入站流量、來自所選Pod的出站流量,還是同時應用於兩者。如果NetworkPolicy沒有指定策略類型,則為Ingress默認情況下始終設置為;如果網絡策略有任何退出規則,則設置Egress。
入口:每個網絡策略都包含壹個入口規則白名單。該規則允許同時匹配來自和端口的流量。示例策略包含壹個簡單的規則:它匹配來自兩個源之壹的單個端口,第壹個由namespaceSelector指定,第二個由podSelector指定。
出口:每個網絡策略都包含壹個出口規則白名單。每個規則都允許匹配目標和端口部分的流量。示例策略包含壹條規則,該規則將單個端口上的流量匹配到10.0.0.0/24中的任何目的地。
因此,壹個示例網絡策略:
1.在“默認”名稱空間下隔離標有“role=db”的窗格(如果它們尚未被隔離)。
2.(入口規則)允許以下pod連接到“默認”命名空間下標簽為“role=db”的所有pod的6379 TCP端口:
註意範圍
“-”是同壹層次,或者說的關系。
註意ipBlock中目的地址或源地址的NAT轉換。
往來選擇器的行為
您可以在“入口自”部分或“出口至”部分指定四個選擇器:
PodSelector:這將在與NetworkPolicy相同的名稱空間中選擇壹個特定的Pod,並且應該允許它作為入口源或出口目的地。
NamespaceSelector:這將選擇壹個特定的名稱空間,對於該名稱空間,所有的pod都應該用作輸入源或輸出目的地。
NamespaceSelector和podSelector:指定namespaceSelector和podSelector的to/from條目選擇特定名稱空間中的特定pod。註意正確的YAML語法;
以下策略在from數組中只包含壹個元素,並且只允許來自標記為role = client的Pod的連接,並且Pod所在的命名空間標記為user=alice。
該策略在from數組中包含兩個元素,允許來自本地名稱空間中標有role = client的POD的連接,或者來自任何名稱空間中標有user = alice的POD的連接。
IpBlock:這將選擇壹個特定的IP CIDR範圍作為入口源或出口目的地。這些應該是集群外的IP,因為Pod IP存在時間很短,是隨機生成的。
群集的入口和出口機制通常需要重寫數據包的源IP或目的IP。在這種情況下,不確定它是發生在NetworkPolicy處理之前還是之後,並且對於網絡插件、雲提供商、服務實現等的不同組合,行為可能是不同的。
在傳入的情況下,這意味著在某些情況下,您可以根據實際的原始源IP來過濾傳入的數據包,而在其他情況下,NetworkPolicy所作用的源IP可能是LoadBalancer或Pod的節點。
對於出口,這意味著從Pod到重寫為群集外IP的服務IP的連接可能會也可能不會受到基於IP塊的策略的約束。
默認策略
默認情況下,如果命名空間中沒有策略,則允許出入該命名空間中的Pod的所有流量。下面的示例使您能夠更改此命名空間中的默認行為。
默認情況下,所有入站流量都會被拒絕。
通過創建選擇所有容器但不允許任何流量進入容器的網絡策略,為命名空間創建“默認”隔離策略。
這確保了即使沒有選擇其他網絡策略,容器仍然可以被隔離。此策略不會更改默認的退出隔離行為。
默認情況下,允許所有入站流量。
如果您希望允許所有流量流向某個命名空間中的所有pod(即使您添加的策略導致某些pod被視為“隔離”),您可以創建壹個策略來明確允許該命名空間中的所有流量。
默認情況下拒絕所有導出流量。
通過創建選擇所有容器但不允許來自它們的任何出口流量的網絡策略,可以為命名空間創建“默認”出口隔離策略。
這確保了即使沒有被任何其他網絡策略選擇的pod也不會被允許流出。此策略不會更改默認的入口隔離行為。
默認情況下,允許所有導出流。
如果您希望允許來自某個命名空間中所有pod的所有流量(即使您添加的策略導致某些pod被視為“隔離”),您可以創建壹個策略,明確允許該命名空間中的所有出口流量。
默認情況下,所有入站和出站流量都被拒絕。
通過在命名空間中創建以下NetworkPolicy,可以為該命名空間創建“默認”策略來阻止所有入站和出站流量。
這確保了即使沒有被任何其他網絡策略選擇的pod也不會被允許進入或退出流量。
SCTP支持
Kubernetes支持SCTP作為網絡策略定義中的協議值,並將其作為alpha函數提供。要啟用此功能,集群管理員需要在apiserver上啟用SCTPSupport功能門,例如,“-feature-gates = SCTP支持=真,...”。啟用功能門後,用戶可以將網絡策略的協議字段設置為SCTP。Kubernetes為SCTP協會建立了相應的網絡,就像TCP連接壹樣。
CNI插件必須支持SCTP作為網絡策略中的協議值。
首先,需要有壹個支持網絡策略的Kubernetes集群。有許多網絡提供商支持網絡策略,包括:
白棉布
羅曼娜
編織網絡
註意:以上列表是按產品名稱的字母順序排序的,而不是按推薦或偏好排序的。以下示例對於使用上述任何提供者的Kubernetes集群都有效。
創建壹個nginx部署,並通過服務公開它。
要了解Kubernetes網絡策略是如何工作的,可以從創建壹個nginx部署並通過服務公開它開始。
兩個nginx pod在默認名稱空間下運行,並由壹個名為nginx的服務公開。
其他pod可以訪問測試服務。
從其他PODs訪問這個新的nginx服務。要進行驗證,請從默認名稱空間下的其他pod訪問服務。請確保在此命名空間下沒有執行孤立的操作。
啟動壹個busybox容器,然後在容器中使用wget命令訪問nginx服務:
限制對nginx服務的訪問
如果您想將nginx服務僅限於那些標簽為access: true的pod,您可以創建壹個只允許來自這些pod的連接的網絡策略:
為服務指定策略
根據上面的nginx-policy.yaml文件,使用kubectl工具創建壹個網絡策略:
未定義訪問標記時測試訪問服務。
如果您嘗試從未正確標記的pod訪問nginx服務,請求將超時:
定義訪問標簽後再次測試。
創建壹個帶有正確標簽的pod,您將看到該請求被允許: