ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

DigitalOcean Kubernetes 集群自动扩缩容实战:autoscaler 项目 DigitalOcean Cloud Provider 接入与配置指南

DigitalOcean Kubernetes 集群自动扩缩容实战:autoscaler 项目 DigitalOcean Cloud Provider 接入与配置指南 DigitalOcean Kubernetes 集群自动扩缩容实战autoscaler 项目 DigitalOcean Cloud Provider 接入与配置指南【免费下载链接】autoscalerAutoscaling components for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/au/autoscaler本指南以 autoscaler 仓库中 DigitalOcean 云厂商插件Cloud Provider为核心系统讲解如何为 DigitalOcean Kubernetes ServiceDOKS集群启用 Cluster Autoscaler包括 JSON 云配置文件各参数的正确用法、扩缩容行为的驱动机制以及从源码构建镜像到部署的完整开发流程。读完本文你将掌握 DigitalOcean 节点池Node Pool自动扩缩容的配置方法与底层调用链并能够基于仓库源码自行构建、验证该插件。概述面向 DOKS 节点池的 Cluster AutoscalerDigitalOcean Cluster Autoscaler 文档 是本仓库中cluster-autoscaler组件针对 DigitalOcean 云平台DOKS的实现说明。Kubernetes 官方 Cluster Autoscaler 会根据 Pod 调度需求自动调整工作节点数量DigitalOcean 版本将这种能力映射到 DOKS 的节点池Node Pool维度上它在指定 DigitalOcean Kubernetes 集群的任意节点池内自动伸缩工作节点并且作为 DOKS 提供的一项能力可以针对已有集群动态启用或禁用。整个仓库是一个包含多套 Kubernetes 扩缩容组件addon-resizer、vertical-pod-autoscaler、cluster-autoscaler、balancer 等的 autoscaler 项目而 DigitalOcean 插件位于 cluster-autoscaler/cloudprovider/digitalocean/ 目录下是众多云厂商实现之一与 aws、azure、gce 等并列。该插件在 Kubernetes 中注册的云厂商名为digitalocean见 digitalocean_cloud_provider.go// ProviderName is the cloud provider name for this provider. const ProviderName digitalocean func init() { builder.RegisterCloudProvider(ProviderName, func(opts *coreoptions.AutoscalerOptions, do cloudprovider.NodeGroupDiscoveryOptions, rl *cloudprovider.ResourceLimiter, informerFactory informers.SharedInformerFactory) cloudprovider.CloudProvider { return BuildDigitalOcean(opts, do, rl) }) builder.SetDefaultCloudProvider(ProviderName) }其中builder.SetDefaultCloudProvider(ProviderName)意味着在编译时若仅启用该厂商DigitalOcean 会被作为默认云厂商加载具体的构建方式见下文「开发与构建」一节。配置云配置文件Cloud ConfigDigitalOcean 云厂商使用一个 JSON 格式的配置文件来初始化通过 Cluster Autoscaler 的--cloud-config命令行参数传入该参数在 BuildDigitalOcean 中被os.Open(opts.CloudConfig)打开并交由newManager解析。配置参数一览参数类型必填说明cluster_idstring是DigitalOcean Kubernetes 集群的 ID一个 UUIDtokenstring二选一直接以字面量形式给出的 DigitalOcean 访问令牌Access Tokentoken_filestring二选一存放 DigitalOcean 访问令牌的文件路径urlstring否DigitalOcean API 地址默认https://api.digitalocean.com/约束token与token_file必须且只能提供其中一个。这一规则在 digitalocean_manager.go 中有严格校验并且与 README 的声明完全一致if cfg.Token cfg.TokenFile { return nil, errors.New(access token is not provided) } if cfg.Token ! cfg.TokenFile ! { return nil, errors.New(access token literal and access token file must not be provided together) } if cfg.ClusterID { return nil, errors.New(cluster ID is not provided) }对应的 JSON 结构体定义在 digitalocean_manager.go// Config is the configuration of the DigitalOcean cloud provider type Config struct { ClusterID string json:cluster_id Token string json:token TokenFile string json:token_file URL string json:url }配置示例一个完整的、使用字面量令牌的配置文件如下该示例形态与单元测试中使用的配置一致见 digitalocean_manager_test.go{ cluster_id: 123456, token: dop_v1_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, url: https://api.digitalocean.com/v2 }若希望避免在配置文件中明文存放令牌可以改用token_file{ cluster_id: 123456, token_file: /etc/do/token, url: https://api.digitalocean.com/v2 }参数语义与校验细节源码级结合 digitalocean_manager.go 的实现可以归纳出以下实际行为token_file的处理读取文件内容后会先bytes.TrimSpace去除首尾空白再判定是否为空。也就是说即使文件中只有空白字符也会被判定为「空令牌文件」并报错。仓库 testdata/ 目录下的correct_token、empty_token、whitespace_token三个测试夹具分别覆盖了「合法令牌」「空文件」「全空白文件」三种情形。url的可选性url为空时使用 godo 客户端默认值https://api.digitalocean.com/若显式提供则通过godo.SetBaseURL(cfg.URL)覆盖测试中常见写法是https://api.digitalocean.com/v2。认证方式插件使用 OAuth2 静态令牌源oauth2.StaticTokenSource构造 HTTP 客户端再基于 godo SDK 创建 DigitalOcean 客户端User-Agent 固定为cluster-autoscaler-digitalocean/version。校验错误是致命错误配置缺失或非法时BuildDigitalOcean会调用klog.Fatalf直接终止进程而不是降级运行确保配置错误被快速暴露。配置文件在部署中的传入方式--cloud-config是 Cluster Autoscaler 的通用启动参数。在 Kubernetes 中部署时通常将 JSON 配置以 Secret 或 ConfigMap 挂载到 Pod 内再通过命令行参数指向其路径。启动命令示例./cluster-autoscaler \ --cloud-providerdigitalocean \ --cloud-config/etc/do/cloud-config.json \ --namespacekube-system \ --logtostderrtrue \ --stderrthresholdinfo \ --v4注意--cloud-providerdigitalocean需要二进制以 DigitalOcean 构建标签编译见「开发与构建」否则该厂商不会被注册。行为扩缩容参数从 DOKS API 驱动这是本插件与很多云厂商实现的重要差异Autoscaler 本身的启停状态、节点池的最小/最大节点数等参数不是通过 Cluster Autoscaler 启动参数或节点组发现参数配置的而是通过 DOKS 公开 API 配置再由节点池Node Pool对象反映出来。Cloud Provider 会周期性地从 API 拉取这些配置并相应调整自身行为。从 digitalocean_cloud_provider.go 可以看到Refresh()在每个主循环前被调用并委托给 Manager// Refresh is called before every main loop and can be used to dynamically // update cloud provider state. func (d *digitaloceanCloudProvider) Refresh() error { klog.V(4).Info(Refreshing node group cache) return d.manager.Refresh() }而 digitalocean_manager.go 中的Manager.Refresh()是核心实现——它调用 DOKS API 的ListNodePools拉取集群下所有节点池并做两件关键事情按AutoScale标志过滤只有开启了自动扩缩容nodePool.AutoScale true的节点池才会被纳入 NodeGroup 列表未开启的节点池被跳过这正是「通过 API 动态启用/禁用」的机制所在。读取MinNodes/MaxNodes将 API 返回的最小/最大节点数直接赋给 NodeGroup 的minSize/maxSize成为扩缩容的边界。for _, nodePool : range nodePools { if !nodePool.AutoScale { continue } nodePoolTemplateResponse, _, err : m.client.GetNodePoolTemplate(ctx, m.clusterID, nodePool.Name) ... group append(group, NodeGroup{ id: nodePool.ID, clusterID: m.clusterID, client: m.client, nodePool: nodePool, nodePoolTemplate: nodePoolTemplateResponse, minSize: nodePool.MinNodes, maxSize: nodePool.MaxNodes, }) }当所有节点池都未启用自动扩缩容时Manager 会记录一条 INFO 日志cluster-autoscaler is disabled. no node pools are configured此时没有可操作的 NodeGroup相当于 Autoscaler 被「关闭」。Refresh的触发频率由 Cluster Autoscaler 的--scan-interval控制默认 10 秒测试 digitalocean_manager_test.go 也验证了「带AutoScale: true与MinNodes/MaxNodes的节点池会被纳入并正确读取边界未设置 autoscale 配置的节点池则被忽略」这一行为。节点池与 NodeGroup 的映射源码级NodeGroup 与节点池一一对应一个开启自动扩缩容的节点池对应一个NodeGroup其Id()返回节点池 IDDebug()输出格式为cluster ID: pool-id (min:min max:max)见 digitalocean_node_group.go。自动发现全部节点池与需要--node-group-auto-discovery或-nodes参数的其他厂商不同DigitalOcean 插件会自动使用集群中的所有节点池因此不使用cloudprovider.NodeGroupDiscoveryOptions相关标志见 digitalocean_cloud_provider.go 中的注释说明。Provider ID 约定节点 Provider ID 采用digitalocean://droplet-id前缀格式常量doProviderIDPrefixtoProviderID/toNodeID负责前缀的拼接与剥离见 digitalocean_cloud_provider.go。节点归属查找NodeGroupForNode通过比对node.Spec.ProviderID与各节点池内节点 ID 来确定节点所属的节点池见 digitalocean_cloud_provider.go。扩缩容动作的底层调用链当 CA 决定扩容或缩容时会触发NodeGroup的以下方法它们最终都转换为对 DOKS API 的调用见 digitalocean_node_group.go方法作用底层 API 调用IncreaseSize(delta)扩容delta 必须为正且目标值不能超过MaxSize()UpdateNodePool(Count当前delta)DecreaseTargetSize(delta)减少目标规模delta 必须为负且不低于MinSize()UpdateNodePool(Count当前delta)DeleteNodes(nodes)删除指定节点借助节点标签doks.digitalocean.com/node-id定位逐个DeleteNodeTargetSize()返回当前目标规模直接返回节点池CountNodes()返回节点池内全部实例及状态直接读取缓存的节点池数据在IncreaseSize中插件还会校验 API 返回的新Count是否与期望一致不一致则报错并拒绝更新本地缓存DeleteNodes中若节点缺少doks.digitalocean.com/node-id标签例如尚未注册的占位节点会拒绝删除。toInstanceStatus将 DOKS 节点状态provisioning/running/draining/deleting映射为 CA 的InstanceCreating/InstanceRunning/InstanceDeleting未知状态则携带ErrorInfo标记异常见 digitalocean_node_group.go。从零扩容Scale from Zero支持插件实现了TemplateNodeInfo()通过GetNodePoolTemplate从 API 获取节点池模板容量、可分配资源、标签、污点构造出「新节点长什么样」的模拟信息供 CA 在扩容模拟中预测新增节点是否满足 Pod 调度。模板数据在Refresh时缓存缓存未命中时也会实时拉取见 digitalocean_node_group.go。开发构建二进制与镜像README 提供了从源码构建 DigitalOcean 版 Cluster Autoscaler 的完整流程前提是进入本仓库cluster-autoscaler目录即 autoscaler 仓库中cluster-autoscaler子目录的根路径。1. 构建 cluster-autoscaler 二进制GOARCHamd64 make build-in-docker该目标在 cluster-autoscaler/Makefile 中的实现为先通过docker-builder构建autoscaling-builder构建镜像基础镜像来自仓库根目录的 builder/ 目录再在容器内执行对应架构的编译docker-builder: docker build --network${DOCKER_NETWORK} -t autoscaling-builder ../builder build-in-docker: build-in-docker-arch-$(GOARCH) build-in-docker-arch-%: clean-arch-% docker-builder docker run ${RM_FLAG} -v pwd:/gopath/src/k8s.io/autoscaler/cluster-autoscaler/:Z autoscaling-builder:latest \ bash -c cd /gopath/src/k8s.io/autoscaler/cluster-autoscaler BUILD_TAGS${BUILD_TAGS} LDFLAGS${LDFLAGS} make build-arch-$*说明Makefile 中的编译会依据BUILD_TAGS决定启用哪些云厂商。仓库内其他厂商如 ionoscloud文档中可见make build-in-docker BUILD_TAGSionoscloud的用法DigitalOcean 类似地通过构建标签digitalocean将 router_digitalocean.go 纳入编译从而注册该厂商。如果你的二进制是在完整构建全部厂商下生成的同样包含 DigitalOcean 支持。2. 构建 Docker 镜像docker build --platform linux/amd64 -f Dockerfile.amd64 -t digitalocean/cluster-autoscaler:dev .该命令以仓库根目录的 cluster-autoscaler/Dockerfile.amd64 为 Dockerfile该文件已存在于 cluster-autoscaler/ 目录下将上一步构建出的二进制封装为镜像并打上digitalocean/cluster-autoscaler:dev标签。3. 推送镜像到 Docker Hubdocker push --platform linux/amd64 digitalocean/cluster-autoscaler:dev推送完成后即可在 DOKS 集群中以 DaemonSet 或 Deployment 形式部署该镜像配合--cloud-config指向的配置文件运行。部署建议与注意事项配置文件校验是硬性的启动前请确保cluster_id非空、token/token_file恰好提供其一且令牌具备访问 DOKS Kubernetes API 的权限配置错误会导致进程直接Fatal退出。扩缩容边界以 DOKS API 为准由于min/max与开关状态都来自节点池对象任何对节点池自动扩缩容参数的修改例如通过 DO 控制台或 API都会在下一次--scan-interval默认 10 秒内被插件感知并生效。节点删除依赖标签节点必须带有doks.digitalocean.com/node-id标签DOKS 自动注入才能被安全删除自定义或手工创建的节点可能缺少该标签而被拒绝删除。自动发现全部节点池无需配置-nodes或--node-group-auto-discovery插件会自动枚举集群中所有开启 AutoScale 的节点池若没有任何节点池开启 AutoScale插件将处于空闲状态并打印相应日志。延伸阅读DigitalOcean 云厂商实现源码digitalocean_cloud_provider.go、digitalocean_manager.go、digitalocean_node_group.go单元测试与测试夹具digitalocean_manager_test.go、digitalocean_node_group_test.go、testdata/云厂商注册入口构建标签digitaloceanrouter_digitalocean.goCluster Autoscaler 构建与发布流程cluster-autoscaler/Makefile、cluster-autoscaler/Dockerfile.amd64集群自动扩缩容的总体设计文档cluster-autoscaler/README.md【免费下载链接】autoscalerAutoscaling components for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/au/autoscaler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表