K8s网络策略

Network Policy(网络策略)

默认情况下,k8s集群网络是没有任何限制的,Pod可以和任何其他Pod通信,在某些场景下需要做网络控制,减少网络面的攻击,提高安全性,就会用到网络策略(Network Policy)。为了使用Network Policy,K8s引入了一个新的资源对象NetworkPolicy,供用户设置Pod间网络访问的策略。但仅定义一个网络策略是无法完成实际的网络隔离的,还需要一个策略控制器(Policy Controller)进行策略的实现。策略控制器由第三方网络组件提供,目前Calico、Cilium、Kube-router、Romana、Weave Net等开源项目均支持网络策略的实现。

Network Policy的主要功能是对Pod间的网络通信进行限制和准入控制,设置方式为将Pod的Label作为查询条件,设置允许访问或禁止访问的客户端Pod列表。目前查询条件可以作用于Pod和Namespace级别。

网路策略的使用场景:

  • 应用程序之间访问控制,例如A不能访问B的Pod
  • 开发环境命名空间不能访问测试环境命名空间的Pod
  • 当Pod暴露到外部时,需要做Pod的白名单
  • 多租户网络环境隔离

 网络策略示例:

复制代码
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default               #针对default命名空间做网络策略
spec:
  podSelector:                     #pod标签选择,针对default命名空间下的含有role=db的pod做限制
    matchLabels:
      role: db                     #pod标签
  policyTypes:                    #网络策略
    - Ingress                      #针对访问default命名空间下含有role=db标签的pod做限制
    - Egress                       #针对default命名空间下含有role=db标签的pod做访问外部的限制
  ingress:                         #外部访问含有标签的pod白名单
    - from:
        - ipBlock:
            cidr: 172.17.0.0/16   #只允许访问的IP段
             except:
              - 172.17.1.0/24     #在上面的基础上,不允许这些IP访问
        - namespaceSelector:      #针对命名空间做限制
            matchLabels:
              project: myproject  #允许这个命名空间下的pod访问
        - podSelector:            #pod选择,如果没有则默认上面命名空间中的所有pod允许访问
            matchLabels:
              role: frontend      #允许myproject下的这个pod访问
      ports:
        - protocol: TCP           #允许访问的网络协议
          port: 6379              #允许访问的端口
  egress:                          #针对default空间下含有role=db的标签访问外部策略
    - to:
        - ipBlock:
            cidr: 10.0.0.0/24     #允许访问的IP段
      ports:
        - protocol: TCP          #网路协议 
          port: 5978             #允许访问的端口
复制代码

案例一

test命名空间下pod可以相互访问,拒绝其他命名空间所有pod访问,但是可以访问其他命名空间。

复制代码
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: reject-all-ingress
  namespace:test
spec:
  podSelector: {} #未配置,匹配本命名空间下所有pod
  policyTypes:
  - Ingress
  ingress:
  - form:
    - podSelector: {} #未配置,匹配本命名空间下所有pod
复制代码

案例二

同一命名空间下应用之间的限制访问:

test命名空间下标签为app=db的pod不允许被访问,只允许test命名空间下标签为app=web的标签访问3306端口

复制代码
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: web-db-ingress
  namespace:test
spec:
  podSelector: 
     matchLabels:
       app=db
  policyTypes:
  - Ingress
  ingress:
  - form:
    - podSelector: 
      matchLabels:
        app=web
    ports:
      - protocol: TCP
        port: 3306
复制代码

案例三 

只允许指定命名空间下的应用访问

以上面为例,指定test2命名空间下的pod访问test命名空间下的app=db的pod的3306端口,其他的都不允许访问。

复制代码
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: web-db-ingress
  namespace:test
spec:
  podSelector: 
     matchLabels:
       app=db
  policyTypes:
  - Ingress
  ingress:
  - form:
    - namespaceSelector:
        matchLabels: 
          name: test2
    ports:
      - protocol: TCP
        port: 3306
复制代码

 

posted @   李志锋  阅读(451)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
点击右上角即可分享
微信分享提示