写点什么

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

评论

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

Oracle、MySQL等数据库故障处理优质文章分享 | 10月文章汇总

墨天轮

MySQL 数据库 oracle 性能优化 故障恢复

阿里云E-HPC+i4p大内存实例,加速寻因生物单细胞数据分析效率

阿里云弹性计算

HPC

OpenHarmony移植案例: build lite源码分析之hb命令__entry__.py

华为云开发者联盟

鸿蒙 芯片 华为云 源代码 企业号十月 PK 榜

元宇宙场景技术实践|实现“虚拟人”自由

ZEGO即构

React组件设计模式-纯组件,函数组件,高阶组件

xiaofeng

React

最近面试经常被问到的js手写题

helloworld1024fd

JavaScript

阿里云Imagine Computing创新技术大赛正式开启!

阿里云CloudImagine

阿里云 技术大赛

React的5种高级模式

夏天的味道123

React

美团前端常考手写面试题(边面边更)

helloworld1024fd

JavaScript

React组件复用的技巧

夏天的味道123

React

从华泰证券年报看数字化转型的平台化趋势

王和全

数字化转型 数字化 华泰证券 平台化

react源码中的生命周期和事件系统

flyzz177

React

react源码中的hooks

flyzz177

React

写个JS深拷贝,面试备用

helloworld1024fd

JavaScript

假如面试官要你手写一个promise

helloworld1024fd

JavaScript

React组件复用的发展史

夏天的味道123

React

音视频开发进阶|第六讲:色彩和色彩空间·下篇

ZEGO即构

音视频开发 色彩

CIO们开始将软件供应链升级为安全优先级top

SEAL安全

DevOps 开源软件 软件供应链 SBOM 软件供应链安全

React性能优化的8种方式

xiaofeng

React

react源码中的协调与调度

flyzz177

React

聊聊前端开发中的 Ghost Design 设计思路

汪子熙

前端开发 angular web开发 SAP 11月月更

共筑使能千行百业的数字底座 | HDC 2022松湖对话顺利召开

OpenHarmony开发者

OpenHarmony

动手实践丨使用华为云IoT边缘体验“边云协同”

华为云开发者联盟

云计算 华为云 企业号十月 PK 榜

想会用synchronized锁,先掌握底层核心原理

华为云开发者联盟

开发 华为云 企业号十月 PK 榜

走进 Orca 架构及技术世界

KaiwuDB

数据库·

浅谈:数字资产永续合约交易所开发有什么好处?

W13902449729

合约交易所开发 区块链交易所开发

React核心工作原理

xiaofeng

React

重磅!涛思数据发布TDengine PI连接器

TDengine

数据库 tdengine 时序数据库

一本书,带你走出Spring新手村

博文视点Broadview

深入浅出分布式,阿里大牛手写《分布式核心原理》Github一夜爆火

Java永远的神

分布式 程序人生 分布式计算 分布式系统 分布式存储

一种基于Prompt的通用信息抽取(UIE)框架

阿里技术

深度学习 信息抽取

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