詳解k8s?NetworkPolicy?網(wǎng)絡(luò)策略是怎么樣的
前言
隨著微服務(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ī)則,可以控制哪些類型的外部流量可以進(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í)開啟 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)用程序的可靠性和安全性。
為了更好地使用它,需要對(duì)其有一定的理解并遵循相應(yīng)的配置和管理規(guī)則。
以上就是詳解k8s NetworkPolicy 網(wǎng)絡(luò)策略是怎么樣的的詳細(xì)內(nèi)容,更多關(guān)于k8s NetworkPolicy 網(wǎng)絡(luò)策略的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- K8S?prometheus?operator監(jiān)控工作原理介紹
- k8s Job 執(zhí)行一次性以及批處理任務(wù)使用場(chǎng)景案例
- k8s?Service?實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和負(fù)載均衡
- k8s?Ingress實(shí)現(xiàn)流量路由規(guī)則控制的定義格式類型
- kubeadm?init快速搭建k8s源碼解析
- K8S-ConfigMap實(shí)現(xiàn)應(yīng)用和配置分離詳解
- 帶你學(xué)會(huì)k8s?更高級(jí)的對(duì)象Deployment
- K8S?Operator部署及自定義詳解
相關(guān)文章
k8s編排之DaemonSet知識(shí)點(diǎn)詳解
這篇文章主要為大家介紹了k8s編排之DaemonSet知識(shí)點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Rainbond功能架構(gòu)及應(yīng)用管理官方文檔介紹
這篇文章主要為大家介紹了Rainbond功能機(jī)構(gòu)及使用官方文檔,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪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)通,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11Kubernetes控制器中DaemonSet與Job的使用教程
這篇文章主要介紹了Kubernetes控制器中DaemonSet與Job的使用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08K8s實(shí)戰(zhàn)教程之容器和?Pods資源分配問(wèn)題
這篇文章主要介紹了K8s實(shí)戰(zhàn)教程之容器和?Pods資源分配,本篇文章通過(guò)配置集群中運(yùn)行的容器的?CPU?請(qǐng)求和限制,你可以有效利用集群上可用的?CPU?資源,通過(guò)將?Pod?CPU?請(qǐng)求保持在較低水平,可以使?Pod?更有機(jī)會(huì)被調(diào)度,需要的朋友可以參考下2022-07-07淺析k8s中各組件和kube?apiserver通信時(shí)的認(rèn)證和鑒權(quán)問(wèn)題
這篇文章主要介紹了k8s中各組件和kube?apiserver通信時(shí)的認(rèn)證和鑒權(quán),本文使用的k8s集群是用kubekey搭建,命令是./kk create cluster --with-kubernetes v1.21.5 --with-kubesphere v3.2.1,需要的朋友可以參考下2022-06-06