Kubernetes 中,Network Policy(網(wǎng)絡策略)定義了一組 Pod 是否允許相互通信,或者與網(wǎng)絡中的其他端點 endpoint 通信。
NetworkPolicy
對象使用標簽選擇Pod,并定義規(guī)則指定選中的Pod可以執(zhí)行什么樣的網(wǎng)絡通信,規(guī)則通常由如下三類信息組合而成:
- 允許訪問的其他容器組(容器組不能阻止其訪問自己的端口)
- 允許訪問的名稱空間
- 允許訪問的 IP 段(例外:從容器組所在的節(jié)點訪問容器組,或者從容器組訪問其所在的節(jié)點都是始終被允許的)
前提條件
Network Policy 由網(wǎng)絡插件實現(xiàn),因此,您使用的網(wǎng)絡插件必須能夠支持 NetworkPolicy
才可以使用此特性。如果您僅僅是創(chuàng)建了一個 Network Policy 對象,但是您使用的網(wǎng)絡插件并不支持此特性,您創(chuàng)建的 Network Policy 對象是不生效的。
Isolated/Non-isolated Pods·
默認情況下,Pod 都是非隔離的(non-isolated),可以接受來自任何請求方的網(wǎng)絡請求。
如果一個 NetworkPolicy 的標簽選擇器選中了某個 Pod,則該 Pod 將變成隔離的(isolated),并將拒絕任何不被 NetworkPolicy 許可的網(wǎng)絡連接。(名稱空間中其他未被 NetworkPolicy 選中的 Pod 將認可接受來自任何請求方的網(wǎng)絡請求。)
Network Police 不會相互沖突,而是相互疊加的。如果多個 NetworkPolicy 選中了同一個 Pod,則該 Pod 可以接受這些 NetworkPolicy 當中任何一個 NetworkPolicy 定義的(入口/出口)規(guī)則,是所有NetworkPolicy規(guī)則的并集,因此,NetworkPolicy 的順序并不重要,因為不會影響到最終的結果。
為了使兩個容器組之間的網(wǎng)絡能夠連通,源容器組的出方向網(wǎng)絡策略和目標容器組的入方向無網(wǎng)絡策略必須同時允許該網(wǎng)絡連接。只要其中的任何一方拒絕了該連接,該連接都不能創(chuàng)建成功。
NetworkPolicy對象
參閱 NetworkPolicy 來了解資源的完整定義。
下面是一個 NetworkPolicy 的示例:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
-
基本信息: 同其他的 Kubernetes 對象一樣,
NetworkPolicy
需要apiVersion
、kind
、metadata
字段 - spec:
NetworkPolicy
的spec
字段包含了定義網(wǎng)絡策略的主要信息:-
podSelector: 同名稱空間中,符合此標簽選擇器
.spec.podSelector
的 Pod 都將應用這個NetworkPolicy
。上面的 Example中的 podSelector 選擇了role=db
的 Pod。如果該字段為空,則將對名稱空間中所有的 Pod 應用這個NetworkPolicy
-
policyTypes:
.spec.policyTypes
是一個數(shù)組類型的字段,該數(shù)組中可以包含Ingress
、Egress
中的一個,也可能兩個都包含。該字段標識了此NetworkPolicy
是否應用到 入方向的網(wǎng)絡流量、出方向的網(wǎng)絡流量、或者兩者都有。如果不指定policyTypes
字段,該字段默認將始終包含Ingress
,當NetworkPolicy
中包含出方向的規(guī)則時,Egress
也將被添加到默認值。 - ingress:
ingress
是一個數(shù)組,代表入方向的白名單規(guī)則。每一條規(guī)則都將允許與from
和ports
匹配的入方向的網(wǎng)絡流量發(fā)生。例子中的ingress
包含了一條規(guī)則,允許的入方向網(wǎng)絡流量必須符合如下條件:- Pod 的監(jiān)聽端口為
6379
- 請求方可以是如下三種來源當中的任意一種:
- ipBlock 為
172.17.0.0/16
網(wǎng)段,但是不包括172.17.1.0/24
網(wǎng)段 - namespaceSelector 標簽選擇器,匹配標簽為
project=myproject
- podSelector 標簽選擇器,匹配標簽為
role=frontend
- ipBlock 為
- Pod 的監(jiān)聽端口為
- egress:
egress
是一個數(shù)組,代表出方向的白名單規(guī)則。每一條規(guī)則都將允許與to
和ports
匹配的出方向的網(wǎng)絡流量發(fā)生。例子中的egress
允許的出方向網(wǎng)絡流量必須符合如下條件:- 目標端口為
5978
- 目標 ipBlock 為
10.0.0.0/24
網(wǎng)段
- 目標端口為
-
podSelector: 同名稱空間中,符合此標簽選擇器
因此,例子中的 NetworkPolicy
對網(wǎng)絡流量做了如下限制:
- 隔離了
default
名稱空間中帶有role=db
標簽的所有 Pod 的入方向網(wǎng)絡流量和出方向網(wǎng)絡流量 - Ingress規(guī)則(入方向白名單規(guī)則):
- 當請求方是如下三種來源當中的任意一種時,允許訪問
default
名稱空間中所有帶role=db
標簽的 Pod 的6379
端口:- ipBlock 為
172.17.0.0/16
網(wǎng)段,但是不包括172.17.1.0/24
網(wǎng)段 - namespaceSelector 標簽選擇器,匹配標簽為
project=myproject
- podSelector 標簽選擇器,匹配標簽為
role=frontend
- ipBlock 為
- 當請求方是如下三種來源當中的任意一種時,允許訪問
- Egress rules(出方向白名單規(guī)則):
- 當如下條件滿足時,允許出方向的網(wǎng)絡流量:
- 目標端口為
5978
- 目標 ipBlock 為
10.0.0.0/24
網(wǎng)段
- 目標端口為
- 當如下條件滿足時,允許出方向的網(wǎng)絡流量:
to和from選擇器的行為
NetworkPolicy 的 .spec.ingress.from
和 .spec.egress.to
字段中,可以指定 4 種類型的標簽選擇器:
-
podSelector 選擇與
NetworkPolicy
同名稱空間中的 Pod 作為入方向訪問控制規(guī)則的源或者出方向訪問控制規(guī)則的目標 -
namespaceSelector 選擇某個名稱空間(其中所有的Pod)作為入方向訪問控制規(guī)則的源或者出方向訪問控制規(guī)則的目標
-
namespaceSelector 和 podSelector 在一個
to
/from
條目中同時包含namespaceSelector
和podSelector
將選中指定名稱空間中的指定 Pod。此時請?zhí)貏e留意 YAML 的寫法,如下所示:... ingress: - from: - namespaceSelector: matchLabels: user: alice podSelector: matchLabels: role: client ...
該例子中,podSelector 前面沒有
-
減號,namespaceSelector 和 podSelector 是同一個 from 元素的兩個字段,將選中帶user=alice
標簽的名稱空間中所有帶role=client
標簽的 Pod。但是,下面的這個 NetworkPolicy 含義是不一樣的:... ingress: - from: - namespaceSelector: matchLabels: user: alice - podSelector: matchLabels: role: client ...
后者,podSelector 前面帶
-
減號,說明 namespaceSelector 和 podSelector 是 from 數(shù)組中的兩個元素,他們將選中 NetworkPolicy 同名稱空間中帶role=client
標簽的對象,以及帶user=alice
標簽的名稱空間的所有 Pod。當您對此不確信時,可以嘗試使用
kubectl describe
命令查看 kubernetes 是如何解析您定義的 NetworkPolicy 的。文章來源:http://www.zghlxwxcb.cn/news/detail-618486.html- ipBlock 可選擇 IP CIDR 范圍作為入方向訪問控制規(guī)則的源或者出方向訪問控制規(guī)則的目標。這里應該指定的是集群外部的 IP,因為集群內(nèi)部 Pod 的 IP 地址是臨時分配的,且不可預測。
集群的入方向和出方向網(wǎng)絡機制通常需要重寫網(wǎng)絡報文的 source 或者 destination IP。kubernetes 并未定義應該在處理
NetworkPolicy
之前還是之后再修改 source / destination IP,因此,在不同的云供應商、使用不同的網(wǎng)絡插件時,最終的行為都可能不一樣。這意味著:文章來源地址http://www.zghlxwxcb.cn/news/detail-618486.html- 對于入方向的網(wǎng)絡流量,某些情況下,你可以基于實際的源 IP 地址過濾流入的報文;在另外一些情況下,NetworkPolicy 所處理的 “source IP” 可能是 LoadBalancer 的 IP 地址,或者其他地址
- 對于出方向的網(wǎng)絡流量,基于 ipBlock 的策略可能有效,也可能無效
到了這里,關于kubernetes網(wǎng)絡之網(wǎng)絡策略-Network Policies的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!