网络策略NetworkPolicy

网络策略NetworkPolicy

2023年7月6日发(作者:)

⽹络策略NetworkPolicy⽹络策略在 Kubernetes ⾥,⽹络隔离能⼒的定义,是依靠⼀种专门的 API 对象来描述的,即: NetworkPolicy。Kubernetes ⾥的 Pod 默认都是“允许所有”(Accept All)的,即:Pod 可以接收来⾃任何发送⽅的请求;或者,向任何接收⽅发送请求。⽽如果要对这个情况作出限制,就必须通过 NetworkPolicy 对象来指定。⼀个完整的NetworkPolicy对象⽰例如下所⽰:apiVersion: /v1kind: NetworkPolicymetadata: name: test-network-policy namespace: defaultspec: 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: 80 egress: - to: - ipBlock: cidr: 10.0.0.0/24 ports: - protocol: TCP port: 5978与所有其他的 Kubernetes 资源对象⼀样,NetworkPolicy 需要 apiVersion、kind 和 metadata 字段,我们通过 ector 字段定义这个 NetworkPolicy 的限制范围,因为 NetworkPolicy ⽬前只⽀持定义 ingress 规则,所以这⾥的 podSelector 本质上是为该策略定义 “⽬标pod”, ⽐如我们这⾥ matchLabels:role=db 表⽰的就是当前Namespace ⾥携带了 role=db 标签的 Pod。⽽如果把 podSelector 字段留空:spec:

podSelector: {}那么这个 NetworkPolicy 就会作⽤于当前 Namespace 下的所有 Pod。每个 NetworkPolicy 包含⼀个 policyTypes 列表,可以是 Ingress、Egress 或者两者都包含,该字段表⽰给当前策略是否应⽤于所匹配的 Pod 的⼊⼝流量、出⼝流量或者⼆者都包含,如果没有指定 policyTypes,则默认情况下表⽰ Ingress ⼊⼝流量,如果配置了任何出⼝流量规则,则将指定为 Egress。⼀旦 Pod 被 NetworkPolicy 选中,那么这个 Pod 就会进⼊“拒绝所有”(Deny All)的状态,即:这个 Pod 既不允许被外界访问,也不允许对外界发起访问。⽐如上⾯⽰例表⽰的是该隔离规则只对 default 命名空间下的,携带了 role=db 标签的 Pod 有效。限制的请求类型包括 ingress(流⼊)和 egress(流出)。ingress: 每个 NetworkPolicy 包含⼀个 ingress 规则的⽩名单列表。其中的规则允许同时匹配 from 和 ports 部分的流量。⽐如上⾯⽰例中我们配置的⼊⼝流量规则如下所⽰: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: 80这⾥的 ingress 规则中我们定义了 from 和 ports,表⽰允许流⼊的⽩名单和端⼝,Kubernetes 会拒绝任何访问被隔离 Pod 的请求,除⾮这个请求来⾃于以下“⽩名单”⾥的对象,并且访问的是被隔离 Pod 的端⼝。⽽这个允许流⼊的⽩名单中指定了三种并列的情况,分别是:ipBlock、namespaceSelector 和 podSelector:default 命名空间下⾯带有 role=frontend 标签的 Pod带有 project=myproject 标签的 Namespace 下的任何 Pod任何源地址属于 172.17.0.0/16 ⽹段,且不属于 172.17.1.0/24 ⽹段的请求。egress: 每个 NetworkPolicy 包含⼀个 egress 规则的⽩名单列表。每个规则都允许匹配 to 和 port 部分的流量。⽐如我们这⾥⽰例规则的配置:egress: - to: - ipBlock: cidr: 10.0.0.0/24 ports: - protocol: TCP port: 5978表⽰ Kubernetes 会拒绝被隔离 Pod 对外发起任何请求,除⾮请求的⽬的地址属于 10.0.0.0/24 ⽹段,并且访问的是该⽹段地址的 5978 端⼝。安装Calico要让⽹络策略⽣效,就需要特定的⽹络插件⽀持,⽬前已经实现了 NetworkPolicy 的⽹络插件包括 Calico、Weave 和 kube-router 等项⽬,但是并不包括 Flannel 项⽬。所以说,如果想要在使⽤ Flannel 的同时还使⽤ NetworkPolicy 的话,就需要再额外安装⼀个⽹络插件,⽐如 Calico 项⽬,来负责执⾏ NetworkPolicy。由于我们这⾥使⽤的是Flannel ⽹络插件,所以⾸先需要安装 Calico 来负责⽹络策略。⾸先确定 kube-controller-manager 配置了如下的两个参数:......spec: containers: - command: - kube-controller-manager - --allocate-node-cidrs=true - --cluster-cidr=10.244.0.下载需要使⽤的资源清单⽂件:$ curl /manifests/ -O如果之前配置的 pod CIDR 就是 10.244.0.0/16 ⽹段,则可以跳过下⾯的配置,如果不同则可以使⽤如下⽅式进⾏替换:$ POD_CIDR="" $ sed -i -e "s?10.244.0.0/16?$POD_CIDR?g" 最后直接安装:$ kubectl apply -f 测试⾸先我们准备两个待测试的Pod:apiVersion: v1kind: Podmetadata: name: test-npspec: containers: - name: test-np image: nginx:1.17.1---apiVersion: v1kind: Podmetadata: name: busyboxspec: containers: - name: busybox image: busybox:1.30 command: ["/bin/sh","-c","sleep 86400"]直接创建这两个pod:$ kubectl apply -f

pod/test-np unchangedpod/busybox configured$ kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED ...busybox 1/1 Running 0 3m38s 10.244.2.3 node1 ...

test-np 1/1 Running 0 3m38s 10.244.1.6 node2 ...

我们使⽤busybox来访问test-np,在没有加任何⽹路策略的情况下,测试是否能正常请求:$ kubectl exec -it busybox ping 10.244.1.6kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] 10.244.1.6 (10.244.1.6): 56 data bytes64 bytes from 10.244.1.6: seq=0 ttl=62 time=0.642 ms64 bytes from 10.244.1.6: seq=1 ttl=62 time=0.536 ms64 bytes from 10.244.1.6: seq=2 ttl=62 time=0.这时候我们添加上⾯的⽹络策略,同时给test-np打上role=db的标签:$ kubectl label pod test-np role=db --overwritepod/test-np labeled$ kubectl get networkpolicykubectl get networkpolicyNAME POD-SELECTOR AGEtest-network-policy role=db 10s这时候test-np这个Pod就匹配了⽹络策略,由于匹配了⽹络策略的就会拒绝所有的⽹络请求,需要通过⽩名单来进⾏开启请求,但是busybox这个Pod 明显没有在⽩名单之中,所以应该会拒绝⽹络请求:kubectl exec -it busybox ping 10.244.1.6kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] 10.244.1.6 (10.244.1.6): 56 data bytes^C--- 10.244.1.6 ping statistics ---8 packets transmitted, 0 packets received, 100% packet losscommand terminated with exit code 1那么现在我想让busybox能正常请求test-np这个pod,我们来看test-np绑定的⽹路策略中的⽩名单,第⼀条我们明显不符合要求,第⼆条将busybox转移标签 project=myproject 的Namespace 下⾯,这个实现也不是特别容器,接着我们来看第三条,带有role=frontend这个标签的Pod就可以访问,那么我们就可以直接给我busybox打上这个标签:$ kubectl label pod busybox role=frontend --overwritepod/busybox labeled接着我们继续请求test-np,这次应该可以成功:kubectl exec -it busybox ping 10.244.1.6kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] 10.244.1.6 (10.244.1.6): 56 data bytes64 bytes from 10.244.1.6: seq=0 ttl=62 time=0.519 ms64 bytes from 10.244.1.6: seq=1 ttl=62 time=0.761 ms64 bytes from 10.244.1.6: seq=2 ttl=62 time=1.682 ms64 bytes from 10.244.1.6: seq=3 ttl=62 time=0.

发布者:admin,转转请注明出处:http://www.yc00.com/news/1688593822a153187.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信