Kubernetes(常缩写 K8s),中文常叫容器编排器
(container orchestrator):一个跑在一批机器之上的集群系统。你向它提交期望状态
(跑什么、要几份、什么版本),它负责把这些工作负载安排到合适的机器上、盯住数量、坏了补上、
升级时一批一批换;你要的东西写成 YAML,用命令行工具 kubectl 交进去。
像机场塔台:你只说"我要三个航班同时在天上",哪架飞机用哪条跑道、哪一班延误了怎么补,
是塔台在安排 —— 你不用自己开飞机,也不用去数停机坪上还剩几个位子。
容器先解决了"程序连环境一起打包"这件事;可程序一旦跑在多台机器上,新的麻烦立刻冒出来:
这四件事都不属于"程序"本身,而属于"一堆程序怎么在一批机器上安顿下来"。 编排器就是专门管这件事的那一层。
一圈闭环:你写下期望,它盯着现状,一直把两者拉平。
期望状态 你写下的:要几份、什么镜像 -> API server(kube-apiserver) 集群里所有读写的唯一入口 -> etcd 把期望状态存下来 -> 控制器 controller 不停对比期望与现状 -> 调度器 scheduler 挑一台合适的机器 -> kubelet 节点上的代理,盯住本机 Pod -> 容器运行时 真正把容器跑起来
kubectl rollout undo 退回上一版。docker run 难。同一句"它没起来",
你要顺着 kubectl get、describe、logs 和事件一层层看下去,
才能从"Pod 状态异常"落到真正的报错上。场景一:声明"要 3 份",然后看着它自己凑齐。
kubectl apply -f deployment.yaml # 声明:这个 Deployment 要 3 份
kubectl get pods -w # 盯着状态,Pod 一行行冒出来
# 手动删掉一个:kubectl delete pod web-xxxx,再看 get pods,很快又是 3 个
你没做任何事,数量是被控制器补齐的 —— 这就是它最值钱的地方。
场景二:滚动更新,不对就回滚。
kubectl set image deployment/web web=registry.example.com/web:1.4
kubectl rollout status deployment/web # 一批一批替换,直到全部起来
kubectl rollout undo deployment/web # 新版本有问题,一条命令退回上一版
升级期间旧 Pod 还在接请求,所以不中断;回滚的也是同一套声明,不需要人手去改每台机器。
场景三:本机练手,先用不着真买机器。
minikube start # 或 kind create cluster:在本机起一个单节点集群
kubectl get nodes # 看这一台"节点"是否就绪
kubectl create deployment demo --image=nginx --replicas=3
kubectl scale deployment demo --replicas=5 # 改一句期望,它自己再补两个
minikube 与 kind 起的是真集群、走同一套 kubectl 命令,只是把控制面缩到一台机器能装下。
先问一句:这件事管的是"一个容器怎么跑",还是"一堆容器放哪、几份、坏了谁补"?
| 名称 | 它是什么 | 和 Kubernetes 什么关系 |
|---|---|---|
| Kubernetes(容器编排器) | 在一批机器之上,按你声明的期望安排、补齐、升级工作负载 | 本课主角,管的是"放哪、几份、坏了谁补" |
| Docker | 在一台机器上把镜像做成容器、再把它跑起来的工具链 | 下一层:它管单个容器怎么跑;K8s 通过容器运行时跑容器,并不执行 docker 命令 |
| Docker Compose | 在一台机器上编排多个容器,一份 YAML 写清谁连谁 | 形状很像,但只在单机内:没有多机调度,也没有坏了自动补 |
| Docker Swarm | Docker 自带的集群编排模式,配置写法与 Compose 接近 | 同族里更轻的一个,能力与生态较小,社区基本转向 K8s |
| Nomad | 通用编排器:除了容器,还能跑普通进程 | 同类替代品,胜在轻、能混跑;生态与插件数量不如 K8s |
| k3s | 把控制面压缩过的轻量发行版 | 同一套 kubectl 命令的小号版,常用在小型设备与边缘场景 |
| minikube / kind | 在你本机起一个单节点集群的练习工具 | 不是编排器,是给你练手和测试用的集群 |
| 部署 | 把做好的东西送到别人能访问的地方 | 上一段:它管交付那一步;交付之后在集群里怎么活着,才是 K8s 的事 |
一句话分工:容器运行时管"怎么跑",编排器管"放哪、几份、坏了谁补"。顺带一句:云厂商卖的托管集群(如 EKS、GKE),就是把控制面这份活当成 SaaS / PaaS 卖给你。
三题自测,每题只有一个正确选项;选完立刻看到解释。
1. 你只写下"要 3 份、镜像是 1.4",它自己不停对比现状并补齐 —— 这种做法叫什么?
对。声明式交出去的是"期望状态",反复纠偏的活归控制器;命令式则是你自己把每一步列清楚。
2. 决定新起来的 Pod 去哪台机器上跑的,是下面哪一个?
对。控制器负责"要几份",调度器负责"放哪台",kubelet 与容器运行时负责"在机器上跑起来"。
3. 下面哪一项,不是 Kubernetes 替你负责的事?
对。它只保证"按你要求的份数活着",程序本身对不对、快不快,得你自己负责 —— 它甚至会如实重启一个有 bug 的程序。