当前位置: 首页 > news >正文

aws eks 集群访问ecr仓库拉取镜像的认证逻辑

本文主要讨论三个问题

  • ecr帮助程序在docker上如何配置
  • eks集群访问ecr仓库的逻辑
  • kubelet授权ecr的源码分析

ecr帮助程序

在docker环境下,可以通过在$HOME/.docker/config.json中指定凭证管理程序

docker login

aws同样提供了证书助手,避免手动执行ecr认证命令

amazon-ecr-credential-helpe

帮助程序本身是一个二进制命令,只需要在PATH中找到就可以

eks集群访问ecr仓库

在1.24集群后默认运行时成为containerd,在我们启动集群后,会发现对于一些私有的ecr仓库,即使仓库本身没有配置放行策略,节点仍旧能够从此仓库拉取镜像。

例如以下镜像托管在aws官方的ecr仓库中。然而在节点的$HOME/.docker/config.json文件中并没有发现帮助程序的配置

918309763551.dkr.ecr.cn-north-1.amazonaws.com.cn/amazon-k8s-cni:v1.11.4-eksbuild.1

原来,从 Kubernetes v1.20 开始,kubelet 可以使用 exec 插件动态获得针对某容器镜像库的凭据。kubelet 需要设置以下两个标志:

  • --image-credential-provider-config —— 凭据提供程序插件配置文件的路径。
  • --image-credential-provider-bin-dir —— 凭据提供程序插件二进制可执行文件所在目录的路径。

kubelet启动节点时kubelet日志中有以下参数配置

I0218 05:30:51.783345    5014 flags.go:64] FLAG: --image-credential-provider-bin-dir="/etc/eks/ecr-credential-provider"
I0218 05:30:51.783350    5014 flags.go:64] FLAG: --image-credential-provider-config="/etc/eks/ecr-credential-provider/ecr-credential-provider-config"

去除访问ecr权限后报错如下

Warning  Failed 11s  kubelet    Failed to pull image "xxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn/amazonlinux:latest": rpc error: code = Unknown desc = failed to pull and unpack image "xxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn/amazonlinux:latest": failed to resolve reference "xxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn/amazonlinux:latest": pulling from host xxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn failed with status code [manifests latst[]: 401 Unauthorized       
Warning  Failed 11s  kubelet    Error: ErrImagePull

节点上的kubelet日志显示

E0218 05:50:49.260465    5014 aws_credentials.go:184] error getting credentials from ECR for xxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn AccessDeniedException: User: arn:aws-cn:sts::xxxxxx:assumed-role/eksctl-test124-nodegroup-test124-NodeInstanceRole-1NVLMK3YZWYY3/i-0a598be817afd520b is not authorized to perform: ecr:GetAuthorizationToken on resource: * because no identity-based policy allows the ecr:GetAuthorizationToken action

对应源码如下,可见kubelet通过插件向ecr请求凭证

cfg, err := p.getFromECR(parsed)
if err != nil {klog.Errorf("error getting credentials from ECR for %s %v", parsed.registry, err)return credentialprovider.DockerConfig{}
}

kubelet的凭证获取程序的配置文件,满足以下条件时匹配

  • 两者都包含相同数量的域部分并且每个部分都匹配。
  • 匹配图片的 URL 路径必须是目标图片 URL 路径的前缀。
  • 如果 matchImages 包含端口,则该端口也必须在镜像中匹配。

配置 kubelet 镜像凭据提供程序

$ cat /etc/eks/ecr-credential-provider/ecr-credential-provider-config
apiVersion: kubelet.config.k8s.io/v1beta1
kind: CredentialProviderConfig
providers:- name: ecr-credential-providermatchImages:- "*.dkr.ecr.*.amazonaws.com"- "*.dkr.ecr.*.amazonaws.cn"- "*.dkr.ecr-fips.*.amazonaws.com"- "*.dkr.ecr.us-iso-east-1.c2s.ic.gov"- "*.dkr.ecr.us-isob-east-1.sc2s.sgov.gov"defaultCacheDuration: "12h"apiVersion: credentialprovider.kubelet.k8s.io/v1beta1args:- get-credentials

分析源码

https://github.com/kubernetes/kubernetes/blob/master/pkg/credentialprovider/aws/aws_credentials.go

https://github1s.com/kubernetes/kubernetes/blob/master/pkg/credentialprovider/aws/aws_credentials.go#L187

这里额外提一下github1s项目,在vscode终端中浏览github仓库,提供高亮和折叠等功能,这样就不用下载源码了

首先初始化凭证提供程序,创建一个ecr token的缓存

// init registers a credential provider for each registryURLTemplate and creates
// an ECR token getter factory with a new cache to store token getters
func init() {credentialprovider.RegisterCredentialProvider("amazon-ecr",newECRProvider(&ecrTokenGetterFactory{cache: make(map[string]tokenGetter)},ec2ValidationImpl,))
}

以上init函数初始化了一个包含ecrProvider的对象,包括缓存,token工程函数,一个判断ec2环境的函数

type ecrProvider struct {cache         cache.StoregetterFactory tokenGetterFactoryisEC2         ec2ValidationFunc
}

核心逻辑是一个名为Provider的方法

func (p *ecrProvider) Provide(image string) credentialprovider.DockerConfig {parsed, err := parseRepoURL(image)if err != nil {return credentialprovider.DockerConfig{}}// 避免由于非aws平台造成的aws sdk执行延迟,判断是否为ec2环境// 具体方法是ecrProvider中的isEC2函数,依据为 1. 获取实例的uuid 2. 获取凭证session// 只会执行一次once.Do(func() {isEC2 = p.isEC2()if isEC2 && credentialprovider.AreLegacyCloudCredentialProvidersDisabled() {klog.V(4).Infof("AWS credential provider is now disabled. Please refer to sig-cloud-provider for guidance on external credential provider integration for AWS")}})// 从cache中查找ecr tokenif cfg, exists := p.getFromCache(parsed); exists {klog.V(3).Infof("Got ECR credentials from cache for %s", parsed.registry)return cfg}klog.V(3).Info("unable to get ECR credentials from cache, checking ECR API")// 向ecr发起获取token请求cfg, err := p.getFromECR(parsed)if err != nil {klog.Errorf("error getting credentials from ECR for %s %v", parsed.registry, err)return credentialprovider.DockerConfig{}}

对于新节点需要向ecr发起请求获取token

func (p *ecrProvider) getFromECR(parsed *parsedURL) (credentialprovider.DockerConfig, error) {
cfg := credentialprovider.DockerConfig{}// 解析区域getter, err := p.getterFactory.GetTokenGetterForRegion(parsed.region)if err != nil {return cfg, err}// 构造参数并发送请求到ecr获取tokenparams := &ecr.GetAuthorizationTokenInput{RegistryIds: []*string{aws.String(parsed.registryID)}}output, err := getter.GetAuthorizationToken(params)...data := output.AuthorizationData[0]if data.AuthorizationToken == nil {return cfg, errors.New("authorization token in response is nil")}// 加入缓存entry, err := makeCacheEntry(data, parsed.registry)cfg[entry.registry] = entry.credentialsreturn cfg, nil
}

前面kubelet中的错误就是由于getFromECR执行失败,导致kubelet输出error getting credentials from ECR

相关文章:

aws eks 集群访问ecr仓库拉取镜像的认证逻辑

本文主要讨论三个问题 ecr帮助程序在docker上如何配置eks集群访问ecr仓库的逻辑kubelet授权ecr的源码分析 ecr帮助程序 在docker环境下,可以通过在$HOME/.docker/config.json中指定凭证管理程序 docker login aws同样提供了证书助手,避免手动执行ecr认…...

Linux Socket Buffer介绍

一. 前言 Linux内核网络子系统的实现之所以灵活高效,主要是在于管理网络数据包的缓冲器-socket buffer设计得高效合理。在Linux网络子系统中,socket buffer是一个关键的数据结构,它代表一个数据包在内核中处理的整个生命周期。 二. Socket Bu…...

ACL与NAT

ACL---访问控制列表,是一种策略控制工具 功能:1.定义感兴趣流量(数据层面 ) 2.定义感兴趣路由(控制层面) ACL 条目表项组成: 编号规则:步数或者跳数默认值为5,…...

使用gdb来debug程序并查找Segmentation fault原因

GDB 调试前言GDB基础用法1.启动及退出调试2.设置参数3.执行程序4.流程控制5.设置断点6.输出信息7.查看栈帧8.info命令9.显示源码GDB调试coredump文件关注公众号【程序员DeRozan】,回复【1207】,免费获取计算机经典资料及现金红包 前言 在开发程序时&…...

vbs简单语法及简单案例

文章目录一、简单语法1、变量2、输入3、输出4、选择语句5、循环二、用记事本编译中文乱码问题三、制作一个简单vbs脚本表白一、简单语法 1、变量 语法: dim 变量名例: dim a,b a1 b2 msgbox ab运行: 2、输入 语法:InputBox(…...

学板绘课程学费一般多少钱

学板绘课程学费一般多少钱?培训机构的费用和师资、模式有关,价格贵不贵要结合相同类型的机构多多对比。因为好些平台做了很多的宣传广告,运营成本很高, 终羊毛出在羊身上,这样的机构知名度很高,但是性价比不…...

48.在ROS中实现local planner(1)- 实现一个可以用的模板

有了之前45.在ROS中实现global planner(1)- 实现一个可以用模板的global planner的经验, 现在再去创建一个local planner的包就容易多了 1. 创建包 创建 cd ~/pibot_ros/ros_ws/src # 这里可以使用自己的ros workspace catkin_create_pkg sample_loc…...

jenkins基础部署

一、jenkins是什么1.Jenkins的前身是Hudson,采用JAVA编写的持续集成开源工具。Hudson由Sun公司在2004年启动,第一个版本于2005年在java.net发布。2007年开始Hudson逐渐取代CruiseControl和其他的开源构建工具的江湖地位。在2008年的JavaOne大会上在开发者…...

Unity3D -知识点(1)

1.场景视图鼠标滚轮:场景放大缩小鼠标右键:场景左右平移场景编辑器中,能看到什么?网格,每一格大小为1unit,建模不同,规定不同,(对应屏幕上100个像素)世界坐标系y轴向上为正x轴向右为…...

【学习笔记】NOIP暴零赛3

博弈(game) 观察到博弈过程中胜负态不会发生改变&#xff0c;那么求出从每个棋子出发能走的最长链&#xff0c;然后背包即可。 复杂度O(nm)O(nm)O(nm)。 #include<bits/stdc.h> #define ll long long #define pb push_back using namespace std; const int mod9982443…...

Java JSR规范列表

Java JSR规范列表目录概述需求&#xff1a;设计思路实现思路分析1.JSR2.JSR方法3.web service4.Webservice:5.数据处理器拓展实现参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,m…...

Java必备小知识点1

Java程序类型: Applications和AppletApplications:是指在计算机操作系统中运行的程序。是完整的程序&#xff0c;能独立运行。被编译后&#xff0c;用普通的Java解释器就可以使其边解释边执行。必定含有一个main方法&#xff0c;程序执行时&#xff0c;首先寻找main方法&#x…...

JavaScript作用域、闭包

文章目录作用域、作用域链作用域作用域链循环中的作用域自由变量、闭包自由变量闭包的定义、表现、应用如何确定在闭包中获取正确的变量总结作用域、作用域链 作用域 编程语言中存储、访问、修改变量当中的值是一项基本能力、存储变量、访问变量必须按照一定的规则&#xff0…...

JavaScript Date(日期) 对象

JavaScript Date 对象是 JavaScript 中用于处理日期和时间的内置对象。它可以用于获取当前时间、设置日期和时间、计算日期和时间之间的差异、以及将日期和时间格式化为各种字符串格式。在本文中&#xff0c;我们将详细介绍 JavaScript Date 对象的作用和在实际工作中的用途。 …...

rust过程宏 proc-macro-workshop解题-4-sorted

名字版本号rust1.69.0OSubuntu 22.04这一大关卡介绍的是属性式过程宏。 第一关:01-parse-enum 还是简单的看我们是否已经实现了一个属性式过程宏的空架子,如果有这个空架子,就直接通过了。 use proc_macro::TokenStream; use proc_macro2; use syn;#[proc_macro_attribut…...

数据结构与算法—队列

队列 队列介绍 有序列表&#xff0c;可以用数组或者链表实现。遵循先进先出原则。 数组实现队列 public class ArrayQueue {public static void main(String[] args) {ArrayQueue queue new ArrayQueue(3);// 接收用户输入char key ;Scanner sc new Scanner(System.in);…...

AcWing3416.时间显示——学习笔记

目录 题目 代码 AC结果 思路 关键步骤 题目 3416. 时间显示 - AcWing题库https://www.acwing.com/problem/content/description/3419/ 代码 import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input new Scanner(System.in…...

贴吧手机端防删图GIF动态图制作解析

贴吧存活 思路技术运气 1&#xff1a;防删图不是存活的绝对因素&#xff0c;除了防删图&#xff0c;还有账号&#xff0c;ip&#xff0c;内容&#xff0c;吧的问题 2&#xff1a;一个图不是每个吧都可以发 3&#xff1a;一个贴不被删不仅仅看图片 4&#xff1a;有时候运气也很…...

iOS接入Google登录

1.在Google Cloud后台配置客户端ID 首先要在 Google Cloud 中创建一个项目。新创建的Project需要先配置同意屏幕。一共有4步骤需要配置。 1.OAuth 同意屏幕 User Type选择"外部"进行创建。填写必必要的信息&#xff0c;应用名称、用户支持电子邮件地址、开发者电子邮…...

【C语言】大小端字节序问题

一、大小端字节序问题 大小端是由CPU决定的&#xff0c;大小端可以理解为字节顺序&#xff0c;所以大小端全称叫大端字节序、小端字节序。其实大端、小端这两个词是从《格列佛游记》里出来的。《格列佛游记》有一段讲的是吃鸡蛋是从大的那头敲开还是小的那头敲开的问题&#xf…...

【笔试真题】- 阿里系列-2026.03.25-算法岗

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围在线刷题 bishipass.com 阿里系列-2026.03.25-算法岗 1. LYA 的同余构造 问题描述 说明:阿里系列近期多条业务线笔试题基本共用同一套公开机试,淘天、阿里云等方向都可参考本场。 …...

Windows右键菜单管理效率提升指南:用ContextMenuManager打造个性化定制体验

Windows右键菜单管理效率提升指南&#xff1a;用ContextMenuManager打造个性化定制体验 【免费下载链接】ContextMenuManager &#x1f5b1;️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾遇到这样的场景&…...

java毕业设计基于springboot铜仁一中学生成绩管理系统

前言 铜仁一中学生成绩管理系统是基于Java和Spring Boot框架开发的&#xff0c;目的是高效管理学生的成绩信息&#xff0c;为学校教学管理提供便利。通过该系统&#xff0c;教师可以方便地录入学生的各科考试成绩&#xff0c;学生和教师能够根据不同条件查询成绩&#xff0c;系…...

基于动态三维环境下的Q-Learning算法无人机自主避障路径规划研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Llama-3.2V-11B-cot保姆级教程:Streamlit界面按钮/状态/动效设计逻辑

Llama-3.2V-11B-cot保姆级教程&#xff1a;Streamlit界面按钮/状态/动效设计逻辑 1. 工具概览与核心价值 Llama-3.2V-11B-cot是基于Meta多模态大模型开发的高性能视觉推理工具&#xff0c;专为双卡4090环境优化。这个工具最大的特点是让复杂的多模态模型变得简单易用&#xf…...

OpenClaw对接ollama模型:GLM-4.7-Flash接口配置详解

OpenClaw对接ollama模型&#xff1a;GLM-4.7-Flash接口配置详解 1. 为什么选择本地ollama部署GLM-4.7-Flash 去年我在尝试构建个人自动化工作流时&#xff0c;发现公有云API调用不仅费用高昂&#xff0c;还存在隐私顾虑。直到发现ollama这个轻量级模型运行框架&#xff0c;配…...

右键菜单太乱?ContextMenuManager让Windows操作效率提升300%

右键菜单太乱&#xff1f;ContextMenuManager让Windows操作效率提升300% 【免费下载链接】ContextMenuManager &#x1f5b1;️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager ContextMenuManager是一款纯粹的Windows…...

RTX4090D优化版Qwen3-32B+OpenClaw:3小时搞定AI办公自动化

RTX4090D优化版Qwen3-32BOpenClaw&#xff1a;3小时搞定AI办公自动化 1. 为什么选择本地部署方案 去年冬天&#xff0c;当我第17次被飞书机器人返回的"API配额不足"提示打断工作流时&#xff0c;终于下定决心寻找替代方案。作为一个小型技术团队的负责人&#xff0…...

巨有科技:景区二消低迷?智慧旅游重构盈利模式

门票降价、客流增长但营收不涨&#xff0c;是当下多数景区面临的经营困境。过度依赖门票经济&#xff0c;二次消费&#xff08;二消&#xff09;占比低、业态单一&#xff0c;景区盈利空间不断被压缩。2026年文旅行业告别粗放增长&#xff0c;景区盈利重心向二次消费转移&#…...

Ventoy进阶玩法:给你的万能启动盘加上‘软件商店’和自动菜单(附配置脚本)

Ventoy终极定制指南&#xff1a;打造智能启动盘的进阶技巧 每次面对一堆零散的ISO文件时&#xff0c;你是否也幻想过能有一个像手机应用商店那样井井有条的启动盘&#xff1f;Ventoy作为开源启动盘解决方案&#xff0c;其潜力远不止于"扔进去就能用"的基础功能。本文…...