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

最新文章

  1. 从mixin到new和prototype:Javascript原型机制详解
  2. (转) RSA算法原理(一)
  3. 新浪微博授权失败:applications over the unaudited use restrictions
  4. 【Java EE 学习 21 下】【 使用易宝支付接口实现java网上支付功能】
  5. z-tree
  6. 第十七章:jQuery类库
  7. mysql 查看 删除 日志操作总结(包括单独和主从mysql)
  8. ASPから広がり
  9. Network view
  10. 那些年,让我们一起着迷的Spring
  11. maven项目打包发布时跳过测试
  12. excel vlookup
  13. BGP网络学习总结
  14. Javascript继承1:子类的的原型对象----类式继承
  15. JavaScript中的栈和堆内存,作用域
  16. (转)打印相关_C#(PrintDocument、PrintDialog、PageSetupDialog、PrintPreviewDialog)
  17. Hive调优
  18. es6学习笔记1
  19. [Algorithm] Deferred Acceptance Algorithm
  20. AI小白快上车!这是发往高薪职位的车!

热门文章

  1. python 爬虫可视化,天气
  2. JavaScript:操作符:空值合并运算符(??)
  3. Windows 平台计算 CPU 总利用率
  4. 饮料换购【第六届蓝桥杯省赛C++A/C组,第六届蓝桥杯省赛JAVAB组】
  5. 安装pytorch-gpu的经验与教训
  6. 把KMP算法嚼碎了喂给你吃!(C++)
  7. 洛谷 P1208混合牛奶 题解
  8. css之transform属性的使用
  9. Grafana 系列文章(四):Grafana Explore
  10. day16-声明式事务-02