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

01

前言

Cloud-Init[1] 是跨平台云实例初始化的行业标准。它得到了所有主要公共云提供商的支持,适用于私有云基础设施的配置系统以及裸机安装。Cloud-Init 将在启动时识别其运行所在的云环境,读取来自云端提供的任何元数据,并据此初始化系统。这可能涉及设置网络和存储设备,配置 SSH 访问密钥以及系统的许多其他方面。之后,Cloud-Init 还将解析并处理传递给该实例的任何可选用户或供应商数据。在你想要创建自定义的 Linux 部署镜像时或者每次部署一个新的 Linux 服务器时,有很多事情需要初始化并且进行自动化处理。Cloud-Init 可以帮助我们实现这些自动化任务。

02

现状:Cloud-Init 在云平台中的普及

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

  • Amazon EC2

  • Alibaba cloud (AliYun)

  • Azure

  • Google Compute Engine

  • LXD

03

用途:Cloud-Init 解决了什么问题?

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

云计算部署的挑战

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

Cloud-Init 的解决方案

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

04

Cloud-Init 的功能和使用场景

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

Cloud-Init 的常见用例

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

  • 设置 hostname

  • 添加 SSH keys

  • 在第一次启动时执行一个脚本

  • 格式化并且挂载一个数据盘

  • 启动 Ansible playbook

  • 安装一个 DEB/RPM 包

我们的项目 AutoMQ[2] 是基于云实现的云原生 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 时,为什么选择 Cloud-Init?

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

05

Cloud-Init 是如何工作的?

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

早期启动阶段

在网络配置启用之前的本地启动阶段,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 下运行,是引导的最后一部分,运行用户定义的代码。

06

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

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

  • Cloud-Init 主要专注于云实例的初始启动和配置过程。

  • Packer 专注于创建不变的机器镜像,以便在多个平台上复用。

  • Ansible 则是一个更全面的配置管理和应用部署工具,适用于系统配置和应用部署的自动化。

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

07

总结

本文详细介绍了 Cloud-Init 的功能和使用场景以及介绍了其与其他自动化部署工具的区别。希望这对你有所帮助。
AutoMQ[2] 致力于引领消息和流系统走向云原生时代。充分利用云上成熟和规模化的云服务兑现云的价值和潜力是我们一直在贯彻的宗旨。为了更好地使用云服务,充分了解各种云服务的特性、定价、原理是我们义不容辞的任务。在未来,我们也将持续为大家分享云技术,做你身边的云专家,让我们一起用好云,将云的价值真正发挥出来。

参考资料

[1] Cloud-Init:  https://github.com/canonical/Cloud-Init
[2] AutoMQ: https://github.com/AutoMQ/automq
[3] Introduction to Cloud-Init: https://cloudinit.readthedocs.io/en/latest/explanation/introduction.html#how-does-Cloud-Init-work

END

关于我们

我们是来自 Apache RocketMQ 和 Linux LVS 项目的核心团队,曾经见证并应对过消息队列基础设施在大型互联网公司和云计算公司的挑战。现在我们基于对象存储优先、存算分离、多云原生等技术理念,重新设计并实现了 Apache Kafka 和 Apache RocketMQ,带来高达 10 倍的成本优势和百倍的弹性效率提升。

🌟 GitHub 地址:https://github.com/AutoMQ/automq
💻 官网:https://www.automq.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/679621.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JsonCpp源码跨平台编译

1.macos编译jsoncpp: https://github.com/open-source-parsers/jsoncpp.git 克隆jsoncpp源码 使用CMake进行编译 生成makefile mkdir build cd build cmake ../ 编译: make编译并运行测试成功:

Github:ChatTTS从下载到使用

前言 本文使用工具: Anaconda :直接进行包管理,用来自定义生成python解释器,虚拟环境vscode:用来执行代码 注:我使用的Ubuntu,使用win,mac等,需要额外配置 简介 Chat…

python的内置模块 I

内置模块 I 除了我们自己写的模块之外,Python 中还内置了大量非常实用的模块。其实,我们之前的代码中就已经使用过几个内置模块了,比如 time 模块和 random 模块。 Python 的内置模块非常多,今天我们介绍几个常用的模块。废话少…

Linux 内存屏障简介

文章目录 1. 前言2. 什么是内存屏障?3. 为什么需要内存屏障?3.1 多发射(Multi-issuing)3.2 乱序执行(Out-of-order execution)3.3 预测执行(Speculative execution)3.4 Load-Store 优化3.5 CPU Cache3.6 编译乱序3.7 小结 4. ARM 内存一致性模型 和 内存…

Julia编程11:变量作用域 Scope of Variables

There are two main types of scopes in Julia, global* scope* and local* scope*. Julia有全局变量作用域和局部变量作用域,函数或者一些结构体、循环体如for等是否内部是局部环境可以参照下表。 ConstructScope typeAllowed withinmodule, baremoduleglobalglo…

商品API数据集成:一站式商品信息服务平台

一站式商品信息服务平台:商品API数据集成 在数字化快速发展的今天,信息的高效获取与整合成为了各行各业追求的核心竞争力。特别是在商品信息领域,如何快速、准确地获取并整合来自多个渠道的商品数据,为企业决策提供支持&#xff0…

【数据结构】图论——AOV和AOE(拓扑排序、存放表达式、关键活动、关键路径)

目录 AOV和AOEAOV 有向无环图及其应用(拓扑结构)有向无环图的应用——存放表达式二叉树存放表达式图存放表达式 AOE 有向无环图及其应用——关键路径1. 事件的最早发生时间事件(顶点)最早发生时间的计算方法: 2. 事件允许的最晚发生时间事件(…

JS百题斩~ typeof 、instanceof 与 Object.prototype.toString 区别(简单易懂)

首先,让我们先了解一下JavaScript的数据类型,分为两类: 基础类型:Undefined,Null,Boolean,Number,BigInt,String,Symbol 引用类型:Object&#xf…

网络简史-基于图论的网络

先看一幅图: 如图,我们对类似 crossbar,banyan tree,b-tree,10-tree,256-tree,甚至 dcn fat-tree 等 “规则拓扑” 网络相当熟悉。规则拓扑网络中,地址信息被编码到拓扑本身&#…

每天复习一点小CTF知识(6.4)

NSSCTF/[FSCTF 2023]夜深人静的时候也会偷偷emo 直接爆破压缩包,先来数字 解压好,一个flag.mp3 mp3隐写,直接干 得一个txt文件直接开

2024最新破解版CorelDRAW解锁设计新境界!

在当今快速变化的市场环境中,品牌之间的竞争愈发激烈。为了在众多品牌中脱颖而出,企业需要不断地提升自身的品牌形象和市场识别度。而在这个过程中,视觉设计起到了至关重要的作用。一款优秀的设计软件不仅能帮助设计师轻松地将创意想法变成现…

【全网唯一】触摸精灵iOS版纯离线本地文字识别插件

目的 触摸精灵iOS是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务,节省大量人工操作的时间。但触摸精灵的图色功能比较单一,无法识别屏幕上的图像,根据图像的变化自动执行相应的操作。本篇文章主要…

《平渊》· 捌 —— 「庄子」山木篇中的 “空船效应”

《平渊》 捌 "若能虚己以游世,其孰能害之?" "方舟而济于河,有虚船来触舟,虽有惼心之人而不怒;有一人子其上,则呼张歙之;一呼而不闻,再呼而不闻,于是三呼邪…

热烈祝贺2024年重庆市建筑电气学术年会圆满成功

芳菲四月花似锦,正是人间好时节,4月26日, 24年重庆市建筑电气学术年会在重庆维景国际大酒店举办。会议主题是“智慧 低碳 绿色 安全 ”。会上业内专家就建筑电气行业的新技术、市场趋势和未来发展展开探讨与深入交流。 本次会议邀请重庆市建筑电气行业主…

vue中实现一个时间选择器的级联框,第一层小时,第二层分钟

最近在做一个考勤系统时&#xff0c;新增班次的时候需要设置打卡时段&#xff0c;类似如下效果&#xff1a; 1、封装自定义组件Time.vue 接收参数有endHour(范围结束的小时数)、endMinute(最后一小时结束的分钟数)等&#xff0c;根据具体需求变动 <template><div&…

【代码+详解】算法题 : 最大公约数

❗❗❗必看: 下列题我全部都使用 Java 语言写的,并且均可以提交成功,获得Accepted 结果的. 如果代码和详解看了之后,对答案有任何疑问,都可以在评论区提出来,我都会一个一个回答. ❗❗❗感谢大家的支持,如果喜欢我的博客,关注 点赞 收藏 评论一波,非常感谢!!! 文章目录 题目&…

低代码和零代码软件时代质量管理(QM)和质量管理系统(QMS)

【前言】 质量控制过程的目的是为了确保产品的制造标准得到保持和改进。质量控制过程使公司能够满足客户的期望&#xff0c;同时确保产品质量的一致水平。采用这些标准创造了一种公司文化&#xff0c;鼓励所有员工努力实现高质量的生产标准。低代码和零代码软件可以成为质量控…

6.4学习总结

Codeforces Round 950 (Div. 3)A、B题解 解题思路 开一个数组来记录A,B,C,D,E,F,G难度题目出现的次数&#xff0c;因为每一轮比赛都需要每一种难度都有一题&#xff0c;所以我们只要根据要出的比赛的轮数对每一个难度的题目进行自减&#xff0c;最后遍历数组把所有为负数的题目…

vscode编译文件夹下所有文件的配置(包含插件和 .json 文件)

文章目录 我所使用的插件.json 文件配置1. c_cpp_properties.json2. launch.json3. settings.json4. tasks.json 如何运行 我所使用的插件 红框中的五个插件是必备的&#xff0c;其中 Code Runner 插件可以在写完一个 .c 或 .cpp 文件后&#xff0c;按下 Crtl R 快捷键快速编…

12-学生们参加各科测试的次数(高频 SQL 50 题基础版)

12-学生们参加各科测试的次数 -- 学生表中&#xff0c;id是唯一的&#xff0c;将他作为主表 -- CROSS JOIN产生了一个结果集&#xff0c;该结果集是两个关联表的行的乘积 -- 2行表,与3行表使用cross join,得到2*36行数据 select st.student_id, st.student_name,su.subject_na…