KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA

01 · 它到底解决了什么问题 — keel 龙骨

## 现场:容器能跑之后,麻烦换了地方

现场:容器能跑之后,麻烦换了地方

上一门课结束时,你能在自己电脑上跑起一个容器了。现在把它放到服务器上。

第一台很顺利:装好 Docker、docker run,跑起来了。然后是第二台、第三台。
麻烦不在"跑起来",在跑起来之后:

三件事看着是三个问题,其实是同一件事:"服务应该长什么样"只存在你的脑子里,机器不知道,
也不会替你去维持。人一多、机器一多、时间一长,就一定漏。Kubernetes 就是为这件事做出来的。

一、它是什么

一句话:你只说"我想要什么",它负责一直把现状弄成那样。 注意"一直"和"负责"这两个词,
后面几章反复出现的就是它们。

它自己打的比方是一个总管:你交一张菜单("四份这个"),他去派人、端菜;
中途有人打翻一盘,他再补一盘,不需要你重新点单。这个比方要落到具体东西上才算数。
Kubernetes 里有三个词,从今天起你一直会用到:

名词 一句话
集群(cluster) 一组机器 + 一套管理它们的软件。你只跟这套软件说话
节点(node) 集群里的一台机器。容器最终是在某个节点上跑起来的
期望状态(desired state) 你写在文件里的那句话——"我要 2 个副本、用这个镜像"

它和 docker run 最根本的差别就在这里:

docker run          你现在去把它跑起来。跑没跑起来,只在这一刻被确认一次
期望状态            它应该一直是那样。交上去之后,维持它变成集群的事

你不写命令,你写期望状态。 这句话现在只是一个说法,第 03 章你会亲眼看到它的后果。

二、先看看你的集群长什么样

装集群不在本课范围内(本机一个单节点集群就够)。装好之后,敲这三行确认能连上:

kubectl version
kubectl cluster-info
kubectl get nodes

你会看到类似这样的输出:

Client Version: v1.36.1
Kustomize Version: v5.8.1
Server Version: v1.37.0
Kubernetes control plane is running at https://127.0.0.1:42680
CoreDNS is running at https://127.0.0.1:42680/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
NAME                     STATUS   ROLES           AGE   VERSION
keel-lab-control-plane   Ready    control-plane   55s   v1.37.0

环境:kubectl v1.36.1 / Kubernetes v1.37.0(kind v0.33.0 建的单节点集群)。地址、端口、
节点名、版本号都会变——读形状,别抄数字。

三行读法不同:

报错 Unable to connect to the server: dial tcp [::1]:8080: connectex: ...?
这不是坏了,是没连上集群。它上面还会跟着 E1015 ... memcache.go:265 那几行噪音,
要读的是最后那句。撞上它只有两种可能:集群没在运行;或你还没有任何集群配置。

三、它不是什么

零基础最容易建立错的三条印象,先纠正:

读完你能做什么

下一步:现在你知道它是什么了。下一章交上去第一份期望状态——
你会看到那句"它还没跑起来"是怎么发生的。

进入 keel 阅读