资讯专栏INFORMATION COLUMN

kubernetes network policy学习笔记

wuyangnju / 2089人阅读

摘要:不同的网络实现原理等并不能统一地支持。描述信息选择器,选定的所有的出入站流量要遵循本的约束策略类型。所有包含的中的可以与上述的端口建立连接所有下的包含的可以与上述的端口建立连接允许上述访问网段为的目的的端口。但可以做到范围的整体控制。

简介

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级别的策略可能会影响其性能。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/32618.html

相关文章

  • Kubernetes 1.7:从完善容器编排功能到落地商业应用新跨越!

    摘要:新功能版本增加了安全性有状态的应用程序和可扩展性等功能。网络已从升级到新的组。 ​根据 Kubernetes Google Group 产品经理 Aperna Sinha 和 Kubernetes Mirantis 项目经理 Ihor Dvoretskyi 的说法,Kubernetes 1.7 中的 API aggregation 功能使用户可以在运行时添加自定义的 API 服务器,与...

    big_cat 评论0 收藏0
  • K8S 生态周报| 2019-04-15~2019-04-21

    摘要:生态周报内容主要包含我所接触到的生态相关的每周值得推荐的一些信息。欢迎订阅知乎专栏生态。正式发布是毕业项目,可用于监控系统及服务状态。并且可以通过配置规则来触发报警等。 「K8S 生态周报」内容主要包含我所接触到的 K8S 生态相关的每周值得推荐的一些信息。欢迎订阅知乎专栏「k8s生态」。 Prometheus v2.9.0 正式发布 Prometheus 是 CNCF 毕业项目,可用...

    fevin 评论0 收藏0
  • kubernetes 1.3 current and future

    摘要:执行该初始化任务的容器被成为初始化容器。目前,有等状态。网络身份的维护主要通过稳定的和来维护,他们通过的配置文件指定。若其操作导致最小可用数低于应用要求,则操作会被拒绝。 本文讨论 K8S 1.3 的一些新功能,以及正在进行中的功能。读者应该对 kubernetes 的基本结构已经有所了解。 支持更多类型的应用 1、Init container Init container 是1.3 ...

    entner 评论0 收藏0
  • 华尔街见闻基于istio的服务网格实践

    摘要:,托管于腾讯云容器平台容器编排工具。适配我们目前的服务部署在腾讯云托管,节点使用核的网络增强型机器,所有的后端服务都以部署,集群外部署高可用支持集群内服务发现,数据库以为主,消息队列采用。 距离2017年的见闻技术架构调整接近2年,随着业务线的发展,见闻技术部的项目数量、项目架构类型、基础设施规模、服务变更频率都在不断地增长,带给SRE的挑战是如何能更快地助力于开发人员更快更稳定地部署...

    stonezhu 评论0 收藏0
  • 浅析 Kubernetes原生NetworkPolicy 网络策略,让更安全的容器运行环境唾手可得

    摘要:本文将主要分析原生的网络策略。笔者认为这个问题主要是因为使用者不了解网络策略的省缺行为。可选字段,字符串,策略规则类型,表示该网络策略中包含哪些类型的策略,可选为或。互相间为或的关系,满足其中一条则放行。标准,除了指定的放行外其他都禁止。 k8s中的网络策略主要分为原生 NetworkPolicy 和第三方网络插件提供的网络策略。本文将主要分析原生Networkpolicy的网络策略。...

    jsdt 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<