`
大涛学长
  • 浏览: 121872 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

K8s 从懵圈到熟练 – 镜像拉取这件小事

阅读更多
导读:相比 K8s 集群的其他功能,私有镜像的自动拉取,看起来可能是比较简单的。而镜像拉取失败,大多数情况下都和权限有关。所以,在处理相关问题的时候,我们往往会轻松的说:这问题很简单,肯定是权限问题。但实际的情况是,我们经常为一个问题,花了多个人的时间却找不到原因。这主要还是我们对镜像拉取,特别是私有镜像自动拉取的原理理解不深。这篇文章,作者将带领大家讨论下相关原理。

顺序上来说,私有镜像自动拉取会首先通过阿里云 Acr credential helper 组件,再经过 K8s 集群的 API Server 和 kubelet 组件,最后到 docker 容器运行时。但是我的叙述,会从后往前,从最基本的 docker 镜像拉取说起。


镜像拉取这件小事

为了讨论方便,我们来设想一个场景。很多人会使用网盘来存放一些文件,像照片,文档之类。当我们存取文件的时候,我们需要给网盘提供账户密码,这样网盘服务就能验证我们的身份。这时,我们是文件资源的所有者,而网盘则扮演着资源服务器的角色。账户密码作为认证方式,保证只有我们自己可以存取自己的文件。







这个场景足够简单,但很快我们就遇到新需求:我们需要使用一个在线制作相册的应用。按正常的使用流程,我们需要把网盘的照片下载到本地,然后再把照片上传到电子相册。这个过程是比较很繁琐的。我们能想到的优化方法是,让相册应用,直接访问网盘来获取我们的照片,而这需要我们把用户名和密码授权给相册应用使用。

这样的授权方式,优点显而易见,但缺点也是很明显的:我们把网盘的用户名密码给了相册服务,相册服务就拥有了读写网盘的能力,从数据安全角度,这个是很可怕的。其实这是很多应用都会遇到的一个一般性场景。私有镜像拉取其实也是这个场景。这里的镜像仓库,就跟网盘一样,是资源服务器,而容器集群则是三方服务,它需要访问镜像仓库获取镜像。








理解 OAuth 2.0 协议

OAuth 协议是为了解决上述问题而设计的一种标准方案,我们的讨论针对 2.0 版本。相比把账户密码直接给三方应用,此协议采用了一种间接的方式来达到同样的目的。如下图,这个协议包括六个步骤,分别是三方应用获取用户授权,三方应用获取临时 Token 以及三方应用存取资源。







这六步理解起来不容易,主要是因为安全协议的设计,需要考虑协议的易证明性,所以我们换一种方式来解释这个协议。简单来说,这个协议其实就做了两件事情:

在用户授权的情况下,三方应用获取 token 所表示的临时访问权限;

然后三方应用使用这个 token 去获取资源。

如果用网盘的例子来说明的话,那就是用户授权网盘服务给相册应用创建临时 token,然后相册应用使用这个 token 去网盘服务获取用户的照片。实际上 OAuth 2.0 各个变种的核心差别,在于第一件事情,就是用户授权资源服务器的方式。







最简单的一种,适用于三方应用本身就拥有被访问资源控制权限的情况。这种情况下,三方应用只需要用自己的账户密码登录资源服务器并申请临时 token 即可;

当用户对三方应用足够信任的情况下,用户直接把账户密码给三方应用,三方应用使用账户密码向资源服务器申请临时 token;

用户通过资源服务器提供的接口,登录资源服务器并授权资源服务器给三方应用发放 token;

完整实现 OAuth 2.0 协议,也是最安全的。三方应用首先获取以验证码表示的用户授权,然后用此验证码从资源服务器换取临时 token,最后使用 token 存取资源。

从上面的描述我们可以看到,资源服务器实际上扮演了鉴权和资源管理两种角色,这两者分开实现的话,协议流程会变成下图这样。








Docker 扮演的角色


大图

镜像仓库 Registry 的实现,目前使用“把账户密码给三方应用”的方式。即假设用户对 Docker 足够信任,用户直接将账户密码交给 Docker,然后 Docker 使用账户密码跟鉴权服务器申请临时 token。








理解 docker login

首先,我们在拉取私有镜像之前,要使用 docker login 命令来登录镜像仓库。这里的登录其实并没有和镜像仓库建立什么会话之类的关系。登录主要就做了三件事情:

第一件事情是跟用户要账户密码。

如下图,当执行登录命令,这个命会提示输入账户密码,这件事情对应的是大图的第一步。







第二件事情,docker 访问镜像仓库的 https 地址,并通过挑战 v2 接口来确认,接口是否会返回 Docker-Distribution-Api-Version 头字段。

这件事情在协议图中没有对应的步骤。它的作用跟 ping 差不多,只是确认下 v2 镜像仓库是否在线,以及版本是否匹配。







第三件事情,docker 使用用户提供的账户密码,访问 Www-Authenticate 头字段返回的鉴权服务器的地址 Bearer realm。

如果这个访问成功,则鉴权服务器会返回 jwt 格式的 token 给 docker,然后 docker 会把账户密码编码并保存在用户目录的 .docker/docker.json 文件里。







下图是我登录仓库之后的 docker.json 文件。这个文件作为 docker 登录仓库的唯一证据,在后续镜像仓库操作中,会被不断的读取并使用。其中关键信息 auth 就是账户密码的 base64 编码。








拉取镜像是怎么回事

镜像一般会包括两部分内容,一个是 manifests 文件,这个文件定义了镜像的元数据,另一个是镜像层,是实际的镜像分层文件。镜像拉取基本上是围绕这两部分内容展开。因为我们这篇文章的重点是权限问题,所以我们这里只以 manifests 文件拉取为例。

拉取 manifests 文件,基本上也会做三件事情:

首先,docker 直接访问镜像manifests的地址,以便获取 Www-Authenticate 头字段。这个字段包括鉴权服务器的地址 Bearer realm,镜像服务地址 service,以及定义了镜像和操作的 scope。







接着,docker 访问上边拿到的 Bearer realm 地址来鉴权,以及在鉴权之后获取一个临时的 token。这对应协议大图使用账户密码获取临时 token 这一步,使用的账户密码直接读取自 docker.json 文件。







最后,使用上边的 token,以 Authorization 头字段的方式,来下载 manifests 文件。这对应的是协议大图下载镜像这一步。当然因为镜像还有分层文件,所以实际 docker 还会用这个临时 token 多次下载文件才能完整镜像下载。








K8s 实现的私有镜像自动拉取


基本功能

K8s 集群一般会管理多个节点,每个节点都有自己的 docker 环境。如果让用户分别到集群节点上登录镜像仓库,这显然是很不方便的。为了解决这个问题,K8s 实现了自动拉取镜像的功能。这个功能的核心,是把 docker.json 内容编码,并以 Secret 的方式作为 Pod 定义的一部分传给 Kubelet。







具体来说,步骤如下:

创建 secret。这个 secret 的 .dockerconfigjson 数据项包括了一份 base64 编码的 docker.json 文件;

创建 pod,且 pod 编排中 imagePullSecrets 指向第一步创建的 secret;

Kubelet 作为集群控制器,监控着集群的变化。当它发现新的 pod 被创建,就会通过 API Server 获取 pod 的定义,这包括 imagePullSecrets 引用的 secret;

Kubelet 调用 docker 创建容器且把 .dockerconfigjson 传给 docker;

最后 docker 使用解码出来的账户密码拉取镜像,这和上一节的方法一致。


进阶方式

上边的功能,一定程度上解决了集群节点登录镜像仓库不方便的问题。但是我们在创建 Pod 的时候,仍然需要给 Pod 指定 imagePullSecrets。K8s 通过变更准入控制(Mutating Admission Control)进一步优化了上边的基本功能。







进一步优化的内容如下:

在第一步创建 secret 之后,添加 default service account 对 imagePullSecrets 的引用;

Pod 默认使用 default service account,而 service account 变更准入控制器会在 default service account 引用 imagePullSecrets 的情况下,添加 imagePullSecrets 配置到 pod 的编排里。


阿里云实现的 Acr credential helper

阿里云容器服务团队,在 K8s 的基础上实现了控制器 Acr credential helper。这个控制器可以让同时使用阿里云 K8s 集群和容器镜像服务产品的用户,在不用配置自己账户密码的情况下,自动使用私有仓库中的容器镜像。







具体来说,控制器会监听 acr-configuration 这个 configmap 的变化,其主要关心 acr-registry 和 watch-namespace 这两个配置。前一个配置指定为临时账户授权的镜像仓库地址,后一个配置管理可以自动拉取镜像的命名空间。当控制器发现有命名空间需要被配置却没有被配置的时候,它会通过阿里云容器镜像服务的 API,来获取临时账户和密码。

有了临时账户密码,Acr credential helper 为命名空间创建对应的 Secret 以及更改 default SA 来引用这个 Secret。这样,控制器和 K8s 集群本身的功能,一起自动化了阿里云 K8s 集群拉取阿里云容器镜像服务上的镜像的全部流程。


总结

理解私有镜像自动拉取的实现,有一个难点和一个重点。

难点是 OAuth 2.0 安全协议的原理,上文主要分析了为什么 OAuth 会这么设计;

重点是集群控制器原理,因为整个自动化的过程,实际上是包括 Admission control 和 Acr credential helper 在内的多个控制器协作的结果。

本文作者:声东 阿里云售后技术专家

原文链接https://yq.aliyun.com/articles/720278?utm_content=g_1000079643

本文为云栖社区原创内容,未经允许不得转载。
分享到:
评论

相关推荐

    K8S(kubernetes)学习指南

    镜像拉取这件小事 镜像拉取是Kubernetes集群中的镜像管理机制之一,它负责将镜像从Registry中拉取到集群中。镜像拉取有多种方式,例如使用 Docker Hub、Google Container Registry等。 实践篇 实践篇是Kubernetes...

    藏经阁-深入浅出Kubernetes-129页

    镜像拉取这件小事看似简单,但实际牵涉到镜像仓库的配置、镜像拉取策略、安全性和效率等问题,对容器的快速启动和集群的稳定运行有着直接影响。 实践篇的内容涵盖了从集群节点的高可用性到命名空间管理,再到微服务...

    无线充电LCC-S仿真:基于Simulink的高效电磁组竞赛电源系统建模与优化

    内容概要:本文详细介绍了用于智能车竞赛微缩电磁组的无线充电LCC-S仿真模型。该模型采用Simulink搭建,主要针对48V输入、1000W输出的无线充电系统进行仿真。文中不仅提供了具体的谐振参数(如L1=35uH,C1=62nF,C2=72nF),还分享了调整死区时间、耦合系数、负载突变测试等实践经验。此外,作者强调了实际应用中的注意事项,如元件选型、散热设计以及仿真与现实差异的处理方法。 适合人群:参与智能车竞赛的学生和技术爱好者,尤其是对无线充电技术和电力电子感兴趣的读者。 使用场景及目标:①帮助参赛队伍快速建立高效的无线充电系统仿真模型;②指导实际硬件搭建过程中参数的选择和优化;③提高系统效率,确保在比赛中的可靠性和性能。 其他说明:本文提供的模型已在Matlab 2023b中验证可行,建议使用者根据实际情况调整参数,并关注仿真与实际应用之间的差异。

    基于springboot+vue的考研资讯平台管理系统(源码+数据库)239

    基于springboot+vue的考研资讯平台管理系统:前端 vue2、element-ui,后端 maven、springmvc、spring、mybatis;角色分为管理员、学生;集成考研资讯、报考指南、资料信息、客服等功能于一体的系统。 ## 环境-239 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Node 14.14.0</b> - <b>JDK 1.8</b>

    基于GADF+Transformer的轴承故障诊断模型:振动信号转二维图像及深度学习分类

    内容概要:本文详细介绍了将振动信号转化为二维图像并利用Transformer进行轴承故障诊断的方法。首先,通过格拉姆角场(GADF)、小波变换(DWT)和短时傅立叶变换(STFT)将一维振动信号转换为二维图像。然后,构建了一个基于Transformer的视觉模型,用于捕捉图像的全局特征。实验结果显示,该方法在凯斯西储大学轴承数据集上达到了98.7%的准确率,尤其在低信噪比环境下的表现优于传统方法。此外,文中提供了详细的代码实现和数据预处理步骤,以及一些实用的训练技巧。 适合人群:从事机械故障诊断的研究人员和技术人员,尤其是对深度学习应用于工业设备监测感兴趣的读者。 使用场景及目标:适用于工业环境中机械设备的故障预测与健康管理。主要目标是提高故障检测的准确性,特别是在复杂工况和低信噪比情况下,帮助维护团队及时发现潜在问题,降低维修成本。 其他说明:文中提到的所有代码和预训练模型均已开源,可供研究和教学使用。同时,作者分享了一些实践经验,如数据增强策略的选择和信号去噪方法的应用,有助于读者更好地理解和复现实验结果。

    【代码随想录】ACM输入输出模板汇总:多语言实现与典型问题解析

    内容概要:本文档是《卡码网-25种ACM输入输出总结模板.pdf》,由程序员Carl编写,旨在帮助读者掌握ACM竞赛中常见的25种输入输出方式。文档详细介绍了多种编程语言(如C++、Java、Python、Go、JavaScript等)的实现方法,涵盖了从简单的A+B问题到复杂的链表操作、二叉树遍历等各类典型题目。每种输入输出方式均配有相应的练习题,帮助读者通过实际操作加深理解。此外,文档不仅提供代码模板,还强调了对问题的分析和解决思路。 适合人群:具备一定编程基础,尤其是准备参加ACM竞赛或从事算法相关工作的开发者。 使用场景及目标:①帮助读者快速掌握ACM竞赛中常见的输入输出格式;②提高编程效率,减少在笔试和面试中因输入输出处理不当而浪费的时间;③通过练习题巩固所学知识,提升解决实际问题的能力。 阅读建议:由于文档侧重于输入输出模板的总结,建议读者在学习过程中结合具体的编程语言特性进行实践,并尝试完成提供的练习题,以加深对模板的理解和应用。同时,注意不同语言之间的语法差异,灵活运用所学知识。

    基于springboot的健身中心会员管理系统(源码+数据库)199

    基于springboot的健身中心会员管理系统:前端 jsp、jquery,后端 maven、springmvc、spring、mybatis;角色分为管理员、用户;集成会员卡、留言板、公告、统计报表等功能于一体的系统。 ## 功能介绍 ### 客户 - 基本功能:登录,退出,个人资料查看与修改,密码修改 - 我的会员卡:会员卡查询,详情 - 充值信息:充值信息的列表查询,多条件搜索查询,详情 - 我的消费记录:消费记录查询,多条件搜索查询,详情 ### 管理员 - 账号管理:管理员账号信息的增删改查,密码修改 - 公告管理:公告信息的增删改查 - 客户管理:客户信息的增删改查 - 会员卡管理:会员卡信息的增删改查,多条件搜索查询,会员卡充值 - 留言板管理:留言板信息的列表查询,留言回复 - 统计报表管理:消费信息的查询统计,充值信息的查询统计 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>JDK 1.8</b>

    基于springboot的教育互助管理系统(源码+数据库)236

    基于springboot的教育互助管理系统:前端 html、jquery,后端 maven、springmvc、spring、mybatis;角色分为管理员、用户;集成交流动态、我的平台、我的好友、互助评论、教育互助等功能于一体的系统。 ## 环境-236 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>JDK 1.8</b>

    multiSIM视频教程-常用仪器仪表使用.zip

    multisim

    手绘彩虹小太阳幼儿教学课件模板.pptx

    手绘彩虹小太阳幼儿教学课件模板

    SH3201数据手册和代码.tar

    SH3201数据手册和代码.tar 产品简介 SH3201是一款六轴IMU(Inertial measurement unit)惯性测量单元。SH3201内部集成三轴陀螺仪以及三轴加速度计,尺寸小,功耗低,适用于消费电子市场应用,能提供高精度的实时角速度与线加速度数据。SH3201具有出色的温度稳定性,在-40℃到85℃的工作范围内能保持高分辨率。 封装形式和尺寸 ● 封装:14 Pins LGA ● 尺寸:2.5×3.0×1.0mm³

    自动驾驶多类交通目标检测数据集1.zip

    数据集介绍:自动驾驶多类交通目标检测数据集 一、基础信息 数据集名称:自动驾驶多类交通目标检测数据集 图片数量: - 训练集:2,868张图片 - 验证集:30张图片 - 测试集:301张图片 分类类别: - Bikes(自行车):交通场景中常见非机动车类型 - Bus(公交车):大型公共交通工具 - Car(汽车):主流机动车辆类型 - Crosswalk(人行横道):道路安全标识 - Fire hydrant(消防栓):城市基础设施组件 标注格式: YOLO格式,包含目标检测所需的边界框坐标及类别标签,支持主流深度学习框架。 数据来源:真实道路场景采集,涵盖多样交通环境。 二、适用场景 自动驾驶感知系统开发: 用于训练车辆环境感知模型,精准识别道路参与者(车辆、行人)及关键基础设施(人行道、消防栓)。 智能交通监控系统: 支持开发实时交通流量分析系统,识别车辆类型及道路安全标识。 道路安全研究: 为交叉路口安全分析、基础设施布局优化提供数据支撑。 AI算法基准测试: 适用于目标检测模型性能验证,覆盖常见交通目标类别。 三、数据集优势 场景覆盖全面: 包含5类关键交通要素,覆盖车辆、行人设施及市政设备,满足复杂场景建模需求。 标注质量可靠: 专业团队标注,严格质检流程确保边界框定位精准,类别标注准确。 任务适配性强: 原生YOLO格式支持主流检测框架(YOLOv5/v7/v8等),即插即用。 应用潜力突出: 数据来源于真实道路场景,可直接应用于L2-L4级自动驾驶系统开发,具备强工程落地价值。

    一个极速,多功能的哔哩哔哩推送机器人.zip

    一个极速,多功能的哔哩哔哩推送机器人

    基于jsp+servlet的机票预订后台管理系统(源码+数据库)128

    基于jsp+servlet的机票预订后台管理系统:前端 jsp、jquery,后端 servlet、jdbc,角色分为管理员、用户;集成航班信息查询,在线订票,订单查询等功能于一体的系统。 ## 功能介绍 ### 管理员 - 航班信息管理:航班信息列表查询,航班添加 - 订单信息管理:用户在前台浏览航班信息,订票下单后,管理员可以在后台查询用户下单信息 - 用户信息管理:用户信息由客户自己在前台注册,管理员可以查看和删除用户 - 留言评论管理:用户在前台针对航班信息或订票服务进行评论,后台查看评论和删除 ### 用户 - 基本功能:登录,注册,退出 - 网站首页:轮播图,航班搜索,航班列表信息展示 - 订票:航班详情,在线订票,填写乘机人和联系人信息,退改签说明,提交订单 - 用户中心:个人资料查询与修改,订单列表查询 - 留言:留言列表查看,发表留言评论 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>JDK 1.8</b>

    COMSOL多物理场建模在海底气体水合物沉积物汽液两相流动研究中的应用

    内容概要:本文详细介绍了利用COMSOL进行海底气体水合物沉积物中汽液两相流动的数值模拟。首先,文章解释了模型的基本架构,包括多孔介质流和相场法追踪气液界面,并展示了关键的偏微分方程。接着,讨论了网格划分、水合物相变的能量方程源项设置以及重要参数如各向异性系数的正确配置。此外,文中强调了模型验证步骤,如网格收敛性测试、时间步长敏感性分析和物质守恒检查。最后,分享了一些实际工程应用的经验,如处理非均质储层和相变潜热的影响。 适合人群:从事地质工程、石油勘探、环境科学等领域研究的专业人士和技术人员。 使用场景及目标:适用于需要深入理解和模拟海底气体水合物沉积物中复杂物理现象的研究人员。主要目标是帮助用户掌握COMSOL在这一领域的具体应用方法,提高数值模拟的准确性。 其他说明:文章不仅提供了详细的数学模型和编程代码片段,还分享了许多实践经验,有助于读者避开常见陷阱并优化计算效率。

    Screenshot_2025_0421_055352.png

    Screenshot_2025_0421_055352.png

    Abaqus混凝土收缩建模与分析:从材料定义到结果验证的技术详解

    内容概要:本文详细介绍了如何使用Abaqus进行混凝土收缩建模与分析。首先讲解了混凝土收缩的基本概念及其重要性,接着逐步介绍材料定义、收缩模型选择、收缩应变计算方法(包括UMAT子程序和热膨胀模拟)、分析步配置、边界条件设置、后处理验证等各个环节的具体操作步骤和技术细节。文中还提供了多个实用的Python脚本和.inp文件模板,帮助用户更好地理解和应用相关知识点。此外,作者分享了许多实战经验和常见错误规避技巧,确保模型的稳定性和准确性。 适合人群:从事土木工程仿真分析的专业人士,尤其是有一定Abaqus使用经验的研究人员和工程师。 使用场景及目标:适用于需要进行混凝土结构长期性能预测、裂缝发展模拟等复杂工程问题的研究人员。通过掌握本文提供的技术和方法,能够提高仿真模型的精度,减少与实际测量结果之间的偏差。 其他说明:文中提到的所有代码片段和操作指南均基于最新版本的Abaqus软件平台。建议读者结合官方文档和其他在线资源进一步学习和探索。

    前端分析-2023071100789s

    前端分析-2023071100789s

Global site tag (gtag.js) - Google Analytics