问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

云实例初始化的行业标准:Cloud-Init

创作时间:
作者:
@小白创作中心

云实例初始化的行业标准:Cloud-Init

引用
简书
1.
https://www.jianshu.com/p/ab6d9716bb32

Cloud-Init是跨平台云实例初始化的行业标准,得到了所有主要公共云提供商的支持。它在启动时识别运行环境,读取云端元数据,并据此初始化系统,包括网络、存储设备和SSH访问密钥等配置。本文将详细介绍Cloud-Init的功能、使用场景及其与其他自动化部署工具的区别。

Cloud-Init在云平台中的普及

Cloud-Init几乎已经成为云计算领域中初始化虚拟机的事实标准,其广泛的应用几乎遍及所有主流的云平台。通过观察Cloud-Init支持的数据源(datasource),可以发现其兼容性极强,不仅支持众多云服务提供商,如AWS(亚马逊云服务)、Azure(微软云)、Aliyun(阿里云),还包括多种私有云和容器虚拟化部署方案,例如CloudStack、OpenNebula、OpenStack和LXD。

Cloud-Init解决了什么问题?

Cloud-Init主要解决了快速、自动化配置和启动云实例的问题,以便高效地适应云计算环境中的动态变化需求。这个工具的设计初衷旨在简化云实例的初始化流程。自从作为一个开源项目推出以来,Cloud-Init迅速获得了广泛的认可,并很快成为了几乎所有主要云服务提供商(如Amazon Web Services、Google cloud Platform和Microsoft Azure)支持的标准部分。

在云计算的早期阶段,虚拟机的设置和配置是一个耗时且复杂的过程,特别是面对大规模的配置和依赖软件安装需求时。虽然预配置的系统镜像能够实现快速部署,但随着计算需求的多样化和架构的复杂化,这种方法逐渐显得不够灵活和高效。运维人员需要对每个实例进行手动配置,如配置网络、存储、SSH密钥、软件包和各种其他系统方面,这不仅增加了运维工作量,也提高了出错的可能性。

Cloud-Init应运而生,以解决这一痛点。它允许用户在云实例首次启动时自动执行一系列定制化的配置任务,如设置主机名、网络配置、用户管理、安装软件包等,极大地简化了云实例的部署和管理。通过使用Cloud-Init,用户可以为云实例定制启动脚本和配置文件,从而实现真正的“一次配置,到处运行”,大幅提升了云资源的部署效率和灵活性。在云实例启动过程中,Cloud-Init负责识别其运行的云环境,并据此对系统进行相应的初始化设置。这意味着在首次启动时,云实例将被自动配置好网络、存储、SSH密钥、软件包以及其他多种系统设置,无需额外的人工干预。Cloud-Init的核心价值在于它为云实例的启动和连接提供了一种无缝的桥梁,确保实例按照预期的方式运作。对于使用云服务的用户来说,Cloud-Init提供了一种无需安装即可进行的首次启动配置管理方案。对于云提供商,它提供了可以与其云集成的实例设置。

Cloud-Init的功能和使用场景

Cloud-Init提供了一系列功能,能够支持多种云计算环境中的自动化配置和管理任务。通过这些功能和使用场景,Cloud-Init为云计算环境中的自动化部署和管理提供了强大的支持,极大地提升了云资源的配置灵活性和效率。

Cloud-Init通常用于在应用进程真正启动之前完成一些自定义的初始化操作。常见的初始化操作包括但不限于:

  • 设置hostname
  • 添加SSH keys
  • 在第一次启动时执行一个脚本
  • 格式化并且挂载一个数据盘
  • 启动Ansible playbook
  • 安装一个DEB/RPM包

我们的项目AutoMQ是基于云实现的云原生Kafka。在云上(以AWS为例)如果不使用k8s部署,AutoMQ将会使用ASG和EC2来运行。AutoMQ启动前涉及一系列初始化任务和配置才可以完整正常的启动。以下内容是AutoMQ企业版控制面实际采用的Cloud-Init脚本内容,用于完成启动初始化。其大体的步骤主要是:

  1. 初始化systemd使用的service文件
  2. 使用aws sdk利用ECS RAM Role完成身份认证,保证其有对其他云服务的访问权限
  3. 准备AutoMQ需要的环境变量
  4. 通过脚本启动AutoMQ systemd服务。
 #cloud-config
write_files:
- path: /etc/systemd/system/kafka.service
    permissions: '0644'
    owner: root:root
    content: |
      // ignore some code...
      
- path: /opt/automq/scripts/run.info
    permissions: '0644'
    owner: root:root
    content: |
      role=
      wal.path=
      init.finish=
runcmd:
    // ignore some code....
    echo "Start getting the meta and wal volume ids" > ${AUTOMQ_HOME}/scripts/automq-server.log
    region_id=$(curl -s http://169.254.169.254/latest/meta-data/placement/region)
    
    aws configure set default.region ${region_id} --profile ec2RamRoleProfile
    aws configure set credential_source Ec2InstanceMetadata --profile ec2RamRoleProfile
    aws configure set role_arn #{AUTOMQ_INSTANCE_PROFILE} --profile ec2RamRoleProfile
    
    instance_id=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
- |
    echo "AUTOMQ_ENABLE_LOCAL_CONFIG=#{AUTOMQ_ENABLE_LOCAL_CONFIG}" >> ${AUTOMQ_HOME}/scripts/env.info
    // ignore some code....
- |
    echo "export AUTOMQ_NODE_ROLE='#{AUTOMQ_NODE_ROLE}'" >> /etc/bashrc
    // ignore some code....
    source /etc/bashrc
- sh ${AUTOMQ_HOME}/scripts/automq-server.sh up --s3url="#{AUTOMQ_S3URL}" >> ${AUTOMQ_HOME}/scripts/automq-server.log 2>&1 &
  

注意:该userdata内容不完整,仅为参考示意,需要配合AutoMQ其他脚本和企业版代码才可以直接运行

在谈论初始化环境时,你可能会想到Docker或者k8s。但好消息是,你实际上不必在两者之间做出选择。因为为了使用Docker或者k8s,你仍然需要在机器上安装和配置Docker或者K8s的组件,这时候就需要使用Cloud-Init来进行配置了。大家只是在不同抽象级别的runtime上的差异而已,两者并不冲突。可以把Cloud-Init理解为VM世界的Dockerfile。

Cloud-Init是如何工作的?

工作流程大致可以分为两个阶段,分别发生在启动过程的早期(本地启动阶段)和晚期。

在网络配置启用之前的本地启动阶段,Cloud-Init主要执行以下操作:

  • 识别数据源:通过检查硬件内置值来识别实例运行的数据源,数据源是所有配置数据的来源。
  • 获取配置数据:一旦识别出数据源,Cloud-Init从中获取配置数据。这些数据指示Cloud-Init要执行的操作,可能包括实例的元数据(如机器ID、主机名和网络配置)、供应商数据和用户数据(userdata)。其中,供应商数据由云供应商提供,用户数据(userdata)由用户提供,这些数据通常在网络配置之后应用。
  • 写入网络配置:Cloud-Init写入网络配置并配置DNS,以备网络服务启动时应用。

在网络配置之后的启动阶段,Cloud-Init执行非关键配置任务,根据供应商数据和用户数据(userdata)配置运行中的实例。具体操作包括:

  • 配置管理:Cloud-Init可以与Puppet、Ansible或Chef等工具交互,应用更复杂的配置并确保系统是最新的。
  • 安装软件:在此阶段,Cloud-Init可以安装软件,并运行软件更新以确保系统完全更新并准备就绪。
  • 用户账户:Cloud-Init能够创建和修改用户账户,设置默认密码,并配置权限。
  • 执行用户脚本:如果用户数据中提供了自定义脚本,Cloud-Init可以运行它们,允许安装附加指定的软件,应用安全设置等。它还可以将SSH密钥注入到实例的authorized_keys文件中,从而允许安全地远程访问机器。

启动阶段的细分:

  • Detect:运行平台识别工具ds-identify以确定实例运行的平台。
  • Local:在Cloud-Init-local.service下运行,主要负责识别“本地”数据源和应用网络配置。
  • Network:在Cloud-Init.service下运行,要求所有配置的网络在线,并处理用户数据。
  • Config:在cloud-config.service下运行,只运行配置模块,如runcmd。
  • Final:在cloud-final.service下运行,是引导的最后一部分,运行用户定义的代码。

Cloud-Init与其他工具的区别和工作流

虽然Cloud-Init、Packer和Ansible都是自动化部署和配置工具,但它们在功能、定位和工作流方面有所不同。

  • Cloud-Init主要专注于云实例的初始启动和配置过程。
  • Packer专注于创建不变的机器镜像,以便在多个平台上复用。
  • Ansible则是一个更全面的配置管理和应用部署工具,适用于系统配置和应用部署的自动化。

这些工具虽然在某些方面有重叠,但通过协同工作,它们可以在不同阶段提供更加精细化和高效的自动化部署和管理流程。

总结

本文详细介绍了Cloud-Init的功能和使用场景以及介绍了其与其他自动化部署工具的区别。希望这对你有所帮助。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号