kubernetes network policy学习笔记

李俊
• 阅读 10794

简介

network policy顾名思义就是对pod进行网络策略控制。 k8s本身并不支持,因为k8s有许多种网络的实现方式,企业内部可以使用简单的flannel、weave、kube-router等,适合公有云的方案则有calico等。不同的网络实现原理(vethpair、bridge、macvlan等)并不能统一地支持network policy。

network policy 策略模型

使用network policy资源可以配置pod的网络,networkPolicy是namespace scoped的,他只能影响某个namespace下的pod的网络出入站规则。

  • metadata 描述信息
  • podSelector pod选择器,选定的pod所有的出入站流量要遵循本networkpolicy的约束
  • policyTypes 策略类型。包括了Ingress和Egress,默认情况下一个policyTypes的值一定会包含Ingress,当有egress规则时,policyTypes的值中会包含Egress
  • ingress 入站
  • egress 出站

策略模型可以参考官方文档, 这里举个例子:

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

该例子的效果如下:
1、default namespace下label包含role=db的pod,都会被隔绝,他们只能建立“满足networkPolicy的ingress和egress描述的连接”。即2-5点:
2、所有属于172.17.0.0/16网段的IP,除了172.17.1.0/24中的ip,其他的都可以与上述pod的6379端口建立tcp连接。
3、所有包含label:project=myproject的namespace中的pod可以与上述pod的6379端口建立tcp连接;
4、所有default namespace下的label包含role=frontend的pod可以与上述pod的6379端口建立tcp连接;
5、允许上述pod访问网段为10.0.0.0/24的目的IP的5978端口。

再例,如果我们想要只允许default这个namespace下label包含access=true的pod访问nginx pod(label:run=nginx),可以对nginx pod设置入站规则:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: access-nginx
  namespace: default
spec:
  podSelector:
    matchLabels:
      run: nginx
  ingress:
  - from:
    - podSelector:
        matchLabels:
          access: "true"

另外一些默认的规则:
1.同namespace的pod,入站规则为全部禁止

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

2.同namespace的pod,入站规则为全部开放:

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

3.同namespace的pod,出站规则为全部禁止

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

4.同namespace的pod,出站规则为全部开放

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

network policy的实现

network policy的实现仰赖CNI插件的支持,目前已经支持的cni插件包括:
Calico 。calico本身通过BGP路由实现容器网络,network policy大致也是通过它实现的。
Cilium
Kube-router。 这个工具比较吸引人,因为他使用iptables实现networkpolicy,同时它也能成为kube-proxy组件的替代品。
Romana
Weave Net。也是通过iptables实现出入站策略。(看了社区的例子,里面针对namespace级别的控制好像要用正则表达式进行匹配)
这些容器网络解决方案,在支持networkpolicy时,均需要在node上启动agent(可以用k8s的daemonset)

思考:与neutron 网络中安全组的区别

其实network policy要做的事情,安全组一样可以做。但network policy可以做到namespace范围的整体控制。
思考一个networkpolicy agent要做的事情,应该包含以下几点:
1、对networkpolicy进行全namespace范围的list & watch;
2、对规则原语的解析和定制。(如何将namespace、label等概念具象到iptables中?我的想法比较笨拙:使用正则表达式表述pod name的规则,同时list-watch pod并维护pod name 到pod ip的关系)
3、维护这些规则在本地的实现和记录(如iptables表)

安全组的规则记录在上层网关,而不是每一个节点上在安全组规则上,可能需要list watch networkPolicy、namespace、pod等资源,因此实现namespace级别的策略可能会影响其性能。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
分布式id如何生成
1.UUID生成通过网卡、时间、随机数来保证生成的唯一的字符串。优点:(1)本地生成,生成简单(2)速度快(3)高可用;缺点:(1)无序,如果存入mysq,影响B的操作性能,因为B树是需要排序的;(2)占用空间较大(36个
Stella981 Stella981
4年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
4年前
Kubernetes(三):k8s集群部署之kubeadm
k8s部署环境公有云环境:AWS、腾讯云、阿里云等等私有云:OpenStack、vSphere等Baremetal环境:物理服务器或独立虚拟机(底层没有云环境)。k8s部署方式Minikube:Kubernetes官网提供的微型分布式环境(ht
Stella981 Stella981
4年前
Linux查看GPU信息和使用情况
1、Linux查看显卡信息:lspci|grepivga2、使用nvidiaGPU可以:lspci|grepinvidia!(https://oscimg.oschina.net/oscnet/36e7c7382fa9fe49068e7e5f8825bc67a17.png)前边的序号"00:0f.0"是显卡的代
Stella981 Stella981
4年前
Kubernetes源码探疑:Pod IP泄露排查及解决
作者:陈绥来源:UCloud(ID:ucloud\_tech)UK8S是UCloud推出的Kubernetes容器云产品,完全兼容原生API,为用户提供一站式云上Kubernetes服务。我们团队自研了CNI(Container Network Interface)网络插件,深度集成VPC,使UK8S容器应用拥有与云主机间等同的网络性能(目前
Stella981 Stella981
4年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
4年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
4年前
Github标星5300+,专门为程序员开发文档开源管理系统,我粉了
!(https://oscimg.oschina.net/oscnet/a11909a041dac65b1a36b2ae8b9bcc5c432.jpg)码农那点事儿关注我们,一起学习进步!(https://oscimg.oschina.net/oscnet/f4cce1b7389cb00baaab228e455da78d0
Stella981 Stella981
4年前
Nginx反向代理upstream模块介绍
!(https://oscimg.oschina.net/oscnet/1e67c46e359a4d6c8f36b590a372961f.gif)!(https://oscimg.oschina.net/oscnet/819eda5e7de54c23b54b04cfc00d3206.jpg)1.Nginx反