跳到正文概念梳理 · Jimmy Huang's Blog概念梳理
本页目录· 67 条
1. 先从最根本的问题开始:为什么“只有容器”还不够
你可以先把容器理解成:
一个打包好的、能运行程序的小盒子。
比如你写了一个网站,你可以把它装进容器里。
这样它启动快,环境一致,也比虚拟机轻量。老师上课一开始也先回顾了这些优点:容器比 VM 启动更快,因为它不需要再单独加载完整的 guest OS,而是共享宿主机内核。
但问题来了:
假设你的网站原来只有 100 个用户,现在变成 5000 个用户。
一个容器扛不住了,你肯定会想到:
那我多开几个容器不就好了?
听上去很合理,但老师专门拿这个例子说明:
你就算多开了新容器,也马上会遇到很多现实问题,比如:
这些新容器开在哪台机器上?
用户怎么知道它们的地址?
哪个容器忙,哪个容器闲?
某个容器死了怎么办?
怎么自动补上新的容器?
怎么更新版本而不停机?
所以真正的问题不是“我会不会开容器”,而是:
我怎么管理一大堆容器。
这就是 orchestration 要解决的事。课件也明确说了,编排工具的作用就是在大规模下整合和管理容器,提供扩缩容、服务发现、负载均衡、健康检查、自愈、安全、滚动更新等能力。
2. 什么叫 Orchestrator(编排器)
你可以把 orchestrator 理解成:
一个总调度员。
老师在课上用了很多生活类比,比如足球教练、小组作业里的组长。意思都一样:
当系统里只有一个服务、一个容器的时候,可能你自己还能手动管。
但当系统里有很多机器、很多容器、很多请求时,你必须要有一个“统一调度”的角色。
这个调度员要做什么?
最核心的是两件事:
也就是:一个新任务来了,这个任务该分给哪台机器、哪个节点去跑。课件把这个问题叫做 resource allocation / scheduling。
某个节点还有没有 CPU / 内存
某个服务是不是挂了
现在是不是该扩容了
系统是不是和我想要的状态一致
所以 orchestrator 不是“帮你启动容器”那么简单,它更像一个长期值班的管理系统。
3. 什么是 Cluster(集群)
课件在 Docker Swarm 部分就写得很清楚:一个 swarm 由一个或多个 Docker 节点组成,这些节点可以是 physical servers、VMs、Raspberry Pis 或 cloud instances。
跑更多服务
扛更多请求
某台机器坏了还能让别的机器继续工作
4. 为什么“多台机器一起工作”会变难
老师专门让大家把 cluster 想成小组作业,因为两者的问题特别像。课件虽然没写这么细,但 transcript 里老师反复强调了:
多人协作会遇到同步、共识、任务分配、负载均衡、版本不一致、成员不工作、沟通障碍这些问题;分布式系统里其实也会遇到同类问题。
如果你有 5 台机器,一起跑服务,就会出现这些问题:
谁是负责做决定的?
哪台机器该接哪个任务?
某台机器挂了怎么办?
所有机器怎么保持“对系统状态的理解一致”?
多个管理节点同时发号施令会不会冲突?
这也是为什么这周会讲到 leader、manager、worker、Raft 共识算法。
因为这些概念,都是在解决“多台机器如何不打架地协同工作”这个问题。
5. Docker Swarm 是什么
6. Manager 和 Worker 是什么意思
Worker
比如某个服务需要启动副本、某个容器要运行,实际干活的通常是 worker。
Manager
它比 worker 多一层责任,不只是跑任务,还要参与集群管理。
如果有多个 manager,大家都说自己来指挥,会不会乱?
所以 Docker Swarm 里会在多个 manager 中选出一个 leader。课件写得很明确:managers select a leader,其他 manager 只是被动监控,如果 leader 失败再重新选举。
worker = 执行者
manager = 管理者
leader = 真正当前拍板的人
7. 为什么需要 Leader(领导者)
因为如果没有 leader,多个 manager 可能会出问题:
Raft consensus algorithm(Raft 共识算法)。
8. 什么是 Raft 共识算法
一套让多个管理节点选出 leader,并且对系统状态达成一致的规则。
课件定义得比较正式:共识算法是让一组机器即使在部分节点失败的情况下,也能像一个整体一样工作,并对单一真实状态达成一致。Raft 就是这样一种共识算法。
9. Raft 里的三个状态:Follower、Candidate、Leader
1)Follower
它自己不主动指挥,只是等 leader 发消息过来。
2)Candidate
如果一个 follower 太久没听到 leader 的消息,它会怀疑:
这时它就从 follower 变成 candidate。
3)Leader
一旦某个 candidate 拿到多数票,它就成为 leader,开始管理集群。
follower:普通成员
candidate:竞选人
leader:组长
10. Raft 选举是怎么发生的
这个流程你最好真的理解,因为它不难,而且特别关键。
第一步:所有节点开始时都是 follower
第二步:leader 会定期发 heartbeat
只要 follower 还能收到 leader 的 heartbeat,它就继续老实当 follower。
第三步:如果某个 follower 很久没收到 heartbeat
于是它超时后变成 candidate,发起选举。课件把这个时间叫 election timeout。
第四步:candidate 给自己投票,并请求别人投票
我先投我自己一票
然后问其他节点:你们支不支持我做 leader?
第五步:如果拿到多数票,它就成为 leader
第六步:如果没有人拿到多数票
比如两个 candidate 同时发起竞选,票数打平了。
11. 什么是 Term
课件说得很清楚:时间被分成一个个 term,每个 term 开始时可能发生选举;成功就会有一个 leader 管到这个 term 结束;有时选举失败,这个 term 就没有 leader。
term = 一轮“谁来当 leader”的时间段。
12. 为什么要随机 timeout
因为如果所有 follower 都在完全同一时刻超时,它们就会一起跳出来竞选,导致票数打架,更容易 split vote(票数分裂)。
所以每个节点会随机选一个 timeout 范围,这样更可能只有一个节点先超时、先发起选举。
13. Docker Swarm 里的 Service 是什么
这是 Docker Swarm 里一个非常重要的概念。
在 swarm 里,真正作为调度原子单位的是 service,不是直接的 container。service 是比 container 更高一层的对象,它包住 container 后,会给你带来 scaling、rolling updates、rollback 等能力。一个被 service 包起来运行的容器,也会被叫做 task 或 replica。
“我要一个 web service,保持 3 个副本,一直在线。”
这个“更高层的要求”就是 service 这种思路。
14. 什么是 Scheduling(调度)
这个概念在 Swarm 和 Kubernetes 里都非常重要。课件在讲 orchestrator 时就已经提到:资源分配和调度是编排的核心问题之一。
老师在口头解释里还补充了很多你可以直观理解的指标,比如:
哪个节点还有 CPU / RAM
哪个节点更空闲
哪个节点健康
哪个节点资源合适
也就是说,调度不是乱丢,而是根据系统状态来选“最适合跑这个任务的节点”。
老师给小组分工时,会看谁有空、谁会做、谁现在最适合做。
15. 什么是 Kubernetes
老师在 transcript 里也特别强调了一个 trade-off:
Swarm 更简单、容易上手
Kubernetes 更强,但复杂度更高
16. Kubernetes 的两大部分:Control Plane 和 Nodes
1)Control Plane
课件说,master(也就是 control plane)是一组系统服务,负责构成集群控制面。
API Server
Cluster Store
Controller Manager
它负责不断观察系统,看看当前实际情况和目标是不是一致。
Scheduler
2)Worker Nodes
看 API server 有没有新任务
执行任务
把结果和状态回报给 control plane
control plane:负责想、负责管
nodes:负责跑、负责干
17. Kubernetes 节点上的几个组件
课件还提到了 node 上面几个你至少要认识名字的组件:
Kubelet
这是 node 和 control plane 沟通的关键角色。
Container Runtime
Kube-proxy
课件里提到它会反映 Kubernetes 的网络服务到每个节点上。
18. 为什么 Kubernetes 不是直接部署 Container,而是部署 Pod
“既然我都已经有 container 了,为什么 Kubernetes 还要再来一个 Pod?”
因为在 Kubernetes 里,最小调度单位不是 container,而是 Pod。课件写得非常明确:Pod 是 atomic unit of scheduling;应用要运行在 Kubernetes 上,需要先容器化,再被包进 Pod,再通过声明式 manifest 部署。
Kubernetes 真正调度的不是单个 container,而是整个 Pod。
19. Pod 到底是什么
Pod 本身不直接跑业务逻辑,它更像一个 sandbox
一个 Pod 里可以有一个 container,也可以有多个 container
如果有多个 container,它们通常是紧密协作关系
例如课件举了 multi-container Pod 的例子:
所以 Pod 的思路不是“随便把几个容器塞一起”,而是:
20. 同一个 Pod 里的容器为什么能一起工作
课件说得很清楚:一个 Pod 内多个容器共享同样的环境,比如共享内存、volume、网络栈;同一个 Pod 里的容器共享同一个 IP 地址,彼此之间用 localhost 端口通信。
网络上更近
可以更自然地协作
不需要像跨机器那样复杂通信
21. 为什么扩容时是“增加 Pod”,不是“往一个 Pod 里塞更多容器”
课件专门有一页图在强调这件事:Pods as the unit of scaling。
因为 Kubernetes 的扩缩容单位是 Pod。
22. Pod 的“原子性”是什么意思
课件说 Pod 的部署是 atomic operation。
如果一个 Pod 里有多个容器,那么 Kubernetes 是把它们当作一个整体来看待的。
课件也明确写了:一个 Pod 只能被调度到一个 node 上。
23. Pod 生命周期(Pod lifecycle)为什么很重要
Pod 会被创建、运行、死亡;如果它意外死亡,Kubernetes 会启动一个新的 Pod 来替代它,但这个新 Pod 会有新的 ID 和新的 IP 地址。
这个概念特别重要,因为它改变了你对“服务实例”的看法。
所以你不能把业务强依赖在“某个具体 Pod 永远不变”这件事上。
24. Deployment 是什么
现在我们进入 Kubernetes 里另一个很核心的对象:Deployment。
课件的定义是:Deployment 是一个更高层的 Kubernetes 对象,它包装特定的 Pod,并且增加扩缩容、零停机更新、版本回滚这些能力。
Pod 是具体跑起来的小单位,Deployment 是管理这些 Pod 的“经理”。
“我要始终维持 3 个这样的 Pod,如果少了就补,如果镜像版本要升级就滚动替换。”
这种“长期管理”就是 Deployment 做的事。
25. 什么叫 Desired State(期望状态)
Kubernetes 会一直通过 watch loop 看当前状态是不是和 desired state 一样。
我要 2 个副本
镜像版本是 nginx:1.15.8
暴露 80 端口
如果系统当前只有 1 个副本,Kubernetes 会自动补到 2 个。
如果现在运行的是旧镜像版本,而你把 YAML 改成新版本,它就会推进更新。
26. Declarative(声明式)到底是什么意思
课件里把 Kubernetes 的一种典型使用方式叫做 declarative approach,就是通过 YAML 文件声明系统应该长什么样。
和它相对的是 imperative(命令式),也就是你手动一条条下命令。课件也给了 kubectl apply 和 kubectl run 的例子。
27. 为什么有了 Pod 和 Deployment,还要有 Service
而且死了以后,新 Pod 的 IP 会变。课件在 Pod lifecycle 和 Services 部分都强调了这一点:Pods are mortal,replacement Pods come with different IPs。
所以 Kubernetes 引入了 Service。
28. Service 是什么
课件说得很清楚:Service 提供一个稳定的 DNS 名称、IP 地址和端口;后端再把请求负载均衡到一组动态变化的 Pods 上。
前面是固定入口
后面是哪几个 Pod 在干活,可以变
这就解决了 Pod 会死、Pod IP 会变的问题。
29. 为什么说 Service 很像“前台总机”
明天 A 死了,Kubernetes 重建成 D。
但如果用户永远只找一个固定 Service,比如 renderer-service,
Pod 是后面会变的工位,Service 是前面不变的总机号码。
30. Service 怎么知道自己该把流量送给哪些 Pod
课件说,Service 使用 labels 和 label selector 来决定把流量负载均衡给哪些 Pod。
这样它就知道哪些 Pod 是自己这一组的后端实例。
31. 什么是 Self-healing(自愈)
虽然课件在 features 和 Deployment 思路里提到得更抽象一点,但其实你已经能理解了。
比如你 desired state 写的是 3 个 Pod。
Kubernetes 会自动再建一个,把它拉回 3。
32. 什么是 Scaling(扩缩容)
课件在 Swarm 的 service 和 Kubernetes 的 Deployment 里都提到 scaling,Pod 也是 Kubernetes 扩展的基本单位。
“用户多了,多招几个人;用户少了,减少几个工位。”
33. 什么是 Rolling Update(滚动更新)
课件在 Swarm 的 service 和 Kubernetes 的 Deployment 中都提到更新能力。
34. 什么是 Rollback(回滚)
课件在 Deployment 和 Swarm service 的高级能力里都提到了 rollback。
35. 什么是 Service Discovery(服务发现)
这个词一开始听起来很抽象,但其实你已经差不多懂了。
uploader 想找到 renderer
前端想找到后端
某个微服务想找到数据库服务
如果后端 Pod 的地址总在变,那你不能靠死记 IP。
所以需要 Service、DNS、标签选择机制来帮助“找到正确的服务对象”。课件在 Services 部分就讲了稳定名称和稳定 IP 的作用。
所以 service discovery 本质上就是:
36. 什么是 Volume / Persistent Data(持久化数据)
这部分不是这周最中心的内容,但课件也讲到了,而且对初学者很有用。
课件说,在容器里持久化数据,推荐用 volume。你先创建一个 volume,再把它挂载进容器;容器往这个目录写的东西,实际上就写进 volume 里了。
你可以把容器想成某种类似内存态的东西,如果容器没了,里面的数据就不一定还在;所以真正重要的数据应该放到 volume 这类外部持久存储上。
37. Docker Compose 和 Orchestration 的关系
老师在 transcript 里其实把这个边界讲得很清楚。
多个容器之间如何一起定义
它们有什么依赖关系
用一个 YAML 把它们组织起来
就要更进一步用 Swarm 或 Kubernetes 这样的 orchestration 工具。
Compose 是多容器组织工具,Orchestrator 是集群级管理工具。
38. 这周最重要的思维方式是什么
第一步
第二步
第三步
所以需要 orchestration 来统一管理集群中的容器。
第四步
Docker Swarm 和 Kubernetes 都是在做这件事,只是设计和复杂度不同。
第五步
在 Kubernetes 里,不直接调度 container,而是调度 Pod。
第六步
Pod 会死、会变,所以需要 Deployment 来管副本,需要 Service 提供稳定访问入口。
第七步
Kubernetes 的核心思想是 desired state:
如果你把这条逻辑链真正理解了,这周内容就算吃透大半了。相关核心点都在课件总结页和各部分定义里反复出现。
39. 你现在应该能用自己的话说出这些句子
为了确认你是不是真的懂了,你可以试着自己复述下面这些话:
容器编排是为了解决大量容器在真实部署中的管理问题。
Orchestrator 像总调度员,负责调度、扩缩容、监控和维护系统状态。
Cluster 就是一组一起工作的机器。
Docker Swarm 里有 manager 和 worker,manager 会选出 leader。
Raft 是一种选 leader 并让节点达成一致的机制。
Kubernetes 分 control plane 和 worker nodes。
Pod 是 Kubernetes 最小调度单位,不是 container。
Deployment 管理 Pod,负责扩缩容、更新和回滚。
Service 给一组会变化的 Pod 提供稳定入口。
Kubernetes 会不断把当前状态拉回你声明的 desired state。
如果这些你都能比较自然地讲出来,那你已经不是“死记了几个词”,而是真的理解了。
40. 最后,我用一句最简单的话把整周再收一遍
这周 Seminar 讲的,就是:当应用从“一个容器能跑”发展到“很多容器要稳定地一起跑”时,我们需要用 Docker Swarm 或 Kubernetes 这样的编排系统来自动管理它们,而 Kubernetes 的核心世界观是:用 Pod 运行容器,用 Deployment 管 Pod,用 Service 稳定对外访问,并通过 desired state 持续维持系统运行。