开发者学堂课程【企业级运维之云原生与 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为镜像地址),就完成了镜像的部署。
Docker Registry
Registry 可以理解为仓库,它是用来保存所有创建好的镜像统一存储的位置。根据它的权限分为私有仓库 ( Private Registry ) 和公共仓库 ( Public Registry ) 。公共仓库不需要用户名验证,就可以 pull 拉取镜像,但不能 push 推送镜像,私有仓库需要验证用户名和密码后,才可以 pull 拉取和 push 推送镜像。
阿里云提供的容器镜像的仓库服务:ACR。
二、阿里云容器镜像服务 ACR
1. 阿里云容器镜像服务 ACR 优势
Ÿ 简单易用:
无需自行搭建及运维,一键创建镜像仓库 支持多地域,提供稳定快速的镜像上传、下载服务;
Ÿ 安全可控:
完善的镜像权限管理体系,确保镜像的分享安全,团队的协作便利提供镜像安全扫描功能,保证镜像漏洞可识别,漏洞级别可提示;
Ÿ 云产品间无缝集成:
整合容器服务,实现新应用镜像生成后的持续部署,整合云 Code CodePipeline,实现源代码到编译测试后,自动生成应用镜像;
2. Dockerhub
Ÿ 速度慢:镜像仓库服务器在大陆外,上传下载慢;
Ÿ 安全性低:没有镜像安全扫描功能;
Ÿ 衔接性差:webhook 触发器钩子设置繁琐,与其他产品和服务对接不方便。
3. 三种容器镜像方案对比
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. 拉取或推送镜像
Ÿ 镜像仓库地址格式
使用 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 类型
Ÿ 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。
免密组件 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 拉取镜像。