NetworkPolicy用來(lái)控制Pod與Pod之間的網(wǎng)絡(luò)通信,它也支持針對(duì)Namespace進(jìn)行限制?;诎酌麊文J剑弦?guī)則的對(duì)象通過(guò),不符合的拒絕。 應(yīng)用場(chǎng)景舉例:
Pod A不能訪問(wèn)Pod B;
開(kāi)發(fā)環(huán)境所有Pod不能訪問(wèn)測(cè)試命名空間;
提供對(duì)外訪問(wèn)時(shí),限制外部IP;
官方NetworkPolicy YAML示例:
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說(shuō)明:必需字段:apiVersion、 kind 和 metadata 字段。
podSelector:定義目標(biāo)Pod的匹配標(biāo)簽,即哪些Pod會(huì)生效此策略;
policyTypes:表示給定的策略是應(yīng)用于目標(biāo)Pod的入站流量(Ingress)還是出站流量(Egress),或兩者兼有。如果NetworkPolicy未指定policyTypes則默認(rèn)情況下始終設(shè)置Ingress。
ingress:定義入流量限制規(guī)則,from用來(lái)定義白名單對(duì)象,比如網(wǎng)段、命名空間、Pod標(biāo)簽,Ports定義目標(biāo)端口。
egress:定義出流量限制規(guī)則,定義可以訪問(wèn)哪些IP和端口
案例一: 需求:aming命名空間下所有Pod可以互相訪問(wèn),也可以訪問(wèn)其他命名空間Pod,但其他命名空間不能訪問(wèn)aming命名空間Pod。 首先創(chuàng)建幾個(gè)Pod:
kubectl run busybox --image=busybox -- sleep 3600 ## default命名空間里創(chuàng)建busybox Pod kubectl run busybox --image=busybox -n aming -- sleep 3600 ## aming命名空間里創(chuàng)建busybox Pod kubectl run web --image=nginx:1.23.2 -n aming ## aming命名空間里創(chuàng)建web pod在沒(méi)有創(chuàng)建NetworkPolicy的情況下測(cè)試
kubectl exec busybox -n aming -- ping 10.18.235.161 ##aming命名空間的busybox ping default命名空間的busybox IP kubectl exec busybox -n aming -- ping 10.18.235.162 ##aming命名空間的busybox ping aming命名空間的web IP kubectl exec busybox -- ping 10.18.235.162 ##default命名空間的busybox ping aming命名空間的web IP創(chuàng)建networkpolicy的YAML
vi deny-all-namespaces.yaml ##內(nèi)容如下 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all-namespaces namespace: aming spec: podSelector: {} # 為空,表示匹配本命名空間所有Pod policyTypes: - Ingress ingress: - from: - podSelector: {} # 為空,表示匹配該命名空間所有Pod,即允許該命名空間所有Pod訪問(wèn),沒(méi)有定義namespaceSelector,也就是說(shuō)不允許其它namespace的Pod訪問(wèn)。應(yīng)用YAML
kubectl apply -f deny-all-namespaces.yaml測(cè)試:
kubectl exec busybox -n aming -- ping 10.18.235.161 ##aming命名空間的busybox ping default命名空間的busybox IP kubectl exec busybox -n aming -- ping 10.18.235.162 ##aming命名空間的busybox ping aming命名空間的web IP kubectl exec busybox -- ping 10.18.235.162 ##default命名空間的busybox ping aming命名空間的web IP將剛剛創(chuàng)建的所有資源刪除:
kubectl delete po busybox --force kubectl delete po busybox -n aming --force kubectl delete po web -n aming kubectl delete -f deny-all-namespaces.yaml案例二: 通過(guò)PodSelector限制
vipod-selector.yaml##內(nèi)容如下 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: app-to-app namespace: aming spec: podSelector: matchLabels: app: test policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: dev ports: - protocol: TCP port: 80應(yīng)用YAML
kubectl apply -f pod-selector.yaml創(chuàng)建測(cè)試pod
kubectl run web01 --image=nginx:1.23.2 -n aming -l 'app=test' #創(chuàng)建Pod時(shí),指定label kubectl get pod web01 -n aming --show-labels # 查看label # 如果label創(chuàng)建錯(cuò)了,也可以修改,在本實(shí)驗(yàn)中不需要做如下操作 # kubectl label pod busybox app=test123 --overwrite kubectl run app01 --image=nginx:1.23.2 -n aming -l 'app=dev' kubectl run app02 --image=nginx:1.23.2 -n aming查看web01的IP
kubectl describe po web01 -n aming |grep -i ip測(cè)試
kubectl exec -n aming app01 -- curl 10.18.235.170 kubectl exec -n aming app02 -- curl 10.18.235.170測(cè)試成功后,刪除掉剛剛創(chuàng)建的資源
kubectl delete po app01 -n aming kubectl delete po app02 -n aming kubectl delete po web01 -n aming kubectl delete -f pod-selector.yaml案例三: 限制namespace
viallow-ns.yaml#內(nèi)容如下 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-ns namespace: aming spec: podSelector: {} policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: name: test ports: - protocol: TCP port: 80應(yīng)用YAML
kubectl apply -f allow-ns.yaml創(chuàng)建測(cè)試ns
kubectl create ns test創(chuàng)建測(cè)試pod
kubectl run web01 --image=nginx:1.23.2 -n aming kubectl run web02 --image=nginx:1.23.2 -n test kubectl run web03 --image=nginx:1.23.2 kubectl run web04 --image=nginx:1.23.2 -n aming查看web01的IP
kubectl describe po web01 -n aming |grep -i ip查看ns label
kubectl get ns --show-labels給ns設(shè)置標(biāo)簽
kubectl label namespace test name=test測(cè)試:
kubectl -n test exec web02 -- curl 10.18.235.172 #可以訪問(wèn) kubectl exec web03 -- curl 10.18.235.172 #不可以訪問(wèn) kubectl -n aming exec web04 -- curl 10.18.235.172 #不可以訪問(wèn),即使同一個(gè)命名空間也無(wú)法訪問(wèn)
以上為NetworkPolicy的主要內(nèi)容,你看明白了嗎?
審核編輯:劉清
-
YAML
+關(guān)注
關(guān)注
0文章
21瀏覽量
2322 -
TCP通信
+關(guān)注
關(guān)注
0文章
146瀏覽量
4221
原文標(biāo)題:來(lái)看看k8s里pod之間是如何進(jìn)行網(wǎng)絡(luò)隔離的
文章出處:【微信號(hào):aming_linux,微信公眾號(hào):阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論