378 字
2 分钟
Kubernetes Operator 开发实战:用 Go 扩展 K8s 能力
K8s 不仅仅是容器编排
大多数人只用 K8s 的内置资源:Pod, Deployment, Service。 但 K8s 真正的威力在于它是一个 可扩展的分布式操作系统。 它的 API Server 是通用的。
Operator 模式 = CRD (自定义资源) + Controller (控制器)。
场景:自动管理 Redis 集群
假设你想部署一个 Redis 集群。 用 Deployment?不行,Redis 有状态,主从切换逻辑复杂。 用 StatefulSet?可以,但故障恢复还是需要人工干预。
这时候,你需要写一个 RedisOperator。
1. 定义 CRD
apiVersion: db.example.com/v1kind: RedisClustermetadata: name: my-cachespec: replicas: 3 version: "6.2" storage: "10Gi"2. 编写 Controller (Reconcile Loop)
Controller 的核心逻辑是一个死循环(调和循环): “观察现状 (Current State) -> 对比期望 (Desired State) -> 执行动作 (Action)“
func (r *RedisReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { // 1. 获取 CR 对象 var redis RedisCluster if err := r.Get(ctx, req.NamespacedName, &redis); err != nil { return ctrl.Result{}, client.IgnoreNotFound(err) }
// 2. 检查 Pod 是否存在 var pods corev1.PodList // ... 列出 Pods ...
// 3. 比较数量 if len(pods.Items) < redis.Spec.Replicas { // 4. 创建新 Pod r.Create(ctx, newPod(&redis)) }
return ctrl.Result{}, nil}为什么是 Go?
虽然可以用 Java 或 Python 写 Operator,但 K8s 本身是 Go 写的。
使用 controller-runtime 和 client-go,你可以获得原生的体验和最高的性能。
总结
Operator 是云原生时代的“高级自动化脚本”。 它把运维专家的知识(如何备份、如何扩容、如何故障转移)编码到了软件里。 掌握 Operator 开发,你就从 K8s 的使用者晋升为了开发者。
Kubernetes Operator 开发实战:用 Go 扩展 K8s 能力
https://www.oferry.com/posts/a50/