企业级运维之云原生与Kubernetes实战课程 - 第二章第1讲 阿里云容器镜像服务

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 容器镜像仓库介绍阿里云容器镜像服务ACR优势ACR基础操作ACR使用实践常见问题

企业级运维之云原生与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为镜像地址),就完成了镜像的部署。

image.png

 

Docker Registry

 

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

 

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

 

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

 

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

 

  • 简单易用:

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

 

  • 安全可控:

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

 

  • 云产品间无缝集成:

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

 

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查看,包含了镜像仓库的地址、authbase64加密后用户名和密码);

 

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,然后进行权限校验才能pushdocker 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创建ConfigMapkubectl apply -f xxxxxxconfigmapyaml文件)
  • 查看ConfigMapkubectl get cm xxxxxxconfigmap服务名) -o yaml

 

e.  使用ConfigMap

 

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

 

yaml文件示例:

 

apiversion: v1

kindPod

metadata:

   nametest-pod

spec:

containers

   -name: test-container

   image: k8s.gcr.io/busybox

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

   envFrom:

   -configMapRef:

   nametest-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 IDAccessKey Secret的权限进行拉取;
  • 通过配置RAM AssumeRole权限,使用其他用户的权限进行拉取。RoleARN是角色的全局资源描述符,用来指定具体角色。比如,某个云账号下的 devops角色的ARN为:acsram::1234567890123456role/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
相关文章
|
3月前
|
存储 运维 关系型数据库
开源新发布|PolarDB-X v2.4.1 增强企业级运维能力
PolarDB-X 是阿里云推出的云原生分布式数据库,自2021年10月开源以来,持续迭代升级,至2024年4月发布的v2.4.1版本,重点增强了企业级运维能力,如无锁变更、物理扩缩容、数据TTL等,提供金融级高可用、透明分布式、HTAP一体化等特性。PolarDB-X 支持集中式和分布式一体化形态,兼容MySQL生态,适用于金融、通信、政务等行业。
|
3月前
|
存储 Cloud Native 块存储
EBS深度解析:云原生时代企业级块存储
企业上云的策略,从 Cloud-Hosting 转向 Serverless 架构。块存储作为企业应用上云的核心存储产品,将通过 Serverless 化来加速新的计算范式全面落地。在本话题中,我们将会介绍阿里云块存储企业级能力的创新,深入解析背后的技术细节,分享对未来趋势的判断。
240 2
|
6月前
|
运维 Devops
阿里云云效操作报错合集之创建镜像仓库时遇到报错,是什么导致的
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
阿里云云效操作报错合集之创建镜像仓库时遇到报错,是什么导致的
|
6月前
|
存储 运维 数据安全/隐私保护
如何高效利用阿里云Docker镜像仓库管理您的容器镜像
如何高效利用阿里云Docker镜像仓库管理您的容器镜像
|
6月前
|
运维 监控 安全
构建高效自动化运维系统:DevOps在企业级应用的实现路径
【7月更文挑战第54天】在当今IT领域,DevOps作为一种文化和实践,旨在弥合开发与运维之间的鸿沟,以实现更快速、更可靠的产品交付。本文将深入探讨在企业环境中如何构建一个高效的自动化运维系统,不仅涵盖理论框架,还包括具体实施步骤和最佳实践。通过持续集成(CI)、持续部署(CD)、基础设施即代码(IaC)等关键概念的融合运用,文章旨在为读者提供一个清晰的指导,以便在其组织中落实DevOps策略,并实现运维效率的显著提升。
|
6月前
|
运维 Kubernetes Go
"解锁K8s二开新姿势!client-go:你不可不知的Go语言神器,让Kubernetes集群管理如虎添翼,秒变运维大神!"
【8月更文挑战第14天】随着云原生技术的发展,Kubernetes (K8s) 成为容器编排的首选。client-go作为K8s的官方Go语言客户端库,通过封装RESTful API,使开发者能便捷地管理集群资源,如Pods和服务。本文介绍client-go基本概念、使用方法及自定义操作。涵盖ClientSet、DynamicClient等客户端实现,以及lister、informer等组件,通过示例展示如何列出集群中的所有Pods。client-go的强大功能助力高效开发和运维。
534 1
|
6月前
|
运维 Kubernetes 监控
自动化运维:使用Python脚本实现系统监控云原生技术实践:Kubernetes在现代应用部署中的角色
【8月更文挑战第31天】在现代IT运维管理中,自动化已成为提高效率和准确性的关键。本文将通过一个Python脚本示例,展示如何实现对服务器的自动监控,包括CPU使用率、内存占用以及磁盘空间的实时监测。这不仅帮助运维人员快速定位问题,也减轻了日常监控工作的负担。文章以通俗易懂的语言,逐步引导读者理解并实践自动化监控的设置过程。 【8月更文挑战第31天】本文旨在探索云原生技术的核心—Kubernetes,如何革新现代应用的开发与部署。通过浅显易懂的语言和实例,我们将一窥Kubernetes的强大功能及其对DevOps文化的影响。你将学会如何利用Kubernetes进行容器编排,以及它如何帮助你的
|
6月前
|
弹性计算 Docker 容器
创建阿里云镜像仓库imagePullSecrets
创建阿里云镜像仓库imagePullSecrets
|
6月前
|
运维 Kubernetes Cloud Native
Kubernetes云原生问题之在托管Kubernetes服务中云服务商和用户的运维责任划分如何解决
Kubernetes云原生问题之在托管Kubernetes服务中云服务商和用户的运维责任划分如何解决
49 0
|
2月前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。

相关产品

  • 容器镜像服务
  • 容器服务Kubernetes版