前言
隨著微服務(wù)的流行,越來(lái)越多的云服務(wù)平臺(tái)需要大量模塊之間的網(wǎng)絡(luò)調(diào)用。
在 Kubernetes 中,網(wǎng)絡(luò)策略(NetworkPolicy)是一種強(qiáng)大的機(jī)制,可以控制 Pod 之間和 Pod 與外部網(wǎng)絡(luò)之間的流量。
Kubernetes 中的 NetworkPolicy 定義了一組規(guī)則,這些規(guī)則允許或者拒絕特定流量的傳輸。通過(guò)使用 NetworkPolicy,Kubernetes 管理員能夠更好地掌控容器網(wǎng)絡(luò),確保應(yīng)用程序的網(wǎng)絡(luò)安全性。
NetworkPolicy 可以實(shí)現(xiàn)什么
NetworkPolicy 可被定義為 Pod 標(biāo)簽選擇器、命名空間選擇器或者兩者的組合。它可以實(shí)現(xiàn)以下功能:
- 限制 Pod 之間的流量:通過(guò)指定 Ingress 規(guī)則,可以阻止來(lái)自其他 Pod 的流量進(jìn)入目標(biāo) Pod。
- 允許 Pod 之間的流量:需要為目標(biāo) Pod 配置 Egress 規(guī)則,以便只允許來(lái)自特定 Pod 的流量進(jìn)入。
- 限制 Pod 與外部網(wǎng)絡(luò)的通信:通過(guò)指定 Egress 規(guī)則,可以控制哪些類(lèi)型的外部流量可以進(jìn)入 Pod,并防止未經(jīng)授權(quán)的訪問(wèn)。
- 允許 Pod 與外部網(wǎng)絡(luò)的通信:需要為目標(biāo) Pod 配置 Ingress 規(guī)則,以便只允許來(lái)自特定 IP 地址、端口或協(xié)議的流量進(jìn)入。
使用 NetworkPolicy 時(shí),需要考慮什么
使用 NetworkPolicy 時(shí),需要考慮以下幾個(gè)方面:
- NetworkPolicy 只在支持它的網(wǎng)絡(luò)插件中起作用,例如 Calico、Cilium 和 Weave Net 等。
- 沒(méi)有定義任何 NetworkPolicy 規(guī)則,則所有的流量都會(huì)被允許。
- 定義 NetworkPolicy 后,它只適用于當(dāng)前命名空間中的 Pod。
- 在 NetworkPolicy 中指定標(biāo)簽選擇器時(shí),應(yīng)保證其唯一性,以免給其他 Pod 帶來(lái)影響。
網(wǎng)絡(luò)策略有哪些
默認(rèn)情況下,如果名字空間中不存在任何策略,則所有進(jìn)出該名字空間中 Pod 的流量都被允許。
Namespace 隔離流量
默認(rèn)情況下,所有 Pod 之間都是互通的。每個(gè) Namespace 可以配置獨(dú)立的網(wǎng)絡(luò)策略,來(lái)隔離 Pod 之間的網(wǎng)絡(luò)流量。
由此,可以通過(guò)創(chuàng)建匹配 Pod 的 Network Policy 來(lái)作為默認(rèn)的網(wǎng)絡(luò)策略,比如默認(rèn)拒絕所有 Pod 之間 Ingress 的通信,如下:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
默認(rèn)拒絕 Pod 之間 Egress(出口) 通信的策略:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Egress
甚至是默認(rèn)拒絕 Pod 之間 Ingress(入口) 和 Egress(出口) 通信的策略:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
Pod 隔離
Pod 隔離可以分為出口的隔離和入口的隔離。其實(shí)這里的“隔離”不是絕對(duì)的,而是還有一些其它限制。
比如可以通過(guò)使用標(biāo)簽選擇器(這里可以是 namespaceSelector 和 podSelector)來(lái)控制 Pod 之間的流量。
如下面的 Network Policy:
- 允許 default namespace 中帶有 role=myfront 標(biāo)簽的 Pod 訪問(wèn) default namespace 中帶有 role=mydb 標(biāo)簽 Pod 的 6379 端口
- 允許帶有 project=myprojects 標(biāo)簽的 namespace 中所有 Pod 訪問(wèn) default namespace 中帶有 role=mydb 標(biāo)簽 Pod 的 6379 端口
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: mydb
ingress:
- from:
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: myfront
ports:
- protocol: tcp
port: 6379
另外一個(gè)同時(shí)開(kāi)啟 Ingress 和 Egress 通信的策略為:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: mydb
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 192.168.0.0/16
except:
- 192.168.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: myfront
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.1.0.0/24
ports:
- protocol: TCP
port: 5978
它用來(lái)隔離 default namespace 中帶有 role=mydb 標(biāo)簽的 Pod:
- 允許 default namespace 中帶有 role=myfront 標(biāo)簽的 Pod 訪問(wèn) default namespace 中帶有 role=mydb 標(biāo)簽 Pod 的 6379 端口
- 允許帶有 project=myprojects 標(biāo)簽的 namespace 中所有 Pod 訪問(wèn) default namespace 中帶有 role=mydb 標(biāo)簽 Pod 的 6379 端口
- 允許 default namespace 中帶有 role=mydb 標(biāo)簽的 Pod 訪問(wèn) 10.1.0.0/24 網(wǎng)段的 TCP 5987 端口
使用場(chǎng)景
禁止訪問(wèn)指定服務(wù)
kubectl run web --image=nginx --labels app=web,env=prod --expose --port 80
網(wǎng)絡(luò)策略如下:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: web-deny-all
spec:
podSelector:
matchLabels:
app: web
env: prod
只允許指定 Pod 訪問(wèn)服務(wù)
kubectl run apiserver --image=nginx --labels app=bookstore,role=api --expose --port 80
網(wǎng)絡(luò)策略如下:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: api-allow
spec:
podSelector:
matchLabels:
app: bookstore
role: api
ingress:
- from:
- podSelector:
matchLabels:
app: bookstore
禁止 namespace 中所有 Pod 之間的相互訪問(wèn)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
namespace: default
spec:
podSelector: {}
禁止其他 namespace 訪問(wèn)服務(wù)
kubectl create namespace secondary
kubectl run web --namespace secondary --image=nginx \
--labels=app=web --expose --port 80
網(wǎng)絡(luò)策略配置如下:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
namespace: secondary
name: web-deny-other-namespaces
spec:
podSelector:
matchLabels:
ingress:
- from:
- podSelector: {}
此策略可以確保即使沒(méi)有被其他任何 NetworkPolicy 選擇的 Pod 也不會(huì)被允許流出流量。 此策略不會(huì)更改任何 Pod 的入站流量隔離行為。
只允許指定 namespace 訪問(wèn)服務(wù)
kubectl run web --image=nginx \
--labels=app=web --expose --port 80
網(wǎng)絡(luò)策略如下:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: web-allow-prod
spec:
podSelector:
matchLabels:
app: web
ingress:
- from:
- namespaceSelector:
matchLabels:
purpose: production
允許外網(wǎng)訪問(wèn)服務(wù)
kubectl run web --image=nginx --labels=app=web --port 80
kubectl expose deployment/web --type=LoadBalancer
網(wǎng)絡(luò)策略如下:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: web-allow-external
spec:
podSelector:
matchLabels:
app: web
ingress:
- ports:
- port: 80
from: []
有了這個(gè)策略,任何額外的策略都不會(huì)導(dǎo)致來(lái)自這些 Pod 的任何出站連接被拒絕。 此策略對(duì)進(jìn)入任何 Pod 的隔離沒(méi)有影響。
以上這些使用場(chǎng)景的 YAML 配置定義就不再贅述了,有不明白的地方可以看下我之前的文章。
總結(jié)
Kubernetes 中的 NetworkPolicy 是一個(gè)非常重要的特性,可以控制容器網(wǎng)絡(luò)的流量和安全,確保應(yīng)用程序的可靠性和安全性。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-433253.html
為了更好地使用它,需要對(duì)其有一定的理解并遵循相應(yīng)的配置和管理規(guī)則。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-433253.html
到了這里,關(guān)于【云原生】k8s NetworkPolicy 網(wǎng)絡(luò)策略是怎么樣的的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!