获课: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] 进行投诉,我们将在确认本文链接指向的资源存在侵权后,立即删除相关介绍帖子!
暂无评论