NetworkPolicy用來控制Pod與Pod之間的網絡通信,它也支持針對Namespace進行限制。基于白名單模式,符合規則的對象通過,不符合的拒絕。 應用場景舉例:
Pod A不能訪問Pod B;
開發環境所有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:定義目標Pod的匹配標簽,即哪些Pod會生效此策略;
policyTypes:表示給定的策略是應用于目標Pod的入站流量(Ingress)還是出站流量(Egress),或兩者兼有。如果NetworkPolicy未指定policyTypes則默認情況下始終設置Ingress。
ingress:定義入流量限制規則,from用來定義白名單對象,比如網段、命名空間、Pod標簽,Ports定義目標端口。
egress:定義出流量限制規則,定義可以訪問哪些IP和端口
案例一: 需求:aming命名空間下所有Pod可以互相訪問,也可以訪問其他命名空間Pod,但其他命名空間不能訪問aming命名空間Pod。 首先創建幾個Pod:
kubectl run busybox --image=busybox -- sleep 3600 ## default命名空間里創建busybox Pod kubectl run busybox --image=busybox -n aming -- sleep 3600 ## aming命名空間里創建busybox Pod kubectl run web --image=nginx:1.23.2 -n aming ## aming命名空間里創建web pod在沒有創建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創建networkpolicy的YAML
vi deny-all-namespaces.yaml ##內容如下 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訪問。應用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將剛剛創建的所有資源刪除:
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##內容如下 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應用YAML
kubectl apply -f pod-selector.yaml創建測試pod
kubectl run web01 --image=nginx:1.23.2 -n aming -l 'app=test' #創建Pod時,指定label kubectl get pod web01 -n aming --show-labels # 查看label # 如果label創建錯了,也可以修改,在本實驗中不需要做如下操作 # 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測試成功后,刪除掉剛剛創建的資源
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#內容如下 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應用YAML
kubectl apply -f allow-ns.yaml創建測試ns
kubectl create ns test創建測試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設置標簽
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的主要內容,你看明白了嗎?
審核編輯:劉清
-
YAML
+關注
關注
0文章
21瀏覽量
2322 -
TCP通信
+關注
關注
0文章
146瀏覽量
4222
原文標題:K8S API資源對象NetworkPolicy
文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論