eks节点的网络策略配置机制解析
参考链接
- vpc-cni网络策略最佳实践,https://aws.github.io/aws-eks-best-practices/security/docs/network/#additional-resources
- vpc cni网络策略faq,https://github.com/aws/amazon-vpc-cni-k8s/blob/0703d03dec8afb8f83a7ff0c9d5eb5cc3363026e/docs/network-policy-faq.md
aws-cni插件pod的容器目录如下
aws-vpc-cni-init
首先通过aws-vpc-cni-init容器进行初始化,该容器是个一次性任务,具体的行为如下
- 通过IMDS获取到MAC地址,然后用MAC地址查询到主网卡
- 配置主网卡的参数
- 配置ipv6相关设置
aws-node
而aws-node容器的启动脚本为aws-vpc-cni
,由于当cni二进制文件安装到/opt/cni/bin
并且配置文件就绪后kubelet会认为cni插件就绪,对于vpc-cni来说则包括如下两部分:
- cni二进制文件和配置文件
- aws-k8s-agent守护进程(ipam控制器)
vpc-cni会确保aws-k8s-agent守护进程(ipam控制器)启动后再拷贝cni二进制文件,在aws-vpc-cni的启动脚本中会启动并等待ipamd启动,此时进程阻塞因此aws-node容器会继续保持运行,而ipamd则被当作ds进程在每个节点上运行。
在aws-node容器中始终会通过grpc-health-probe
进行健康和就绪检查
exec [/app/grpc-health-probe -addr=:50051 -connect-timeout=5s -rpc-timeout=5s]
此外ipamd会在61678端口暴露/metrics路径指标,可以通过安装cni-metrics-helper将这部分指标发布到cloudwatch中
# 192.168.2.119为aws-node的pod地址
$ curl 192.168.2.119:61678/metrics
通过ipamd暴露的路径还可以获取当前分配ip的情况
// get enis info
# curl http://localhost:61679/v1/enis | python -m json.tool
// get IP assignment info
# curl http://localhost:61679/v1/pods | python -m json.tool
其他的introspect路径包括
func (c *IPAMContext) setupIntrospectionServer() *http.Server {serverFunctions := map[string]func(w http.ResponseWriter, r *http.Request){"/v1/enis": eniV1RequestHandler(c),"/v1/eni-configs": eniConfigRequestHandler(c),"/v1/networkutils-env-settings": networkEnvV1RequestHandler(),"/v1/ipamd-env-settings": ipamdEnvV1RequestHandler(),}
routed-eni-cni-plugin
真正被kubelet调用进行pod网络环境初始化时,执行的cni二进制文件为routed-eni-cni-plugin
,会分别和ipamd和networkpolicy-agent通过rpc通信方式交互,对应的日志为/var/log/aws-routed-eni/plugin.log
。
ipamdAddress = "127.0.0.1:50051"
npAgentAddress = "127.0.0.1:50052"
cni二进制文件主要通过两个方法和ipamd交互,https://github.com/aws/amazon-vpc-cni-k8s/blob/0703d03dec8afb8f83a7ff0c9d5eb5cc3363026e/docs/cni-proposal.md
// amazon-vpc-cni-k8s/amazon-vpc-cni-k8s-master/cmd/routed-eni-cni-plugin/cni.go
type CNIBackendClient interface {AddNetwork(ctx context.Context, in *AddNetworkRequest, opts ...grpc.CallOption) (*AddNetworkReply, error)DelNetwork(ctx context.Context, in *DelNetworkRequest, opts ...grpc.CallOption) (*DelNetworkReply, error)
}// 例如,如下分配ip地址的主要逻辑
conn, err := grpcClient.Dial(ipamdAddress, grpc.WithTransportCredentials(insecure.NewCredentials()))
c := rpcClient.NewCNIBackendClient(conn)
r, err := c.AddNetwork(context.Background(),...)
如果是严格网络策略模式,则cni二进制文件会和np-node-agent通信,为新的pod强制添加网络策略
if utils.IsStrictMode(r.NetworkPolicyMode) {// Set up a connection to the network policy agentnpConn, err := grpcClient.Dial(npAgentAddress, grpc.WithTransportCredentials(insecure.NewCredentials()))npc := rpcClient.NewNPBackendClient(npConn)npr, err := npc.EnforceNpToPod(context.Background(),
np-node-agent
网络策略涉及到的组件包括如下
-
Network Policy Controller控制器会自动安装在 EKS Control Plane 上,监视 NetworkPolicy 对象并发送指令到 Node Agent
When you create a new Amazon EKS cluster, the network policy controller is automatically installed on the EKS control plane. It actively monitors the creation of network policies within your cluster and reconciles policy endpoints. Subsequently, the controller instructs the node agent to create or update eBPF programs on the node by publishing pod information through the policy endpoints
-
Network Policy Node Agent,通过创建 eBPF 程序在节点上实现网络策略
-
AWS eBPF SDK for Go,提供了一个接口,用于与节点上的 eBPF 程序进行交互
-
VPC Resource Controller,管理Kubernetes Pods的分支和中继网络接口
当需要涉及到网络策略相关操作时(例如创建netpl资源),np-controller会解析配置的网络策略,并通过自定义 CRD (PolicyEndpoints
在np-controller安装的时候自动安装) 资源发布解析的endpoints。np-node-agent获取PolicyEndpoint资源,并通过附加到pod主Veth 接口的 eBPF 探针来执行策略。对应的日志为/var/log/aws-routed-eninetwork-policy-agent.log
np-node-agent会将主机的/sys/fs/bpf文件系统挂载在卷bpf-pin-path
下
/sys/fs/bpf from bpf-pin-path (rw)
np-node-agent默认的启动参数为
Args: --enable-ipv6=false --enable-network-policy=false --enable-cloudwatch-logs=false --enable-policy-event-logs=false --log-file=/var/log/aws-routed-eni/network-policy-agent.log--metrics-bind-addr=:8162 --health-probe-bind-addr=:8163 --conntrack-cache-cleanup-period=300
np-node-agent启动日志中的主要逻辑如下
-
等待controller就绪
-
设置ConntrackTTL清理时间cleanupPeriod为300
-
校验并安装bpf程序到/opt/cni/bin/
$ ls -al /opt/cni/bin| grep bpf -rw-r--r-- 1 root root 27136 Oct 23 10:51 tc.v4egress.bpf.o -rw-r--r-- 1 root root 27360 Oct 23 10:51 tc.v4ingress.bpf.o -rw-r--r-- 1 root root 3384 Oct 23 10:51 v4events.bpf.o
-
安装aws-eks-na-cli命令到/opt/cni/bin/
-
设置全局默认maps和加载probe
-
初始化Conntrack client
-
开启rpc server监听127.0.0.1:50052
-
启动metrics server
如果收到了来自np-controller的指令,则np-node-agent会开始为pod创建网络策略,
-
如果没开np直接返回success
// EnforceNpToPod processes CNI Enforce NP network request func (s *server) EnforceNpToPod(ctx context.Context, in *rpc.EnforceNpRequest) (*rpc.EnforceNpReply, error) {if s.policyReconciler.GeteBPFClient() == nil {s.log.Info("Network policy is disabled, returning success")
-
同一个节点上的pod副本会使用同样的eBPF firewall maps
if s.policyReconciler.ArePoliciesAvailableInLocalCache(podIdentifier) && isMapUpdateRequired {//Derive Ingress and Egress Firewall Rules and Update the relevant eBPF mapsingressRules, egressRules, _ :=s.policyReconciler.DeriveFireWallRulesPerPodIdentifier(podIdentifier, in.K8S_POD_NAMESPACE)err = s.policyReconciler.GeteBPFClient().UpdateEbpfMaps(podIdentifier, ingressRules, egressRules)
由于vpc-cni插件会在节点上安装eBPF SDK集合,因此可以使用 eBPF SDK 工具(aws-eks-na-cli)来识别网络策略的问题
aws-eks-na-cli
命令只有在开启--enable-network-policy=true
后才会安装到节点
$ sudo /opt/cni/bin/aws-eks-na-cli ebpf -h
Dump all ebpf related dataUsage:aws-eks-na-cli ebpf [flags]aws-eks-na-cli ebpf [command]Aliases:ebpf, ebpfAvailable Commands:dump-maps Dump all ebpf maps related dataloaded-ebpfdata Dump all ebpf related datamaps Dump all ebpf maps related dataprogs Dump all ebpf program related data
具体的用法涉及到ebpf sdk的组件和api调用,需要进一步学习
相关文章:

eks节点的网络策略配置机制解析
参考链接 vpc-cni网络策略最佳实践,https://aws.github.io/aws-eks-best-practices/security/docs/network/#additional-resourcesvpc cni网络策略faq,https://github.com/aws/amazon-vpc-cni-k8s/blob/0703d03dec8afb8f83a7ff0c9d5eb5cc3363026e/docs/…...
【C】用c写贪吃蛇
1.输入正确的账号密码及其用户名,登录成功进入贪吃蛇游戏界面, 2.随机生成蛇头★、食物▲的位置(x,y),并使用□打印地图 3.使用w s a d按键,完成蛇头的上下左右移动 4.蛇头碰撞到食物后,吃下食物变成蛇身的一部分●…...

qt QLineEdit详解
一、概述 QLineEdit 是 Qt 框架中用于创建单行文本输入框的类。它非常适合用于接收用户输入,例如用户名、密码或其他简单的文本信息。它提供了许多有用的编辑功能,支持多种输入模式和文本限制,并支持撤销、重做、剪切、粘贴以及拖放等功能。…...
DevEco Studio的使用 习题答案<HarmonyOS第一课>
一、判断题 1. 如果代码中涉及到一些网络、数据库、传感器等功能的开发,均可使用预览器进行预览。 正确(True)错误(False) 错误(False)回答正确 2. module.json5文件中的deviceTypes字段中,配置了phone,tablet,2in1等多种设备类型,才能进行多设备预览。 正确(True)…...

鸿蒙网络编程系列36-固定包头可变包体解决TCP粘包问题
1. TCP数据传输粘包简介 在本系列的第6篇文章《鸿蒙网络编程系列6-TCP数据粘包表现及原因分析》中,我们演示了TCP数据粘包的表现,如图所示: 随后解释了粘包背后的可能原因,并给出了解决TCP传输粘包问题的两种思路,第一…...

【华为路由】OSPF多区域配置
网络拓扑 设备接口地址 设备 端口 IP地址 RTA Loopback 0 1.1.1.1/32 G0/0/0 10.1.1.1/24 RTB Loopback 0 2.2.2.2/32 G0/0/0 10.1.1.2/24 G0/0/1 10.1.2.1/24 RTC Loopback 0 3.3.3.3/32 G0/0/0 10.1.2.2/24 G0/0/1 10.1.3.1/24 RTD Loopback 0 4.4.4…...

【C++初阶】一文讲通C++内存管理
文章目录 1. C/C内存分布2. C语言中动态内存管理方式3. C内存管理方式3. 1 new/delete操作内置类型3. 2 new和delete操作自定义类型 4. new与delete的原理4. 1 operator new与operator delete函数4. 2 内置类型4. 3 自定义类型 5. 定位new表达式(placement-new)6. malloc/free和…...
Vue学习笔记(九、简易计算器)
在这个案例中,我们使用v-model分别双向绑定了n1、n2操作数,op操作选项和result计算结果,同时用绑定了等号按钮事件。 由于是双向绑定,当input和select通过外部输入内容时,vm内部的数值也会改变,所以calcula…...

Maven 不同环境灵活构建
需求: 使用 Maven根据不同的构建环境(如开发、测试、生产)来定义不同的配置,实现灵活的构建管理。 需要Demo项目的可以参考:我的demo项目 一、项目分层 一般的初创项目不会有特别多的配置文件,所以使用 spring.profile…...

第三十篇:TCP连接断开过程,从底层说明白,TCP系列五
上一篇《第二十九篇:图解TCP三次握手,看过不会忘,从底层说清楚,TCP系列四》说了TCP的三次握手,接下来我将讲解TCP四次挥手。 既然有连接就有断开,谈到这里,有的同学可能会想,不就是…...
代码随想录算法训练营第七天| 哈希表理论基础 454.四数相加II 383.赎金信 15.三数之和 18.四数之和
454. 四数相加 II 题目 给定四个包含整数的数组 A, B, C, D,计算有多少个元组 (i, j, k, l) 使得 A[i] B[j] C[k] D[l] 0。 解题思路 先计算数组 A 和 B 的所有组合和,并存入哈希表 map 中,键为组合和,值为该和出现的次数…...
搜维尔科技:Manus新品发布Metagloves Pro专业版,专为高精度需求的客户打造,尤其是人形机器人产业与人机工效研究使用
manus新品发布Metagloves Pro专业版,专为高精度需求的客户打造,尤其是人形机器人产业与人机工效研究使用 搜维尔科技:manus新品发布Metagloves Pro专业版,专为高精度需求的客户打造,尤其是人形机器人产业与人机工效研究…...

Spring Boot实现的动态化酒店住宿管理系统
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理酒店客房管理系统的相关信息成为必然。开发…...

数字IC后端实现Innovus |给各种IP子模块添加port buffer和antenna diode万能脚本
我们之前分享过在hierarchical flow后端实现中为了确保顶层flatten时timing signoff和physical signoff看到的情况和模块级看到的情况一致,我们会在模块io port添加io port buffer(主要是timing,antenna一致性)。实际上在芯片级我…...
反向代理服务器---NGINX
1.NGINX NGINX(发音为“engine-x”)是一个开源的高性能HTTP服务器和反向代理服务器。它被广泛用于互联网应用程序的加速、负载均衡和高可用性的配置。NGINX具有低内存消耗、高并发能力和卓越的性能,能够处理大量并发连接和高流量的网络流量。…...
unity3d————场景管理类SceneManager
常用API SceneManager.LoadScene(string sceneName) 加载名为 sceneName 的场景。SceneManager.LoadScene(int sceneBuildIndex) 根据场景在Build设置中的索引加载场景。SceneManager.GetActiveScene() 获取当前活动的场景。SceneManager.GetSceneByName(string name) 根据名称…...

鹅厂面试官:Transformer 为何需要位置编码?
最近这一两周看到不少互联网公司都已经开始秋招发放Offer。 不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些球…...
MySQL数据库学习指南
一、数据库的库操作 1、创建数据库 2、删除数据库 3、查看数据库 4、选择数据库 5、修改数据库 6、数据库备份与恢复 7、数据库的权限管理 二、数据库的表操作 1、创建表 2、删除表 3、修改表 4、查看表的结构 5、查看表的数据 6、创建索引 7、删除索引 8、约束…...
算法刷题-小猫爬山
本题来源165. 小猫爬山 - AcWing题库 翰翰和达达饲养了 NN 只小猫,这天,小猫们要去爬山。 经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。 翰翰和达达只好花…...

Maven项目管理工具-初始+环境配置
1. Maven的概念 1.1. 什么是Maven Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。 理想的项目构建:高度自动化,跨平台,可重用的组件,标准化的流程 maven能够自动下载依…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...

宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...