阿里云容器镜像服务 | 学习笔记

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 快速学习阿里云容器镜像服务

开发者学堂课程【企业级运维之云原生与 Kubernets 实战课程:阿里云容器镜像服务 】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/913/detail/14500


阿里云容器镜像服务

本章目标

Ÿ 阿里云容器镜像服务的基础使用和最佳实践,常见问题排查手段

Ÿ 熟悉阿里云容器服务集群应用管理(创建、更新、删除)

Ÿ 掌握 Kubernetes 调度和资源管理、路由和负载均衡

Ÿ 掌握阿里云容器服务集群存储、容器服务集群日志和监控

 

本章目录

1. 阿里云容器镜像

2. 阿里云容器服务集群应用管理

3. Kubernetes 调度和资源管理

4. 负载均衡和路由

5. 阿里云容器服务集群集群存储

6. 阿里云容器服务集群日志和监控

7. 实验二:应用部署进阶

 

第二章第1讲 阿里云容器镜像服务

 

目录

Ÿ 容器镜像仓库介绍

Ÿ 阿里云容器镜像服务 ACR 优势

Ÿ ACR 基础操作

Ÿ ACR 使用实践

Ÿ 常见问题

 

一、容器镜像仓库介绍

1. 为什么需要容器镜像仓库

Ÿ 镜像仓库是一个无状态的、高度可扩展的服务器端应用程序,它存储并允许分发 Docker 镜像;

Ÿ 和 yum 源、apt 源类似,容器镜像存储在仓库里,需要从仓库里拉取到本地再运行为一个容器;

Ÿ 镜像仓库分为公共仓库和私有仓库,目前最大的容器镜像公共仓库是 Docker 官方的 Dockerhub。当然自己也可以在本地搭建容器镜像仓库服务,这称为私有仓库;

Ÿ 容器镜像仓库的设计理念和 Github 很相似,也分为远程库和本地库,可以把远程镜像仓库的镜像拉取到本地镜像仓库,也可以把本地镜像仓库的镜像推送到远程镜像仓库;

2. 容器镜像仓库使用步骤

Ÿ 开发者从公共镜像仓库 pull 拉取基础镜像;

Ÿ 构建完成包含业务应用的容器镜像,再 push 推送到自己的私有镜像仓库;

Ÿ 业务环境从私有镜像仓库拉取镜像部署到集群中;

如执行命令:docker pull busybox( busybox 为公共镜像仓库的镜像),然后编写 dockerfile,构建镜像后推送到私有仓库,执行docker run xxx命令或者kubectl creat deployment xxx(xxx为镜像地址),就完成了镜像的部署。

image.png

Docker Registry

Registry 可以理解为仓库,它是用来保存所有创建好的镜像统一存储的位置。根据它的权限分为私有仓库 ( Private Registry ) 和公共仓库 ( Public Registry ) 。公共仓库不需要用户名验证,就可以 pull 拉取镜像,但不能 push 推送镜像,私有仓库需要验证用户名和密码后,才可以 pull 拉取和 push 推送镜像。

阿里云提供的容器镜像的仓库服务:ACR。

 

二、阿里云容器镜像服务 ACR

1. 阿里云容器镜像服务 ACR 优势

Ÿ 简单易用:

无需自行搭建及运维,一键创建镜像仓库 支持多地域,提供稳定快速的镜像上传、下载服务;

Ÿ 安全可控:

完善的镜像权限管理体系,确保镜像的分享安全,团队的协作便利提供镜像安全扫描功能,保证镜像漏洞可识别,漏洞级别可提示;

Ÿ 云产品间无缝集成:

整合容器服务,实现新应用镜像生成后的持续部署,整合云 Code CodePipeline,实现源代码到编译测试后,自动生成应用镜像;

2. Dockerhub

Ÿ 速度慢:镜像仓库服务器在大陆外,上传下载慢;

Ÿ 安全性低:没有镜像安全扫描功能;

Ÿ 衔接性差:webhook 触发器钩子设置繁琐,与其他产品和服务对接不方便。

image.png

3. 三种容器镜像方案对比

image.png

a. 企业版

适用于企业客户、对安全及性能需求高、业务全球多地域、有大规模节点部署要求的集群,其特点如下:

Ÿ 支持容器镜像,加密托管;

Ÿ 支持 Helm Char,加密托管;

Ÿ 支持双引擎开源及云安全中心扫描;

Ÿ 支持镜像加签;

Ÿ 支持公网/ VPC 网络控制(通过添加白名单的方式)、支持关闭公网、添加 ACL条目;

Ÿ 支持操作审计;

Ÿ 支持千节点大规模 P2P 分发;

Ÿ 应用分发全球地域+自动同步、支持全链路可观测、可追踪、可自主设置;

Ÿ 费用及运维成本:收费、提供 SLA 保障;

b. 默认实例

适用于个人开发者,其特点如下:

Ÿ 支持开源扫描;

Ÿ 应用分发仅国内地域+手动触发;

Ÿ 费用及运维成本:免费;

c. Harbor

开源镜像仓库,无限制,其特点如下:

Ÿ 支持 Helm Char;

Ÿ 支持容器镜像;

Ÿ 支持开源扫描;

Ÿ 支持镜像加签;

Ÿ 应用分发多套自建,打通网络;

Ÿ 费用及运维成本:无 SLA 保障。

 

三、ACR 基础操作

1. ACR 的基础操作分两个步骤:

a. 登录镜像仓库;

docker login --username=xxx registry.cn-shenzhen.aliyuncs.com

Ÿ username 为阿里云账号(包括子账号),password 为对应账号的仓库密码(非阿里云账号密码);

Ÿ 使用 docker login 命令,点击 ACK 产品可以找到登录仓库的命令及地址,登录成功后,可以使用命令 cat /root/.docker/config.json 查看,包含了镜像仓库的地址、auth( base 64加密后用户名和密码);

b. 拉取或推送镜像

Ÿ 镜像仓库地址格式

image.png

使用 docker push/pull 命令进行镜像的拉取或推送,仓库地址格式,依次为domain、命名空间、镜像名。

Ÿ 镜像拉取

docker pull registry.cn-shenzhen.aliyuncs.com/<namespace>/registry:[镜像版本号]

私有镜像拉取必须先 docker login ,然后进行权限校验才能拉取,公开镜像可以直接拉取;

Ÿ 镜像推送

docker tag [ImageId]registry.cn-shenzhen.aliyuncs.com/<namespace>/registry:[镜像版本号]

docker push registry.cn-shenzhen.aliyuncs.com/<namespace>/registry:[镜像版本号]

push 镜像必须先 docker login ,然后进行权限校验才能 push,docker login 的域名和 push 的域名必须一致。

2. ACR 授权子账号使用

镜像仓库可以授权给多个子账号同时共享使用,子账号和主账号是互相独立的,仓库授权遵循RAM授权策略。

a. AliyunContainerRegistryFullAccess

子用户拥有该授权后,对于镜像资源的权限等同于主账号,可以做任意管理操作。

{

"Statement": [

{

"Action": "cr:*",

"Effect": "Allow",

"Resource": "*"

}

],

"Version": "1"

}

b. AliyunContainerRegistryReadOnlyAccess

子用户拥有该授权后,对于所有容器镜像资源有只读权限,比如:可以查看仓库列表, Pull 镜像等。

{

"Statement": [

{

"Action": [

"cr:Get*",

"cr:List*",

"cr:PullRepository"

],

"Effect": "Allow",

"Resource": "*"

}

],

"Version": "1"

}

其他自定义权限参考:https://help.aliyun.com/document_detail/67992.html

 

四、ACR 使用实践

1. ConfigMap

a. 定义

ConfigMap 是用来存储配置文件的 kubernetes 资源对象,所有的配置内容都存储在 etcd 中。

b. 用途

ConfigMap 核心作用是让配置信息和镜像解耦(微服务思想)。

c. 特点

Pod 可以使用 ConfigMap 的数据生成配置文件。如果 Pod 配置文件要改变时,只需要修改 ConfigMap 里面的数据,然后会动态改变 Pod 容器里面的配置信息。 ConfigMap 的数据是以键值的形式存在。

d. 命令示例

Ÿ 使用 yaml 创建 ConfigMap:kubectl apply -f xxx(xxx为 configmap 的 yaml 文件)

Ÿ 查看 ConfigMap:kubectl get cm xxx(xxx为 configmap 服务名) -o yaml

e. 使用 ConfigMap

如下示例的 yaml 文件中,envFrom 字段内通过 ConfigMapRef 指定需要用到的ConfigMap,还可以在 Pod 命令中使用 ConfigMap 定义的环境变量、以及将  ConfigMap 数据添加到一个卷中在 Pod 中挂载该数据卷的方式。

yaml 文件示例:

apiversion: v1

kind:Pod

metadata:

name:test-pod

spec:

containers

-name: test-container

image: k8s.gcr.io/busybox

command: I"Nbin/sh","_C","env"

envFrom:

-configMapRef:

name:test-config4

restartPolicy: Never

参考《配置Pod使用ConfigMap》:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/

2. Secret

a. 定义

Ÿ Secret 结构与 ConfigMap 类似,均是键/值对的映射,使用方法也与 ConfigMap 相同;

Ÿ Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec 中。 Secret 可以以 Volume 或者环境变量的方式使用;

Ÿ Secret 的大小被限制为 1MB。当 Secret 挂载到 Pod 上时, 是以 tmpfs 的形式挂载,即这些内容都是保存在节点的内存中,而不是写入磁盘,通过这种方式来确保信息的安全性。

b. Secret 类型

image.png

Ÿ Opaque:用户自定义的任意数据;

Ÿ kubernetes.io/dockerconfigjson:用来存储私有 docker registry 的认证信息;

Ÿ kubernetes.io/service-account-token:用于被 serviceaccount 引用。 serviceaccout 创建时 Kubernetes 会默认创建对应的 secret;

注:Pod 如果使用了 serviceaccount ,对应的 secret 会自动挂载到 Pod 目录 /run/secrets/kubernetes.io/serviceaccount 中。

3. Kubernetes 中如何使用私有镜像仓库创建应用

步骤1:生成私有镜像的密钥;

kubectl create secret docker-registry [$Reg_Secret]--docker-server=[$Registry]--docker-username=[$Username--docker-password=[$Password] --docker-email=[$Email]

说明:

[$Reg_Secret] 为密钥的键名称,可自行定义;

[$Registry] 为 Docker 仓库地址;

[$Username] 为登录 Docker 仓库的用户名;

[$Password] 为登录 Docker 仓库的密码;

[$Email] 为邮件地址,该配置项可选填;

步骤2:在编排的 YAML 文件中加入密钥相关配置项,完成后 YAML 文件类似如下

containers:

-name:foo

image: [$Registry]/abc/test: 1.0

imagePullSecrets:

name: [$Reg Secret]

说明:

imagePullSecrets 配置为在声明拉取镜像时指定的密钥。

另一种用法,将镜像拉取密钥放到命名空间下的默认 ServicAccount 中:

a. Kubectl create secret docker-registry mysecret--docker-server=xiniao-registry.cn-zhangjiakou.cr.aliyuncs.comdocker-username=xiniaoetest.com --docker-passrord=mYpassWd***

b. kubectl patch serviceaccount default -p ‘{"imasepuIISecrets":[f"name":mysecret")]’

4. ACR 免密组件

拉取私有仓库的镜像都需要 docker login 登录验证,而且经常遇到验证问题,如何省略这一步?

a. 免密组件 aliyun-acr-credential-helper

aliyun-acr-credential-helper 是一个可以在 ACK 集群中免密拉取 ACR 默认版或企业版私有镜像的组件,该组件会默认安装在所有 ACK 集群中。

b. acr-configuration 配置

免密组件通过读取 ACK 集群内的 kube-system 命名空间中的 acr-configuration 的配置,进行私有镜像拉取。当前支持针对私有镜像仓库使用以下三种权限之一的策略进行配置:

Ÿ 使用默认的 ACK Worker RAM 角色权限进行拉取(默认策略);

Ÿ 使用自定义 RAM 角色的 AccessKey ID 和 AccessKey Secret 的权限进行拉取;

Ÿ 通过配置 RAM AssumeRole 权限,使用其他用户的权限进行拉取。RoleARN 是角色的全局资源描述符,用来指定具体角色。比如,某个云账号下的 devops 角色的 ARN 为:acs:ram::1234567890123456:role/samplerole。

image.png

免密组件 acr-configuration 配置项示例

c. 免密组件常见场景:

场景一:配置当前账号拉取权限

步骤:

Ÿ 登录容器服务管理控制台;

Ÿ 在控制台左侧导航栏中,单击集群;

Ÿ 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情;

Ÿ 在集群信息页面,单击集群资源页签,单击 Worker RAM 角色右侧链接;

Ÿ 在 RAM 角色基本信息的权限管理页签,单击目标权限策略名称.

Ÿ 单击修改策略内容;

Ÿ 在策略内容区域增加以下字段后,单击确定。

{

"Action": [

"cr: Get*",

"cr: List*"

"cr: PullRepository"

],

"Resource":"*",

"Effect": A11ow"

}

场景二:配置跨地域拉取镜像权限

如果需要拉取的镜像与当前 ACK 集群不属于同一地域的时候,需要修改配置项 acr-configuration 中的 configMap。

例如,默认仓库同时拉取北京地域与杭州地域的镜像,配置如下:

data:

service-account: "default"

watch-namespace: "a11"

expiring-threshold: "15m"

notify-email: "cs@aliyuncs.com"

acr-registry-info:

- instanceId: ""

regionId: cn-beijing

- instanceId: ""

regionId: cn-hangzhou

场景三:配置跨账号拉取权限

使用角色扮演进行跨账号拉取配置原则如下:

Ÿ B 用户( RAM 角色)可以拉取指定私有仓库下的私有镜像( B 用户 RAM 角色有 cr.* 相关的权限);

Ÿ B 用户( RAM 角色)允许让 A 用户下的 ACK Worker RAM 角色扮演(信任策略);

Ÿ A 用户下的 ACK 集群的 Worker RAM 角色有扮演 B 用户( RAM 角色)的权限(AliyunAssumeRoleAccess);

Ÿ 设置 A 用户下的 Worker RAM 角色扮演B用户( configMap 中的assumeRoleARN );

步骤4需要调整组件配置,新增 assumeRoleARN 配置,指定扮演哪个角色。 配置内容为 B 用户 Worker RAM 角色的 ARN。

data:

service-account: "default"

watch-namespace: "a11"

expiring-threshoid: "15m"

notify-email: "cs@aIiyuncs.com"

acr-registry-info:

-instanceId: ""

regionId: cn-beijing

domains: registry.cn-beijing.aliyuncs.com

assumeRoleARN: acs: ram::.*:role/kubernetesworkerrole-test

场景四:同时拉取默认实例和企业实例的私有镜像

如需同时拉取默认实例和企业版实例的私有镜像,按照以下方式修改配置项 ACR-configuration 中的 configMap:

data:

seryice-account="detaIt"

watch-namespace:"all"

expiring-threshold:"15m"

notiEy-emaiI:"cs@aliyuncs.com"

acr-registry-info:

- instanceId:""

- instanceId:"cri-xxxx"

 

五、常见问题

1. 拉取镜像失败,报错镜像不存在或者没有权限

Ÿ 确认镜像本身是否存在,镜像地址是否填写正确;

Ÿ 确认镜像是否是私有镜像,私有镜像必须配置密钥拉取(是否使用免密组件);

Ÿ 如果没有使用免密组件,可以手动 docker login 后测试拉取镜像情况,确认 secret 中的镜像地址和 development 中的镜像地址域名是否一致;

Ÿ 如果使用免密组件,查看免密组件 Pod 日志确认是否有异常,检查 ACR-configuration 配置是否有问题;

Ÿ 检查免密组件的 RAM Role 权限策略是否正确。

2. 镜像拉取失败,报错 timeout

检查镜像地址是否正确,镜像地址是否可达,如果是公网地址,确认 ECS 是否有绑定 EIP 或者 ECS 所在交换机是否有绑定 SNAT 保证公网能力,如果是 VPC 地址,检查镜像地址 Region 是否和 ECS 是相同 Region ,默认相同 Region 地址才能 VPC 拉取镜像。

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。 &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
专有云 Serverless 持续交付
亚太唯一,阿里云再度入选Gartner®容器管理魔力象限领导者
Gartner正式发布 2024《容器管理魔力象限》报告,阿里云再度成为中国唯一一家入选「领导者象限」的科技公司。
|
2月前
|
人工智能 专有云 Serverless
亚太唯一!阿里云再度入选Gartner®容器管理魔力象限领导者
亚太唯一!阿里云再度入选Gartner®容器管理魔力象限领导者
106 2
|
3月前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
3年前的云栖大会,我们发布分布式云容器平台ACK One,随着3年的发展,很高兴看到ACK One在混合云,分布式云领域帮助到越来越多的客户,今天给大家汇报下ACK One 3年来的发展演进,以及如何帮助客户解决分布式领域多云多集群管理的挑战。
阿里云容器服务 ACK One 分布式云容器企业落地实践
|
2月前
|
弹性计算 Kubernetes 网络协议
阿里云弹性网络接口技术的容器网络基础教程
阿里云弹性网络接口技术的容器网络基础教程
阿里云弹性网络接口技术的容器网络基础教程
|
3月前
|
人工智能 Kubernetes Cloud Native
阿里云容器服务,全面助力云上体育盛会
本文讲述了阿里云容器服务,通过安全稳定的产品能力和成熟的稳定性保障体系,全面助力云上体育赛场,促进科技之光与五环之光交相辉映。
阿里云容器服务,全面助力云上体育盛会
|
3月前
|
人工智能 Prometheus 监控
使用 NVIDIA NIM 在阿里云容器服务(ACK)中加速 LLM 推理
本文介绍了在阿里云容器服务 ACK 上部署 NVIDIA NIM,结合云原生 AI 套件和 KServe 快速构建高性能模型推理服务的方法。通过阿里云 Prometheus 和 Grafana 实现实时监控,并基于排队请求数配置弹性扩缩容策略,提升服务稳定性和效率。文章提供了详细的部署步骤和示例,帮助读者快速搭建和优化模型推理服务。
182 7
使用 NVIDIA NIM 在阿里云容器服务(ACK)中加速 LLM 推理
|
3月前
|
供应链 安全 Cloud Native
阿里云容器服务助力企业构建云原生软件供应链安全
针对软件供应链的攻击事件在以每年三位数的速度激增,其中三方或开源软件已经成为攻击者关注的重要目标,其攻击方式和技术也在不断演进。通过供应链的传播,一个底层软件包的漏洞的影响范围可以波及世界。企业亟需更加标准和完善的供应链风险洞察和防护机制。本文将结合最佳实践的形式,面向容器应用完整的生命周期展示如何基于容器服务ACK/ACR/ASM助力企业构建云原生软件供应链安全。
|
3月前
|
运维 Kubernetes Serverless
直降算力成本!阿里云容器计算服务ACS正式商业化
阿里云容器计算服务ACS正式商业化,综合算力成本最高可降55%。容器计算服务ACS可实现算力资源的极限扩容,易用性也大幅提升50%,将有力承载未来暴涨的容器算力需求,推动用云范式更新升级。
100 9
|
3月前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
阿里云ACK容器服务生产级可观测体系建设实践
|
3月前
|
运维 Kubernetes Java
阿里云容器计算服务ACS ,更普惠易用、更柔性、更弹性的容器算力
ACS(阿里云容器计算服务)推出Serverless容器算力,提供更普惠、柔性、弹性的算力资源,适用于多种业务场景,如复合应用、ACK集成、EMR大数据处理等,帮助企业降低成本、提升效率。

相关产品

  • 容器镜像服务