您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“k8s NetworkPolicy網(wǎng)絡策略怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“k8s NetworkPolicy網(wǎng)絡策略怎么使用”吧!
NetworkPolicy 可被定義為 Pod 標簽選擇器、命名空間選擇器或者兩者的組合。它可以實現(xiàn)以下功能:
限制 Pod 之間的流量:通過指定 Ingress 規(guī)則,可以阻止來自其他 Pod 的流量進入目標 Pod。
允許 Pod 之間的流量:需要為目標 Pod 配置 Egress 規(guī)則,以便只允許來自特定 Pod 的流量進入。
限制 Pod 與外部網(wǎng)絡的通信:通過指定 Egress 規(guī)則,可以控制哪些類型的外部流量可以進入 Pod,并防止未經(jīng)授權的訪問。
允許 Pod 與外部網(wǎng)絡的通信:需要為目標 Pod 配置 Ingress 規(guī)則,以便只允許來自特定 IP 地址、端口或協(xié)議的流量進入。
使用 NetworkPolicy 時,需要考慮以下幾個方面:
NetworkPolicy 只在支持它的網(wǎng)絡插件中起作用,例如 Calico、Cilium 和 Weave Net 等。
沒有定義任何 NetworkPolicy 規(guī)則,則所有的流量都會被允許。
定義 NetworkPolicy 后,它只適用于當前命名空間中的 Pod。
在 NetworkPolicy 中指定標簽選擇器時,應保證其唯一性,以免給其他 Pod 帶來影響。
默認情況下,如果名字空間中不存在任何策略,則所有進出該名字空間中 Pod 的流量都被允許。
默認情況下,所有 Pod 之間都是互通的。每個 Namespace 可以配置獨立的網(wǎng)絡策略,來隔離 Pod 之間的網(wǎng)絡流量。
由此,可以通過創(chuàng)建匹配 Pod 的 Network Policy 來作為默認的網(wǎng)絡策略,比如默認拒絕所有 Pod 之間 Ingress 的通信,如下:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny spec: podSelector: {} policyTypes: - Ingress
默認拒絕 Pod 之間 Egress(出口) 通信的策略:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny spec: podSelector: {} policyTypes: - Egress
甚至是默認拒絕 Pod 之間 Ingress(入口) 和 Egress(出口) 通信的策略:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny spec: podSelector: {} policyTypes: - Ingress - Egress
Pod 隔離可以分為出口的隔離和入口的隔離。其實這里的“隔離”不是絕對的,而是還有一些其它限制。
比如可以通過使用標簽選擇器(這里可以是 namespaceSelector 和 podSelector)來控制 Pod 之間的流量。
如下面的 Network Policy:
允許 default namespace 中帶有 role=myfront 標簽的 Pod 訪問 default namespace 中帶有 role=mydb 標簽 Pod 的 6379 端口
允許帶有 project=myprojects 標簽的 namespace 中所有 Pod 訪問 default namespace 中帶有 role=mydb 標簽 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 標簽的 Pod:
允許 default namespace 中帶有 role=myfront 標簽的 Pod 訪問 default namespace 中帶有 role=mydb 標簽 Pod 的 6379 端口
允許帶有 project=myprojects 標簽的 namespace 中所有 Pod 訪問 default namespace 中帶有 role=mydb 標簽 Pod 的 6379 端口
允許 default namespace 中帶有 role=mydb 標簽的 Pod 訪問 10.1.0.0/24 網(wǎng)段的 TCP 5987 端口
kubectl run web --image=nginx --labels app=web,env=prod --expose --port 80
網(wǎng)絡策略如下:
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: web-deny-all spec: podSelector: matchLabels: app: web env: prod
kubectl run apiserver --image=nginx --labels app=bookstore,role=api --expose --port 80
網(wǎng)絡策略如下:
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: api-allow spec: podSelector: matchLabels: app: bookstore role: api ingress: - from: - podSelector: matchLabels: app: bookstore
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny namespace: default spec: podSelector: {}
kubectl create namespace secondary kubectl run web --namespace secondary --image=nginx \ --labels=app=web --expose --port 80
網(wǎng)絡策略配置如下:
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: namespace: secondary name: web-deny-other-namespaces spec: podSelector: matchLabels: ingress: - from: - podSelector: {}
此策略可以確保即使沒有被其他任何 NetworkPolicy 選擇的 Pod 也不會被允許流出流量。 此策略不會更改任何 Pod 的入站流量隔離行為。
kubectl run web --image=nginx \ --labels=app=web --expose --port 80
網(wǎng)絡策略如下:
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: web-allow-prod spec: podSelector: matchLabels: app: web ingress: - from: - namespaceSelector: matchLabels: purpose: production
kubectl run web --image=nginx --labels=app=web --port 80 kubectl expose deployment/web --type=LoadBalancer
網(wǎng)絡策略如下:
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: web-allow-external spec: podSelector: matchLabels: app: web ingress: - ports: - port: 80 from: []
有了這個策略,任何額外的策略都不會導致來自這些 Pod 的任何出站連接被拒絕。 此策略對進入任何 Pod 的隔離沒有影響。
到此,相信大家對“k8s NetworkPolicy網(wǎng)絡策略怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。