k8s里pod之间是如何进行网络隔离的

您所在的位置:网站首页 k8s容器网络模式有哪些 k8s里pod之间是如何进行网络隔离的

k8s里pod之间是如何进行网络隔离的

2023-05-31 11:36| 来源: 网络整理| 查看: 265

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限制

vi pod-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

vi allow-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的主要内容,你看明白了吗?



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3