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