在这一步中,我们主要基于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中部署应用
- 创建存储卷,指向之前创建的NAS,同时创建对应的存储声明,提供给容器组(Pod)使用。
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的关系。
- 在ACK Serverless控制台工作负载的无状态标签下,使用镜像创建无状态应用。
【延伸阅读】工作负载 Workload
这里的工作负载就对应前面Kubernetes中工作负载 Workload的概念。工作负载通常有如下几种类型:
- 无状态(Deployment):表示对Kubernetes集群的一次更新操作,用于运行完全独立、功能相同应用的场景。
- 有状态(StatefulSet):支持应用部署、扩容、滚动升级时有序进行。如使用有状态来管理使用了持久存储的应用。
- 任务(Job):它创建出来的Pod只要完成任务就立即退出,用于执行一次性任务。可以使用Job以并行的方式运行多个 Pod。
- 定时任务(CronJob):它创建的Pod会周期性的执行,用于执行周期性任务。
- 自定义资源(Custom Resource Definitions,CRD):可以通过CRD添加第三方工作负载资源。
本次任务中采用无状态的工作负载类型来承载网站应用。
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提供的是IP+端口的访问服务,需要访问对应的NodeIP:Port,对于已经习惯了使用域名的用户不是特别友好。
- 由于NodePort的访问方式,需要指定Node节点的端口,一旦服务多起来,多个端口难以管理。
- Service本身也可能被销毁重建,从而使得Service的地址也会发生变化。
为了解决上述问题,这里通过搭建外部负载均衡,并将流量转发到Service上来解决。Service与负载均衡搭配后的访问流程如下:
- 完成应用的创建,ACK Serverless将先后完成无状态工作负载和服务的创建。
容器集群的工作(计算)节点
大刘:再问你一个问题,之前学习过,Kubernetes由管理节点和工作节点构成。但你注意到了吗,在刚刚创建ACK Serverless集群以及部署应用的过程中,并没有直接创建工作节点。
小陈:是的呢,我也发现了,这是为什么?
大刘:这是因为我们选择了ACK Serverless服务,ACK Serverless是容器服务的Serverless版本,Serverless的优点就是无需购买节点、无需对集群进行节点维护和容量规划,可以直接使用。ACK Serverless会按需、自动的创建好工作节点资源,所以我们不需要手动创建工作节点。
小陈:原来如此,确实方便了很多呀。
我们先来回忆一下工作节点的知识,工作节点是Kubernetes的工作负载节点,主要包含三个组件:kubelet、kube-proxy、Container Runtime。
- kubelet:负责管理节点上容器的创建、删除、启停等任务,与管理节点通信。
- kube-proxy:负责Kubernetes服务的通信及负载均衡服务。
- Container Runtime:负责容器的基础管理服务,接收kubelet组件的指令。
ACK Serverless是容器服务Serverless版,无需购买节点即可直接部署容器应用,无需对集群进行节点维护和容量规划。ACK Serverless通过虚拟节点直接管理ECI,每个ECI对应一个Pod,而不是像自建Kubernetes那样需要采用ECS作为工作节点。ACK Serverless与自建Kubernetes工作节点的架构比较如下:
配置网站应用信息
- 获取应用访问地址,通过浏览器访问。
- 访问应用完成配置:创建数据库账号,给数据库账号赋权,初始化WordPress页面配置,并访问网站管理等。
创建数据库账号,并赋权数据库账号;获取数据库的账号信息,配置到应用配置中;最后,完成网站应用的安装与配置。