拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

LinuxKit 在 Microsoft Azure 上的镜像构建与虚拟机部署实战指南

LinuxKit 在 Microsoft Azure 上的镜像构建与虚拟机部署实战指南 操作系统云原生容器运行时【免费下载链接】linuxkitA toolkit for building secure, portable and lean operating systems for containers项目地址https://gitcode.com/gh_mirrors/li/linuxkit点击查看免费下载本文以 docs/platform-azure.md 为骨架结合 linuxkit 仓库中src/cmd/linuxkit/run_azure.go、azure.go、push_azure.go等源码实现与 examples/platform-azure.yml 示例配置系统讲解如何将 LinuxKit 构建的镜像上传到 Azure 并创建虚拟机。读完本文你将掌握 Azure 服务主体的认证配置、linuxkit build -format vhd的镜像产出流程、linuxkit run azure一键部署的完整资源创建链路以及镜像不含 Azure Linux Agent 导致门户报创建失败这一已知限制的正确应对方式。一、部署模式概述一次命令全套 Azure 资源LinuxKit 镜像本身是面向容器的极简操作系统在 Azure 上运行的基本思路是用linuxkit build产出 VHD 格式的磁盘镜像再由linuxkit run azure把 VHD 上传到 Azure 存储账户并自动创建一整套运行所需的基础设施资源。执行linuxkit run azure时工具会自动完成以下资源的创建见 run_azure.go 的调用顺序资源组resource group承载后续所有资源存储账户storage account存放上传的 VHD 镜像虚拟网络virtual network与子网subnet网络接口network interface与公网 IPpublic IP虚拟机VM以上传的 VHD 作为 OS 磁盘启动。需要注意的是当前 LinuxKit Azure 镜像不包含 Azure Linux AgentWALinuxAgent。这是理解整个部署体验的关键前提Azure 门户会因为缺少 Agent 而将 VM 创建报告为失败deployment failed但只要 VHD 本身构建正确VM 依然可以正常启动SSH 依然可用由于 Azure 不提供 VM 串口输出serial output的访问能力SSH 是连接这台机器的唯一途径因此镜像中必须包含 sshd 服务下文示例配置会体现。二、前置准备通过服务主体完成 Azure 认证linuxkit run azure与linuxkit push azure都依赖服务主体service principal方式访问 Azure 资源。工具启动时会在 run_azure.go 中通过getEnvVarOrExit强制校验以下四个环境变量缺失任何一个都会直接报错退出环境变量含义获取方式AZURE_TENANT_IDAzure Active Directory 租户 ID 或域名在 Azure 门户中查询服务主体所属的租户信息AZURE_SUBSCRIPTION_IDAzure 订阅 ID登录 Azure 门户后从订阅信息中获取AZURE_CLIENT_IDAzure Active Directory 应用服务主体的 Client ID创建 AAD 应用后获得AZURE_CLIENT_SECRET该应用的密钥Secret创建 AAD 应用时生成并妥善保存服务主体的创建需要先在 Azure Active Directory 中注册一个应用并授权其管理目标订阅下的资源再取得上述 ID 与 Secret。配置好之后linuxkit run azure会在 azure.go 的initializeAzureClients中完成 OAuth2 令牌获取并分别初始化资源组、存储账户、虚拟网络、子网、公网 IP、网络接口与虚拟机七个 Azure SDK 客户端——这正是后续自动化创建资源的底层基础。三、构建 VHD 镜像linuxkit build -format vhd3.1 编写 YAML 配置参照仓库中的官方示例 examples/platform-azure.yml 创建自己的azure.yml。该示例的核心配置如下kernel: image: linuxkit/kernel:6.12.59 cmdline: consolettyS0 init: - linuxkit/init:1c3e4933ceabd7418b961d66d5d884bf0044ac64 - linuxkit/runc:9442aa234715e751a16144f1d4ae3fd1a00fd492 - linuxkit/containerd:eb5daf20704109ea58abb38d2b808e0c3a7e3717 - linuxkit/ca-certificates:256f1950df59f2f209e9f0b81374177409eb11de onboot: - name: sysctl image: linuxkit/sysctl:43ac1d39da329c3567fcb9689e5ca99de6d169b6 services: - name: rngd image: linuxkit/rngd:984eb580ecb63986f07f626b61692a97aacd7198 - name: dhcpcd image: linuxkit/dhcpcd:b87e9ececac55a65eaa592f4dd8b4e0c3009afdb - name: sshd image: linuxkit/sshd:08e5d4a46603eff485d5d1b14001cc932a530858 binds.add: - /root/.ssh:/root/.ssh files: - path: root/.ssh/authorized_keys source: ~/.ssh/id_rsa.pub mode: 0600 optional: true几个对 Azure 场景尤为关键的要点内核命令行consolettyS0指定串口控制台设备。虽然 Azure 不提供串口输出查看能力但保留该参数有助于镜像在通用虚拟化环境中正确输出内核日志sshd服务由于无法通过串口或控制台访问 VMSSH 是唯一的运维入口sshd必须加入services段authorized_keys文件生成一对新的 SSH 密钥把公钥写入files段示例中使用~/.ssh/id_rsa.pubmode: 0600保证私密性optional: true表示本机无此公钥时构建不中断并通过binds.add把宿主机密钥目录挂载进 sshd 容器dhcpcd服务负责在 VM 启动后通过 DHCP 获取 IP 地址是接入 Azure 虚拟网络的基本网络配置。3.2 执行构建linuxkit build -format vhd azure.yml构建成功后当前目录会产出azure.vhd镜像文件。-format vhd是面向 Azure 的标准磁盘格式——Azure 的托管磁盘与存储账户中的 OS 镜像正是以 VHD 形式存在的。构建系统位于 src/cmd/linuxkit/build.go它负责按 YAML 中声明的 kernel / init / onboot / services / files 顺序组装出最终的磁盘镜像。四、一键部署linuxkit run azure4.1 命令与参数linuxkit run azure \ -resourceGroupName resource-group-name \ -accountName storage-account-name \ -location westeurope \ path-to-your-azure.vhd各参数定义可在 run_azure.go 中确认参数默认值说明-resourceGroupName无必填承载 VM 及相关资源的资源组名称-accountNamelinuxkit存储账户名称VHD 将上传至该账户下的linuxkitcontainer容器Blob 名为linuxkitimage.vhd见 azure.go 的常量定义-locationwestusVM 所在地域示例中使用westeurope子命令本身还有一个位置参数imagePath即 VHD 镜像的绝对或相对路径run_azure.go。4.2 完整的执行输出解读以下是文档中给出的典型运行输出结合源码可以逐行还原背后发生了什么Creating resource group in westeurope Creating storage account in westeurope, resource group linuxkit-azure2 2017/05/30 12:51:49 Using default parallelism [8*NumCPU] : 16 Computing MD5 Checksum.. Completed: 98% RemainingTime: 00h:00m:00s Throughput: 272 MB/sec Detecting empty ranges.. Empty ranges : 449/513 Effective upload size: 126.00 MB (from 1024.00 MB originally) Uploading the VHD.. Completed: 100% [ 126.00 MB] RemainingTime: 00h:00m:00s Throughput: 0 Mb/sec Upload completed OS Image uploaded at https://linuxkitazure2.blob.core.windows.net/linuxkitcontainer/linuxkitimage.vhd Creating virtual network in resource group linuxkit-azure2, in westeurope Creating subnet linuxkitsubnet584 in resource group linuxkit-azure2, within virtual network linuxkitvirtualnetwork916 Creating public IP Address in resource group linuxkit-azure2, with name publicip368 publicip368 Started deployment of virtual machine linuxkitvm493 in resource group linuxkit-azure2 Creating virtual machine in resource group linuxkit-azure2, with name linuxkitvm493, in location westeurope NOTE: Since you created a minimal VM without the Azure Linux Agent, the portal will notify you that the deployment failed. After around 50 seconds try connecting to the VM ssh -i path-to-key rootpublicip368.westeurope.cloudapp.azure.com关键细节一随机资源命名。虚拟网络、子网、公网 IP、网络接口和虚拟机名称都由代码在运行时随机生成run_azure.go例如linuxkitvirtualnetwork916、linuxkitsubnet584、publicip368、linuxkitvm493避免与既有资源冲突。关键细节二VHD 上传是高性能并行上传。上传逻辑在 azure.go 的uploadVMImage中实现先通过validator.ValidateVhd/ValidateVhdSize校验本地 VHD 的完整性与尺寸ensureVHDSanity以2 MB 页大小PageBlobPageSize将 VHD 切分为多个 page blob 区域对应输出中的Computing MD5 Checksum调用LocateUploadableRanges与DetectEmptyRanges检测空白区域并跳过不传输——这正是输出中Empty ranges : 449/513、Effective upload size: 126.00 MB (from 1024.00 MB originally)的来源即 1024 MB 的原始镜像实际只需上传约 126 MB以8 * NumCPU的并行度输出中的Using default parallelism [8*NumCPU] : 16即 2 核 CPU 的机器并发上传剩余的有效区域并最终写入 Blob 的 MD5 校验值。关键细节三VM 参数的占位特性。azure.go 的setVirtualMachineParameters显示VM 使用Standard_DS1规格且AdminUsername为unusedUserName、AdminPassword为UnusedPassword!123——源码注释明确说明这些值仅为通过部署校验而设置由于镜像中没有 Azure Linux Agent它们不会被实际使用。同时开启了启动诊断Boot Diagnostics。4.3 创建完成后连接 VM命令结束后等待约50 秒让 VM 完成启动与网络配置然后使用镜像中配置的公钥所对应的私钥进行 SSH 连接前提是镜像中包含 sshd 服务ssh -i path-to-key rootpublicip368.westeurope.cloudapp.azure.com公网域名由createPublicIPAddress中以公网 IP 名称为DomainNameLabel生成azure.go格式为label.region.cloudapp.azure.com。五、仅上传镜像linuxkit push azure如果只是想先把 VHD 推到 Azure 存储账户暂不创建 VM可以使用独立的推送子命令 push_azure.golinuxkit push azure -resource-group resource-group-name -storage-account storage-account-name path-to-azure.vhd它与run azure共用同一套环境变量认证与uploadVMImage上传实现参数命名为-resource-group与-storage-account注意与run azure的-resourceGroupName/-accountName命名差异上传完成后同样得到位于linuxkitcontainer容器中的linuxkitimage.vhd。六、已知限制、规避方式与演进方向原文档对当前实现的边界有非常坦诚的说明结合源码可进一步确认门户误报创建失败核心限制镜像不包含 Azure Linux AgentAzure 门户会在 VM 创建后报告部署失败。这是预期行为只要 VHD 构建正确机器依然可启动、可 SSH。判断 VM 是否真正就绪的方式不是看门户状态而是等待约 50 秒后尝试 SSH。VHD 上传方案当前上传依赖azure-vhd-utils工具库仓库 vendored 于 src/cmd/linuxkit/vendor/github.com/radu-matei/azure-vhd-utils其价值在于通过并行分块与空白区域检测实现对超 1 GB 原始镜像的快速、高效上传。这直接对应本文 4.2 节中的上传输出日志。网络端口开放work in progress目前run azure尚未提供指定 VM 开放端口即网络安全组 NSG 规则的选项相关能力仍在开发中。Azure 元数据支持缺失仓库中的 pkg/metadata 包负责从各云平台元数据服务读取实例信息目前尚不支持 Azure 的元数据服务从源码结构看其 provider 列表如 provider_aws.go、provider_gcp.go 等中确实没有 Azure 对应的 provider 实现。七、小结LinuxKit 在 Azure 上的部署链路已经高度自动化编写 YAML →linuxkit build -format vhd产出 VHD →linuxkit run azure完成上传 建网 建机全流程。理解无 Azure Linux Agent 导致门户误报、以 SSH 就绪为准这一关键心智模型是顺利使用该能力的前提。若需要更精细的运维如端口管控、元数据读取可关注仓库后续演进或结合 pkg/metadata 自行扩展 provider 实现。赞分享操作系统云原生容器运行时【免费下载链接】linuxkitA toolkit for building secure, portable and lean operating systems for containers项目地址https://gitcode.com/gh_mirrors/li/linuxkit点击查看免费下载相关推荐Kata Containers 在 IBM Secure ExecutionSE虚拟机上的部署与安全镜像构建指南Kata Containers 在 IBM Secure ExecutionSE虚拟机上的部署与安全镜像构建指南 导读 本文基于 Kata Containe云原生容器运行时LinuxKit 在树莓派 3B 上的部署实战镜像构建、启动流程与外设支持LinuxKit 在树莓派 3B 上的部署实战镜像构建、启动流程与外设支持 LinuxKit 官方支持在树莓派 3BRaspberry Pi 3b上构建和操作系统云原生容器运行时LinuxKit Hyper-V 后端实战在 Windows 上运行、配置与排查 linuxkit 虚拟机LinuxKit Hyper V 后端实战在 Windows 上运行、配置与排查 linuxkit 虚拟机 本文围绕 LinuxKit 的 Hyper V 运操作系统云原生容器运行时上一篇Light-R1性能优化技巧如何将训练成本控制在1000美元以内下一篇深度解析Atmosphere固件彻底解决Nintendo Switch启动错误的终极指南 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表