云原生入门系列|第1集:K8s是什么?------从"搬箱子"到"自动化仓库"的革命
1. 引子:运维到底在忙什么?
假设你是一家电商公司的运维工程师。以前,公司只有一两个应用,跑在几台物理服务器上。每次上线,你需要手动登录服务器,拉取代码,重启进程。万一服务器宕机,你得半夜爬起来抢修。
后来,公司开始用 Docker 容器。每个应用被打包成一个个"集装箱" ------ 环境一致、依赖隔离。你写了个脚本,一键启动10个容器,感觉轻松了不少。
但问题又出现了:流量高峰时,你需要手动增加容器数量;某个容器挂了,你要手动重启;多个容器之间怎么通信?怎么让用户通过一个域名访问到不同服务?你发现,光靠脚本已经管不过来了。
这时候,Kubernetes(简称 K8s) 登场了。它就像一个"自动化物流仓库",你把容器(箱子)交给它,它自动负责:
- 放在哪个货架(节点)
- 维持多少箱(副本数)
- 箱子坏了自动换新(自愈)
- 货物进出路由(网络)
- 根据订单量增减箱子(弹性伸缩)
一句话:K8s 是容器的"操作系统",帮你管理成千上万个容器的生命周期。
2. K8s 名字由来
Kubernetes 是希腊语"舵手"的意思。因为单词太长,社区取了缩写 K8s ------ K 和 s 之间有 8 个字母,和 "internationalization → i18n" 类似。
3. K8s 能做什么? ------ 四个核心能力
| 能力 | 解释 | 没有K8s时 | 有了K8s |
|---|---|---|---|
| 自动部署与回滚 | 你可以声明"我要运行nginx:1.20",K8s自动部署;升级到1.21失败,自动退回1.20。 | 手动改镜像、重启,回滚要重新打包。 | kubectl set image 一行命令完成,错误自动停。 |
| 服务发现与负载均衡 | 容器A访问容器B,不需要知道B的IP,只要知道Service名字。K8s自动做负载均衡。 | 写死IP或自己维护DNS,容器漂移后IP变化就废了。 | K8s内置DNS和VIP,容器挂了自动摘除。 |
| 存储编排 | 自动挂载你需要的存储(本地、云硬盘、NFS等),容器重启后数据不丢。 | 手动挂载宿主机目录,多节点下数据不同步。 | 声明PVC,K8s会自动分配存储并挂载。 |
| 自我修复 | 如果容器健康检查失败,K8s会重启它;如果节点宕机,会在健康节点重建容器。 | 需要外部监控脚本或人工介入。 | K8s controller loop 持续尝试达到期望状态。 |
4. K8s 的架构(极简版)
K8s 集群由两部分组成:
- 控制平面(Master):集群的"大脑",负责调度、维护状态、暴露API。
- 工作节点(Node):真正运行容器的机器,每个节点上有一个 kubelet(管家)和容器运行时(如 Docker)。
你可以用 kubectl get nodes 查看节点列表。
5. 最小的部署单元不是容器,是 Pod
很多初学者以为 K8s 直接运行容器。不,它运行的是 Pod ------ 一个Pod里可以有1个或多个容器,这些容器共享网络和存储,像一个"逻辑主机"。
例如,你有一个业务容器需要实时收集日志,然后推送到中心。你可以设计一个Pod包含两个容器:
- 主容器:运行你的业务应用
- Sidecar容器:负责收集日志并发送
这样两个容器可以共享同一个Pod IP,通过 localhost 互相访问。
6. 声明式API ------ 告诉K8s"要什么",而不是"怎么做"
K8s 的核心思想是声明式。你写一个 YAML 文件,描述最终想要的状态(比如:运行3个nginx Pod),K8s 会持续调整实际状态,使之与期望状态一致。
命令式(旧方式):
bash
docker run -d --name nginx nginx
如果容器挂了,没有人重新拉起。
声明式(K8s方式):
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 3
template:
spec:
containers:
- name: nginx
image: nginx
保存为 deploy.yaml,执行 kubectl apply -f deploy.yaml。K8s 会确保永远有3个nginx Pod在运行。
7. 一个最简单的K8s操作体验
假设你已经装好 minikube(本地单节点集群),试试下面的流程:
# 创建一个 Deployment
kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4
# 查看 Pod
kubectl get pods
# 把这个 Deployment 暴露成 Service(允许外部访问)
kubectl expose deployment hello-minikube --type=NodePort --port=8080
# 获取访问地址
minikube service hello-minikube --url
浏览器打开那个 URL,你会看到请求信息。这就是一个完整的最小应用:部署 + 服务暴露。
}
- 为什么现在是学习K8s的最好时机?
岗位需求爆炸:几乎所有中大型企业招聘后端/运维/云原生岗位,都要求"熟悉 K8s"。
技术成熟稳定:K8s 已经诞生近十年(1.0 发布于2015年),社区文档、学习资源非常丰富。
上手门槛降低:minikube、kind、k3s 等工具让你笔记本就能跑起完整集群。
AI 基础设施:大模型训练平台(如Kubeflow、Ray on K8s)都基于 K8s 构建。
- 本系列学习路线图
我们计划用30篇文章,从零基础到能够独立部署一个微服务应用。路线如下:
基础篇(第1-10集):核心概念:Pod、Deployment、Service、Ingress、ConfigMap、Secret、Volume。
进阶篇(第11-20集):调度、存储、网络、安全、监控。
实战篇(第21-30集):CI/CD、Helm、服务网格、Operator、故障排查。
每一篇文章都会配有可运行的命令和YAML示例,你可以一边读一边在 minikube 上练习。
- 下一集预告
第2集我们将手把手在本地搭建 K8s 实验环境(minikube 或 kind),并成功运行第一个 Pod。敬请期待!
本内容为《云原生入门系列》第1集,订阅专栏后可获取全部30集。