eks节点的网络策略配置机制解析

news2024/11/23 17:09:53

参考链接

  • 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 agent
    npConn, 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 maps
        ingressRules, 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 data

Usage:
  aws-eks-na-cli ebpf [flags]
  aws-eks-na-cli ebpf [command]

Aliases:
  ebpf, ebpf

Available Commands:
  dump-maps       Dump all ebpf maps related data
  loaded-ebpfdata Dump all ebpf related data
  maps            Dump all ebpf maps related data
  progs           Dump all ebpf program related data

具体的用法涉及到ebpf sdk的组件和api调用,需要进一步学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2224392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一致角色的视频且唇形同步中文配音和免费音效添加

现在AI可以免费生成不带水印、不限时长的视频了,并且视频里的角色可以进行唇形同步配音。最重要的是,我还会分享给大家,怎么生成角色一致的动画场景,怎么使用场景图片生成完整的视频,并且我还会介绍一款,我…

COSCon'24 志愿者招募令:共创开源新生活!

亲爱的开源爱好者们, 第九届中国开源年会(COSCon24)即将在北京中关村国家自主创新示范区会议中心于2024年11月2日至3日隆重举行。今年的主题是“Open Source, Open Life|开源新生活”,旨在探索开源技术如何在各个领域推…

高级 SQL 技巧全面教程:提升你的数据库操作能力

高级 SQL 技巧全面教程:提升你的数据库操作能力 引言 在数据驱动的时代,SQL(结构化查询语言)是与数据库交互的核心工具。虽然基础 SQL 语法足以满足日常需求,但掌握一些高级技巧能够显著提高你的工作效率和数据处理能…

C++基础:三个字符串也能搞大小?

上一篇说了三个整数比较大小,按照顺序输入的,这次我们看看字符串的,顺便把那个简化以下: 题目:这次输入三个字符串。如果用户输入“Stenbeck", “Hemingway”,“Fitzgerald”,输出将是“Fitzgerald,Hemingway&…

分页列表缓存

写这篇文章&#xff0c;我们聊聊分页列表缓存&#xff0c;希望能帮助大家提升缓存技术认知。 1 直接缓存分页列表结果 这是最简单易懂的方案&#xff0c;我们按照不同的分页条件查询出结果后&#xff0c;直接缓存分页结果 。 伪代码如下&#xff1a; public List<Product&…

Linux的makefile与进度条小程序实践

makefile make命令主要功能使用方法常用选项 makefile文件基本结构使用案例变量定义内置变量(即系统定义的确定变量)伪目标模式规则条件语句注释makefile中的常用函数 进度条小程序创建文件编辑.h文件编辑.c文件创建main函数makefile文件执行效果 make命令 在linux中&#xff…

如何用mmclassification训练多标签多分类数据

这里使用的源码版本是 mmclassification-0.25.0 训练数据标签文件格式如下&#xff0c;每行的空格前面是路径&#xff08;图像文件所在的绝对路径&#xff09;&#xff0c;后面是标签名&#xff0c;因为特殊要求这里我的每张图像都记录了三个标签每个标签用“,”分开&#xff0…

WORFBENCH:一个创新的评估基准,目的是全面测试大型语言模型在生成复杂工作流 方面的性能。

2024-10-10,由浙江大学和阿里巴巴集团联合创建的WORFBENCH&#xff0c;一个用于评估大型语言模型&#xff08;LLMs&#xff09;生成工作流能力的基准测试。它包含了一系列的测试和评估协议&#xff0c;用于量化和分析LLMs在处理复杂任务时分解问题和规划执行步骤的能力。WORFBE…

【Super-resolved q-space learning of diffusion MRI】

扩散MRI的超分辨q-空间学习 摘要&#xff1a; 背景&#xff1a;扩散磁共振成像 (dMRI) 提供了一种强大的工具&#xff0c;可以无创地研究活人大脑中的神经结构。然而&#xff0c;它对神经结构的重建性能依赖于 q 空间中扩散梯度的数量。高角度&#xff08;HA&#xff09;dMRI…

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第六十七章 Trusted Firmware-A 移植

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

(二十三)Java反射

1.反射概念 反射允许对成员变量&#xff0c;成员方法和构造方法的信息进行编程访问&#xff0c;通俗理解就是允许从类里面拿东西&#xff0c;用途有提示词等&#xff0c;如下所示都是通过反射实现的 所以&#xff0c;学习反射就是学习从字节码class文件中获取成员信息并且对其…

流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(一)

闲着没事做&#xff0c;记录一下开发项目用过的协议&#xff0c;项目中&#xff0c;大多是是实时显示播放的&#xff0c;通过私有协议&#xff0c;传输到上位机&#xff0c;实时播放&#xff0c;延时小于200ms&#xff0c;仿照这些协议&#xff0c;定义的数据格式。如果用这些协…

C语言实现Go的defer功能

之前笔者写了一篇博文C实现Go的defer功能&#xff0c;介绍了如何在C语言中实现Go的defer功能&#xff0c;那在C语言中是否也可以实现这样的功能呢&#xff1f;本文就将介绍一下如何在C语言中实现Go的defer功能。 我们还是使用C实现Go的defer功能中的示例&#xff1a; void te…

一文彻底理解 JavaScript 解构赋值

一、基本概念 为什么需要解构呢&#xff0c;先来看一个例子&#xff1a; const student {name: ZhangSan,age: 18,scores: {math: 19,english: 85,chinese: 100} };function displayInfo(student) {console.log(name:, student.name);console.log(math:, student.scores.mat…

排序(二)快速排序的多种实现方法

目录 一.快速排序 1.左右指针法 2.挖坑法 3.前后指针法 4.非递归实现 5.快速排序特性总结 二.整体代码 1.Sort.h 2.Sort.c 3.Stack.h 4.Stack.c 5.test.c 一.快速排序 1.左右指针法 我们找到一个key,begin去找比key大的值,end去找比key小的值,找到了就将begin和end…

从头学PHP之运算符

关于运算符的图片均来自网络&#xff0c;主要是自己写太麻烦了&#xff0c;程序是个简化自己工作量的方式&#xff0c;能复制粘贴就不要手写了&#xff08;建议初期还是多写写&#xff0c;加深下记忆&#xff09;在这里我就偷个懒&#xff0c;图片涉及到侵权及时&#xff0c;请…

阻塞队列——Java

一、前言 阻塞队列也是队列的一种&#xff0c;但是带有阻塞性质。但是这种阻塞情况是极端情况&#xff0c;在生产、消费者模型中&#xff0c;当生产者与消费者不协调时&#xff0c;就会出现阻塞情况。 二、特性 线程安全 阻塞特性 若队列为空&#xff0c;当尝试出队列时&am…

深度解析跨境支付之跨境支付与国内支付对比

跨境支付和国内支付的不同点主要体现在5个方面&#xff1a; 1.交易币种不同 这一点其实有两层含义 第一层含义是二者的支付行为的交易币种不同&#xff0c;国内支付基本是人民币但是跨境支付可以是人民币也可以是外币&#xff0c;具体交易币种要取决于收款方要求的交易币种。…

数据结构(8.4_1)——简单选择排序

简单选择排序 每一趟在待排序元素中选取关键字最小的元素加入有序子序列 代码实现 //简单选择排序 void SelectSort(int A[], int n) {for (int i 0; i < n - 1; i) {//一共进行n-1趟int min i;//记录最小元素位置for (int j i 1; j < n; j)//在A[i...n-1中选择最…

RabbitMQ延迟消息插件安装(Docker环境)

背景&#xff1a;当我们需要使用RabbitMQ发送延迟消息的时候&#xff0c;为了简化延迟消息发送的实现&#xff0c;一般都会给RabbitMQ安装延迟插件"rabbitmq_delayed_message_exchange" 如下会说明使用Docker启动的RabbitMQ容器如何安装延迟消息插件。 1. Docker启动…