ARTICLE DETAIL

资讯详情

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

Gophercloud 实战指南:使用 Go SDK 完成 OpenStack 认证与云资源编排

Gophercloud 实战指南:使用 Go SDK 完成 OpenStack 认证与云资源编排 测试云原生质量保障【免费下载链接】originConformance test suite for OpenShift项目地址https://gitcode.com/gh_mirrors/or/origin点击查看免费下载本指南以 Gophercloud 官方 README 为核心结合本仓库OpenShift Conformance test suite 的origin镜像中 vendored 的 Gophercloud 源码系统讲解如何安装 SDK、准备 OpenStack 凭据、完成 Keystone 认证、创建服务客户端并编排云资源如创建云服务器。读完本文你将掌握gophercloud与gophercloud/utils两种认证路径、ProviderClient与ServiceClient的底层工作方式以及自动重认证、限流退避等高级行为的实现原理可直接套用到自己的 Go 项目中。什么是 GophercloudGophercloud 是一个面向 OpenStack 的 Go SDK官方定位为 An OpenStack SDK for Go。它把 OpenStack 各服务的 REST API 封装成 Go 类型与函数让开发者可以用类型安全的 Go 代码完成认证、查询服务目录、创建/删除云资源等操作。在当前仓库中Gophercloud 以第三方依赖的形式被 vendored 在vendor/github.com/gophercloud/gophercloud/目录下其顶层包包含认证选项auth_options.go、Provider 客户端provider_client.go、服务客户端service_client.go、端点搜索endpoint_search.go、分页pagination/等核心模块openstack/子目录下则提供了各 OpenStack 服务identity、compute、objectstorage 等的实现。从 provider_client.go 中的DefaultUserAgent gophercloud/v1.14.1可以看出本仓库 vendored 的是 v1.14.1 版本。如何安装Gophercloud 与大多数 Go 库一样通过标准 Go module 机制引入。在你的代码中引用任意 Gophercloud 包即可触发依赖解析import github.com/gophercloud/gophercloud随后更新go.mod并拉取依赖go mod tidyGophercloud 的顶层包通常与其他包配合使用常见组合是同时导入github.com/gophercloud/gophercloud/openstack提供各服务客户端工厂函数以及具体的服务资源包如.../openstack/compute/v2/servers具体用法见下文。准备 OpenStack 凭据因为要调用 OpenStack API你首先需要获取自己的 OpenStack 凭据。官方推荐将凭据存放到clouds.yaml文件中而不是写死在 Go 源码里——把凭据信息与源代码解耦后你可以放心地把代码推送到版本控制系统而无需担心泄露。需要准备的信息包括一个有效的 Keystone identity URL认证服务地址凭据本身。可以是用户名/密码组合、一组 Application Credentials应用凭据、一个预生成的 token或任何其他受支持的认证机制。通过 Horizon 快速导出凭据如果你部署了 OpenStack 仪表盘Horizon有一个快捷方式访问project/api_access路径点击右上角的 Download OpenStack RC File 按钮即可下载两种格式的凭据文件clouds.yaml结构化的 YAML 配置文件包含全部访问细节。将其放到~/.config/openstack/clouds.yaml即可被 Gophercloud 生态的配置读取器识别openrc一个 bash 脚本执行source openrc会把所有访问细节导出为环境变量随后会提示你输入密码。需要说明的是Gophercloud 核心库本身不直接解析clouds.yaml该能力由配套库gophercloud/utils提供见下文认证一节。认证构建 ProviderClient有了凭据之后下一步是认证。Gophercloud 的认证由顶层 Provider 结构体——即ProviderClient——承担。ProviderClient是一个顶级客户端所有 OpenStack 服务客户端都由它派生而来它内部保存了访问 API 所需的全部认证细节如基础 URL 和 token ID。从 provider_client.go 的源码可以看到ProviderClient的核心字段包括字段作用IdentityBase身份服务的基础 URL用于发起认证请求应指向身份服务的根资源而非某个特定版本IdentityEndpoint身份端点可能是特定版本的身份服务若指定了版本将直接使用该端点而非先查询版本TokenID最近一次签发的有效 token 的 ID应用不应直接读写该字段而应使用Token()/SetTokenAndAuthResult()EndpointLocator描述如何从服务目录中为各服务发现端点HTTPClient允许用户注入自定义的 http/https 传输行为UserAgent请求中的 User-Agent 头默认gophercloud/v1.14.1可通过UserAgent.Prepend()追加自定义前缀ReauthFunc请求返回 401 时用于重新认证的函数因为不同版本的身份服务可能有不同的认证函数RetryBackoffFunc/MaxBackoffRetries限流429时的退避重试函数与最大重试次数默认 60 次RetryFunc通用失败请求处理函数请求失败后总会调用置空则遇到错误直接中止方式一使用 gophercloud/utils推荐github.com/gophercloud/utils 库提供clientconfig包来简化认证其中包含读取clouds.yaml文件等附加能力。使用clientconfig生成 Provider 客户端import ( github.com/gophercloud/utils/openstack/clientconfig ) // 也可以跳过配置改在环境中设置 OS_CLOUD opts : new(clientconfig.ClientOpts) opts.Cloud devstack-admin provider, err : clientconfig.AuthenticatedClient(opts)注意clientconfig属于独立的gophercloud/utils仓库本仓库 vendored 的gophercloud核心库并未包含该包使用前需要单独引入。方式二不使用 gophercloud/utilsGophercloud 核心库不提供clouds.yaml文件支持如果你不想依赖gophercloud/utils需要自行实现这部分功能。此时有两种方式填充认证选项import ( github.com/gophercloud/gophercloud github.com/gophercloud/gophercloud/openstack ) // 方式 1手动传入认证信息 opts : gophercloud.AuthOptions{ IdentityEndpoint: https://openstack.example.com:5000/v2.0, Username: {username}, Password: {password}, } // 方式 2用工具函数从环境变量读取 opts, err : openstack.AuthOptionsFromEnv()拿到opts后传入openstack.AuthenticatedClient(opts)即可获得一个ProviderClientprovider, err : openstack.AuthenticatedClient(opts)AuthOptions 字段详解gophercloud.AuthOptions定义于 auth_options.go是所有身份实现与 provider 字段的并集常用字段如下字段说明IdentityEndpoint身份 API 的 HTTP 端点即云运营商常说的 auth_url /OS_AUTH_URLUsername/UserIDIdentity V2 需要 UsernameIdentity V3 需要 UserID 或 Username DomainID/DomainNamePassword密码PasscodeTOTP 认证方法使用的动态口令DomainID/DomainName使用 Username 配合 Identity V3 时两者最多提供一个否则均可选TenantID/TenantNameV2 API 中的租户在 V3 中对应 project_id / project_name这里统一叫 Tenant部分 provider 允许用名称代替 IDAllowReauth为 true 时允许 Gophercloud 在内存中缓存凭据并在 token 过期时自动重新认证默认 false。注意若不加以限制重认证可能无限重试官方建议通过自定义 RoundTripper 记录失败次数来限制TokenID允许用既有 token可能是他人身份完成认证Scope认证请求的作用域AuthScope含ProjectID、ProjectName、DomainID、DomainName、SystemApplicationCredentialID/ApplicationCredentialName/ApplicationCredentialSecretApplication Credentials 认证所需信息从ToTokenV3CreateMap()的实现可以看出认证时支持password、token、application_credential、totp等 identity method并对各类组合做了严格校验如 Username 与 UserID 不能同时提供、使用 Username 时 DomainID/DomainName 必须提供其一、ApplicationCredential 必须提供 Secret 等。注意CanReauth()对 TOTP 口令返回 false即 TOTP 认证不支持自动重认证。从环境变量读取AuthOptionsFromEnvopenstack/auth_env.go 中的AuthOptionsFromEnv()会读取标准的OS_*环境变量并填充AuthOptions必填OS_AUTH_URL、OS_USERNAME或OS_USERID、OS_PASSWORD缺失会返回对应的ErrMissingEnvironmentVariable可选OS_PROJECT_ID、OS_PROJECT_NAMEOS_TENANT_ID、OS_TENANT_NAME是二者的废弃形式、OS_DOMAIN_ID、OS_DOMAIN_NAME、OS_APPLICATION_CREDENTIAL_ID/NAME/SECRET、OS_PASSCODE、OS_SYSTEM_SCOPE若设置了OS_PROJECT_NAME还需要设置OS_PROJECT_ID以处理不在默认 domain 下的 projectOS_SYSTEM_SCOPEall时会把 Scope 设为系统级System: true。典型用法是先source openrc导出环境变量再调用opts, err : openstack.AuthOptionsFromEnv() provider, err : openstack.AuthenticatedClient(opts)ProviderClient 的认证流程调用openstack.AuthenticatedClient(options)时见 openstack/client.go实际执行两步NewClient(options.IdentityEndpoint)创建未认证的ProviderClient规范化 URL 并填充IdentityBase/IdentityEndpoint同时调用UseTokenLock()初始化并发安全的 token 锁Authenticate(client, options)向端点发起认证请求根据端点支持的版本自动选择 Keystone v2优先级 20或 v3优先级 30优先选择 v3成功后将 token 与 service catalog 写入客户端。认证成功后ProviderClient会记录 token并通过AuthenticatedHeaders()在后续请求中自动附带X-Auth-Token头设置EndpointLocator后续各服务客户端依据服务目录catalog定位端点若设置了AllowReauth会构造一个一次性客户端throw-away clienttoken 与 reauth 函数被清零注册ReauthFunc——当某个请求收到 401 时provider_client.go 中的Request()会自动调用Reauthenticate()重新认证并重放请求同一请求只重认证一次避免无限循环。创建服务客户端有了基础 Provider 之后将其作为依赖注入到各个 OpenStack 服务中。例如要使用 Compute API需要创建一个 Compute 服务客户端。使用clientconfig的方式client, err : clientconfig.NewServiceClient(compute, opts)使用核心库的方式通过openstack包的工厂函数创建client, err : openstack.NewComputeV2(provider, gophercloud.EndpointOpts{ Region: os.Getenv(OS_REGION_NAME), })openstack包为各服务提供了对应的工厂函数均定义于 openstack/client.go例如函数服务类型NewComputeV2computeNovaNewNetworkV2networkNeutron端点后附加v2.0/NewObjectStorageV1object-storeSwiftNewBlockStorageV1/V2/V3volume / volumev2 / volumev3CinderNewImageServiceV2imageGlance附加v2/NewLoadBalancerV2load-balancerOctaviaNewDNSV2dnsDesignateNewIdentityV2/V3identityKeystoneNewBareMetalV1/NewBareMetalIntrospectionV1baremetal / baremetal-introspectionIronicNewSharedFileSystemV2sharev2ManilaNewKeyManagerV1key-managerBarbicanNewWorkflowV2、NewPlacementV1、NewCDNV1、NewDBV1、NewOrchestrationV1、NewClusteringV1、NewMessagingV2、NewContainerV1、NewContainerInfraV1等对应各类服务EndpointOpts 与端点定位工厂函数接收的gophercloud.EndpointOpts定义于 endpoint_search.go用于在服务目录中唯一确定一个端点字段必填说明Type是服务类型如 compute、object-store一般由服务客户端函数自动填充Name否服务名称如 nova。服务可能同 Type 不同 Name因此有时两者都需要Region视情况端点所在的地理区域仅对跨区域的服务必需Availability否端点可见性AvailabilityPublic默认/AvailabilityInternal/AvailabilityAdmin对应 v2 的 publicURL/internalURL/adminURL 与 v3 的 InterfaceServiceClient 的使用ServiceClientservice_client.go封装了具体服务的基础 URL 与资源路径提供Get、Post、Put、Patch、Delete、Head方法最终都转发到ProviderClient.Request()。它还支持Microversion设置服务微版本请求时会自动附带对应的版本头如 Nova 的X-OpenStack-Nova-API-Version与通用的OpenStack-API-Version头MoreHeaders为服务的所有请求统一附加 HTTP 头ServiceURL(parts...)按资源片段拼接完整 URL。实战创建一台云服务器Provision a server使用上面创建的 Compute 服务客户端即可执行任意 Compute API 操作。以创建新服务器为例调用Create方法并传入 flavor ID硬件规格与 image ID操作系统镜像import github.com/gophercloud/gophercloud/openstack/compute/v2/servers server, err : servers.Create(client, servers.CreateOpts{ Name: My new server!, FlavorRef: flavor_id, ImageRef: image_id, }).Extract()上述代码创建了一台带指定参数的新服务器并把新资源体现在server变量中一个servers.Server结构体。Gophercloud 的请求/响应模型是XxxOpts构造请求 XxxResult承载响应servers.Create返回CreateResult调用其Extract()方法把响应体解析为强类型结构体若Extract()返回的err非 nil则表示创建失败。CreateOpts还支持Networks、SecurityGroups、UserData、Metadata等更多字段具体定义可查阅 servers/requests.go。高级用法请求定制与自动重试Gophercloud 的ProviderClient.Request()支持通过RequestOptsprovider_client.go精细控制每一次 HTTP 请求字段说明JSONBody/RawBody请求体二选一前者会被 JSON 编码默认 Content-Type 为 application/json后者直接消费一个io.ReaderJSONResponse非 nil 时响应体会被解析为 JSON 并填充到该变量OkCodes视为成功的 HTTP 状态码列表不设置时按 HTTP 方法取默认值GET/HEAD → 200POST/PUT → 201/202PATCH → 200/202/204DELETE → 202/204MoreHeaders/OmitHeaders追加 / 移除请求头OmitHeaders 优先于 MoreHeadersErrorContext自定义错误类型可根据状态码返回更具体的资源错误KeepResponseBody保留响应体以便后续使用不能与JSONResponse同时使用Request()的完整处理链见doRequest包括编码请求体 → 组装请求头Content-Type、Accept、User-Agent、X-Auth-Token→ 发送请求 → 校验状态码 → 按需处理错误。当收到 401 时自动触发重认证并重放请求收到 429/498限流时调用RetryBackoffFunc退避重试最大次数受MaxBackoffRetries限制未设置时取DefaultMaxBackoffRetries 60其他错误码400/403/404/405/408/409/500/502/503/504则映射为对应的ErrDefaultXxx错误类型若设置了RetryFunc还会把失败交给它决定是否重试。此外Gophercloud 的pagination包vendor/github.com/gophercloud/gophercloud/pagination/提供Pager、LinkedPage、MarkerPage、SinglePage等分页工具处理 OpenStack API 的列表类资源openstack/utils目录下还有版本协商等辅助逻辑。原 README 还提到一份 FAQ 用于定制 Gophercloud 行为的技巧不过该文件并未包含在本仓库的 vendored 树中可按需从上游获取。向后兼容性保证Gophercloud 的版本号遵循 semver语义化版本在v1.0.0之前没有任何兼容性保证自 v1 起同一个 major 版本内不会引入破坏性变更no breaking changes within a major release。这意味着在你的go.mod中以v1.x引入 Gophercloud 后可以放心在 minor/patch 升级中保持代码兼容。上游的版本发布流程说明见其RELEASE.md同样未随 vendored 树携带可从上源获取。结语与进一步阅读Gophercloud 把 OpenStack 复杂的 REST API 世界收敛为一套清晰的 Go 类型系统AuthOptions负责认证信息ProviderClient持有会话与 tokenServiceClient代表具体服务XxxOpts/XxxResult构成资源的请求与响应模型。无论你是用clouds.yamlgophercloud/utils的声明式配置还是用OS_*环境变量 AuthOptionsFromEnv()的经典方式都能在几分钟内完成认证并开始操作云资源。想深入源码细节可在本仓库中直接阅读以下文件provider_client.goProvider 客户端、认证头、自动重认证与退避重试实现openstack/client.go各服务客户端工厂函数与 v2/v3 认证流程auth_options.go认证选项字段与认证请求体构建逻辑openstack/auth_env.goOS_*环境变量解析与校验service_client.go服务客户端与微版本请求头openstack/compute/v2/servers/requests.goCompute 服务资源操作含CreateOpts示例。赞分享测试云原生质量保障【免费下载链接】originConformance test suite for OpenShift项目地址https://gitcode.com/gh_mirrors/or/origin点击查看免费下载相关推荐Gophercloud用 Go 语言驱动 OpenStack 云的 SDK 实战指南含 LinuxKit 集成实例Gophercloud用 Go 语言驱动 OpenStack 云的 SDK 实战指南含 LinuxKit 集成实例 本指南以 LinuxKit 仓库中内嵌操作系统云原生容器运行时使用 Gophercloud v2面向 Go 开发者的 OpenStack SDK 实战指南以 kOps 源码为例使用 Gophercloud v2面向 Go 开发者的 OpenStack SDK 实战指南以 kOps 源码为例 Gophercloud 是 OpenS云原生集群管理运维IaC基于 Gophercloud v2 AGENTS.md 的 OpenStack Go SDK 工程规范与测试实践指南基于 Gophercloud v2 AGENTS.md 的 OpenStack Go SDK 工程规范与测试实践指南 本文档源文件 vendor/github云原生集群管理运维IaC上一篇如何快速掌握Mi-Create免费创建小米手表个性化表盘的终极指南下一篇如何将PowerShell脚本转换为EXE3分钟完成专业级程序封装创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表