
🧐 为什么有了 Docker 还需要 K8S?
Docker 解决了"怎么把软件打包"的问题(集装箱)。
但是,当你的业务做大了,你需要管理成千上万个集装箱时,麻烦就来了:
- 怎么调度? 哪台服务器空闲?应该把这个容器放到哪台机器上?
- 怎么自愈? 如果半夜 3 点某个容器挂了,谁把它拉起来?
- 怎么扩缩容? 双 11 流量暴增,谁自动帮你加 100 个实例?流量过了谁帮你删掉?
Docker Compose 只能管理单机上的几个容器(像是一个小乐团的指挥 )。
Kubernetes (K8S) 则是管理跨越几十台服务器、成千上万容器的超级总指挥 (像是一个大型港口的调度系统)。
名字由来 :Kubernetes 是希腊语"舵手 "的意思。K 和 s 之间有 8 个字母,所以简称 K8S。
🧱 核心概念:K8S 的"四大家族"
在 K8S 的世界里,不要只盯着"容器",因为 K8S 根本不直接管理容器!
1. Pod (豆荚) ------ 最小原子单位 🫛
- 概念:K8S 调度的最小单位不是容器,而是 Pod。
- 比喻 :Pod 就像一个豌豆荚 。
- 通常一个 Pod 里只放一个豌豆(容器)。
- 但有时也会放两个关系紧密的豌豆(比如主应用 + 日志收集助手)。
- 关键点:Pod 里的容器共享网络(IP)和存储,它们同生共死。
2. Node (节点) ------ 干活的工人 👷
- 概念:一台物理机或虚拟机。
- 比喻 :车间里的工位 。Pod 就运行在 Node 上。
- Master Node:包工头,负责发号施令。
- Worker Node:搬砖工,负责真正跑应用。
3. Deployment (部署) ------ 期望状态管理器 📜
- 概念:你通过它告诉 K8S:"我要运行 Vue 应用,给我保持 3 个副本!"
- 比喻 :包工头的合同 。
- 如果某个 Pod 挂了,Deployment 发现现在的数量(2个)少于合同规定的(3个),它会立马再造一个新的补上。
- 这就是 K8S 的自愈能力。
4. Service (服务) ------ 稳定的前台 💁♀️
- 概念 :Pod 的 IP 是会变的(每次重启都会变)。Service 提供一个固定 IP。
- 比喻 :公司的前台电话 。
- 不管后端的员工(Pod)怎么离职入职(重启/迁移),客户(用户)只要打前台电话(Service IP),前台就会把电话转接给现有的员工。
🏗️ 架构图解:K8S 怎么工作?
👷 Worker Node 2 (搬砖工)
👷 Worker Node 1 (搬砖工)
🧠 Master Node (大脑)
kubectl apply
指派任务
指派任务
API Server
调度器
控制器
Kubelet
🫛 Pod (Vue应用)
🫛 Pod (API服务)
Kubelet
🫛 Pod (Vue应用)
👨💻 管理员
- 管理员 把"合同"(YAML文件)交给 Master。
- 调度器看哪台机器空闲。
- Kubelet (节点上的代理人)接收指令,在自己的机器上创建 Pod。
✨ K8S 的三大超能力
1. 故障自愈 (Self-healing) 🚑
- 场景:半夜服务器 A 突然断电,上面的 10 个 Pod 全挂了。
- K8S 反应:Master 发现联系不上 Worker A,立刻在健康的 Worker B 和 C 上重新创建这 10 个 Pod。
- 结果:服务自动恢复,无需人工干预。
2. 自动扩缩容 (Auto-scaling) 📈
- 场景:微博热搜来了,CPU 占用率飙升到 90%。
- K8S 反应:Horizontal Pod Autoscaler (HPA) 检测到高负载,自动把 Pod 数量从 3 个增加到 30 个。
- 结果:抗住流量高峰。流量下去后,自动缩减回 3 个,省钱。
3. 滚动更新 (Rolling Update) 🔄
- 场景:要发布新版本 App。
- K8S 反应 :不是全部关掉再重开(会导致服务中断)。而是先启动 1 个新版本 Pod,等它健康了,再杀掉 1 个旧版本 Pod。如此循环,直到全部替换完成。
- 结果:用户完全无感知,业务不中断。
🚀 进阶知识:生产环境必备
学会了"四大家族"只能让你在本地跑起来,要在公司生产环境用好 K8S,你还需要掌握这三个神器:
1. Ingress (统一大门) 🚪
- 痛点 :
Service只能提供内网 IP,或者通过LoadBalancer暴露公网 IP(但很贵,一个服务一个 IP)。 - 解决方案 :Ingress 就像大楼的保安亭 (通常基于 Nginx)。
- 只有一个公网 IP。
- 根据域名(
api.com-> API 服务,web.com-> Vue 服务)把流量分发给不同的 Service。 - 比喻:你只需要告诉保安(Ingress):"我要去 8 楼",他就会把你指引到电梯口(Service)。
2. ConfigMap & Secret (配置与机密) 🔐
- 痛点:把数据库密码写死在代码或 YAML 里太危险了,而且改配置还得重新打包镜像。
- 解决方案 :
- ConfigMap :存普通配置(如:
API_URL=https://api.test.com)。 - Secret:存敏感信息(如:数据库密码、证书),会自动加密。
- 比喻 :保险箱。Pod 启动时,直接从保险箱里拿密码,而不是写在额头上。
- ConfigMap :存普通配置(如:
3. PV & PVC (持久化存储) 💾
- 痛点:Pod 挂了重启,里面的文件就没了(和 Docker 容器一样)。
- 解决方案 :
- PV (PersistentVolume) :管理员准备的一块硬盘(就像地皮)。
- PVC (PersistentVolumeClaim) :开发者申请硬盘的单子(就像房产证)。
- 比喻:不管房子(Pod)怎么拆了重建,你的地皮(PV)和上面的家具(数据)永远都在。
📝 实战:一个最简单的 K8S 部署文件
在 K8S 里,我们不写 Dockerfile,而是写 YAML。
yaml
# 1. 定义 Deployment (管理 Pod)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-vue-app
spec:
replicas: 3 # 副本数:我要 3 个!
selector:
matchLabels:
app: vue # 管理贴了 "app=vue" 标签的 Pod
template:
metadata:
labels:
app: vue # 给 Pod 贴标签
spec:
containers:
- name: vue
image: my-vue-image:v1 # 用这个镜像
ports:
- containerPort: 80
---
# 2. 定义 Service (固定入口)
apiVersion: v1
kind: Service
metadata:
name: my-vue-service
spec:
selector:
app: vue # 转发给贴了 "app=vue" 标签的 Pod
ports:
- port: 80
targetPort: 80
type: LoadBalancer # 对外暴露 IP
🧠 总结
- Docker 是单兵作战(步枪)。
- K8S 是集团军作战(指挥系统)。
- 它虽然学习曲线陡峭,但它是云原生时代的操作系统。
- 只要掌握了 Pod、Node、Deployment、Service 这四大概念,再加上进阶的 Ingress 和 PVC,你就拿到了 K8S 的入门钥匙。