ARTICLE DETAIL

资讯详情

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

在 Scaleway 上使用 kOps 部署生产级 Kubernetes 集群:从零创建到 Terraform 管理全指南

在 Scaleway 上使用 kOps 部署生产级 Kubernetes 集群:从零创建到 Terraform 管理全指南 在 Scaleway 上使用 kOps 部署生产级 Kubernetes 集群从零创建到 Terraform 管理全指南【免费下载链接】kopsKubernetes Operations (kOps) - Production Grade k8s Installation, Upgrades and Management项目地址: https://gitcode.com/gh_mirrors/kop/kopskOpsKubernetes Operations为 Kubernetes 集群的创建、升级与管理提供了全生命周期支持本文聚焦其Scaleway 云平台支持从环境准备、凭据配置、单 Master 集群创建到集群编辑/删除、Terraform 配置生成与滚动更新后的状态一致性修复给出完整可运行的实战流程。读完本文你将掌握在 Scaleway 上以 kOps 落地 Kubernetes 集群的完整路径并理解其底层 feature flag 门控、模型构建与资源打标机制源码依据见 pkg/model/scalewaymodel。当前状态与功能边界WARNINGkOps 对 Scaleway 的支持目前处于alpha阶段属于早期开发功能随时可能发生变更请谨慎使用。已支持的功能集群全生命周期创建create、更新update与删除delete集群支持滚动更新实例组管理创建、编辑与删除实例组Instance Groups可编辑字段包括但不限于实例镜像Instance image实例规格Instance size即 Scaleway 的商业类型 commercial type单 Master 到多 Master 迁移支持从单控制面平滑迁移到高可用多控制面架构。规划中的功能以下能力尚未实现属于后续开发方向Cluster Autoscaler自动扩缩容支持私有网络Private networkBareMetal 裸金属服务器。从源码结构看这些规划直接对应 Scaleway 云层实现中尚缺的能力例如 api_loadbalancer.go 明确以错误返回说明Scaleway 集群目前没有 VPC因此暂不支持内网负载均衡器印证了私有网络能力的缺失。环境准备在开始之前请确保满足以下前置条件已安装kops版本 1.26安装方式见 安装指南已安装kubectl用于与集群交互Scaleway 凭据至少需要 Access Key、Secret Key 和 Project IDS3 兼容对象存储桶及其凭据kOps 使用状态存储state store保存集群配置。桶的凭据可以与创建集群资源所用的凭据不同。如果使用 Scaleway 的对象存储桶需要在KOPS_STATE_STORE环境变量中为桶名加上scw://前缀有关状态存储的更多信息见 state.md。可选依赖SSH 密钥创建集群可以不提供 SSH 密钥但在更新集群时是必需的。支持id_rsa与id_ed25519两种格式域名如果希望把集群托管在自己的域名下需要在 Scaleway 注册该域名用于 Scaleway DNS 方案。环境变量配置1. 启用 Scaleway 支持由于 Scaleway 支持处于 alpha 阶段它被 feature flag 门控必须显式开启export KOPS_FEATURE_FLAGSScaleway这个 flag 在源码中有明确对应pkg/featureflag/featureflag.go 定义了Scaleway new(Scaleway, Bool(false))默认关闭pkg/clouds/supported.go 中只有在featureflag.Scaleway.Enabled()为真时才会把scaleway追加到可用的云平台列表随后kops create cluster --cloudscaleway才能通过校验。2. 配置 Scaleway 凭据kOps 通过 Scaleway 官方 SDKscaleway-sdk-go调用其 API凭据有两种传入方式方式一使用 SCW 配置文件推荐给已有 Scaleway DevTools 的用户如果你已经使用过 Scaleway 的命令行工具本地通常已有配置文件默认路径为$HOME/.config/scw/config.yaml可以通过 profile 名直接复用export SCW_PROFILEmy-profile方式二直接在环境中设置凭据export SCW_ACCESS_KEYmy-access-key export SCW_SECRET_KEYmy-secret-key export SCW_DEFAULT_PROJECT_IDmy-project-id注意profile 优先于环境变量被检查但如果你同时设置了二者环境变量会覆盖配置文件profile中的信息。在源码层面cloud.go 的NewScwCloud正是通过读取SCW_PROFILE或SCW_ACCESS_KEY/SCW_SECRET_KEY/SCW_DEFAULT_PROJECT_ID这些环境变量来构建 Scaleway 客户端并初始化 Domain、IAM、Instance、IPAM、LB、Marketplace 等一组 API 服务对象。3. 配置状态存储桶S3 Bucket凭据为了让 kOps 能读写状态存储桶中的集群配置还需要设置以下变量。这些凭据可以与上一节的凭据相同也可以不同export KOPS_STATE_STOREscw://bucket-name # bucket-name 为之前创建的桶名 # Scaleway 对象存储兼容 S3 协议因此只需覆盖部分 S3 配置即可指向我们的桶 export S3_REGIONfr-par # 或其他提供对象存储的 Scaleway 区域 export S3_ENDPOINTs3.$S3_REGION.scw.cloud # 定义 provider 端点 export S3_ACCESS_KEY_IDmy-access-key # 桶的 S3 API Access Key export S3_SECRET_ACCESS_KEYmy-secret-key # 桶的 S3 API Secret Key创建单 Master 集群基础创建命令如下分别演示三种典型场景# 场景一无 DNS可用区 fr-par-1 kops create cluster --cloudscaleway --namemy.cluster --zonesfr-par-1 --dnsnone --yes # 场景二使用 Scaleway DNS需要你在 Scaleway 注册并拥有该域名可用区 pl-waw-1 kops create cluster --cloudscaleway --namemycluster.mydomain.com --zonespl-waw-1 --yes # 场景三无 DNS新集群默认就是无 DNS 选项可用区 nl-ams-2 kops create cluster --cloudscaleway --namemycluster.k8s.local --zonesnl-ams-2 --yes上述命令会以如下默认参数创建集群容器网络接口CNIcilium。要更换使用--networkingcalico受支持的 CNI 完整列表见网络页面实例规格Instance typeDEV1-M。可通过--node-sizePRO2-XS和/或--control-plane-sizePRO2-XS修改实例镜像Instance imageubuntu_jammy。可通过--node-imageubuntu_focal和/或--control-plane-imageubuntu_focal修改。这些默认值均有源码依据默认实例规格常量定义于 populate_instancegroup_spec.godefaultNodeMachineTypeScaleway DEV1-M、defaultMasterMachineTypeScaleway DEV1-M默认镜像则由defaultImage结合集群架构与频道信息推断。此外instances.go 定义了根卷大小默认值节点Node根卷默认50GB、控制面Control Plane根卷默认20GB并且对于仅支持块存储的商用类型PRO、PLAY、ENT前缀见 instances.go会自动把根卷调整到上述大小块存储卷默认大小仅为 10GB不满足需求。注意目前只能将 kOps 集群创建在单个可用区中可选可用区为fr-par-1、fr-par-2、fr-par-3、nl-ams-1、nl-ams-2、nl-ams-3、pl-waw-1、pl-waw-2。集群的日常管理编辑集群配置# 在文本编辑器中打开集群配置文件供修改 kops edit cluster mycluster.k8s.local --statescw://my-state-store # 应用修改 kops update cluster mycluster.k8s.local --yes删除集群kops delete cluster mycluster.k8s.local --yes从模型构建的角度看kOps 在创建集群时会为 Scaleway 生成以下几类资源任务见 pkg/model/scalewaymodel实例Instanceinstances.go 为每个实例组生成对应数量的scalewaytasks.Instance并自动打上集群名、实例组名及角色标签ControlPlane/NodekOps 正是依靠这些标签如noprefixkops.k8s.io/cluster定义于 cloud.go来识别、归组和管理云资源负载均衡器Load Balancerapi_loadbalancer.go 在集群需要为 API 前置负载均衡时创建名为api.cluster-name的公网 LB并为其配置 HTTPS 后端/前端转发至 kube-apiserver 端口若使用私有/无 DNS 拓扑还会追加 kops-controller 的 LB 转发规则DNS 记录dns.go 在集群发布 DNS 记录时为 API 外部、内部以及kops-controller.internal创建 TTL 为 60 秒的 A 记录占位 IP 为203.0.113.123真实 IP 在资源落地后由 kOps 回填/更新SSH 密钥sshkey.go 将用户提供的 SSH 公钥注册为 Scaleway 的 SSH 密钥资源。Terraform 支持kOps 可以将集群直接生成对应的 Terraform 配置而不是由 kOps 直接创建资源。更多背景见 kOps Terraform 支持。场景一无负载均衡器的集群使用 Scaleway DNSkops create cluster --cloudscaleway --namemycluster.mydomain.com --zonesfr-par-1 --targetterraform --out$OUTPUT_DIR cd $OUTPUT_DIR terraform init terraform applykOps 会在你指定的输出目录中生成kubernetes.tf文件你只需初始化 Terraform 并执行 apply 即可。注意每次使用--targetterraform --out$OUTPUT_DIR重新调用 kOps 都会覆盖kubernetes.tf因此你对它所做的任何手工修改都会丢失。场景二带负载均衡器的集群无 DNS对于无 DNS 的集群存在一个特殊技巧kOps 在编写实例的 cloud-init 配置时还不知道负载均衡器的 IP 地址因此需要先执行一次 update再做一次滚动更新rolling-update。第一步创建有效集群kops create cluster --cloudscaleway --namemy.cluster --zonesfr-par-1 --targetterraform --out$OUTPUT_DIR cd $OUTPUT_DIR terraform init terraform apply # 负载均衡器就绪后更新集群以把其 IP 集成进实例配置 kops update cluster my.cluster --targetterraform --out$OUTPUT_DIR # 替换实例使其携带新配置重启此时集群尚无法校验因此需要 --cloudonly 标志 kops rolling-update cluster my.cluster --cloudonly --yes第二步保持 Terraform 状态与滚动更新后的一致性实例被滚动更新替换后集群即可通过校验。但此时资源已经脱离了 Terraform 的管理状态文件是失效的。若要保持状态与集群一致需要把新实例导入 Terraform 状态可使用以下脚本# 首先获取实例名称 cd $OUTPUT_DIR || exit TF_SERVERS($(grep resource scaleway_instance_server kubernetes.tf | awk {print $3} | cut -d -f 2)) # 然后获取导入所需的可用区 ZONE$(terraform output zone | cut -d -f2) # 对每个实例 for SERVER in ${TF_SERVERS[]}; do # 从状态中移除过期的实例 terraform state rm scaleway_instance_server.$SERVER # 获取其新 ID NEW_SERVER_ID$(scw instance server list zone$ZONE name$SERVER -o template{{ .ID }}) if [ $NEW_SERVER_ID ]; then echo could not find new ID of the server $SERVER fi # 将新实例导入状态 terraform import scaleway_instance_server.$SERVER $ZONE/$NEW_SERVER_ID done注意运行该脚本需要安装Scaleway CLIscw。你也可以在 Scaleway Console 中手动查询新实例的 ID但如果实例数量较多手动方式并不实际。下一步现在你已经拥有了一个可用的 kOps 集群建议继续阅读生产环境配置建议了解如何为生产负载配置 kOps。例如你可以把集群迁移到高可用架构将单 Master 扩展为多控制面以提升集群的容灾能力。小结本文完整覆盖了在 Scaleway 上使用 kOps 的落地路径先通过KOPS_FEATURE_FLAGSScaleway打开 alpha 支持再配置 SCW 凭据与 S3 兼容状态存储随后用一条kops create cluster --cloudscaleway命令即可创建默认 CNI 为 Cilium、实例规格为 DEV1-M、镜像为 ubuntu_jammy 的集群日常管理通过kops edit/update/delete完成如需基础设施即代码可用--targetterraform生成kubernetes.tf并对带负载均衡器的无 DNS 集群执行先 update 后 rolling-update、再导入新实例的三步流程。需要特别留意的是当前支持仍为 alpha、单可用区部署、尚未支持内网负载均衡与自动扩缩容生产使用前请结合源码与官方文档充分评估。【免费下载链接】kopsKubernetes Operations (kOps) - Production Grade k8s Installation, Upgrades and Management项目地址: https://gitcode.com/gh_mirrors/kop/kops创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表