1.?容器?????Դ??
2.cinder、glance容器镜像制作简介(一)
3.云原生DevOps落地方案
4.一次NPM前端项目的云源CI-Build速度优化
5.OpenShift简介
6.Docker 这九个不同的应用场景,你都用到了吗?
?码容?????Դ??
操作系统作为计算机系统的核心软件,管理和控制硬件与软件资源,容器为用户和应用程序提供高效、云源统一且安全的码容点云处理源码运行环境。Linux,容器作为一个开源、云源跨平台的码容多用户、多任务操作系统,容器因其高度定制性、云源稳定性和安全性,码容广泛应用于服务器、容器云计算、云源物联网与嵌入式设备等领域。码容Linux 的发展得益于庞大的社区支持,各种发行版满足了不同用户与场景的需求。
Linux 发展的起源可以追溯到 年 UNIX 系统的诞生,UNIX 成为早期计算机科学与学术界的重要操作系统。然而,UNIX 作为闭源商业产品,限制了其传播与修改。为响应这一需求,理查德·斯托曼创立了 GNU 项目,旨在开发一个完全自由的开源操作系统。 年,Linux 内核由 Linus Torvalds 开发,成为自由软件,通过互联网共享,吸引了大量开发者与贡献者的关注,逐步发展成为稳定、高性能的操作系统核心。
随着 Linux 的发展,形成了基于开源与自由软件原则的现代操作系统。它在服务器领域广泛应用,成为互联网基础设施的关键组成部分,同时在个人计算机与移动设备领域也有应用,如 PC、笔记本、智能手机与平板电脑等。多样化的发行版,如 Ubuntu、Debian、CentOS、Fedora 与 openSUSE 等,提供了不同的用户界面、软件包管理工具与配置选项,以满足不同用户需求。
今天,Linux 成为最受欢迎和广泛使用的开源操作系统之一,展示了强大的稳定性、安全性和可定制性,成为技术创新的驱动力。Linux 社区开发者与用户持续努力改进与推动 Linux 发展,使其不断进步与演化。
CentOS,一个基于 RHEL 的社区发行版,因免费与兼容性而在服务器领域赢得了广泛用户与市场份额。然而,全套源码代挂 年底,CentOS 宣布停止支持,CentOS Linux 8 将于 年底结束支持,CentOS 7 将在其生命周期结束后( 年 6 月 日)停止维护。这一消息震惊了 Linux 社区。CentOS 原本是社区项目,后被红帽公司收购,作为 RHEL 的下游分支,最终定位模糊,使得 CentOS Linux 终将落幕。
RHEL 限制访问源代码的决定在 年引发轰动。Red Hat 宣布不再将 RHEL 的源代码推送到 git.centos.org,只将 CentOS Stream 作为 RHEL 相关源代码发布的唯一仓库。这一决定影响了基于 RHEL 的发行版,如 AlmaLinux、Rocky Linux 与 Oracle Linux 等,这些发行版以与 RHEL 1:1 二进制兼容为目标或特色,无法直接获取 RHEL 源代码,面临挑战与机遇。
Linux 与 Windows 的主要区别在于 Linux 的自由软件特性与源代码级别的可定制性,而 Windows 作为封闭软件,具有不透明的架构,图形界面反应速度较快,但潜在的安全风险与维护成本较高。Linux 在高性能、高效率或界面体验方面满足用户需求,而 Windows 的封闭性则导致其核心架构的混合性质,可能带来系统故障风险。
CentOS Linux 终止与 RHEL 限制源代码访问对操作系统格局产生了影响。对于 RHEL 而言,这一决定可能带来正反两面的影响,包括吸引用户转向其商业订阅服务,但也可能失去市场份额和用户。对于其他 Linux 发行版,这一决定带来了机遇与竞争,可能吸引原本使用 CentOS Linux 的用户,同时面临市场竞争与技术创新的压力。云计算与容器化技术的兴起改变了操作系统使用方式,云计算服务提供商选择定制操作系统以满足特定需求,而容器化技术(如 Docker)提供轻量级、可移植与可扩展的应用部署方式,减少了对操作系统的依赖,推动了操作系统的新格局发展。
Docker 容器化技术的兴起助力操作系统新格局的形成。它提高资源利用率,支持跨平台部署,简化环境配置,提供弹性扩展能力,支持云原生与微服务架构,同时增强了安全性与隔离性。Docker 的发展与应用推动了操作系统与容器化技术的紧密结合,共同推动技术生态系统的进步。
cinder、glance容器镜像制作简介(一)
在天翼云底座3.0架构中,cinder和glance等服务以前采用基于package的管理方式,这导致了依赖软件包的零散和升级复杂。为提升部署效率和维护性,我们转向了容器化管理。ott视频源码下载通过升级容器镜像,服务升级变得更便捷,用户无需感知,失败时回滚操作快速。容器化的优势在于部署简单,管理灵活,以及通过升级镜像实现服务的原子化升级,最大程度地减少对整个服务链路的影响。
在容器化部署的两种主流实现路径中,kolla-ansible直接打包openstack组件为容器,利用ansible和Docker进行部署;openstack-helm则先制作镜像,然后通过helm工具在k8s集群上部署。在天翼云4.0架构中,我们基于loci项目构建cinder和glance的容器镜像,loci是个用于构建openstack服务镜像的工具,支持如cinder、glance等组件。
Docker镜像构建的核心是Dockerfile,它通过一系列指令定义镜像的构建过程,每一层都包含定制的配置。镜像由多层构成,读写层在容器运行时进行修改,删除容器则会清除读写层的改动。loci项目提供不同基础镜像支持,如centos7、ubuntu等,我们在此基础上扩展支持ctyunos系统。
loci构建镜像的过程包括:首先,基于ctyunos Dockerfile构建基础镜像;然后,根据scripts目录下的脚本,安装必要的rpm包和pip包,克隆项目源码,以及清理不必要的包。下一节将详细介绍容器镜像制作的具体流程,敬请关注。
若想深入了解云计算,可访问天翼云官方网站开发者社区,那里有丰富的技术资源和专家讨论区。
云原生DevOps落地方案
DevOps简述
顾名思义,DevOps是开发(Development)与运维(Operations)的融合,旨在打破开发与运维之间的隔阂,促进开发、运营和质量保障(QA)等部门之间的交流与协作。通过小规模、快速迭代的方式开发和部署产品,以便快速应对客户需求的变化。DevOps强调开发运维一体化,强化团队间的沟通与快速反馈,实现快速交付产品和提高交付质量。
DevOps并非新工具集,而是一种思想、一种文化,旨在改变传统开发运维模式,采用最佳实践。通常通过CI/CD(持续集成、持续部署)自动化工具和流程实现DevOps理念,以流水线形式改变开发人员和测试人员发布软件的方式。随着Docker和Kubernetes(以下简称k8s)等技术的工厂缓存源码分析普及,容器云平台基础设施不断完善,加速了开发和运维角色的融合,使云原生的DevOps实践成为未来趋势。以下将基于混合容器云平台详细讲解云原生DevOps的落地方案。
云原生DevOps特点
DevOps是PaaS平台中关键功能模块,包括以下重要能力:支持代码克隆、编译代码、运行脚本、构建发布镜像、部署yaml文件以及部署Helm应用等环节;支持丰富的流水线设置,如资源限额、流水线运行条数、推送代码以及推送镜像触发流水线运行等,提供端到端高效流水线能力;提供开箱即用的镜像仓库中心;提供流水线缓存功能,可自由配置整个流水线或每个步骤的运行缓存,在代码克隆、编译代码、构建镜像等步骤利用缓存缩短运行时间,提升执行效率。
云原生DevOps实现
简单来说,云原生DevOps内部功能设计主要通过k8s提供的自定义controller功能实现,基本逻辑是根据业务需求抽象出多个CRD(Custom Resource Definition,自定义资源对象),编写对应的controller实现业务逻辑。为了实现CI/CD功能,抽象出多个CRD对象,如下所示:
我们知道配置流水线通常需要对接代码仓库,包括仓库地址、仓库授权信息等,因此需要3个CRD对象来记录源代码仓库的相关信息。
设计好DevOps中与仓库相关的3个CRD对象后,需要再定义3个CRD对象来描述流水线相关的信息。
pipeline步骤功能有多种类型,包括运行脚本、构建发布镜像、发布应用模板、部署YAML、部署应用等。为了提供这些功能,采用Jenkins作为底层CI/CD工具,docker registry作为镜像仓库中心,minio作为日志存储中心等。这些服务运行在pipeline所在项目的命名空间下。综上,设计的CI/CD系统功能实现逻辑如下:
如上,第一次运行流水线时,系统会在数据面k8s中部署Jenkins、minio等基础工具的服务,同时在管理面启动一个goroutine,实时同步数据面中流水线的作业状态到管理面的CRD对象中。当触发pipeline执行逻辑时,会产生一个pipelineExecution CRD对象,记录本次运行pipeline的状态信息。当goroutine(syncState)发现有新的执行实例产生时,会通过Jenkins引擎接口启动Jenkins server端流水线作业的运行,Jenkins server端收到信息后会启动单独的一个Jenkins slave pod进行流水线作业的响应。同时,goroutine(syncState)会不断通过引擎接口轮询pipeline执行实例的邹城网站建设源码运行情况,更新pipelineExecution CRD的状态(运行成功或失败等)。当pipeline执行实例发生状态变化时,会触发其对应的controller业务逻辑,通过Jenkins引擎接口与Jenkins server通信进行不同操作,如暂停流水线的运行、运行完毕清除不需要的资源等。当流水线作业发生状态变化时,又会通过goroutine(syncState)更改pipeline执行实例的状态,进而触发对应的controller业务代码进行不同业务逻辑处理,循环往复,直至流水线运行结束。这就是整个pipeline执行时的一个逻辑流程。
CRD定义
以下是详细的CRD结构体讲解,敏感信息使用了’*‘代替。
pipelineSetting:该结构体保存着整个项目下所有pipeline的运行环境信息,如CPU/内存资源限额、缓存路径以及流水线运行的最大并行个数等,不同功能的配置信息保存在不同的CRD下。
pipeline:该结构体记录着流水线的配置元信息,如该流水线对接哪个项目代码、与仓库通信的认证信息以及上次该流水线运行的结果等。如下图所示:
详细的结构字段讲解如下:
pipelineExecution:流水线执行实例,每当流水线运行一次,会产生一个该对象记录着流水线的执行结果等信息。如下图所示:
详细的结构字段讲解如下:
至此,我们完成了流水线功能的基础对象定义。
controller实现
除了抽象出对应的CRD外,还需要编写对应的controller代码实现对应的业务逻辑,如当pipeline运行时,需要产生pipeline执行实例,并实时同步其运行的状态信息等。
当触发流水线执行逻辑时,系统会根据pipeline CRD对象和该流水线对应的代码仓库中的配置文件(.cubepaas.devops.yml)产生一个pipelineExecution CRD对象,这时会触发pipelineExecution对应的controller运行业务逻辑。以下只摘取重要的代码逻辑,如下所示:
其中,deploy函数的逻辑是第一次运行时通过判断数据面中是否存在pipeline的命名空间,如果存在就代表基础资源已经配置完成,直接走reconcileRb函数,该函数的逻辑见下面;如果不存在,就会在数据面中初始化必要的基础资源,如pipeline命名空间、Jenkins、docker、minio服务、配置configMap、secret等。
reconcileRb函数的功能是遍历所有namespace,对其调谐rolebindings,目的是让pipeline serviceAccount(jenkins)对该project下的所有namespace具有所需的操作权限,这样Jenkins server才能够在数据面中正常提供CI/CD基础服务。
goroutine(syncState)的代码逻辑比较简单,当产生新的pipeline执行实例时就会启动Jenkins server端流水线作业的运行并实时同步其运行状态到pipeline执行实例中。代码逻辑如下:
缓存支持
云环境下的流水线是通过启动容器来运行具体的功能步骤,每次运行流水线可能会被调度到不同的计算节点上,这会导致一个问题:容器运行完不会保存数据,每当流水线重新运行时,又会重新拉取代码、编译代码、下载依赖包等,失去了本地宿主机编译代码、构建镜像时缓存的作用,大大延长了流水线运行时间,浪费了很多不必要的时间、网络和计算成本等。为了提高用户使用流水线的体验,加入支持缓存的功能。
为了让流水线具有缓存功能,需要在流水线运行时加入持久化数据的能力。首先想到的是k8s提供的本地持久化存储(即Local Persistent Volume,以下简称Local PV),或依赖远程存储服务器来提供持久化,远程存储效率依赖于网络,并且还需要保证远程存储高可用,这会带来很多复杂性,也一定程度上失去了缓存的作用。综合考虑,我们选择本地存储实现缓存,但是k8s提供的Local PV是需要和节点绑定在一起的,也就是说一旦流水线调度到某个节点上运行,那么下次运行还会绑定到该节点运行,虽然实现了缓存的作用,但是也造成了流水线每次只能在该节点上运行,如果有多条流水线同时跑,可能会导致该节点资源耗尽或者缓存冲突,失去了云平台本身根据资源使用情况平衡调度的特性。
因此,为了平衡缓存与调度间的关系,我们采用了挂载hostPath Volume方式,这样依托于k8s强大的容器调度能力,我们可以同时运行很多条流水线而不用担心资源耗尽或缓存冲突的问题,但是流水线每次运行时可能会被调度到不同的节点上,如果当前节点没有运行过流水线,则起不到缓存的作用。那么如何解决hostPath Volume缓存与调度间的尴尬关系呢?我们巧妙地利用了k8s提供的亲和性调度特性,当流水线运行时我们会记录当前运行节点,下次运行时通过设置Pod的亲和性优先调度到该节点上,随着流水线运行次数越来越多,我们会得到一个运行节点列表。如下所示:
执行实例调度信息会保存到pipeline CRD对象中,每次运行流水线时,系统会根据节点列表设置Pod的亲和性,默认我们会取最近运行流水线的个节点,原则是最近运行流水线的节点优先级越高。代码如下:
创新性的“Hostpath Volume + 亲和性调度”缓存设计方案,不仅实现了流水线的并发性缓存功能,而且实现复杂度低,可自由配置任一阶段、步骤的缓存开关以及缓存路径。无缓存与有缓存运行的对比如下图所示,可见通过缓存加速大大提高了流水线的运行效率。
HCaaS DevOps使用
以上设计在HCaaS平台上得到实现()。在HCaaS控制台上点击DevOps标签,通过代码授权后,即可通过UI界面轻松地编辑流水线,也可通过编辑yaml文件配置具体的功能步骤,如图所示:
通过点击查看日志,你可以看到pipeline各个阶段运行的详细日志信息,如下图所示:
注意首次运行pipeline时系统会从网络下载Jenkins、docker、minio以及其他pipeline-tools镜像,请稍作等待。如果长时间未运行,请查看网络是否有问题。
一次NPM前端项目的CI-Build速度优化
基础设施部分,项目部署在中国的亚马逊云,使用了 AWS 的容器服务(ECS)、容器注册表(ECR)、对象存储(S3)与弹性计算(EC2)。源码管理采用 Atlassian 的 Bitbucket,一个基于 Git 的代码仓库。CI/CD 通过 Jenkins 实现,使用插件 pipline 进行维护。项目使用 Node.js 语言进行开发,代号为 salmon。项目打包与发布采用 NPM 和 Docker。
流程分为标准发布流程。在收到同事 A 和 B 的反馈后,对 CI/CD 过程进行了深入分析。主要分为三个关键步骤:编译代码(stage{ 'Build'})、推送到仓库(stage{ 'Publish'})和运行服务(stage{ 'Deploy'})。在分析“编译”步骤时,发现 npm run build 占用了最多时间,约为 9 分钟。进一步分析发现,容器化 CI 流程的基础设施为纯净、无状态的环境,这与传统基础设施存在差异,可能是速度差异的关键。
为复现非容器化构建流程,使用 EC2(2 核 8GB)进行测试。结果显示,已 build 过的项目目录进行后续 build 耗时显著减少,原因可能是生成了编译缓存文件。对比发现,删除 .next 目录后,项目容量减少 MB,定位到编译后的 node_modules/ 目录下存在 .cache 文件夹,经过多次调试验证,build 前后差异 MB 文件的确位于 .cache 目录中。将 .cache 内容应用到已执行 npm install 未 build 的目录,构建速度得到提升。
为优化缓存,考虑维护线上缓存池,使用 AWS S3 服务进行目录同步。在 EC2 测试机上运行结果良好。对 Dockerfile 进行改造,添加了 AWS CLI 工具以操作 S3。验证优化效果后,Jenkins blue-ocean 统计显示,提速效果明显。实施线上缓存池后,对其他项目进行了评估,发现无法广泛应用此优化策略。虽然工具相对简单,但在优化过程中取得的工程逻辑与解决问题的方法论,对项目和读者都具有启发意义。
OpenShift简介
OpenShift是一个提供自动化流程的容器平台,与Kubernetes相比,它更加专注于DevOps和管道方法。在应用部署方面,OpenShift的自动化流程更为丰富,用户只需创建一个应用程序和一个项目即可。
在应用管理方面,OpenShift的web控制台具有许多功能,能够满足SRE和运营团队管理其工作负载的需求。对于节点配置,OpenShift使用Ansible playbook和安装程序将新的虚拟机引入集群,这比Kubernetes的VM加入集群方式更为简便。
在安全性方面,OpenShift支持通过企业客户合作建立最佳安全实践,并且用户只需要添加用户就可以处理类似命名空间的隔离空间和创建不同的安全策略。此外,OpenShift支持容器运行需要root用户权限。
使用OpenShift的原因在于,它可以在内部网络中构建多租户云平台,提供应用开发、测试、部署、运维的各项服务。它实现了高度自动化,满足应用持续集成及持续交付和部署的需求,并且满足企业及组织对容器管理、容器编排的需求。
开发人员只需编写应用程序并将其部署到集群中,而OpenShift会自动创建项目和应用程序。OpenShift提供Web控制台和CIL,以及各种不同类型的源代码模板,帮助开发人员快速部署和测试应用程序。
OpenShift有三个主要版本,支持多种不同的Linux操作系统,包括RedHat Enterprise Linux和Centos。
从技术堆栈的角度分析,OpenShift自底而上包含了基础架构层、容器引擎层、容器编排层、PaaS服务层和界面及工具层。
基础架构层为OpenShift平台提供运行环境,支持物理机、虚拟机、基础架构云或混合云。操作系统层面支持多种Linux操作系统。
容器引擎层以Docker作为容器引擎,容器编排层使用Kubernetes作为容器编排引擎。
PaaS服务层提供丰富的开发语言、框架、数据库和中间件支持,用户可以在OpenShift平台上快速部署和获取服务。
界面及工具层提供Web控制台、CIL、模板、Jenkins和管道等工具,以实现自动化部署流程。
OpenShift的核心组件包括主控节点、Master节点、Node节点、Project和Namespace、Pod、Service、Router与Route、Persistent Storage和Registry。
Master节点管理集群状态,Node节点运行和维护Docker容器。Project和Namespace用于管理对象的命名空间。Pod相当于容器集合,Service提供持久连接,Router与Route用于管理集群内外请求。Persistent Storage提供持久化存储。Registry用于存放构建完成的镜像。
Source to Image(S2I)流程允许企业标准化和自动化容器构建,提高软件交付效率。此外,OpenShift提供了Eclipse插件等开发和管理工具集,为用户提供良好的体验和DevOps流程。
Docker 这九个不同的应用场景,你都用到了吗?
Docker 是一个开源的容器引擎,能够为任何应用创建轻量级、可移植、自给自足的容器。开发者与系统管理员可以在笔记本上编译测试通过的容器,批量部署于生产环境,包括虚拟机、裸机、OpenStack 集群、云端、数据中心等基础应用平台。容器完全使用沙箱机制,相互之间无任何接口。本文将介绍 Docker 的九种用法,以提升生产力。
1. 本地依赖(Local Dependency)
在本地系统快速尝试 Magento 或使用 MySQL?或是尝试大部分开源项目?使用 Docker 可以节省大量时间。它能提升开发效率,快速搭建开发环境。
2. 搭建环境(Build Environment)
如果希望构建源码,但发现没有合适的环境,使用 Docker 是个不错的选择。它能将运行环境和配置放入代码中,部署时可在不同环境中使用,降低硬件要求与应用环境之间的耦合度。
3. 微服务(Microservices)
微服务架构将一个整体式应用拆分为松耦合的单个服务。使用 Docker 将每个服务打包为镜像,并用 docker-compose 模拟生产环境。虽然实践初期可能费时费力,但长远来看,将产生巨大的生产力。
4. 自动测试(Automated testing)
如何编写自动化的集成测试用例?在 Docker 中运行测试用例,将测试用例与镜像紧密运行,编写测试用例时将具有优势。
5. 部署过程(Deployment process)
使用 Docker 镜像进行自我部署。许多主流的主机提供商支持托管 Docker,只需设置 Docker,并在指定端口运行镜像。
6. 持续部署(Continuous Deployment)
Docker 适合持续集成/持续部署,使用 Docker,持续部署变得简单,新镜像将重新开始。
7. 多租户环境(Multi-tenancy)
Docker 在多租户应用中,可以避免关键应用的重写。使用 Docker 为每个租户的应用层多个实例创建隔离环境,简单且成本低廉。
8. 来自一台机器的多个 APP(Multiple apps from one machine)
Docker 可管理单台机器上的所有服务。使用文件夹挂载为每个基于数据的 Docker 镜像保留数据。
9. 扩容 QPS(Scaling QPS)Docker 通过创建另一个容器轻松进行水平扩展。在遇到高峰流量时,Docker 可帮助解决问题,只需添加更多机器并增加负载均衡器背后的容器数量。
容器化|在 S3 备份恢复 RadonDB MySQL 集群数据
本文将演示如何使用RadonDB MySQL Kubernetes集群进行备份和恢复数据操作,重点关注备份数据至S3存储以及从S3备份恢复集群数据的具体步骤。
首先,需准备一套运行良好的Kubernetes集群。接着,搭建RadonDB MySQL集群。
备份流程分以下几步:下载RadonDB MySQL源码,安装Operator,并创建Deployment。配置备份信息,需提前准备Kubernetes Secret资源信息,针对青云云平台的qingstor对象存储,操作视频提供详细指引。登录青云云平台官网,创建API密钥和S3存储桶,然后创建Kubernetes Secret资源,存放S3对象存储相关信息。
继续进行,将备份数据导入集群,通过创建并启动RadonDB MySQL集群,添加备份配置到mysql_v1a1pha1_mysqlcluster.yaml文件中。在集群运行成功后,执行备份指令,备份文件将被保存至S3存储。
恢复过程从检测S3 bucket并获取备份文件开始。将备份目录设置为yaml文件的restoreFrom属性,执行恢复指令,即可将集群数据从S3备份恢复。
完成数据恢复后,如需卸载集群,参照《部署文档》的卸载部分执行相应操作。
本文旨在提供RadonDB MySQL集群备份与恢复的完整流程,确保数据在Kubernetes环境下得到高效管理与保护。建议深入阅读相关文档,以获取更详细的配置和操作指导,实现更加稳定、可靠的数据库服务。