容器应用与集群管理
单容器实例能否支撑企业级应用? |
|||||||||||||||||||||
容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍容器集群相关的概念和技术,可以帮助您了解容器集群与编排技术的发展与应用,以及阿里云容器服务 ACK 和容器服务Serverless版 ACK Serverless 的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务Serverless版 ACK Serverless 构建和管理企业级应用。
课程目标学习完本课程后,您将能够:
课程场景提示:本课程为场景化教学,旨在帮助学员体验真实的应用场景。该场景讲述了技术新人小陈如何基于阿里云容器服务ACK/ACK Serverless搭建企业级网站应用。 此前,小陈已经采用容器尝试搭建了WordPress的网站应用。综合考量了应用稳定性、业务流量、版本功能迭代、规模灵活可变、架构持续与演进等因素后,公司决定基于容器技术来构建企业网站应用。现在,小陈需要搭建一套正式环境来部署企业网站。然而,单一的容器实例似乎无法满足上述企业级需求,受到导师大刘启发,小陈开始了对容器集群技术的探索和学习。 |
|||||||||||||||||||||
已经能够采用Docker在单容器上完成WordPress网站的构建、发布和运行了。经过公司评估后,计划让小陈把WordPress网站部署到生产环境上,正式上线运营。小陈觉得这个任务重大,由于缺少经验,决定找大刘请教。 小陈:师傅,我刚在容器上搭建过公司网站,现在要在生产环境中搭建公司网站,我感觉只用容器来搭建恐怕不行吧? 大刘:是会有些问题。设想一下,如果容器所在的宿主机出现故障,或者网站应用需要停机升级,又或者用户访问量超过了单个容器的处理能力,会怎样? 小陈:网站可能会无法提供服务,导致业务无法开展。应该如何解决呢? 大刘:一个好汉三个帮咯。这就需要运行多个相同应用的容器,并构成一个跨服务器的容器集群,对外提供统一的访问地址。如此,当一个容器发生异常或其应用需要升级时,由于其他容器未受影响,整个集群可以照常提供服务。容器集群可提供远超单实例的处理能力,还可以根据业务负载的变化,相应调整集群中的容器数量,实现业务的弹性。 小陈:明白了。那么,管理容器集群会很复杂吗? 大刘:这个问题问得好。随着容器技术的普及,容器集群技术也在飞速发展,现在已经很成熟了,容器集群的管理自动化、智能化程度很高,大大节省了运维人员的时间精力,比如我们常说的Kubernetes技术就是这样。 小陈:哦,好像听过这个名字,那我先去了解下容器编排技术。
容器集群的必要性单个容器的应用可以满足简单应用场景或者少量用户访问,但随着应用越来越复杂、访问量越来越大,单个容器的性能慢慢不支,就需要不断增加更多容器来提高应用的处理能力。但随着容器越来越多,就引发了一系列问题:
由于容器本质上是轻量级且短暂存在的,因此在生产环境中运行和管理大量容器,所需工作量巨大。遇到业务访问量特别大的时候,可能需要同时运行数百甚至数千个容器。如果手动管理这些容器,会显著增加管理复杂性。 所以,当大规模使用容器时,人工管理已经不可行,不得不考虑容器调度、部署、跨节点访问、自动伸缩等问题,这就需要容器集群技术了。
容器集群技术是如何发展的?容器出现后,容器集群技术是近些年容器技术演进发展的重点领域之一。容器集群发展的里程碑事件如下:
从容器集群发展历程中,我们看到了Mesos、Swarm和Kubernetes项目,这三个项目都是实现跨集群的应用级别容器部署、管理和运维的自动化平台,这种平台技术一般可以称为容器编排技术。 |
|||||||||||||||||||||
容器编排是什么?容器编排是指自动化容器的部署、管理、扩展和联网。通过容器编排,可以构建跨多个容器的应用服务、跨集群调度容器、扩展这些容器,并持续管理它们的健康状况。容器编排给容器技术带来了巨大的价值,包括:
一个容器编排平台的核心功能:首先可以自动生成容器实例,并且生成的容器可以跨服务器的,帮助提高可用性和性能,同时还有健康检查、容错、可扩展、网络、服务发现、滚动升级等功能,可以很好地解决需求与资源的匹配编排问题。 容器编排平台的市场竞争曾经非常激烈,主流的有三个:Docker Swarm、Mesos Marathon和Kubernetes。它们各有特点,但同时满足上面上述能力的,只有Kubernetes。 |
|||||||||||||||||||||
Kubernetes简化了集群范围内相关容器被共同调度管理的复杂性,能够相对容易地支持更强大、更复杂的容器调度算法。随着Kubernetes 越来越成熟,越来越受到市场青睐,最终成为了容器调度的事实标准。
思考:如何快速掌握容器编排技术?小陈学了一段时间的Kubernetes知识,发觉可以基于Kubernetes来搭建公司网站容器集群。但是Kubernetes涉及的概念太多,千头万绪,学习不得要领,还是找大刘请教。 小陈:师傅,我看了一些Kubernetes的资料。 大刘:哦?已经开始学习Kubernetes了,不错。学得怎么样? 小陈:Kubernetes概念好多、涉及很多知识点,看了一些材料,还是一头雾水。 大刘:嗯,这是正常的。从容器到Kubernetes,无论是技术的广度和深度都增加了很多。Kubernetes概念、组件、技术点很多,如果没领会Kubernetes的设计理念,那就是只抓住了皮毛,没有抓住灵魂,学习Kubernetes就会很困难。 小陈:什么是Kubernetes的设计理念呢? 大刘: Kubernetes是一个面向终态的编排系统。用户按照Kubernetes提供的带有编排逻辑的工作负载模版,向Kubernetes声明期望的应用容器的状态,随后Kubernetes会创建对应的工作负载。Kubernetes的调度器一直在监听各种请求,一旦发现创建了对应的应用容器,立马根据计算节点的情况与预定的策略,把容器调度到最适合的计算节点。计算节点也在监听是否有与自己有关的应用容器创建,如果有,立即拉取用户想要的镜像并运行,并向Kubernetes报告应用容器的状态。工作负载的控制器也在不断监听容器集群的状态是否与用户的预期一致,如果不一致,会按照工作负载控制器的编排逻辑进行处理。容器镜像都创建后,计算节点也会自动发现服务并进行业务负载。 小陈:听起来好神奇。感觉用户只要提交自己想要的工作负载的状态,Kubernetes就会自动工作,最后给到用户期望的。对吧? 大刘:的确如此。这就是Kubernetes强大的地方,基于面向终态的工作机制,可以轻松实现自动部署、服务发现、自动愈合、弹性伸缩等功能。 小陈:师傅一席话,真是让我豁然开朗。那么,怎么学习可以效率高一些呢? 大刘:抓住Kubernetes设计理念后,以单个容器为起点,了解单个容器如何走向一组容器,以及容器集群从创建到运行的整个过程,最好结合实际应用创建部署的过程来进行学习,理论结合实践,这样会快一些,你可以试试。 小陈:好的。我学习中有问题,我再来请教您吧。 大刘:没问题。
Kubernetes是什么?Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。想象一艘载满集装箱的轮船,轮船在大海上航行,把集装箱送到它们该去的地方。集装箱的英文单词是container,container的另一个翻译就是“容器”。 Kubernetes的英文原意是指用来操纵和控制船舶航向的船舵。大海航行靠舵手,借着这个寓意,Kubernetes希望成为运送集装箱的一个轮船,来管理这些集装箱,也就是管理这些容器。这也是为什么Kubernetes的Logo是一张船舵的图片。
Kubernetes 这个单词是希腊语,它的中文翻译是“舵手”或者“飞行员”。在一些常见的资料中也会看到“ks”这个词,也就是“k8s”,它是通过将中间8个字母“ubernete ”替换为“8”而形成的一个缩写。 在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要开发和运维人员进行复杂的手工配置和处理。
Kubernetes核心概念Kubernetes简称K8s,是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。 为什么需要Kubernetes?容器是打包和运行应用程序的好方式。在生产环境中,往往需要管理运行着应用程序的容器,并确保服务不会下线。如果一个容器发生故障,则需要启动另一个容器,类似这样的行为可以交由Kubernetes 来处理。Kubernetes 会满足用户的扩展要求、故障转移你的应用、提供部署模式等。 对于容器和Kubernetes的关系,为了便于理解,可以做个类比:Kubernetes就好比一个操作系统,而容器就好比操作系统上运行的一个进程。 Kubernetes中涉及到的关键名词包含以下这些,他们重要但很抽象,建议您先记住这些名词和概念,在本课程中我们将结合后续实际操作步骤为您展开介绍。
同时,在本课程最后一个课时《Kubernetes简介》中我们会对这些概念和Kubernetes的核心工作原理做进一步的梳理,以帮助您更好的理解。 |
|||||||||||||||||||||
如何低门槛的使用容器集群技术?通过大刘的指导,以及自身的不断钻研,小陈进步很快,已经初步掌握Kubernetes的基本概念和简单使用了。依小陈来看,搭建Kubernetes集群,维护集群的更新,是一件专业性比较强、且复杂繁琐的事情,有一定的学习门槛。 小陈:师傅,谢谢您的指点,我总算初步了解了Kubernetes。但问题是要基于容器集群搭建公司网站,Kubernetes平台建设和维护对我来说有点过于复杂了,好像不是很容易上手? 大刘:的确,Kubernetes对专业技能要求有一定的门槛,而且,仅仅搭建一套Kubernetes环境还不够,还需要有与之配套的监控、日志分析等功能。这些生态软件都自己建、自己管太费时间和精力了。其实可以选择云服务商提供的成熟的容器服务,如阿里云(Aliyun.com)的容器服务,它是基于Kubernetes云原生技术,根据云的特点进行优化改进,同时经过大量项目验证,可以直接使用,相比于自建Kubernetes,会轻松便捷许多 小陈:哦原来还有这种方式,那我先研究下阿里云的容器服务吧。 大刘:针对不同的用户需求场景,阿里云提供了几种类型的容器服务。先不着急下结论,你先了解一下,再来找我讨论。如何? |
|||||||||||||||||||||
阿里云容器服务ACK阿里云容器服务ACK(Alibaba Cloud Container Service for Kubernetes)是全球首批通过Kubernetes一致性认证的服务平台,提供高性能的容器应用管理服务,支持企业级Kubernetes容器化应用的生命周期管理,可以轻松高效地在云端运行Kubernetes容器化应用。 ACK具有如下特点:
ACK的产品形态阿里云容器服务ACK产品有三种形态:专有版Kubernetes、托管版Kubernetes、ACK Serverless。三个版本比较如下:
|
|||||||||||||||||||||
ACK三个版本的适用人群各有区分:
思考:选择容器服务的哪个版本更合适?小陈学习并了解了ACK的三个版本之后,心里已经初步有了答案。按照之前和大刘的约定,再找大刘讨论一下。 小陈:师傅,阿里云容器服务的三个版本我都了解过了,在我看来,三个版本都很成熟。对于我们来说,考虑到现在业务上线、发布都还忙不过来,暂时不会去考虑自己去探索Kubernetes的功能特性,没那个时间、也没那个精力,我觉得应该把精力集中在我们的业务开发和管理上。所以,我觉得选择ACK Serverless可能更合适。 大刘:赞同,这个选择很明智。我也觉得ACK Serverless完全够用,免运维,开箱可用,就冲这一点,就能解放我们的手脚,不再受底层基础设施的牵绊。况且,按照公司业务发展迅猛的势头,公司网站访问量必定会不断突破,还有棘手的营销活动带来的突发访问问题,这些都可以放心交给ACK Serverless处理。咱们可以把精力聚焦在自己的业务上。 小陈:是的。那我再深入学习下ACK Serverless,到后面开始搭建应用的时候,再来找师傅给我一些建议。 大刘:好的。
容器服务Serverless版 ACK ServerlessACK Serverless是阿里云推出的Serverless版Kubernetes容器服务。用户无需购买节点即可直接部署容器应用,无需对集群进行节点维护和容量规划,根据应用配置的CPU和内存资源量按需付费。ACK Serverless集群提供完善的Kubernetes兼容能力,同时降低了Kubernetes使用门槛,让用户更专注于应用程序,而不是管理底层基础设施。 ACK Serverless集群与ACK集群的对比
集群中的Pod基于弹性容器实例ECI运行在安全隔离的容器运行环境中。 对于开发者而言,还有一项新用户福利:满足条件的阿里云用户,可以通过阿里云试用中心免费领取容器服务Serverless版 ACK Serverless: 提示:具体领用规则以试用中心页面的《试用规则》说明为准。 您可以访问阿里云免费试用页面:https://free.aliyun.com/
延伸阅读:弹性容器实例ECI ACK Serverless底层基于弹性容器实例(ECI)来运行Pod,弹性容器实例ECI(Elastic Container Instance)是面向容器的无服务器弹性计算服务, 是跟 云服务器ECS 同级别的计算资源类产品,针对云原生时代的需求进行了针对性的改进和优化。
|
|||||||||||||||||||||
ACK Serverless主要特点 1、虚拟节点:ACK Serverless集群基于虚拟节点创建Pod,虚拟节点实现了Kubernetes与弹性容器实例ECI的无缝连接,让Kubernetes集群获得极大的弹性能力,而不必关心底层计算资源容量。 2、安全隔离:ACK Serverless集群中的Pod基于ECI运行在安全隔离的容器运行环境中,底层通过轻量级虚拟化安全沙箱技术完全强隔离,容器实例间互不影响;同时实例在调度时尽可能分布在不同的物理机上,进一步保障了高可用性。 3、Pod配置:支持原生的Kubernetes Pod功能,支持执行命令kubectl logs访问容器日志和执行kubectl exec进入容器,ECI支持多种规格配置的方式申请资源和计费。 4、应用负载管理:支持Deployment、StatefulSet、Job/CronJob、Pod、CRD等原生Kubernetes负载类型。 |
|||||||||||||||||||||
基于ACK Serverless搭建企业网站主要工作有哪些?准备开始基于ACK Serverless搭建WordPress企业网站了,小陈再去找大刘探讨,希望在网站搭建实践上能获得一些指导,少走一些弯路。 小陈:师傅。我马上要用ACK Serverless容器服务搭建公司网站了,这项任务的核心工作有哪些呢? 大刘:从大的方向上来看,主要是三项主要工作,1)创建ACK Serverless集群,并进行资源准备;2)在ACK Serverless集群上部署应用;3)对创建后的集群和应用进行查看和管理。 小陈:愿闻其详。 大刘:先说第一步。在阿里云控制台创建并生成ACK Serverless集群,然后要准备好部署应用所需要的资源,包括准备好WordPress网站所需的数据库、确定公司网站镜像可用、并准备好存放网站站点目录所需的持久存储。对了,你认为公司网站站点目录应该放到哪里? 小陈:应该放到容器集群之外吧,比如文件存储NAS? 大刘:是的,用NAS没问题。那么,接下来开始做第二步工作,即在ACK Serverless集群上部署应用。部署应用时要注意,创建的应用类型是无状态的,还要设置副本数量,副本数量需要根据前期评估的访问量进行设置。前面提到需要用NAS作为持久化存储,那么在ACK Serverless中要如何使用文件存储NAS呢? 小陈:首先需要创建PV和PVC,让PV要指向对应的NAS,才能把PVC给到应用集群使用。我理解对吗? 大刘:没错。是这样的。另外,还要创建服务,并开通负载均衡,让用户可以通过负载均衡访问服务。 小陈:明白了。到这里,第二步就做完了。后面还要做什么吗? 大刘:还有,在应用部署完成后,就开始第三步,应用集群的管理。从ACK Serverless控制台,熟悉并查看集群、无状态、容器组、服务等信息,查看容器日志,管理集群,还可以设置相应的监控和告警。 小陈:好的。 大刘:要注意一下,重点关注容器日志及监控情况。并持续观察一段时间容器组、日志、监控的信息及变化,了解信息中的含义,便于以后出现问题时,能知道在哪儿查,看什么信息。 小陈:好的,谢谢师傅!
构建和运行企业网站应用的主要步骤基于ACK Serverless搭建公司网站应用,一共分为三大步骤,分别是: 1)创建ACK Serverless集群和准备资源; 2)部署与配置网站应用; 3)应用运维与集群管理。 我们将基于这三个步骤逐一展开介绍。
基于ACK Serverless构建和运行网站应用的主要步骤
|
|||||||||||||||||||||
在这一步中,我们主要完成ACK Serverless容器集群的创建,同时准备好网站应用所需的NAS存储资源和数据库资源等。
创建ACK Serverless集群
在这里我们可以看到阿里云容器服务ACK的不同版本,本次任务我们选择ACK Serverless集群进行资源创建。 创建ACK Serverless集群
在这里我们可以看到阿里云容器服务ACK的不同版本,本次任务我们选择ACK Serverless集群进行资源创建。
容器集群的管理节点 大刘:考考你,之前应该学习过,Kubernetes是由控制平面的一个或多个管理节点(Master Node)和计算平面的多个工作节点(Worker Node)组成的。那么,刚创建的ACK Serverless集群相当于Kubernetes架构中的哪部分呢? 小陈:我理解ACK Serverless集群对应的应该是多个管理节点组成的控制平面吧。 大刘:没错。一个管理节点包含四个主要组件:API Server、Controller Manager、Scheduler 及 etcd,他们之间存在一定的协作关系,可以结合实践操作学习温顾一下。
准备资源
提前构建好WordPress网站应用的镜像,并上传到镜像服务ACR中。现在直接基于镜像部署应用,选择位于ACR仓库中的WordPress网站应用镜像。
ACR是阿里云容器镜像服务,可以用于镜像的托管和全生命流程管理。关于如何制作应用容器镜像及托管至ACR服务,可以回顾上一阶段的课程《基于容器搭建企业级应用》。
通过文件存储NAS的控制台,选择通用型NAS,配置NAS的协议类型NFS等参数,完成创建。
NAS创建完成后,记录其挂载点地址,后续ACK Serverless存储卷的挂载点将使用该地址。
WordPress网站的数据库独立于ACK Serverless集群,由于公司网站业务的访问存在明显的波动特征,为了让数据库也能匹配业务波动,我们选择了免运维、计算资源能自动弹性扩缩容的RDS MySQL Serverless实例。 至此,第一步集群创建和资源准备的工作就完成了。
|
|||||||||||||||||||||
在这一步中,我们主要基于ACK Serverless集群进行网站应用的部署,同时准备好网站应用所需的NAS存储资源和数据库资源等。
容器组与Pod小陈:好了,现在已经创建完ACK Serverless集群,接下来就可以开始部署网站应用了吧? 大刘:是的,不过在此之前,先巩固一下理论知识。考考你,我们的网站应用运行在容器里,那怎么来调度容器资源呢? 小陈:之前学Kubernetes的时候有一个Pod的概念,Pod里面包含一组容器,它是Kubernetes调度资源的原子单位。可是……Pod在哪儿呢,好像没看到? 大刘:没错,你看ACK Serverless界面的左侧,有一个标签叫容器组,它就对应Kubernetes中的Pod。 小陈:哦,原来是这样,多谢师傅提醒。 在操作系统中,进程并不是"孤苦伶仃"的运行,而是以进程组的方式、"有原则的"组织在一起运行,一个进程组内的进程可以共享文件和资源。Kubernetes借鉴了操作系统中"进程组" 的概念,并抽象出一个逻辑概念Pod。Pod是一组紧密关联的容器集合,也可以称为容器组。Pod是Kubernetes中操作和资源调度的基本单元。为了便于理解,我们可以做个类比,Kubernetes就是一个操作系统,就像Linux;Pod就是一个进程组,就像Linux线程组;容器就是一个进程,就像Linux线程。 容器组Pod的组成
在ACK Serverless中部署应用
ACK Serverless中的存储卷就就对应前面学习过的Kubernetes中的PV(Persistent Volume), PV是一种持久化的存储,独立于集群而存在,与Pod容器组的生命周期无关。 PV不能与Pod直接关联,而是用来和存储对接的,用于绑定后端存储,比如NAS文件系统就是一种常见的后端存储类型,写入PV的数据最终都是存放在后端存储上。Kubernetes通过PVC即存储声明的方式来管理和使用PV存储卷。PVC可以直接被Pod挂载,同时可以绑定PV,从而让Pod使用PV;PVC与挂载它的Pod隶属于同一个命名空间Namespace。下图表示了Pod与PVC、PV的关系。
【延伸阅读】工作负载 Workload 这里的工作负载就对应前面Kubernetes中工作负载 Workload的概念。工作负载通常有如下几种类型:
本次任务中采用无状态的工作负载类型来承载网站应用。 a)设置应用基本信息:设置应用名称、副本数量、类型为无状态等。
本次采用无状态工作负载部署应用,选择default的命名空间Namespace。通常,我们会构建开发、测试、准生产、生产等多套应用环境,每套环境中都会创建一个ACK Serverless集群,几套环境中的无状态工作负载、容器组、服务名字都相同,而ACK Serverless集群中要求这些资源名称要唯一。这就需要这些环境创建时,通过命名空间进行资源的有效隔离。 这里的“副本数量”其实就对应Kubernetes里ReplicaSet的副本数,是因为无状态工作负载(Deployment)是通过控制ReplicaSet,来实现对Pod数量的控制。 b)容器配置:设置镜像名称、镜像Tag、所需资源的CPU和内存、新增端口并指定容器端口、数据卷增加云存储声明并指定容器路径;
这里选择的镜像名称,就是我们已经提前准备好的,存放于ACR镜像服务中的WordPress公司网站应用的镜像。 下图增加PVC,这里PVC也是前面准备好的,通过PV绑定了文件存储的挂载点。 c)高级配置:创建服务,类型为负载均衡,外部流量策略为Cluster,设置服务端口并映射到容器端口。这里的服务就对应前面提到过的Kubernetes中的Service。
【延伸阅读】容器集群的访问 Service解决了服务发现和负载均衡的问题,但外部用户直接访问Service并不是最佳的方案,原因如下:
为了解决上述问题,这里通过搭建外部负载均衡,并将流量转发到Service上来解决。Service与负载均衡搭配后的访问流程如下:
容器集群的工作(计算)节点 大刘:再问你一个问题,之前学习过,Kubernetes由管理节点和工作节点构成。但你注意到了吗,在刚刚创建ACK Serverless集群以及部署应用的过程中,并没有直接创建工作节点。 小陈:是的呢,我也发现了,这是为什么? 大刘:这是因为我们选择了ACK Serverless服务,ACK Serverless是容器服务的Serverless版本,Serverless的优点就是无需购买节点、无需对集群进行节点维护和容量规划,可以直接使用。ACK Serverless会按需、自动的创建好工作节点资源,所以我们不需要手动创建工作节点。 小陈:原来如此,确实方便了很多呀。 我们先来回忆一下工作节点的知识,工作节点是Kubernetes的工作负载节点,主要包含三个组件:kubelet、kube-proxy、Container Runtime。
ACK Serverless是容器服务Serverless版,无需购买节点即可直接部署容器应用,无需对集群进行节点维护和容量规划。ACK Serverless通过虚拟节点直接管理ECI,每个ECI对应一个Pod,而不是像自建Kubernetes那样需要采用ECS作为工作节点。ACK Serverless与自建Kubernetes工作节点的架构比较如下:
配置网站应用信息
创建数据库账号,并赋权数据库账号;获取数据库的账号信息,配置到应用配置中;最后,完成网站应用的安装与配置。
|
|||||||||||||||||||||
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)