资讯动态

kOps 下载与复用集群配置 Spec 文件:从状态存储导出到声明式集群管理

发布时间:2026/9/21 15:42:25 来源:尧图企业网站定制
kOps 下载与复用集群配置 Spec 文件从状态存储导出到声明式集群管理【免费下载链接】kopsKubernetes Operations (kOps) - Production Grade k8s Installation, Upgrades and Management项目地址: https://gitcode.com/gh_mirrors/kop/kopskOps 的集群配置config spec file在kops create cluster阶段生成并被上传到创建时指定的状态存储如 Amazon S3 bucket中。当集群已经按照你期望的方式配置好之后你可以把这份配置文件下载下来再用kops create -f以完全无人值守的方式重建整个集群也可以把集群与各实例组InstanceGroup拆分成独立的 YAML 文件纳入源码管理并实现可重复的创建/更新流程。本文以 docs/advanced/download_config.md 为骨架结合 kOps 仓库源码讲解配置文件的生成、导出、复用与实例组管理全流程。kOps 配置 Spec 文件是什么kOps 的核心理念是kubectl for Clusters就像 kubectl 用 YAML 管理 Kubernetes 对象一样kOps 用一个声明式的配置 spec 文件描述整个 Kubernetes 集群。这个文件在create 阶段生成并被上传到创建时传入的KOPS_STATE_STORE例如s3://k8s-us-west中作为集群的源真source of truth。从源码看状态存储中保留了两个关键的集群 spec 文件见 pkg/apis/kops/registry/registry.goconfig用户指定的集群 specPathCluster configcluster-completed.spec补全后的集群 specPathClusterCompleted cluster-completed.spec即 kOps 为所有未显式指定的参数填充默认值之后的完整版本。ConfigBase()则根据cluster.Spec.ConfigStore.Base解析出状态存储的 VFS 路径registry.go。因此下载配置本质上就是从该路径读取这些 spec 对象。从命令行参数创建集群假设你按以下配置选项创建集群沿用原文档示例export KOPS_STATE_STOREs3://k8s-us-west export CLOUDaws export ZONEus-west-1a export CONTROL_PLANE_ZONESus-west-1a export NAMEk8s.example.com export K8S_VERSION1.36.4 export NETWORKCIDR10.240.0.0/16 export CONTROL_PLANE_SIZEm5.large export WORKER_SIZEm5.large然后在终端中调用 kOps 创建集群kops create cluster $NAME \ --cloud$CLOUD \ --zones$ZONE \ --kubernetes-version$K8S_VERSION \ --control-plane-zones$CONTROL_PLANE_ZONES \ --control-plane-size$CONTROL_PLANE_SIZE \ --node-count3 \ --node-size$WORKER_SIZE \ --network-cidr${NETWORKCIDR} \ --dns-zoneZVO7KL181S5AP \ --ssh-public-key$HOME/.ssh/lab_no_password.pub各参数含义简述参数作用--cloud云提供商如aws、gce、azure等--zones集群部署的可用区列表--control-plane-zones控制平面master所在可用区--kubernetes-version要安装的 Kubernetes 版本--control-plane-size/--node-size控制平面与工作节点的实例规格--node-count工作节点数量--network-cidrVPC 网段如10.240.0.0/16--dns-zone使用的 Route53 DNS Zone ID--ssh-public-key注入节点的 SSH 公钥更多完整参数见 kops_create_cluster 命令文档。注意上述kops create cluster只写入状态存储、生成配置并不会真正创建云资源之后仍需执行kops update cluster --yes才会在云上落地。这一点在 cmd/kops/create.go 的源码中也有体现——命令末尾会提示To deploy these resources, run: kops update cluster --name NAME --yes。下载配置kops get 命令要导出已创建集群的配置使用 kOps 命令kops get --name $NAME -o yaml a_fun_name_you_will_remember.yml前提执行上述命令前必须在环境中导出集群名与状态存储变量export NAMEk8s.example.com export KOPS_STATE_STOREs3://k8s-us-west关于-o参数kops get支持table默认、yaml、json三种输出格式定义于 cmd/kops/get.go由--output, -o标志选择get.go。需要说明的一个演进从源码看kops get命令本身已标记为deprecatedget.go会打印kops get [CLUSTER] is deprecated: use kops get all [CLUSTER]并转调RunGetAll。因此新脚本建议直接使用kops get all $NAME -o yaml $NAME.ymlkops get all会一次性导出Cluster 所有 InstanceGroup addons三个层次的资源见 cmd/kops/get_all.go与旧的kops get行为一致。如果你只想导出集群本身的 spec不含实例组可改用kops get cluster $NAME -o yaml cluster-only.yml该命令对应 cmd/kops/get_cluster.go示例注释中也给出了kops get cluster k8s-cluster.example.com -o yaml与重定向保存的用法见 get_cluster.go。关于 --full谨慎使用完整 speckops get cluster还有一个--full标志get_cluster.go会从状态存储读取cluster-completed.spec输出补全后的完整配置get_cluster.go。但源码中明确附带警告get_cluster.goWARNING: Do not use a --full cluster specification to define a Kubernetes installation. You may experience unexpected behavior and other bugs. Use only the required elements and any modifications that you require.也就是说--full适合用来查看/调试实际生效的完整配置但不要拿它作为kops create -f的输入——你只需保留核心字段和你自己的修改其余交给 kOps 补全否则可能出现难以排查的怪异行为。复用配置无人工介入地重建集群如果集群当前的配置正是你想要的那么把导出的配置 spec 文件直接传给 create 命令即可kOps 会完全按照文件重建集群kops create -f spec_filekops create -f支持从本地文件或 stdin-读取文件内容可以是单个或多个 YAML/JSON section以---分隔并支持Cluster、InstanceGroup、SSHCredential以及任意 addon 对象见 cmd/kops/create.go。其处理逻辑值得注意对Cluster对象会调用cloudup.PerformAssignments()为缺失字段补全默认值create.go这意味着旧版本导出的、字段不全的 spec 也能被重新创建对InstanceGroup对象要求 metadata 中带kops.k8s.io/cluster: 集群名标签否则报错create.go如果目标资源已存在会返回cluster xxx already exists之类的错误create.go。正是导出配置 → 复用配置这一闭环让 kOps 集群具备了声明式、可复现的运维能力。管理实例组集群与实例组分开管理kops get --name $NAME -o yaml $NAME.yml导出的是整个集群含所有实例组。另一种推荐做法是为集群与每个实例组各维护一份独立的 YAML 文件——一份$NAME.yaml描述集群instancegroup/目录下每份文件描述一个实例组。这样你就可以写出幂等的创建/更新脚本if ! kops get cluster --name $NAME; then kops create -f kops/$CLUSTER/$REGION.yaml else kops replace -f kops/$CLUSTER/$REGION.yaml fi for ig in kops/$CLUSTER/instancegroup/*; do if ! kops get ig --name $NAME $(basename $ig); then kops create -f $ig else kops replace -f $ig fi done这个模式本质上是create-or-replace幂等应用kops get cluster --name $NAME判断集群是否已存在不存在时命令返回非零退出码不存在 →kops create -f创建已存在 →kops replace -f用新 spec 覆盖旧配置实例组同理用kops get ig --name $NAME ig名探测ig是instancegroups的别名见 cmd/kops/get_instancegroups.go。从源码看kops replace的语义与 create 不同cmd/kops/replace.go对Cluster先通过云 API 查询当前集群状态cloud.FindClusterStatus资源不存在时报错除非加--forcereplace.go存在则执行UpdateCluster把新的 desired spec 写入状态存储对InstanceGroup同样先探测不存在时报错除非--force存在则Updatereplace.go。所以上面脚本中的kops replace分支是安全的它只会更新已经存在的对象不会因为文件与现有状态不一致而误建重复资源。拆分管理的好处还包括实例组变更如扩缩容、换机型只影响对应文件diff 更清晰集群级配置与节点池配置职责分离文件可提交进 Git实现基础设施即代码。修改配置后的落地流程无论是修改集群 spec 还是实例组 YAML改完文件后都需要让变更真正落到云端标准三步为kops replace -f $NAME.yaml # 或 kops create -f首次 kops update cluster $NAME --yes # 应用变更到云资源 kops rolling-update cluster $NAME --yes # 滚动重启实例使节点生效其中rolling-update用于分批替换实例以应用节点级配置kubelet 参数、镜像等详见 kops_rolling-update_cluster 命令文档。关于配置文件的进一步使用与修改方式包括kops edit、直接编辑 spec、通过 API 定制等可参考 使用 Manifest 管理 kOps 集群各类可配置字段的语义可查阅 cluster_spec.md 与 instance_groups.md。最佳实践与注意事项结合原文档与源码实现给出如下实践建议只导出你需要的配置kops get -o yaml导出的核心 spec 已经足够驱动kops create -f不要用--full输出作为创建输入让 kOps 补全它该管的字段PerformAssignments会自动填充未指定参数。如果你在 YAML 中手写过多本可由 kOps 推导的值一旦环境变化如新可用区、新默认镜像反而容易产生不一致脚本幂等是关键集群/实例组一律采用先探测、后 create/replace的模式避免重复创建报错或状态漂移环境变量先行所有依赖--name与KOPS_STATE_STORE的命令get、create -f、replace都要求这两个值在环境中可解析配置文件纳入版本控制把集群 spec 与实例组 YAML 提交到 Git配合 CI 即可实现集群配置的可审计、可回滚与自动重建变更前先在非生产环境验证kOps 官方在 manifests_and_customizing_via_api.md 中同样强调不要在生产环境直接测试 manifest 改动先在小集群验证遇到奇怪行为时优先让 kOps 管更多。掌握创建 → 导出 → 复用 → 幂等更新这条链路后你就能把 kOps 集群运维从交互式命令行升级为完全声明式、可自动化的基础设施交付流程。【免费下载链接】kopsKubernetes Operations (kOps) - Production Grade k8s Installation, Upgrades and Management项目地址: https://gitcode.com/gh_mirrors/kop/kops创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价