写点什么

Kubernetes NetworkPolicy 工作原理浅析

  • 2019-11-26
  • 本文字数:2024 字

    阅读完需:约 7 分钟

Kubernetes NetworkPolicy 工作原理浅析

Kubernetes 能够把集群中不同 Node 节点上的 Pod 连接起来,并且默认情况下,每个 Pod 之间是可以相互访问的。但在某些场景中,不同的 Pod 不应该互通,这个时候就需要进行访问控制。那么如何实现呢?

简介

Kubernetes 提供了 NetworkPolicy 的 Feature,支持按 Namespace 和按 Pod 级别的网络访问控制。它利用 label 指定 namespaces 或 pod,底层用 iptables 实现。这篇文章简单介绍 Kubernetes NetworkPolicy 在 Calico 上的工作原理。

1 控制面数据流

Network Policy 是一种 kubernetes 资源,经过定义、存储、配置等流程使其生效。以下是简要流程:



  • 通过 kubectl client 创建 network policy 资源;

  • calico 的 policy-controller 监听 network policy 资源,获取到后写入 calico 的 etcd 数据库;

  • node 上 calico-felix 从 etcd 数据库中获取 policy 资源,调用 iptables 做相应配置。

2 资源配置模板

Network Policy 支持按 Pod 和 Namespace 级别的访问控制,定义该资源可以参考以下模板。

指定 pod 标签访问

我们要对 namespace 为 myns,带有"role: backend"标签的所有 pod 进行访问控制:只允许标签为"role: frontend"的 Pod,并且 TCP 端口为 6379 的数据流入,其他流量都不允许。


指定 namespaces 标签访问

我们要对标签为"role: frontend"的所有 Pod 进行访问控制:只允许 namespace 标签为"user: bob"的各 Pod,并且 TCP 端口为 443 的数据流入,其他流量都不允许。


3 NetworkPolicy 数据结构定义

看完上边的示例,想必大家对 NetworkPolicy 的资源对象有一定的了解。接下来我们具体看下 Kubernetes 对该接口的定义:



简而言之,该资源指定了“被控制访问 Pod”和“准入 Pod”两类 Pod,这可以从 spec 的 podSelector 和 ingress-from 的 Selector 进行配置。


接下来我们就看下 Kubernetes+Calico 的 Network policy 实现细节。

4 测试版本

以下是测试中使用的组件版本:


  • kubernetes:

  • - master: v1.9.0

  • - node: v1.9.0

  • calico:

  • - v2.5.0

  • - calico-policy-controller


(quay.io/calico/kube-policy-controller:v0.7.0)

5 运行配置

calico 侧,除基本配置外的新建资源:


  • service-account: calico-policy-controller

  • rbac:

  • - ServiceRole: calico-policy-controller

  • - ServiceRoleBinding: calico-policy-controller

  • deployment: calico-policy-controller


Kubernets 侧,新建 network policy 资源;

6 运行状态

在原有正常工作的 Kubernetes 集群上,我们新加了 calico-policy-controller 容器,它里面主要运行 controller 进程:


  • calico-policy-controller:

  • - 进程

  • - 端口:


我们可以看到,启动了 controller 进程,该进程 Established 两个端口:6443 对应的 kubernetes api-server 端口;2379 对应的 calico etcd 端口。

7 Calico-felix 对 policy 的配置

数据包走向

下图是 calico 流量处理流程(从这里找到)。每个 Node 的 calico-felix 从 etcd 数据库拿下来 policy 信息,用 iptables 做底层实现,最主要的就是:cali-pi-[POLICY]@filter 这个 Chain。


Network Policy 报文处理过程中使用的标记位:


0x2000000: 是否已经经过了 policy 规则检测,置 1 表示已经过


符号解释:


from-XXX: XXX 发出的报文; tw: 简写,to wordkoad endpoint; to-XXX: 发送到 XXX 的报文; po: 简写,policy outbound; cali-: 前缀,calico 的规则链; pi: 简写,policy inbound; wl: 简写,workload endpoint; pro: 简写,profile outbound; fw: 简写,from workload endpoint; pri: 简写,profile inbound。



下面通过访问“禁止所有流量”策略的 Pod,来观察对应的 iptables 处理:

流量进入前

流量进入后


可以看到,DROP 的 pkts 由 0 变成了 3。即该数据包经过 MARK、cali-pi-default.web-deny-all 两个 target 处理,被标记符合“拒绝”条件,流经到 DROP 被丢弃。

8 流程分析案例

以下是一个“禁止所有流量进入”的测试案例,通过它看下整体流程。

模型

DENY all traffic to an application


查看 app-web 的标签

在 default 的 namespace 下创建了一个名称为 web 的 service。它的 IP 和标签如下:


配置 policy

首先通过 kubectl 查看 k8s 资源:



再次,通过 calicoctl 和 etcdctl 查看 calico 资源:


查看 felix 进行 network policy 配置的日志

增加 && 删除 Policy


查看 node 上的 iptables 规则

从另一 pod 上访问该服务


可见,访问该 service 的 80 端口失败;ping 所对应的 Pod 试试:



Ping 该 Pod 也是失败,达到了“禁止所有流量进入”的预期。

9 总结

Kubernetes 的 NetworkPolicy 实现了访问控制,解决了部分网络安全的问题。但截至现在,Kubernetes、Calico 对其支持尚未完全,部分特性(egress 等)仍在进行中;另一方面 calico 的每个 Node 上配置大量 iptables 规则,加上不同维度控制的增加,导致运维、排障难度较大。所以对网络访问控制有需求的用户来讲,能否使用还需综合考虑。


本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/a1pa2IeVFWKpfWmzzXiIiQ


2019-11-26 17:132483

评论

发布
暂无评论
发现更多内容

关于电商秒杀系统中防超卖、以及高性能下单的处理方案简述

Java 程序员 后端

剖根问底:Java 不能实现真正泛型的原因是什么?

Java 程序员 后端

区块链编程七大语言,使用最多的竟是Java

Java 程序员 后端

十个超酷的java谋生方式,你喜欢吗?

Java 程序员 后端

关于Spring注解容器配置的那些事,掌握这几点,不再难!

Java 程序员 后端

华为安全技术专家与Linux内核到底发生了什么?这本小册子是怎么回事?

Java 程序员 后端

创建型模式之建造者模式——链式调用

Java 程序员 后端

初次远程面试蚂蚁金服,三面过后本以为凉凉,没想到直接被录取了

Java 程序员 后端

别再找了,这就是全网最全的SpringBean的作用域管理!

Java 程序员 后端

华为java工程师的提升程序员实力的几点建议

Java 程序员 后端

几款常见接口管理平台对比

Java 程序员 后端

分布式服务下,消息中间件改造

Java 程序员 后端

制作Docker镜像,用来编译OpenJDK11源码

Java 程序员 后端

力扣前400题解答笔记,全被字节大神整理到了这份文档里

Java 程序员 后端

动手造轮子:实现一个简单的-AOP-框架

Java 程序员 后端

华为初面+综合面试(Java技术面)附上面试题

Java 程序员 后端

初识Servlet

Java 程序员 后端

前华为18A架构师,总结“RabbitMQ”开发手册,已开源

Java 程序员 后端

内卷严重!看看这些java核心资料,提高竞争力,争做拍死别人的后浪

Java 程序员 后端

凭借着这份Spring面试题,我拿到了阿里,字节跳动美团的offer!

Java 程序员 后端

刚拿的字节跳动offer“打水漂”,TikTok不去了,我该何去何从

Java 程序员 后端

北上广深,2020,多少K的Java程序员应该懂高并发多线程和JVM优化

Java 程序员 后端

冷门的 Java 应用程序安全沙箱机制了解一下

Java 程序员 后端

初探DispatcherServlet#doDispatch

Java 程序员 后端

别再说你不会-JVM-性能监控和调优了,看完这篇再发言!

Java 程序员 后端

关于计算机面试重难点 之 操作系统,字节架构师有话说

Java 程序员 后端

分布式架构——Gossip 协议详解

Java 程序员 后端

初识Java语言(六)- 多态、抽象类以及接口

Java 程序员 后端

前后端项目练习(整合Spring)

Java 程序员 后端

互联网通信云盛会WICC广州站绿色报名通道开启

融云 RongCloud

十面阿里Java岗,看我怎么吊打面试官!

Java 程序员 后端

Kubernetes NetworkPolicy 工作原理浅析_文化 & 方法_OPSDEV - 李文新_InfoQ精选文章