写点什么

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

评论

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

MatrixOne 助力开启分布式计算格局新征程

MatrixOrigin

分布式数据库 HTAP MatrixOrigin MatrixOne 矩阵起源

Flutter三棵树系列之BuildOwner | 京东云技术团队

京东科技开发者

flutter 移动开发 源码解读 企业号 5 月 PK 榜 BuildOwner

GitHub发布即百万!字节内网超实用 java性能优化手册,star超十万

Java你猿哥

Java ssm jvm调优 Java性能优化

如何科学地利用MTTR优化软件交付流程?

SEAL安全

DevOps MTTR 企业号 5 月 PK 榜

从7天到1天,Kyligence 和亚马逊云科技助力欣和提高数据应用价值

Kyligence

数字化转型 指标平台

一块显存为 12GB 的 GPU 卡能够在CST 时域求解器仿真的最大网格数是多少?

思茂信息

cst cst使用教程 cst操作 cst电磁仿真 cst仿真软件

5月书讯 | 《这就是ChatGPT》来了!

图灵教育

数学 书单 GPT

如何将千亿文件放进一个文件系统,EuroSys'23 CFS 论文背后的故事

百度Geek说

数据库 云计算 百度 企业号 5 月 PK 榜

kafka集群是如何选择leader,你知道吗?

JAVA旭阳

kafka

GitHub上开源24小时获星96K的,从零到实战Java架构师成长手册

Java你猿哥

架构 架构师 高可用架构 高性能架构 高可扩展

一次错误的解码处理导致Netty堆外内存泄漏问题的分析

Java你猿哥

Java Netty ssm RSS 逻辑

2023数博会丨软通智慧发布“一屏统揽”TongView 数字政府慧治平台解决方案

说山水

Kafka集群是如何选择leader,你知道吗?

Java kafka 集群

阿里大神级Elasticsearch学习笔记,还学不会就埋了

Java elasticsearch 分布式搜索引擎 ES

使用 Node.js、Socket.IO 和 GPT-4 构建 AI 聊天机器人

devpoint

node.js websocket GPT-4

解锁人机交互新技术 华为开发者联创日·全栈AI黑客松大赛等你来

说山水

前端开发如何更好的避免样式冲突?级联层(CSS@layer)

vivo互联网技术

CSS 级联 @layer

Health Kit文档大变样,一起尝鲜!

HarmonyOS SDK

HMS Core

5月书讯 | 《这就是ChatGPT》来了!

图灵社区

数学 书单 书单推荐 GPT

大语言模型技术原理

NineData

AIGC ChatGPT AI大语言模型 大语言模型 技术原理

硬核!阿里2023版Spring全家桶进阶笔记流出,堪称Java跳槽神器

Java你猿哥

spring Spring Boot spring security Spring全家桶 Spring Cloud Aliababa

深度理解:Redis Hash(散列表)实现原理

Java你猿哥

redis 开源 ssm hash 散列表

刚入职的后端开发问我SpringBoot如何跨域配置?我表示

Java你猿哥

Java Spring Boot ssm 跨域

500行代码手写docker-实现硬件资源限制cgroups

蓝胖子的编程梦

容器 k8s ,docker Cgroups #k8s

如何避免写重复代码:善用抽象和组合

阿里技术

Java 代码实战

Spring Boot实现第一次启动时自动初始化数据库

Java spring Spring Boot

引领下一代云计算技术的变革:无服务器架构

xfgg

云计算 severless

阿里架构组分布式架构技术使用心得:全在这一份文档里面了

Java你猿哥

架构 分布式 ssm 分布式架构 安全架构

Git入门指南:从新手到高手的完全指南

小万哥

git Linux 程序员 后端 C/C++

4 种 MySQL 同步 ES 方案,yyds!

Java你猿哥

Java MySQL sql elasticsearch Binlog

Solaris Network:BSC上首个链上合成资产解决方案

鳄鱼视界

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