侧边栏壁纸
博主头像
背锅小王子博主等级

我从事运维工作有十年之久,主要从事云原生相关的工作,对k8s、devops、servicemesh、可观察性等较为熟悉!

  • 累计撰写 59 篇文章
  • 累计创建 64 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录
k8s

k8s中常用的各种网络策略

背锅小王子
2022-10-25 / 0 评论 / 0 点赞 / 360 阅读 / 1,439 字
温馨提示:
本文最后更新于 2022-11-14,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1、NetworkPolicy

默认情况下,Pod 是非隔离的,它们接受任何来源的流量。

Pod 在被某 NetworkPolicy 选中时进入被隔离状态。 一旦名称空间中有 NetworkPolicy 选择了特定的 Pod,该 Pod 会拒绝该 NetworkPolicy 所不允许的连接。 (名称空间下其他未被 NetworkPolicy 所选择的 Pod 会继续接受所有的流量)

网络策略不会冲突,它们是累积的。 如果任何一个或多个策略选择了一个 Pod, 则该 Pod 受限于这些策略的 入站(Ingress)/出站(Egress)规则的并集。因此评估的顺序并不会影响策略的结果。

为了允许两个 Pods 之间的网络数据流,源端 Pod 上的出站(Egress)规则和 目标端 Pod 上的入站(Ingress)规则都需要允许该流量。 如果源端的出站(Egress)规则或目标端的入站(Ingress)规则拒绝该流量, 则流量将被拒绝。

2、NetworkPolicy参数说明

podSelector:用于定义该网络策略作用于的Pod。

namespaceSelector:此选择器将选择特定的命名空间,并将所有Pod 用作其入站流量来源。

policyTypes:网络策略的类型,包括 ingress 和 egress 两种,用于设置目标 Pod 的入站和出站的网络限制。

ingress:定义允许访问目标 Pod 的入站白名单规则,满足 from 条件的客户端才能访问 ports 定义的目标 Pod 端口号。

- from:对符合条件的客户端 Pod 进行网络放行,规则包括基于客户端 Pod 的 Label、基于客户端 Pod 所在的 Namespace 的 Label 或者客户端的 IP 范围。

- ipBlock:此选择器将选择特定的IP CIDR范围以用作允许访问。

-  except:此选择器将选择特定的IP CIDR范围以用作限制访问。

- ports:允许访问的目标 Pod 监听的端口号。

egress:定义目标 Pod 允许访问的 "出站" 白名单规则,目标 Pod 仅允许访问满足 to 条件的服务端 IP 范围和 ports 定义的端口号。

- to: 允许访问的服务端信息,可以基于服务端 Pod 的Label、基于服务端 Pod 所在的 Namespace 的 Label 或者服务端 IP 范围。

- ports:允许访问的服务端的端口号。

3、限制Pod访问某个外网域名

说明:限制pod访问外部域名www.baidu.com,可以正常访问其他外网域名

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default               
spec:
  podSelector:                    
    matchLabels:
      app: nginx  
  policyTypes:                   
    - Egress                      
  egress:    
    - to:
        - ipBlock:
            cidr: 0.0.0.0/0    
            except: 
              - 220.181.38.149/32
              - 220.181.38.150/32
    - to:  # 配置了去向规则(Egress),限制应用的对外访问。在这里需配置允许UDP请求,否则无法做DNS解析。
        - ipBlock:
            cidr: 0.0.0.0/0
        - namespaceSelector: {}
      ports:
         - protocol: UDP
           port: 53

4、限制Pod只能访问外网的80和443端口

说明:限制pod访问外部域名www.baidu.com,只能访问其他外网域名的80和443端口

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default               
spec:
  podSelector:                    
    matchLabels:
      app: nginx  
  policyTypes:                   
    - Egress                      
  egress:    
    - to:
        - ipBlock:
            cidr: 0.0.0.0/0    
            except: 
              - 220.181.38.149/32
              - 220.181.38.150/32
    ports:
        - protocol: TCP
           port: 80
        - protocol: TCP
           port: 443
    - to:
        - ipBlock:
            cidr: 0.0.0.0/0
        - namespaceSelector: {}
      ports:
         - protocol: UDP
           port: 53

5、默认禁止所有入pod流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
spec:
  podSelector: {}
  policyTypes:
  - Ingress

说明:上例中没有定义pod选择器,表示如果namespace下的某个pod没有被任何Network Policy对象选中,则应用此对象,如果被其它Network Policy先中则不应用此对象。

policyTypes的值为Ingress,表示本例启用Ingress规则。但是本例没有定义具体的Ingress,那就应用默认规则。默认规则禁止所有入pod流量,但例外情况是如果source就是pod运行的节点,则允许通过。

6、默认允许所有入pod流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all
spec:
  podSelector: {}
  ingress:
  - {}

说明:同样没有定义pod选择器,意义与上例同。注意ingress的定义,这个是有规则的,只是规则中的条目为空,与默认规则不同,表示全部允许通过。

7、默认禁止所有出pod流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
spec:
  podSelector: {}
  policyTypes:
  - Egress

8、默认允许所有出pod流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all
spec:
  podSelector: {}
  egress:
  - {}
  policyTypes:
  - Egress

9、默认禁止所有入出pod流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

说明:pod与所运行节点之间流量不受Network Policy限制

10、Default namespace 下的 Pod 可互相访问,而不能被其他任何 Pod 访问

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-other-ns-pod-in
  namespace: default
spec:
  ingress:
  - from:
    - podSelector: {}
  podSelector: {}
  policyTypes:
  - Ingress

11、Default namespace 下的 Pod 不能被任何 Pod 访问

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test
  namespace: default
spec:
  ingress:
  - from:
    - podSelector: {}
  podSelector: {}
  policyTypes:
  - Ingress

12、default命名空间下的Pod的80端口,只允许test命名空间的Pod来访问

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network
  namespace: default
spec:
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          test: test
    ports:
    - protocol: TCP
      port: 80
  podSelector: {}
  policyTypes:
  - Ingress

13、default命名空间下的 pod 出口 只能访问 CIDR 为14.215.0.0/16的80端口

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network
  namespace: default
spec:
  egress:
  - to:
    - ipBlock:
        cidr: 14.215.0.0/16
    ports:
    - protocol: TCP
      port: 80
  podSelector: {}
  policyTypes:
  - Egress
0

评论区