svn拉取文件失败_Kubernetes自动化拉取私有镜像全揭秘

本文详细介绍了在Kubernetes集群中,如何解决私有Docker镜像拉取失败的问题。通过配置K8S的ImagePullSecret,结合准入控制功能,实现集群级别的自动化镜像拉取。文中讲解了Kubelet的工作原理,以及如何创建和引用ImagePullSecret,包括基于Docker登录证书和制品库API Key的方法。
摘要由CSDN通过智能技术生成

4ded574f7d9b1023ea92e3c424d1c5ae.gif

66f7af9b8c0b7baeecb74507f312fac4.png 嘿,跟你分享一个小秘密 快说快说 7aa37e4eee7d915c96fc22ee100b8db3.png 4f793cdc8c08f0ea3ef6264c8ae0823a.gif

目前G行正在进行唯一可信源建设,已成功部署于POC环境,并提供给多个开发测试团队进行试用。唯一可信源是企业内部所有通过审批批准的软件唯一存放的仓库。这些软件包括war 包、jar包、Docker镜像、zip包,以及第三方开源组件或者商业软件的授信版本。这些仓库又称为制品库,其中,Docker私有镜像仓库服务使用广泛,是实现公司DevOps体系建设必备组件之一。

50fa6bf2391f6a96b77545eaefe9e8a0.gif 4f793cdc8c08f0ea3ef6264c8ae0823a.gif

制品库使用人员在基于Kubernetes(K8S)集群上部署应用时,经常会出现私有镜像拉取失败的问题,从而导致应用部署不成功。云平台团队制品库建设支持人员发现,这多是由于集群上的节点和私有镜像仓库之间认证失败导致的,通过正确配置与使用K8S的准入控制功能可以很好的解决这个问题。而且,若想减少问题发生、快速定位、解决此类问题,就需要相关人员对私有镜像自动化拉取原理有一定的了解。本文首先介绍镜像拉取的上层控制组件Kubelet的原理,然后展示了如何配置集群中单个计算节点拉取私有镜像仓库中的镜像的方法,最后通过基于制品库中的API-Key创建ImagePullSecret,并将其添加到Service Account(Sa)对象的方式实现了集群级别的私有镜像自动化拉取。

50fa6bf2391f6a96b77545eaefe9e8a0.gif 66f7af9b8c0b7baeecb74507f312fac4.png 接下来听我娓娓道来 一、对与容器打交道的Kubelet的介绍 本小节主要介绍K8S中负责操作镜像和容器的组件以及具体的流程,这是集群镜像拉取的底层逻辑基础。在K8S平台上部署容器化的应用,完成调度后,K8S就需要负责将这个调度成功的Pod在宿主机上创建出来,并把它所定义的各个容器启动起来。这些都是Kubelet这个核心组件的主要功能。因为在K8S这样一个容器编排与管理系统中,Kubelet是跟容器打交道的主要“场所”。 6158ee3e72416ffb7ad1bff607c31900.png

图1-1  Kubelet工作原理图

Kubelet调用下层容器运行时的执行过程,并不会直接调用Docker的API,而是通过一组叫作CRI(Container Runtime Interface, 容器运行时接口)的gRPC接口来间接执行的。响应CRI接口的组件叫做CRIshim。对于Docker项目中,dockershim就是直接调用Docker的API。如图中五角星标注的部分所示,Kubelet通过CRI最终调用Docker的clientapi 进行实际的image拉取。 二、计算节点拉取私有镜像配置介绍

通过第一节的介绍,我们了解到,实际控制image拉取的是对应的CRIshim,本文以目前使用广泛的Docker为例,进行K8S集群中单节点拉取私有镜像配置介绍,这也是后续配置ImagePullSecret的先决条件。

在安装完docker后,需要进行相关的配置,才能从私有镜像仓库中拉取或者推送镜像,对于K8S集群中的每一个节点,都要具备从私有仓库中拉取镜像的“能力”,即权限认证。在调试因镜像下载失败而应用部署不成功的实践中,常常会登录到失败的节点并进行image拉取测试,判断节点是否具有从私有镜像仓库拉取镜像的能力。如果没有设置可信源,又没有配置HTTPS证书,那么会遇到这个错误:error: http: server gave HTTP response to HTTPS client。具体有如下两种解决办法。

1 设置可信源

1)添加insecure-registries参数到 daemon.json文件

f26894264181938ecfbf6d78f9288dc1.png 2)重启docker服务 daa99850e4c77f0c6133f2ea5cbc71fb.png                                                           2 配置HTTPS证书 更安全的方式应该使用HTTPS协议连接私有镜像仓库,若没有配置过HTTPS认证证书,在采用HTTPS协议进行登录会遇到错误,x509:certificate signed by unknown authority ,解决方法的具体配置步骤如下: 1)创建SSL证书 604c906b781dad3095cb4a6b7f226c87.png 2)复制步骤1中的Servercertificate 内容,创建证书文件 bf0a495b69371a2f1fa9c76806d7881b.png 3)导入证书信息到系统证书文件中并更新证书信息 c9e0168ef6397385a00e24ba5c04c3ba.png 4)重启docker服务 51463fbd22278307e5132d3fbbfff8f2.png 三、K8s集群私有镜像自动拉取

在完成docker安装节点的HTTP或者HTTPS连接配置后,集群的节点就具备了使用私有镜像仓库的条件,但是要想拉取镜像,还需要docker login操作。在每一台节点上进行手动docker login操作以确保每次部署都能拉取到镜像,但是这种做法自动化程度较差,对于应用的快速部署也是不可取的。如何让K8S集群自动拉取私有镜像呢?ImagePullSecret完美的解决了这个问题。

3.1 ImagePullSecret挂载到Pod实现自动拉取镜像 ImagePullSecret顾名思义,是一种Secret。Secret的本质是Volume,是把Pod想要访问的数据加密,存放到Etcd中。然后就可以通过在Pod的容器里挂载Volume的方式,访问到这些Secret里保存的信息了。需要注意的是,Secret对象要求添加的数据必须是经过Base64转码的,避免出现明文的安全隐患。但是并没有经过加密操作,因此在真正的生产环境中,你需要在K8S中开启Secret的加密插件,增强数据的安全性。这个方法的核心是根据docker login的认证信息文件config.json内容编码,以Secret的形式作为Pod定义的一部分传给Kubelet。流程图以及具体的步骤如下。 b05465251b17c85c852703ab996767e1.png 图3-1  Pod直接挂载Secret方式进行镜像拉取流程图 STEP1:

ImagePullSecret的创建

1) 基于已有Docker登录证书创建

在完成docker login之后,会生成或者更新config.json文件,该文件一般位于~/.docker目录下。可以基于这个文件来创建imagePullSecret,具体命令如下:

caef1b53db163f3f49ba5ac80ffb9094.png

2) 采用制品库的APIKey 创建

目前云平台管理团队在POC建设的制品库支持所有开发语言,任意维度的元数据检索、跨语言正反向依赖分析,并同时拥有深度递归、支持多活异地灾备的企业级、高可用二进制制品管理仓库。由于其中的参数以明文的形式填写,因此采用制品库中的API Key,具体获取方式如下图。(测试用例来源于云平台团队制品库建设小组)

d7b253bc8deb9bbe0687e5ea79dade38.png

图3-2  制品库中的API Key

基于API Key的ImagePullSecret创建命令:

ea2e358c81836b1f1578f57f6d872b99.png                                 

其中:

  • my-secret是创建的Secret的名字,可以自己定义

  • 是你的私有镜像服务器址,测试用例中为制品库服务器地址

  • 是你的 Docker用户名,测试用例中采用的是登录制品库的用户名

  • 是你的Docker密码,测试用例中是制品库中的APIKey

  • 是你的Docker电子邮件,属于可选设置

通过命令查询该Secret的内容:

212367f83776cdcf202a3ac864b618eb.png图3-3  Secret内容实例 

STEP2:

在创建Pod的YAML文件中引用该Secret

59274c48750ebb0e844322c515e28e37.png

图3-4  引用Secret 的Pod实例

STEP3:

Kubelet控制器轮询检测着集群的变化,当发现新的Pod需要被创建,就会通过Kube-apiserver获取Pod的定义,包括ImagePullSecret指向的Secret

STEP4:

通过Dockershim调用docker创建容器并把config.json文件传给Docker

STEP5:

Docker使用解码出来的账户密码拉取镜像,这就和在单节点上拉取镜像方式一致了

3.2 通过准入控制(Mutating Admission Control)实现自动化镜像拉取 在3.1章节中采用的方法不需要去集群内每个节点登陆私有镜像仓库,但是需要在创建Pod时填写ImagePullSecret字段,仍有些许不便。幸运的是,可采用K8S的变更准入控制优化实现。主要利用准入控制中的Service Account(Sa)进行操作。

36b59132e7e19ce2e80a1b226f0e9a00.png

图3-5  Service Account 结构图

Sa是一种账号,但是它不是给K8S集群的用户(系统管理员、运维人员、租户用户等)使用的,而是服务于运行在Pod里的进程,为其提供了必要的身份证明。在每个Namespace下都有一个名为default的默认Sa对象,在这个Sa里面有一个名为Tokens的可以被当作Volume被挂载到Pod里的Secret,当Pod启动时,这个Secret会被自动挂载到Pod的指定目录下,用来完成Pod中的进程访问APIServer时的身份鉴权。 ImagePullSecret不作为与API Server 通信鉴权的凭证,而是用于与私有镜像仓库的Registry的鉴权。一个Sa可以包括多个Secret,如上图。采用准入控制的流程中将多了一步Sa的创建或者修改,具体步骤如下。

8a6966529fab8d84ab40646edfb5ed0b.png

图3-6  基于准入控制的方式拉取镜像流程图

STEP1:

在方法一完成之后,增加了创建或者修改已有的ServiceAccount,一般可用名为default的Sa。实例如下:

eaeab6daf721401cba23431b64f41902.png

图3-7  Service Account 内容实例

STEP2:

Pod会使用自己应用创建的Sa,若没有则可以使用defaultSa。而Sa变更准入控制器在引用ImagePullSecret的情况下,会将其配置到Pod的编排中,最终实现集群级别的自动化镜像拉取。

四、基于Helm使用实例

在使用Helm chart进行应用的安装实践中,将ImagePullSecret写入values.yaml中,这样在templates中定义的Pod控制器都可以引用该ImagePullSecret。这是采用准入控制进行镜像自动化拉取的原理应用。

以下是安装集群监控插件Prometheus应用使用ImagePullSecret的实例:

values.yaml文件中定义ImagePullSecret部分内容

c08c2a146d77b6ae32506f9974fa22e0.png 图4-1  定义ImagePullSecret的values.yaml 内容实例 使用ImagePullSecret实例(基于Helm的语法) e2df72acebbb0a38847989925b63d48f.png 图4-2  引用ImagePullSecret的deployment.yaml 内容实例 66f7af9b8c0b7baeecb74507f312fac4.png 是不是还是意犹未尽? 总结

随着唯一可信源制品库的引入,未来G行基于K8S的容器化应用部署一定会使用其中的私有docker镜像仓库服务。熟悉私有镜像自动拉取原理,对减少应用部署失败以及问题的定位大有裨益。实现私有化镜像的自动拉取,最佳实践是通过K8S的变更准入控制功能,将ImagePullSecret附加到Service Account 对象中,继而Kubelet在创建Pod时会将Secret的信息挂载到自身的Volume中,最终集群中的容器运行时,如Docker,会根据这些认证信息去完成镜像的拉取。

a23ff682932a885583e1bfbc66e09c3a.png END

文章来源:公众号“匠心独运维妙维效”

c0d20b7ea6a44f5750324ed56bc9f5bb.png

你“在看”我吗9bc0f03446805634ce4b03b820fd4b6e.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值