
从 CHANGELOG 看 gophercloud 演进Cluster Autoscaler 中 Magnum 云厂商 SDK 的版本足迹与实现解析【免费下载链接】autoscalerAutoscaling components for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/au/autoscaler导读本篇文章以 cluster-autoscaler/cloudprovider/magnum/gophercloud/CHANGELOG.md 为骨架梳理随仓库一同 vendored 的 gophercloud——OpenStack Go SDK——在 0.1.0 至 0.9.0 各版本中的演进脉络涵盖破坏性变更UPGRADE NOTES、功能改进IMPROVEMENTS与缺陷修复BUG FIXES三大类目。该 SDK 是 Kubernetes Cluster Autoscaler Magnum 云厂商实现magnum_cloud_provider.go的底层依赖因此阅读这份 CHANGELOG 可以同时回答三个问题gophercloud 在这段时间内如何走向成熟、Magnum provider 依赖了其中哪些能力、以及升级该依赖时需要关注哪些破坏性变更。读完本文你将能够对照源码定位这些 API 的真实调用关系并在引入或升级依赖时准确评估兼容性影响。一、这份 CHANGELOG 在仓库中的定位1.1 gophercloud 与 Cluster Autoscaler 的关系gophercloud 是面向 OpenStack 平台的官方 Go SDK覆盖 ComputeNova、NetworkingNeutron、Load BalancingOctavia、IdentityKeystone、Block StorageCinder、Container InfraMagnum、OrchestrationHeat等众多 OpenStack 服务。仓库将 gophercloud 以源码形式直接放入 cluster-autoscaler/cloudprovider/magnum/gophercloud/ 目录使 Magnum provider 可以通过k8s.io/autoscaler/cluster-autoscaler/cloudprovider/magnum/gophercloud/...的导入路径直接使用而无需经过公共依赖管理。这一点在 magnum_manager_impl.go 的 import 块中清晰可见它同时导入了 gophercloud 核心包、openstack/compute/v2/flavors、openstack/containerinfra/v1/clusters、openstack/containerinfra/v1/nodegroups、openstack/orchestration/v1/stackresources与openstack/orchestration/v1/stacks。1.2 版本区间与主题CHANGELOG 记录了从 0.1.02019 年 5 月 27 日首次打标签到 0.8.02020 年 2 月 8 日的完整发布历史并预留了尚未发布的 0.9.0 条目。每条记录都附带上游 PR 编号GH-xxxx用于追溯实现细节。由于该库被固定 vendored 在当前仓库中这份 CHANGELOG 同时也界定了 Magnum provider 当时所依赖 SDK 的能力边界——例如containerinfra/v1/nodegroups子包正是 0.8.0 才引入的而 magnum_manager_impl.go 对它的重度使用也印证了这一版本节点的重要性。二、版本演进总览版本发布日期主题标签0.1.02019-05-27首次正式发布0.2.02019-06-17引入 QoS 扩展、诊断与裸机内省字段0.3.02019-07-31时间戳字段、元数据操作、trust 扩展0.4.02019-09-03Magnum 集群创建参数、标签tagsAPI、端口转发0.5.02019-10-13标签tags完善、端口转发补全、监听器 AllowedCIDRs0.6.02019-10-17重新认证机制重构、配额 API0.7.02019-12-03Token 直用认证、FWaaS v2、MaxRetriesDown0.8.02020-02-08破坏性变更集中爆发、nodegroups 支持、错误处理增强0.9.0Unreleased占位条目从时间线上可以观察到两个趋势一是发布节奏非常密集2019 年下半年几乎每月一版反映了 OpenStack 各服务 API 的快速演进二是 0.8.0 作为一次收官版本集中包含了多处破坏性变更是升级时最需要谨慎对待的版本。三、0.8.0破坏性变更与 nodegroups 支持3.1 两处必须知晓的破坏性变更keymanager/v1/acls.SetOpts行为变更。原有的SetOpts结构体被替换为[]SetOpt切片。这意味着调用方在设置密钥管理服务Barbican的 ACL 时需要以[]SetOpt形式传递多个条目而不是在单个结构体中声明字段。这是典型的结构体 → 切片演进目的是支持多条 ACL 规则的批量设置。containerinfra/v1/clusters.Resize的 Extract 返回值变更。0.8.0 之前对Resize调用Extract()会返回一个结构体0.8.0 之后只返回 UUID 字符串。这是一个向后不兼容的改动任何依赖旧结构的调用代码都必须调整。有趣的是这个变更恰好与本仓库 Magnum provider 的用法相互印证在 magnum_manager_impl.go 的updateNodeCount中调用方式为resizeResult : clusters.Resize(mgr.clusterClient, mgr.clusterName, resizeOpts) _, err : resizeResult.Extract()代码用_直接丢弃了 Extract 的返回值只关心是否出错——这与 0.8.0 后Extract 只返回 UUID的新语义完全兼容也说明 provider 侧在升级时无需改动。在deleteNodes中同样是_, err : resizeResult.Extract()的写法magnum_manager_impl.go。3.2 nodegroups.Get 与 nodegroups.ListMagnum 自动伸缩的基石0.8.0 新增了containerinfra/v1/nodegroups.Get与containerinfra/v1/nodegroups.List这是 CHANGELOG 中与本项目关联最直接的条目。其实现位于 nodegroups/requests.goGet发起GET /v1/clusters/{cluster_id}/nodegroups/{node_group_id}请求并期望 200 响应List返回分页器Pager支持marker、limit、sort_key、sort_dir、role五个查询参数。ListOpts中值得注意的细节是Role字段——在 magnum_manager_impl.go 的autoDiscoverNodeGroups中provider 先通过nodegroups.List(...).AllPages()拉取全部节点组再在本地过滤Role master的组并跳过因为当前版本不支持对 master 节点组做自动伸缩。同时代码注释明确说明List 接口不返回 min/max 节点数必须对每个组再调用一次nodegroups.Get才能拿到MaxNodeCount。这一点与 nodegroups/results.go 中NodeGroup结构体的定义一致——MinNodeCount是int而MaxNodeCount是*int可为空表示未设置上限Get返回完整字段而 List 只返回精简字段UUID、Name、FlavorID、ImageID、NodeCount、Role、IsDefault、Status、StackID。nodegroups.Get还被nodeGroupSizemagnum_manager_impl.go读取ng.NodeCount、uniqueNameAndIDForNodeGroup、fetchNodeGroupStackIDs等函数反复调用是整个 Magnum provider 对节点组信息获取的核心入口。3.3 错误处理增强StatusCodeError 与 GetStatusCode0.8.0 新增了StatusCodeError接口与GetStatusCode便捷方法其实现位于 errors.gotype StatusCodeError interface { Error() string GetStatusCode() int }在此之前调用方需要针对ErrDefault400、ErrDefault401、ErrDefault403……ErrDefault503等一长串错误类型分别做类型断言才能拿到 HTTP 状态码。引入该接口后只需一次断言if se, ok : err.(gophercloud.StatusCodeError); ok { code : se.GetStatusCode() }同一文件中还为每种 HTTP 状态码定义了ErrDefault*类型与默认错误文案如 401 → Authentication failed、404 → Resource not found、429 → 提示限流暂停等待重试形成了完整的错误分级体系。3.4 其他重要改进与修复改进方面还包括计算服务的挂起/恢复扩展compute/v2/extensions/shelveunshelve的Shelve、ShelveOffload、Unshelve编排服务的资源类型查询orchestration/v1/resourcetypes的List、GetSchema、GenerateTemplate块存储 API 版本查询blockstorage/apiversions.List/GetPlacement 服务的资源提供者placement/v1/resourceproviders.List/Create负载均衡成员池支持将CreateMemberOptsBuilder传入pools.Create并在CreateMemberOpts中新增Backup、MonitorAddress、MonitorPort字段identity/v3/extensions/trusts.CreateOpts的Impersonation改为非必填loadbalancer/v2/listeners.UpdateOpts新增InsertHeaders裸机内省数据baremetalintrospection/v1/introspection.Data新增NUMATopology。修复方面workflow/v2/crontriggers.ListOpts的sort_key参数名被修正为sort_keys与 OpenStack Mistral API 对齐blockstorage/extensions/schedulerstats.Capabilities.MaxOverSubscriptionRatio现在同时接受字符串与数字响应NewLoadBalancerV2修复了 LBaaS 服务未通告/v2.0endpoint 时的缺陷baremetal/v1/ports.UpdateOperation与networking/v2/extensions/lbaas/vips.commonResult.Extract()的 JSON tag 得到修正。四、0.7.0 与 0.6.0认证链路与基础架构加固4.1 0.7.0Token 直用与 FWaaS v20.7.0 最值得关注的是允许直接使用已有 token 进行认证而不再基于给定 token 再生成一个新 token。这对 Cluster Autoscaler 这类长时间运行、需要周期性刷新凭据的控制器意义重大——它减少了不必要的认证往返也降低了 token 链式失效的风险。同版本还包含tags.ServerTagsExt更名为servers.TagsExt迁移性质compute/v2/servers.ListOpts新增tags、tags-any、not-tags、not-tags-any四个过滤参数便于按标签筛选服务器identity/v3/applicationcredentials新增AccessRule多个 endpoint 匹配时不再报错而是取第一个——这一行为放宽了服务目录不规范的容错度防火墙即服务 v2networking/v2/extensions/fwaas_v2/rules补齐了Create、Delete、Get、Update、List全套 CRUDloadbalancer/v2/providers.List支持枚举负载均衡提供商Octavia 健康监控loadbalancer/v2/monitors在CreateOpts、UpdateOpts、Monitor、ListOpts四处全面新增MaxRetriesDown字段用于控制健康检查连续失败多少次后判定后端节点下线。依赖层面0.7.0 同步更新了go.mod依赖专门针对golang.org/x/crypto的 CVE-2019-11840 漏洞完成修复——说明 SDK 团队在功能演进的同时也持续跟进安全公告。4.2 0.6.0重新认证机制重构0.6.0 的 UPGRADE NOTES 明确指出重新认证reauthentication机制被重构并请求使用方在发现问题时上报。从 IMPROVEMENTS 条目可以看到重构方向改用 goroutine 实现并增加了防止特定场景下无限循环的检查GH-1746。对 Autoscaler 这类常驻服务而言token 过期后的自动重新认证直接关系到长期稳定性因此这是一次值得关注的基础设施级变更。此外 0.6.0 新增networking/v2/extensions/quotas.Get/Update租户网络配额查询与更新修复了loadbalancer/v2/loadbalancers与networking/v2/extensions/lbaas_v2/loadbalancers中Flavor字段名与 OpenStack API 实际返回不一致的问题改为FlavorID将go-yaml依赖升级到 v2.2.4 以修复潜在的 DDoS 漏洞。五、0.5.0 与 0.4.0标签体系与 Magnum 集群创建能力5.1 0.4.0与 Magnum provider 直接相关的三个字段0.4.0 为containerinfra/v1/clusters.CreateOpts增加了三个字段FixedNetwork、FixedSubnet与FloatingIPEnabled。它们的当前实现可以在 clusters/requests.go 中直接看到FloatingIPEnabled *bool json:floating_ip_enabled,omitempty FixedNetwork string json:fixed_network,omitempty FixedSubnet string json:fixed_subnet,omitempty这三个字段允许在创建 Magnum 集群时指定固定网络、固定子网以及是否启用浮动 IP对应 OpenStack Magnum 服务Container Infra的网络规划能力。由于 CHANGELOG 是 0.8.0 版本发行时回溯整理的历史这些字段的存在说明 Magnum 集群创建 API 的网络配置能力在 2019 年 9 月已经趋于完整。5.2 标签tagsAPI 的完整落地0.4.0 新增compute/v2/extensions/tags.List与tags.Check0.5.0 又补齐了tags.Add、tags.Delete、tags.DeleteAll、tags.ReplaceAll部分 PR 在 CHANGELOG 中出现了重复编号记录如 GH-1694/GH-1696 的Add/ReplaceAll可视为同一能力的不同来源。至此 Nova 服务器标签的增删改查全部覆盖。0.5.0 还支持将服务器标签直接反序列化到compute/v2/servers.Server结构体以及为servers.Server增加AttachedVolumes字段。标签能力对资源管理和成本分摊场景非常重要虽然 Magnum provider 自身不直接使用 Nova tags但作为 SDK 通用能力它服务了所有 OpenStack 上的 Go 应用。5.3 端口转发与监听器增强networking/v2/extensions/layer3/portforwarding在 0.4.0/0.5.0 中从Create、Delete到List、Get、Update逐步补齐loadbalancer/v2/listeners在 0.5.0 中为CreateOpts、UpdateOpts、Listener三处新增AllowedCIDRs用于限制监听器的来源网段。0.5.0 还新增了identity/v3/tokens的ExtractDomain方法与ImageStatusImporting镜像状态常量并为baremetalintrospection/v1/introspection.RootDiskType增加ByPath选项。5.4 0.5.0 中的兼容性修复0.5.0 修复了一批与可更新性相关的问题networking/v2/extensions/lbaas_v2/listeners与loadbalancers的 options 参数类型从具体结构体放宽为UpdateOptsBuilder接口允许调用方传入自定义选项loadbalancer/v2/listeners.UpdateOpts中DefaultTlsContainerRef从string改为*string、SniContainerRefs从[]string{}改为*[]string{}lbaas_v2 下的同名结构体同步修改——指针化的目的是让调用方能够显式传入nil以在更新时移除该字段而空值此前会被omitempty直接省略无法表达删除语义。blockstorage/v1/volumes.Create的期望响应码被修正为 202。六、0.3.0 与 0.2.0元数据操作与 QoS 扩展6.1 0.3.0时间戳、密钥与共享文件系统0.3.0 为多个资源补充了CreatedAt/UpdatedAt时间戳字段networking/v2/extensions/layer3/floatingips.FloatingIP、networking/v2/extensions/security/groups.SecGroup、networking/v2/networks.Network新增identity/v3/extensions/trusts.Create/Delete委托信任关系密钥管理服务新增keymanager/v1/containers.CreateSecretRef/DeleteSecretRef向容器增删密钥引用共享文件系统服务Manila在sharedfilesystems/v2/shares下一次性补齐GetMetadata、GetMetadatum、SetMetadata、UpdateMetadata、DeleteMetadatum全套元数据操作并提供sharetypes.IDFromName名称查 ID 的便捷函数baremetal/apiversions.List/Get用于查询裸机服务 API 版本。修复方面baremetal/v1/nodes.CleanStep.Args从map[string]string放宽为map[string]interface{}清洗步骤参数可能包含非字符串值从loadbalancer/v2/monitors.ToMonitorCreateMap中移除URLPath与ExpectedCodes的强制输出因为 Octavia 在未指定时已提供默认值。6.2 0.2.0Neutron QoS 全量 API0.2.0 的绝大多数内容围绕 Neutron QoS服务质量扩展展开networking/v2/extensions/qos/policies的List、Get、Create、Update、Deleteqos/rules下带宽限制规则BandwidthLimitRules、DSCP 标记规则DSCPMarkingRules、最小带宽规则MinimumBandwidthRules各五件套 CRUD以及qos/ruletypes.GetRuleType查询规则类型。这些能力用于为网络端口配置带宽上限、流量标记与最小带宽保障。此外还有compute/v2/extensions/diagnostics.Get虚拟机诊断信息、baremetalintrospection/v1/introspection.Data的Hostname与Extra字段、blockstorage/extensions/volumeactions.SetImageMetadata。修复项包括qos/rules.UpdateBandwidthLimitRule的期望返回码改为 200compute/v2/extensions/schedulerhints.SchedulerHints.Query内容现在会被正确序列化为字符串。6.3 0.1.0起点0.1.02019-05-27是Initial tagged release即该库首次打版本标签的起点。此后所有版本均在此基础上增量演进没有向上回溯的兼容性承诺。七、CHANGELOG 之外的对照阅读从源码看关键 API 的真实形态CHANGELOG 只记录了发生了什么变化而仓库源码则记录了变化后的最终形态。以下三处对照阅读可以加深理解1.clusters.ResizeOpts的最终形态。在 clusters/requests.go 中type ResizeOpts struct { NodeCount *int json:node_count required:true NodesToRemove []string json:nodes_to_remove,omitempty NodeGroup string json:nodegroup,omitempty }NodeCount必须显式提供NodesToRemove用于指定要删除的节点按服务器 UUID 或 minion 索引NodeGroup则把 resize 动作限定到指定节点组。Magnum provider 的扩容走updateNodeCount只设NodeCount缩容走deleteNodes同时设置NodeCount与NodesToRemove正好对应 CHANGELOG 0.8.0 中Resize Extract 只返回 UUID的破坏性变更场景。2.nodegroups.ListOpts的 role 过滤。nodegroups/requests.go 中ListOpts的注释说明marker用于大数据集分页、sort_key默认按id排序、sort_dir默认asc。这与 Magnum 自动发现逻辑中先 List 全量、再按 role 与 MaxNodeCount 过滤的两段式策略相互印证。3. 认证选项与错误分级。auth_options.go 与 errors.go 分别对应 0.7.0 的 token 直用认证改进与 0.8.0 的StatusCodeError接口。若需在 Magnum provider 中区分配额不足依赖ErrUnexpectedResponseCode的 4xx/5xx 语义可借助该接口统一断言。八、升级与维护建议综合这份 CHANGELOG可以提炼出几条对使用方的实操建议重点关注 0.8.0 的两处破坏性变更若你的代码调用了keymanager/v1/acls或解析过clusters.Resize的 Extract 结构体升级时必须同步修改若像 Magnum provider 一样只丢弃 Extract 返回值则无需改动。0.6.0 的重新认证重构属于行为级变更虽为内部实现但直接影响长生命周期进程的 token 管理建议升级后在真实集群中观察认证刷新是否正常。0.7.0 的 endpoint 选择策略放宽多个 endpoint 不再报错而是取第一个这提升了容错性但也意味着行为变化依赖多 endpoint 报错的代码需要重新评估。指针化字段语义0.5.0 中DefaultTlsContainerRef、SniContainerRefs的指针化提示了 OpenStack 客户端开发的通用模式——用*T与nil表达删除该字段的更新意图后续接入其他 Update API 时可借鉴。安全依赖同步0.6.0go-yaml v2.2.4与 0.7.0golang.org/x/crypto的安全修复表明vendored 依赖同样需要跟踪上游安全公告由于当前仓库将 gophercloud 以内嵌源码方式维护升级时需同步核对 gophercloud/README.md 中关于该库不提供向后兼容保证Backwards-Compatibility Guarantees: None请自行 vendor 并编写覆盖所使用部分的测试的官方提示。结语作为一份记录 2019 年至 2020 年初演进历程的 CHANGELOG它浓缩了一个 OpenStack Go SDK 从初版发布到能力齐全的完整轨迹从 QoS、标签、端口转发等横向能力的铺开到containerinfra节点组、错误处理接口等纵向深度的突破再到认证、依赖安全等基础设施的持续加固。而对 Cluster Autoscaler 的 Magnum provider 而言这份 CHANGELOG 恰好勾勒出了其底层依赖的能力边界——nodegroups子包的出现让按节点组的自动伸缩成为可能Resize返回值的变化则在语义上更加简洁。深入阅读本仓库内 nodegroups/requests.go、clusters/requests.go 与 magnum_manager_impl.go 三处源码即可把这本变更史完整地映射到真实运行路径上。【免费下载链接】autoscalerAutoscaling components for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/au/autoscaler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考