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/v1
kind: RedisCluster
metadata:
name: my-cache
spec:
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-runtimeclient-go,你可以获得原生的体验和最高的性能。

总结#

Operator 是云原生时代的“高级自动化脚本”。 它把运维专家的知识(如何备份、如何扩容、如何故障转移)编码到了软件里。 掌握 Operator 开发,你就从 K8s 的使用者晋升为了开发者

Kubernetes Operator 开发实战:用 Go 扩展 K8s 能力
https://www.oferry.com/posts/a50/
作者
晨平安
发布于
2026-02-08
许可协议
CC BY-NC-SA 4.0
封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00