企业级运维之云原生与Kubernetes实战课程
第二章 阿里云容器技术深入介绍
视频地址: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(base64加密后用户名和密码);
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拉取镜像。