KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA

03 · 弄坏它,看它自己修回来 — keel 龙骨

这一章只需要两条命令,但它会造成一个用 Docker 时遇不到的场面。 经历过这一次,"期望状态"这个词才算真的懂了。

这一章只需要两条命令,但它会造成一个用 Docker 时遇不到的场面。
经历过这一次,"期望状态"这个词才算真的懂了。

一、删掉一个,看它回不回来

先看现在有什么:

kubectl get pods
NAME                  READY   STATUS    RESTARTS   AGE
web-565bc6668-t8bp4   1/1     Running   0          4m
web-565bc6668-wkm7t   1/1     Running   0          4m

现在把其中一个删掉(名字换成你屏幕上的):

kubectl delete pod web-565bc6668-t8bp4
pod "web-565bc6668-t8bp4" deleted from default namespace

删掉之后立刻再看一次:

kubectl get pods
NAME                  READY   STATUS    RESTARTS   AGE
web-565bc6668-c9g8d   1/1     Running   0          2s
web-565bc6668-wkm7t   1/1     Running   0          23s

又是两行。 被你删掉的是 ...-t8bp4,现在站在这儿的是 ...-c9g8d——一个新名字。
数量没变,还是 2 个。

这就是第 02 章那句"是集群自己把进程造出来的"的后果:你删掉的是结果,不是原因。

二、它为什么不慌

因为它手里有一份你说的那个数字。

你写的             replicas: 2
它看到的           现在只有 1 个
它做的             再造一个出来

做这件事的东西叫控制器(controller)。它的工作方式很固定:读一遍你写的,再读一遍现在
是什么样,不一样就动手弄成一样,然后回到第一步。
关键是最后那半句——它一直回到第一步,
不是"交文件时跑一次就下班",而是一直在跑。所以:你删掉一个,它下一轮就发现少了一个,
补上——你不需要告诉它,它自己看出来的。

"控制器"这个名词在《Kubernetes 概念课》
有一页。现在不需要点进去。

三、手工改出来的数字,会被纠回去

再做一个实验。这次不删,而是自己动手改:

kubectl scale deploy web --replicas=4
deployment.apps/web scaled
kubectl get pods
NAME                  READY   STATUS    RESTARTS   AGE
web-565bc6668-c9g8d   1/1     Running   0          19s
web-565bc6668-g9wtw   1/1     Running   0          6s
web-565bc6668-ph6q6   1/1     Running   0          6s
web-565bc6668-wkm7t   1/1     Running   0          40s

4 个了。现在再交一次第 02 章那份文件——它里面写的还是 replicas: 2:

kubectl apply -f web.yaml
deployment.apps/web configured
kubectl get pods
NAME                  READY   STATUS    RESTARTS   AGE
web-565bc6668-c9g8d   1/1     Running   0          33s
web-565bc6668-wkm7t   1/1     Running   0          54s

又回到 2 个了。

这一次没有报错、没有提示、没有"你确定要缩容吗"。因为那次 scale 改的不是期望状态——
它只是临时把现状挪了一下;文件里那份期望状态一直是 2,下一次被读到就被执行了。所以改东西的
正规做法是改文件再交一次,而不是敲命令临时改:这套机制只在"文件"这一侧生效。

四、它不是什么

五、清干净,再来一次

这一章的东西可以整个撤掉,一条命令:

kubectl delete -f web.yaml
deployment.apps "web" deleted from default namespace
kubectl get pods
No resources found in default namespace.

No resources found... 是正常返回,不是报错——意思是"这个范围里没有东西",退出码 0。
名字存在但敲错时,报的是另一句:Error from server (NotFound): pods "xxx" not found。

清完之后可以再 kubectl apply -f web.yaml 走一遍:每次删掉重建,get pods 里那两行的
名字都是新的。

读完你能做什么

下一步:现在它能在集群里自己活着了,但从你的电脑访问不到它。
下一章给它一个能被访问到的地址。

进入 keel 阅读