对于 Kubernetes(简称 k8s)新手,我会从核心认知→基础架构→核心资源→基础操作→实战案例逐步拆解,聚焦 "能上手、能理解" 的核心知识点,避免一上来就陷入复杂概念。
一、先搞懂:k8s 是什么?解决什么问题?
- 定义 :k8s 是谷歌开源的容器编排平台,核心是 "管理一堆服务器上的所有 Docker 容器"。
- 类比:如果说 Docker 是 "单机管理容器的工具",k8s 就是 "数据中心级的容器管家"------ 它能自动化完成容器的部署、扩缩容、故障恢复、负载均衡等工作。
- 解决的核心问题 :
- 单机 Docker 无法应对多容器 / 多服务器的集群管理(比如容器挂了没人自动重启);
- 手动管理大量容器的部署、网络、存储太繁琐;
- 无法快速扩缩容以应对业务流量变化。
二、k8s 核心架构(先认 "组件",不深究原理)
k8s 集群分为控制平面(Master) 和节点(Node) 两部分,新手先记住各组件的核心作用即可:
表格
| 角色 | 核心组件 | 作用(通俗版) |
|---|---|---|
| 控制平面 | API Server | 集群的 "入口",所有操作(比如部署容器)都通过它提交,相当于 "前台客服" |
| Controller Manager | 集群的 "管家",监控容器 / 节点状态,比如容器挂了自动重启、节点挂了迁移容器 | |
| Scheduler | 集群的 "调度员",决定哪个容器该部署到哪个 Node 节点上(比如选负载低的节点) | |
| etcd | 集群的 "数据库",存储所有集群配置、状态数据(比如有哪些容器、节点) | |
| 工作节点 | Kubelet | 每个 Node 上的 "代理",接收 Master 的指令,管理本机的容器(启动 / 停止 / 监控) |
| Kube-proxy | 每个 Node 上的 "网络代理",负责容器的网络访问、负载均衡(比如把请求分发到多个容器) | |
| 容器运行时 | 比如 Docker、containerd,负责实际运行容器(k8s 只是指挥,真正运行容器的还是 Docker) |
三、k8s 核心资源(新手必掌握,相当于 "操作对象")
k8s 不直接操作容器,而是通过 "资源对象" 来管理,核心资源按优先级掌握:
1. Pod(最基础的最小部署单元)
- 定义 :k8s 的最小运行单元,一个 Pod 里可以包含 1 个或多个容器(通常只放 1 个,比如一个 SpringBoot 容器)。
- 特点 :
- Pod 里的容器共享网络、存储,相当于 "一个小团队";
- Pod 是 "一次性的",挂了会被 k8s 重新创建(不能直接修改运行中的 Pod);
- 每个 Pod 有唯一的 IP,但 Pod 重建后 IP 会变(所以不能直接用 Pod IP 访问)。
2. Deployment(最常用的控制器,管理 Pod)
- 定义:用于管理 Pod 的 "控制器",是新手最常接触的资源(90% 的场景用它)。
- 核心能力 :
- 自动化创建 / 更新 Pod(比如部署 10 个相同的 SpringBoot Pod);
- 故障自愈:Pod 挂了自动重启 / 重建;
- 扩缩容:一键调整 Pod 数量(比如从 3 个扩到 10 个);
- 版本回滚:更新镜像后出问题,可一键回滚到旧版本。
3. Service(解决 Pod IP 变动的问题,提供稳定访问)
- 定义 :为 Pod 提供稳定的访问地址(固定 IP / 域名),相当于 "Pod 的反向代理"。
- 核心类型(新手先掌握 2 种) :
ClusterIP:仅集群内部可访问(比如后端服务之间调用);NodePort:将 Service 映射到所有 Node 节点的固定端口(比如 30080),外部可通过节点IP:30080访问(适合测试 / 开发环境)。
4. Namespace(命名空间,资源隔离)
- 定义 :把集群资源划分成 "不同的环境",比如
dev(开发)、test(测试)、prod(生产)。 - 作用 :不同 Namespace 的资源相互隔离(比如 dev 的 Deployment 不会和 prod 的冲突),新手可先用默认的
defaultNamespace。
四、k8s 基础操作(命令行,新手必记)
先确保环境就绪:新手推荐用minikube(单机 k8s 集群)或k3s(轻量 k8s),安装后验证:
bash
运行
kubectl version # 查看k8s版本(客户端+服务端)
kubectl get nodes # 查看集群节点(minikube只有1个node)
核心命令(按使用频率排序)
表格
| 命令 | 作用 | 示例 |
|---|---|---|
kubectl get <资源类型> |
查看资源列表 | kubectl get pods(查看所有 Pod)kubectl get deployments(查看所有 Deployment)kubectl get services(查看所有 Service) |
kubectl create -f <yaml文件> |
通过 YAML 文件创建资源 | kubectl create -f demo-deploy.yaml |
kubectl apply -f <yaml文件> |
创建 / 更新资源(推荐,比 create 更灵活) | kubectl apply -f demo-deploy.yaml |
kubectl describe <资源类型>/<资源名> |
查看资源详细信息(排障必备) | kubectl describe pod demo-pod-xxxx |
kubectl logs <pod名> |
查看 Pod 日志(容器日志) | kubectl logs -f demo-pod-xxxx(-f 实时查看) |
kubectl exec -it <pod名> -- /bin/bash |
进入 Pod 内的容器 | kubectl exec -it demo-pod-xxxx -- /bin/bash |
kubectl scale deployment <部署名> --replicas=<数量> |
扩缩容 Deployment 的 Pod 数量 | kubectl scale deployment demo-deploy --replicas=5 |
kubectl delete <资源类型>/<资源名> |
删除资源 | kubectl delete pod demo-pod-xxxx kubectl delete deployment demo-deploy |
五、实战:部署一个 SpringBoot 应用到 k8s(新手入门案例)
通过这个案例,把核心资源和命令串起来:
步骤 1:编写 Deployment 的 YAML 文件(demo-deploy.yaml)
yaml
apiVersion: apps/v1 # API版本(固定)
kind: Deployment # 资源类型:Deployment
metadata:
name: springboot-demo # Deployment名称
spec:
replicas: 2 # 启动2个Pod副本(扩缩容就是改这个数)
selector:
matchLabels:
app: springboot-demo # 匹配标签为app:springboot-demo的Pod
template:
metadata:
labels:
app: springboot-demo # Pod的标签
spec:
containers:
- name: springboot-demo # 容器名称
image: 你的SpringBoot镜像名:标签 # 替换成你自己构建的镜像(比如本地镜像或仓库镜像)
ports:
- containerPort: 8080 # 容器暴露的端口
resources: # 资源限制(可选,避免容器占用过多资源)
limits:
cpu: "1"
memory: "512Mi"
requests:
cpu: "0.5"
memory: "256Mi"
步骤 2:编写 Service 的 YAML 文件(demo-svc.yaml)
yaml
apiVersion: v1
kind: Service
metadata:
name: springboot-demo-svc # Service名称
spec:
type: NodePort # 外部可访问的类型
selector:
app: springboot-demo # 匹配标签为app:springboot-demo的Pod
ports:
- port: 8080 # Service的端口
targetPort: 8080 # 映射到Pod的端口
nodePort: 30080 # 节点暴露的端口(范围30000-32767)
步骤 3:部署资源到 k8s
bash
运行
# 创建Deployment
kubectl apply -f demo-deploy.yaml
# 创建Service
kubectl apply -f demo-svc.yaml
# 查看部署结果
kubectl get deployments # 看Deployment是否正常
kubectl get pods # 看2个Pod是否Running
kubectl get services # 看Service的NodePort是否为30080
步骤 4:访问应用
- 如果是 minikube 环境,先获取节点 IP:
minikube ip; - 浏览器访问:
节点IP:30080,就能看到你的 SpringBoot 应用; - 验证扩缩容:
kubectl scale deployment springboot-demo --replicas=3,再kubectl get pods会看到 3 个 Pod。
步骤 5:删除资源(清理环境)
bash
运行
kubectl delete -f demo-deploy.yaml
kubectl delete -f demo-svc.yaml
六、新手避坑 & 进阶方向
- 避坑点 :
- 不要直接操作 Pod(比如手动删除 Pod),Deployment 会自动重建,要改就改 Deployment;
- 镜像必须是集群内所有 Node 都能访问的(本地镜像需先导入 minikube,或推送到公共 / 私有仓库);
- NodePort 的端口范围是 30000-32767,不能自定义超出这个范围的端口。
- 进阶入门(掌握基础后再学) :
- ConfigMap/Secret:管理配置文件(比如 application.yml)、敏感信息(比如数据库密码);
- PersistentVolume(PV)/PersistentVolumeClaim(PVC):容器数据持久化(比如 MySQL 的数据存储);
- Ingress:替代 NodePort,实现域名访问、HTTPS、路径转发(生产环境常用);
- Helm:k8s 的 "包管理器",一键部署复杂应用(比如 MySQL、Redis 集群)。
总结
- 核心架构:k8s 集群分控制平面(管理)和节点(运行容器),新手不用深究组件细节,重点理解 "Master 指挥,Node 执行";
- 核心资源:Pod(最小运行单元)、Deployment(管理 Pod)、Service(稳定访问 Pod)是新手必掌握的三大核心;
- 核心操作 :通过
kubectl命令 + YAML 文件管理资源,先跑通 "部署 SpringBoot 应用" 的案例,再逐步学习进阶内容。