前言:
学会如何在 Kubernetes 中 创建、发布、更新、回滚、删除 应用,掌握两种管理方式(命令式 vs 声明式),并了解三种主流发布策略。
一、Kubernetes 有两种"操作方式"
就像写程序可以用"手写代码"也可以用"拖拽工具",K8s 管理资源也有两种风格:
|----------|-------------|---------------------------------------|----------------|
| 方式 | 名称 | 特点 | 适合场景 |
| 陈述式(命令式) | Imperative | 直接敲命令,比如 kubectl create | 快速测试、临时操作 |
| 声明式(配置式) | Declarative | 写 YAML 文件,用 kubectl apply -f xxx.yaml | 生产环境、版本控制、团队协作 |
✅ 建议:学习时先用命令式快速上手,工作中尽量用声明式(YAML)!
二、陈述式操作:像"发指令"一样管理应用
2.1 基础信息查看(常用命令)
bash
# 查看 K8s 版本
kubectl version
# 查看集群基本信息(API Server 地址等)
kubectl cluster-info
# 查看所有资源类型及其缩写(如 deploy=Deployment, svc=Service)
kubectl api-resources
# 查看命名空间(Namespace)
kubectl get namespaces
# 查看 default 命名空间下的所有资源
kubectl get all -n default
💡 提示:加 -o wide 可看到更多列(如 IP、节点),加 --show-labels 可显示标签。
2.2 创建一个应用(Deployment)
bash
# 创建一个叫 nginx-wl 的 Deployment,使用 nginx 镜像
kubectl create deployment nginx-wl --image=nginx -n kube-public
这会自动创建一个 Pod 副本控制器(ReplicaSet),默认副本数 = 1。
Pod 名字是随机生成的,如 nginx-wl-6d5b8c7f9-xk2l3。
2.3 查看和进入容器
bash
# 查看 Pod 列表
kubectl get pods -n kube-public
# 查看某个 Deployment 的详细信息
kubectl describe deployment nginx-wl -n kube-public
# 进入容器内部(类似 SSH 登录)
kubectl exec -it <Pod名字> -n kube-public -- bash
# 查看容器日志
kubectl logs <Pod名字> -n kube-public
2.4删除资源
bash
# 删除 Pod(但 Deployment 会自动重建它!)
kubectl delete pod <Pod名字> -n kube-public
# 强制立即删除(跳过优雅终止)
kubectl delete pod <Pod名字> -n kube-public --force --grace-period=0
# 删除整个 Deployment(连带所有 Pod)
kubectl delete deployment nginx-wl -n kube-public
⚠️ 注意:直接删 Pod 没用!因为 控制器(Controller)会自动补上。要删就删控制器本身。
2.5 扩缩容(调整副本数)
bash
# 扩展到 3 个副本
kubectl scale deployment nginx-wl --replicas=3 -n kube-public
# 缩减到 1 个副本
kubectl scale deployment nginx-wl --replicas=1 -n kube-public
2.6 对外暴露服务(Service)
为了让外部能访问你的应用,需要创建 Service:
bash
# 将 nginx-wl 暴露为 NodePort 类型的服务
kubectl expose deployment nginx-wl \
--port=80 \ # Service 在集群内的端口
--target-port=80 \ # 转发到 Pod 的端口
--name=nginx-svc \ # 服务名称
--type=NodePort \ # 类型:NodePort(外部可访问)
-n kube-public
Service 四种类型:
|--------------|-----------------------|--------|
| 类型 | 作用 | 是否对外 |
| ClusterIP | 集群内部访问(默认) | ❌ |
| NodePort | 通过节点 IP + 端口访问 | ✅ |
| LoadBalancer | 云厂商提供公网 IP(如 AWS ELB) | ✅ |
| ExternalName | 映射到外部域名 | ------ |
🔁 端口关系再强调一次:
containerPort:容器内监听的端口(写在 YAML 里)
targetPort:Service 转发到 Pod 的端口(通常 = containerPort)
port:Service 自己的端口(集群内通过 ClusterIP:port 访问)
nodePort:外部通过 节点IP:nodePort 访问(范围 30000--32767)
三、项目完整生命周期:创建 → 发布 → 更新 → 回滚 → 删除
3.1 创建(Create)
bash
kubectl create deployment myapp --image=myapp:v1
3.2 发布(Expose)
bash
kubectl expose deployment myapp --port=8080 --type=NodePort
3.3 更新(Update)
bash
# 将镜像升级到 v2
kubectl set image deployment/myapp myapp=myapp:v2
✅ K8s 默认使用滚动更新:逐步替换旧 Pod,保证服务不中断。
3.4 回滚(Rollback)
如果新版本出问题,可以快速回退!
bash
# 查看更新历史
kubectl rollout history deployment/myapp
# 回滚到上一个版本
kubectl rollout undo deployment/myapp
# 回滚到指定版本(如 revision=2)
kubectl rollout undo deployment/myapp --to-revision=2
# 查看回滚进度
kubectl rollout status deployment/myapp
💡 每次 set image 或 apply 都会产生一个新 revision(版本记录)。
3.5 删除(Delete)
bash
kubectl delete deployment myapp
kubectl delete service myapp
四、高级发布策略:不只是"全量更新"
除了默认的滚动更新,还有更安全的发布方式:
4.1 金丝雀发布(Canary Release)------"先让一小部分人试用"
核心思想:先上线新版本给 5% 用户,观察没问题再全量。
K8s 实现思路(需配合 Ingress 或 Service Mesh):
同时部署 v1 和 v2 两个 Deployment;
通过流量权重控制,95% 流量走 v1,5% 走 v2;
监控 v2 的错误率、延迟;
如果稳定,逐步提高 v2 流量比例(20% → 50% → 100%)。
✅ 优点:风险极小,故障只影响少数用户。
❌ 缺点:配置复杂,需要额外工具(如 Nginx Ingress、Istio)。
4.2 蓝绿发布(Blue-Green Deployment)------"两套环境切换"
蓝环境:当前线上版本(v1)
绿环境:新版本(v2),部署好但不对外
测试通过后,一次性将流量从蓝切到绿
✅ 优点:切换快,回滚只需切回蓝环境。
❌ 缺点:需要双倍资源,切换瞬间可能有连接中断。
📌 注:原文件未详细展开蓝绿发布,但它是常见策略之一。
4.3 滚动发布(Rolling Update)------K8s 默认方式
4.3.1、是什么?
逐步替换旧版本 Pod 为新版本,每次只更新一部分,直到全部完成。
Kubernetes 的 Deployment 默认使用滚动发布。
4.3.2 工作方式:
启动 1 个(或几个)新版本 Pod;
等待新 Pod 就绪后,再删除 1 个(或几个)旧版本 Pod;
重复此过程,直到所有旧 Pod 被替换。
⚙️ 可通过 maxSurge 和 maxUnavailable 控制并发数和可用性。
4.3.3 优点:
零停机(服务始终可用)
资源利用率高(不需要额外大量资源)
简单易用(K8s 原生支持)
4.3.4 缺点:
一旦新版本有问题,会影响所有用户(因为最终 100% 流量都会切到新版本)
回滚虽快,但故障已发生。
五、声明式管理:用 YAML 文件"描述"你想要的状态
5.1 为什么用 YAML?
可版本控制(Git 管理)
可复用、可审计
支持复杂配置(如健康检查、资源限制)
5.2 如何生成 YAML?
方法 1:用 --dry-run 自动生成
bash
kubectl create deployment nginx --image=nginx --replicas=3 --dry-run=client -o yaml > nginx.yaml
方法 2:从现有资源导出
bash
kubectl get deployment nginx -o yaml > nginx.yaml
5.3 应用和更新 YAML
bash
# 首次创建
kubectl apply -f nginx.yaml
# 修改 YAML 后再次 apply(自动触发滚动更新)
kubectl apply -f nginx.yaml
✅ apply 是声明式的核心命令:"让集群变成 YAML 描述的样子"。
5.4 修改配置的三种方式
|------|-------------------------------|----------|------------|
| 方式 | 命令 | 是否修改本地文件 | 适用场景 |
| 在线编辑 | kubectl edit deployment/nginx | ❌ | 临时调试 |
| 离线修改 | 改 xxx.yaml 后 apply | ✅ | 正式更新 |
| 强制重建 | 先 delete -f 再 apply -f | ✅ | apply 不生效时 |
六、总结:一张表掌握核心操作
|----|-------------------------------|-----------------------------------|
| 阶段 | 命令式(初学) | 声明式(生产) |
| 创建 | kubectl create deployment ... | kubectl apply -f app.yaml |
| 发布 | kubectl expose ... | 在 YAML 中定义 Service |
| 更新 | kubectl set image ... | 修改 YAML 后 apply |
| 回滚 | kubectl rollout undo ... | kubectl apply -f old-version.yaml |
| 删除 | kubectl delete ... | kubectl delete -f app.yaml |