詳解k8s?NetworkPolicy?網(wǎng)絡(luò)策略是怎么樣的
前言
隨著微服務(wù)的流行,越來越多的云服務(wù)平臺需要大量模塊之間的網(wǎng)絡(luò)調(diào)用。
在 Kubernetes 中,網(wǎng)絡(luò)策略(NetworkPolicy)是一種強大的機制,可以控制 Pod 之間和 Pod 與外部網(wǎng)絡(luò)之間的流量。
Kubernetes 中的 NetworkPolicy 定義了一組規(guī)則,這些規(guī)則允許或者拒絕特定流量的傳輸。通過使用 NetworkPolicy,Kubernetes 管理員能夠更好地掌控容器網(wǎng)絡(luò),確保應(yīng)用程序的網(wǎng)絡(luò)安全性。
NetworkPolicy 可以實現(xiàn)什么
NetworkPolicy 可被定義為 Pod 標(biāo)簽選擇器、命名空間選擇器或者兩者的組合。它可以實現(xiàn)以下功能:
- 限制 Pod 之間的流量:通過指定 Ingress 規(guī)則,可以阻止來自其他 Pod 的流量進入目標(biāo) Pod。
- 允許 Pod 之間的流量:需要為目標(biāo) Pod 配置 Egress 規(guī)則,以便只允許來自特定 Pod 的流量進入。
- 限制 Pod 與外部網(wǎng)絡(luò)的通信:通過指定 Egress 規(guī)則,可以控制哪些類型的外部流量可以進入 Pod,并防止未經(jīng)授權(quán)的訪問。
- 允許 Pod 與外部網(wǎng)絡(luò)的通信:需要為目標(biāo) Pod 配置 Ingress 規(guī)則,以便只允許來自特定 IP 地址、端口或協(xié)議的流量進入。
使用 NetworkPolicy 時,需要考慮什么
使用 NetworkPolicy 時,需要考慮以下幾個方面:
- NetworkPolicy 只在支持它的網(wǎng)絡(luò)插件中起作用,例如 Calico、Cilium 和 Weave Net 等。
- 沒有定義任何 NetworkPolicy 規(guī)則,則所有的流量都會被允許。
- 定義 NetworkPolicy 后,它只適用于當(dāng)前命名空間中的 Pod。
- 在 NetworkPolicy 中指定標(biāo)簽選擇器時,應(yīng)保證其唯一性,以免給其他 Pod 帶來影響。
網(wǎng)絡(luò)策略有哪些
默認(rèn)情況下,如果名字空間中不存在任何策略,則所有進出該名字空間中 Pod 的流量都被允許。
Namespace 隔離流量
默認(rèn)情況下,所有 Pod 之間都是互通的。每個 Namespace 可以配置獨立的網(wǎng)絡(luò)策略,來隔離 Pod 之間的網(wǎng)絡(luò)流量。
由此,可以通過創(chuàng)建匹配 Pod 的 Network Policy 來作為默認(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 隔離可以分為出口的隔離和入口的隔離。其實這里的“隔離”不是絕對的,而是還有一些其它限制。
比如可以通過使用標(biāo)簽選擇器(這里可以是 namespaceSelector 和 podSelector)來控制 Pod 之間的流量。
如下面的 Network Policy:
- 允許 default namespace 中帶有 role=myfront 標(biāo)簽的 Pod 訪問 default namespace 中帶有 role=mydb 標(biāo)簽 Pod 的 6379 端口
- 允許帶有 project=myprojects 標(biāo)簽的 namespace 中所有 Pod 訪問 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
另外一個同時開啟 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
它用來隔離 default namespace 中帶有 role=mydb 標(biāo)簽的 Pod:
- 允許 default namespace 中帶有 role=myfront 標(biāo)簽的 Pod 訪問 default namespace 中帶有 role=mydb 標(biāo)簽 Pod 的 6379 端口
- 允許帶有 project=myprojects 標(biāo)簽的 namespace 中所有 Pod 訪問 default namespace 中帶有 role=mydb 標(biāo)簽 Pod 的 6379 端口
- 允許 default namespace 中帶有 role=mydb 標(biāo)簽的 Pod 訪問 10.1.0.0/24 網(wǎng)段的 TCP 5987 端口
使用場景
禁止訪問指定服務(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ù)
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 之間的相互訪問
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny namespace: default spec: podSelector: {}
禁止其他 namespace 訪問服務(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: {}
此策略可以確保即使沒有被其他任何 NetworkPolicy 選擇的 Pod 也不會被允許流出流量。 此策略不會更改任何 Pod 的入站流量隔離行為。
只允許指定 namespace 訪問服務(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ù)
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: []
有了這個策略,任何額外的策略都不會導(dǎo)致來自這些 Pod 的任何出站連接被拒絕。 此策略對進入任何 Pod 的隔離沒有影響。
以上這些使用場景的 YAML 配置定義就不再贅述了,有不明白的地方可以看下我之前的文章。
總結(jié)
Kubernetes 中的 NetworkPolicy 是一個非常重要的特性,可以控制容器網(wǎng)絡(luò)的流量和安全,確保應(yīng)用程序的可靠性和安全性。
為了更好地使用它,需要對其有一定的理解并遵循相應(yīng)的配置和管理規(guī)則。
以上就是詳解k8s NetworkPolicy 網(wǎng)絡(luò)策略是怎么樣的的詳細(xì)內(nèi)容,更多關(guān)于k8s NetworkPolicy 網(wǎng)絡(luò)策略的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Rainbond功能架構(gòu)及應(yīng)用管理官方文檔介紹
這篇文章主要為大家介紹了Rainbond功能機構(gòu)及使用官方文檔,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04k8s?pod和service網(wǎng)絡(luò)暴露詳解
這篇文章主要介紹了借助iptables的路由轉(zhuǎn)發(fā)功能,打通k8s集群內(nèi)的pod和service網(wǎng)絡(luò),與外部網(wǎng)絡(luò)聯(lián)通,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11Kubernetes控制器中DaemonSet與Job的使用教程
這篇文章主要介紹了Kubernetes控制器中DaemonSet與Job的使用,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08淺析k8s中各組件和kube?apiserver通信時的認(rèn)證和鑒權(quán)問題
這篇文章主要介紹了k8s中各組件和kube?apiserver通信時的認(rèn)證和鑒權(quán),本文使用的k8s集群是用kubekey搭建,命令是./kk create cluster --with-kubernetes v1.21.5 --with-kubesphere v3.2.1,需要的朋友可以參考下2022-06-06