0

Kubernetes集群核心概念Controller

我今天有课
6天前 8

获课:999it.top/15437/

# 手写一个自定义Controller,把业务也接入K8s

## 谁说Kubernetes只能管容器?我让它帮我自动订机票

### 一、那个让我失眠的晚上

上周四晚上11点,我正在家里追剧,手机突然炸了。

运维群里的消息一条接一条:

- “业务又扩了,手动创建10个Pod”

- “数据库备份忘了做,谁有权限?”

- “新客户 onboarding,还得配一套环境……”

我盯着屏幕,突然意识到一件事:**我们天天吹Kubernetes多牛多牛,结果最烦人的这些破事,还得靠人肉操作?**

K8s说好的“自动化”呢?说好的“声明式API”呢?

那一晚我没睡着,第二天顶着黑眼圈跟老大说:**我要给K8s写个插件,让它帮我们把业务也管起来。**

老大愣了3秒:“你?写K8s源码?”

“不是改源码,是写一个自定义Controller。”

### 二、Controller到底是啥?一个比喻让你秒懂

在Kubernetes里,Controller是个很朴素的概念——**一个永不停止的循环**。

就像你妈每天早上叫你起床:

- 看一眼:起了没?(观察状态)

- 没起:再叫一遍(执行操作)

- 起了:满意了,明天继续(循环)

K8s里的Controller也是这德行。它不断问API Server:“我要的东西现在啥样了?”如果和预期不一样,它就动手改。

内置的Deployment Controller负责管Pod,ReplicaSet Controller负责管副本数。但问题是——**这些Controller只懂K8s自己的那点事,不懂你的业务**。

如果你想让K8s帮你订机票、创建数据库、给新客户开通账号……对不起,内置Controller不伺候。

这时候就需要——**自定义Controller**。

### 三、手写一个Controller,让K8s帮我订机票

我先给你看个神奇的YAML:

```yaml

apiVersion: flights.com/v1

kind: FlightTicket

metadata:

  name: my-flight-ticket

spec:

  from: Mumbai

  to: London

  number: 2

```

看出猫腻了吗?这不是Pod,不是Deployment,这是我自己定义的资源——**FlightTicket**(机票)。

当我`kubectl apply`这个文件,K8s会把它存到etcd里,然后……什么都不会发生。因为K8s根本不知道“机票”是个啥玩意儿。

直到我写一个Controller,让它去“听懂”机票这件事。

Controller的核心代码大概长这样:

```go

func (dc *FlightTicketController) Run(workers int, stopCh <-chan struct{}) {

    // 1. 盯着K8s API,看有没有新的FlightTicket创建

    // 2. 发现有新的,立刻调用 callBookFlightAPI

    // 3. 更新状态为"已订票"

}

func (dc *FlightTicketController) callBookFlightAPI(obj interface{}) {

    // 这里写你真实的业务逻辑——调用航空公司API订票

    // 或者发邮件,或者创建数据库,啥都行

}

```

当你运行这个Controller,神奇的事情发生了:

```bash

# 创建机票

kubectl create -f flightticket.yml

# 查看状态

kubectl get flightticket

NAME                STATUS

my-flight-ticket    Booked  # 真的订成功了!

```

**K8s帮你订了张机票!** 虽然是假的API,但原理一模一样。

### 四、真实案例:有人用这招管理几百个客户

你以为这只是个玩具?Too young。

有一家叫Kolide的公司,做B2B SaaS产品,他们遇到了一个难题:**每个客户都要一套独立的环境**。

传统做法:新客户签合同 → 运维手动创建一堆资源 → 发邮件给客户 → 累死。

他们做了个决定:写一个自定义Controller,叫**Tenant Operator**。

从此以后,新客户来了,只需要:

```bash

kubectl apply -f tenant.yml  # 里面写着客户名字、套餐版本、数据库配置

```

然后Controller会自动:

1. 创建Kubernetes命名空间

2. 在数据库里建库建账号

3. 部署对应版本的应用

4. 配置好网络隔离

5. 发邮件通知销售

**全程无人参与,全自动。**

这就是把业务“接入”K8s的真正含义——**让K8s懂你的业务逻辑,帮你干那些重复的脏活累活。** 

### 五、怎么开始写?给你指条明路

如果你也想动手,别怕,不用从零造轮子。社区已经给你准备好了脚手架:

**方案一:用官方sample-controller(硬核路线)**

```bash

git clone https://github.com/kubernetes/sample-controller.git

cd sample-controller

# 改代码,把业务逻辑写进去

go build -o my-controller

```

**方案二:用Operator SDK(舒适路线)**

```bash

operator-sdk init --domain=mycompany.com --repo=github.com/mycompany/my-operator

operator-sdk create api --group=myapp --version=v1 --kind=MyResource --resource --controller

# 然后只用在Reconcile函数里写你的业务逻辑

```

**方案三:用controller-runtime(极客路线)**

这是K8s官方推荐的方式,封装得恰到好处。 核心就几行:

```go

ctrl.NewControllerManagedBy(mgr).

    For(&mygroupv1.MyResource{}).

    Owns(&appsv1.Deployment{}).

    Complete(myReconciler)

```

### 六、写在最后:K8s不只能管容器,还能管你的业务

以前我以为Kubernetes就是个“容器管家”——谁家容器死了,它负责拉起来。仅此而已。

后来我才明白,**Kubernetes的核心从来不是容器,而是一套“声明式+控制循环”的哲学**。

这套哲学可以管理容器,也可以管理机票、管理客户、管理数据库备份、管理证书过期……**只要你能把业务抽象成“期望状态”和“实际状态”,K8s就能帮你自动化。**

我花了一周写完那个Controller,现在每天准点下班,运维群也安静了。

老大昨天跟我说:“你小子可以啊,让K8s给你打工了。”

我说:“不,是让K8s懂我们的业务了。”

**【评论区互动】**

如果你有Kubernetes,你想让它帮你自动干什么?

- A. 每天自动订外卖

- B. 新员工入职自动开通所有权限

- C. 代码上线自动发周报给老板

- D. 其他(评论区告诉我)

评论区聊聊,点赞最高的送一本《Kubernetes Operator进阶》电子书!



本站不存储任何实质资源,该帖为网盘用户发布的网盘链接介绍帖,本文内所有链接指向的云盘网盘资源,其版权归版权方所有!其实际管理权为帖子发布者所有,本站无法操作相关资源。如您认为本站任何介绍帖侵犯了您的合法版权,请发送邮件 [email protected] 进行投诉,我们将在确认本文链接指向的资源存在侵权后,立即删除相关介绍帖子!
最新回复 (0)

    暂无评论

请先登录后发表评论!

返回
请先登录后发表评论!