写点什么

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:132126

评论

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

【 Flutter 手势探索】我的第二本小册来了,看完我工资从12K变成了20K

android 程序员 移动开发

【中级—,android项目驱动式开发教程

android 程序员 移动开发

【从入门到实用】android启动优化深入解析,安卓系列学习进阶视频

android 程序员 移动开发

【原理+实战,android音视频开发何俊林

android 程序员 移动开发

【Android 功能库】1,醍醐灌顶

android 程序员 移动开发

【原理+实战(1),fluttertextfield高度

android 程序员 移动开发

【孔乙已】生产者消费者有四样写法,android插件化和组件化

android 程序员 移动开发

【Java转Android】60,androidx86输入法

android 程序员 移动开发

技术面试感觉什么都会,面试官一问回答不上来怎么办?

Java高级开发

面试 性能优化 编程语言 Java 分布式

喜报!百度获国家技术发明奖

百度大脑

人工智能 百度

GaussDB的技术发展以及在金融核心数据库国产化的最佳实践丨DAMS峰会

华为云数据库小助手

GaussDB 大会 华为云数据库

【Android Jetpack高手日志】ViewModel 从入门到精通,kotlin中文文档

android 程序员 移动开发

Vue3.x 关于组件的那些变化(新手必看篇)

码仔

vue.js 大前端 组件化 组件

【Android高级架构师系统学习文章】Android基础-Activity全方位解析

android 程序员 移动开发

【Jetpack篇】LiveData取代EventBus,2021年Android知识体系总结

android 程序员 移动开发

35w奖金池,腾讯云TDSQL精英挑战赛等你来战!

腾讯云数据库

数据库 腾讯云 tdsql

【中级—(1),Android资深架构师分享学习经验及总结

android 程序员 移动开发

『Android 技能篇』优雅的转场动画之 Transition,kotlin安卓开发教程视频

android 程序员 移动开发

【Android】金三银四面试集合,android面试题大全

android 程序员 移动开发

【Android面试技巧】当面试官问你glide的时候,android嵌入式开发实战pdf

android 程序员 移动开发

【Flutter 专题】126 图解自定义两侧对齐 ACETabBar 标签导航栏

android 程序员 移动开发

百度智能云天工获评2021世界物联网新技术新产品新应用成果金奖

百度大脑

人工智能 百度

技术创新+开放共赢 华为云GaussDB加速企业数字化转型

华为云数据库小助手

GaussDB GaussDB(for openGauss) 华为云数据库

直播回顾 | MatrixDB 定义下一代时序架构(内附PPT下载)

YMatrix 超融合数据库

车联网 物联网 时序数据库 MatrixDB 超融合时序数据库

MSE | 阿里巴巴云原生网关三位一体的选择与实践

阿里巴巴中间件

阿里云 微服务 云原生 中间件 网关

【Flutter 专题】113 图解自定义 ACEPieWidget 饼状图 (二)

android 程序员 移动开发

【Flutter 专题】114 图解自定义 ACEProgressPainter 对比进度图

android 程序员 移动开发

薪水被应届生倒挂,四年Java老鸟,28岁的我裸辞了,在闭关三个后拿到阿里Offer

收到请回复

程序员 java面试 Java后端

【9月Android面经分享】惜挂阿里三面,Android最新实习面试经验总结

android 程序员 移动开发

【Android面试】热修复,赶紧收藏备战金三银四

android 程序员 移动开发

【Java转Android】29,2021最新网易Android面试题目

android 程序员 移动开发

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