尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

深入解析 govmomi:LinuxKit 中基于 Go 的 VMware vSphere API 客户端库

深入解析 govmomi:LinuxKit 中基于 Go 的 VMware vSphere API 客户端库 操作系统云原生容器运行时【免费下载链接】linuxkitA toolkit for building secure, portable and lean operating systems for containers项目地址https://gitcode.com/gh_mirrors/li/linuxkit点击查看免费下载导读govmomi 是 VMware 官方维护的 Go 语言库用于与 vSphere APIESXi 与 vCenter交互。在 LinuxKit 项目中它是linuxkit push vcenter与linuxkit run vcenter两个命令的底层引擎负责登录 vCenter、查找数据中心/数据存储/主机、上传 ISO、创建虚拟机、挂载 ISO、添加磁盘与网卡以及开机取 IP 等完整生命周期操作。阅读本文后你将理解 govmomi 的包结构、核心对象模型与 vSphere 会话机制并能对照 LinuxKit 源码掌握如何在 Go 程序中驱动 vSphere API 完成虚拟机交付。govmomi 是什么为 Go 打造的 vSphere API 客户端vendor 内的 govmomi README 给出了官方定位A Go library for interacting with VMware vSphere APIs (ESXi and/or vCenter)——即一个面向 VMware vSphere API同时覆盖 ESXi 与 vCenter的 Go 库。它并非从零手写协议而是基于 vSphere API 描述生成的代码之上的一层封装govmomi根包是围绕 vSphere API 描述生成的代码的包装器主要提供与 vSphere API 交互的便捷函数其暴露的 API 与 VMware vSphere API Reference Documentation 中描述的接口高度一致熟悉上游 API 是使用本库的前提官方文档位于 godoc库内代码自带包级注释见 client.go 的包注释明确了包划分原则。在官方仓库基础上govmomi 还随附三套重要组件govc——vSphere CLI可直接在命令行执行 vSphere 管理操作本 vendor 树未包含其源码仅保留在官方仓库vcsim——vSphere API 模拟框架用于离线开发与测试toolbox——VM guest tools 框架LinuxKit 中对应能力由 pkg/open-vm-tools 与 contrib/open-vm-tools 承担。版本兼容性边界官方 README 明确该库面向并已在ESXi 与 vCenter 6.0、6.5、6.7上构建与测试对 5.5 与 5.1 可能可用但均非官方支持版本。LinuxKit 中 vCenter 相关命令的运行前提即建立在这一兼容性声明之上。在 LinuxKit 中的实际用途vCenter 命令链路LinuxKit 的 vCenter 支持位于 src/cmd/linuxkit涉及两个命令文件push_vcenter.go将本地 ISO 镜像上传到 vCenter 数据存储run_vcenter.go基于已上传镜像创建并可选启动虚拟机。两者共享同一个连接辅助函数vCenterConnect定义于 run_vcenter.go其调用链清晰地展示了 govmomi 的核心对象模型。连接与会话NewClient 的职责vCenterConnect的第一步是从命令行参数解析 URL然后调用govmomi.NewClient(ctx, u, true)建立连接。其底层实现client.go依次完成soap.NewClient(u, insecure)构造 SOAP 传输层客户端insecuretrue表示跳过 TLS 证书校验常见于自签证书的 vCentervim25.NewClient(ctx, soapClient)初始化 vSphere API 客户端组装Client结构其内嵌*vim25.Client并持有SessionManager *session.Manager若 URL 中携带用户信息则调用c.Login(ctx, u.User)自动完成登录。也就是说https://username:passwordVCaddress/sdk这种带凭据的 URL 是驱动的标准输入格式——这正是linuxkit run vcenter与linuxkit push vcenter的--url参数所要求的格式默认读取环境变量VCURL。登录/登出委托给session.Managersession/manager.go管理着types.UserSession会话区域设置默认en_US可通过GOVMOMI_LOCALE环境变量覆盖取_时使用服务器端区域设置。资源发现Finder 与数据中心登录后代码通过find.NewFinder(c.Client, true)创建 Finderfind/finder.go。Finder 内部组合了SearchIndex与基于property.DefaultCollector的递归遍历器是 govmomi 中最常用的资源定位工具。vCenterConnect中的典型发现序列f : find.NewFinder(c.Client, true) dc, err : f.DatacenterOrDefault(ctx, *newVM.dcName) // 查找数据中心缺省取默认 f.SetDatacenter(dc) // 后续查找限定在该数据中心内 dss, err : f.DatastoreOrDefault(ctx, *newVM.dsName) // 查找数据存储 folders, err : dc.Folders(ctx) // 获取数据中心默认文件夹 net, err f.NetworkOrDefault(ctx, *newVM.networkName) // 网络仅 run 时需要 hs, err f.HostSystem(ctx, *newVM.vSphereHost) // 指定主机未指定则随机挑选 rp, err hs.ResourcePool(ctx) // 主机默认资源池LinuxKit 未指定主机时的回退逻辑是f.HostSystemList(ctx, */*)列出全部主机然后随机选取一台run_vcenter.go这一细节在 README 中没有但可以在源码中得到确认。上传镜像Datastore soap 上传push vcenter命令push_vcenter.go先校验参数必须是.iso文件、本地文件存在且可读然后调用uploadFiledsurl : dss.NewURL(fmt.Sprintf(%s/%s, *newVM.vmFolder, fileName)) p : soap.DefaultUpload if err : c.UploadFile(ctx, *newVM.path, dsurl, p); err ! nil { ... }这里dss是*object.Datastore数据存储对象定义于 object/datastore.goNewURL生成数据存储内的目标 URLsoap.DefaultUpload提供默认上传参数Client.UploadFile完成文件传输。若未指定--folder则默认以 ISO 文件名去掉.iso后缀作为数据存储上的目录名。创建虚拟机VirtualMachineConfigSpec 与异步任务run vcenter的核心是使用types.VirtualMachineConfigSpec描述新虚拟机规格run_vcenter.gospec : types.VirtualMachineConfigSpec{ Name: *newVM.vmFolder, GuestId: otherLinux64Guest, Files: types.VirtualMachineFileInfo{VmPathName: fmt.Sprintf([%s], dss.Name())}, NumCPUs: int32(*newVM.vCpus), MemoryMB: *newVM.mem, }随后通过object.SCSIControllerTypes().CreateSCSIController(pvscsi)创建 PVSCSI 控制器追加为spec.DeviceChange中的VirtualDeviceConfigSpec再调用folders.VmFolder.CreateVM(ctx, spec, rp, hs)发起创建任务。govmomi 对耗时操作采用异步任务模型CreateVM返回*object.Task调用task.WaitForResult(ctx, nil)阻塞等待完成结果中携带新虚拟机的ManagedObjectReference再经object.NewVirtualMachine(c.Client, info.Result.(types.ManagedObjectReference))包装为虚拟机对象构造函数见 object/virtual_machine.go。设备装配ISO、持久盘与网卡新 VM 创建后LinuxKit 依次通过VirtualMachine对象的方法装配设备挂载 ISOdevices.FindIDEController()找 IDE 控制器devices.CreateCdrom(ide)创建光驱devices.InsertIso(cdrom, dss.Path(...))将已上传的 ISO 接入光驱addISO持久盘devices.FindDiskController(scsi)定位 SCSI 控制器devices.CreateDisk(controller, dss.Reference(), dss.Path(...))创建容量为persistentSz*1024KB 的虚拟磁盘默认文件名为linuxkit.vmdkaddVMDK网卡net.EthernetCardBackingInfo(ctx)获取网络后端object.EthernetCardTypes().CreateEthernetCard(vmxnet3, backing)创建 vmxnet3 网卡addNIC。所有设备最终通过vm.AddDevice(ctx, add...)一次性应用到虚拟机配置。开机与取 IP若指定--powerOn调用vm.PowerOn(ctx)并等待任务完成powerOnVM若同时指定--waitForIP则调用vm.WaitForIP(ctx)阻塞直至获取 guest IPgetVMToolsIP。需要注意两个约束源码中有显式校验--waitForIP依赖--powerOn二者必须同时设置否则直接报错run_vcenter.go取 IP 依赖 guest 内运行 open-vm-tools对应 LinuxKit 包 pkg/open-vm-tools。govmomi 包结构与源码分层在 LinuxKit vendor 目录 src/cmd/linuxkit/vendor/github.com/vmware/govmomi 下govmomi 的组织方式如下包路径职责关键类型/文件govmomi根高层便捷客户端聚合传输层、会话与属性收集client.goClient、NewClient、Login/Logout、PropertyCollector、UploadFilevim25vSphere API 的 SOAP 客户端与类型系统vim25/client.go、vim25/mo、vim25/methodsvim25/soapSOAP 协议层、TLS 与上传/下载参数soap/client.goDefaultUploadvim25/typesvSphere 数据类型如VirtualMachineConfigSpec、ManagedObjectReference由 vSphere API 描述生成session会话管理器Login/Logout/KeepAlivesession/manager.go、session/keep_alive.goobject受管对象包装器虚拟机、数据存储、主机、资源池、文件夹、任务等object/virtual_machine.go、object/datastore.go、object/task.gofind按路径/名称查找资源支持默认值find/finder.goproperty属性收集器用于批量读取对象属性与等待条件property/collector.go、property/wait.gotask任务错误处理与等待task/error.go、task/wait.gonfcNetwork File CopyNFC租赁用于向数据存储传输数据nfc/lease.golist树形资源列表遍历Finder 的底层list/lister.go包注释client.go进一步说明object包是精选受管对象的包装器构造函数统一接收*vim25.Client并向下传递event、guest、license等子系统包仅在特定工作流中需要因此不放在object内。vim25目录名中的 25 指 SOAP API 版本 2.5 兼容线mo子包存放由模式生成的受管对象类型如mo.VirtualMachine、mo.Datastore。安装与使用入门安装方式官方推荐方式Go modules 之前时代的命令go get -u github.com/vmware/govmomi在当前 LinuxKit 仓库中govmomi 以 vendor 依赖形式锁定在 src/cmd/linuxkit/vendor/github.com/vmware/govmomi对应版本记录在 src/cmd/linuxkit/go.mod 与 src/cmd/linuxkit/go.sum 中并遵循 Go modules 的 vendoring 约定modules.txt 中记录了其模块版本与显式导入路径。最小使用模式从连接驱动到虚拟机创建结合 LinuxKit 源码一个完整的 vSphere 驱动流程可归纳为五步构造 URLhttps://username:passwordVCaddress/sdk凭据内嵌于 URL登录govmomi.NewClient(ctx, u, insecure)返回后即已建立会话发现资源find.NewFinder配合DatacenterOrDefault/DatastoreOrDefault/HostSystem/ResourcePool定位目标提交操作构造types.VirtualMachineConfigSpec通过CreateVM等返回*object.Task的异步接口发起操作等待结果task.WaitForResult(ctx, nil)对开机等操作后可通过vm.WaitForIP(ctx)获取 guest IP。LinuxKit 将这一模式落地为linuxkit run vcenter与linuxkit push vcenter两个 cobra 子命令其全部参数如下均可用环境变量提供默认值命令参数环境变量说明两者--urlVCURLvCenter URL格式https://username:passwordVCaddress/sdk两者--datacenterVCDATACENTER数据中心名称两者--datastoreVCDATASTORE数据存储名称两者--hostnameVCHOST承载虚拟机的主机不指定则随机选择run--networkVCNETWORK虚拟机所用网络标签run--vmfolder—虚拟机名称/所在文件夹缺省取 ISO 基名run--persistentSize—持久盘大小MB会创建linuxkit.vmdkrun--powerOn—创建后立即开机run--waitForIP—等待并打印 guest IP需--powerOn且 guest 内运行 open-vm-tools完整参数定义见 run_vcenter.go 与 push_vcenter.go。项目生态与协议官方 README 罗列了使用 govmomi 的知名项目包括 Docker Machine、Docker InfraKit、Kubernetes 及其云提供商、Cluster API、kops、Terraform、Packer、VMware VIC Engine、Telegraf、Libretto、Open Storage 等其中Docker LinuxKit即本仓库也在列表之中直接对应 src/cmd/linuxkit 中的 vCenter 支持。语言生态方面官方还维护了 Ruby 的 rbvmomi 与 Python 的 pyvmomi 等姊妹库。版本治理方面govmomi 对 API 变更遵循语义化版本semver约定逐版本变化记录在官方 CHANGELOGvendor 树内对应 CHANGELOG.md协议为 Apache 2.0vendor 树内 LICENSE.txt。小结govmomi 是连接 Go 程序与 VMware vSphere 的官方桥梁vim25与soap处理协议与传输session管理登录态object与find提供面向对象的资源操作与发现能力异步Task模型保证耗时操作的可等待性。LinuxKit 的 vCenter 交付能力——ISO 上传、虚拟机创建、设备装配、开机取 IP——全部建立在这套 API 之上。若要在自己的 Go 服务中编排 vSphereLinuxKit 的 run_vcenter.go 与 push_vcenter.go 是一份结构清晰、可直接参考的调用范例。赞分享操作系统云原生容器运行时【免费下载链接】linuxkitA toolkit for building secure, portable and lean operating systems for containers项目地址https://gitcode.com/gh_mirrors/li/linuxkit点击查看免费下载相关推荐kOps 与 DigitalOcean深入解析 godo Go 客户端库V2 APIkOps 与 DigitalOcean深入解析 godo Go 客户端库V2 API 导读 godo 是 DigitalOcean 官方出品的 Go 客户云原生集群管理运维IaCgo-containerregistry remote 包深入解析基于 OCI Distribution Spec 的镜像仓库客户端go containerregistry remote 包深入解析基于 OCI Distribution Spec 的镜像仓库客户端 导读 remote操作系统云原生容器运行时Google API Go客户端库入门指南Google API Go客户端库入门指南 概述 Google API Go客户端库是Google官方提供的Go语言SDK用于访问Google的各种API服务开发工具上一篇Pop Shell终极指南各Linux发行版完整安装方法详解下一篇3步通关VBA JSON解析Excel VBA从零开始的JSON转换与跨平台配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表