Kubernetes 操作与项目生命周期管理(初学者详解版)

前言:

学会如何在 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 |

相关推荐
释怀不想释怀4 分钟前
Docker(安装软件)
运维·docker·容器
奔波霸的伶俐虫34 分钟前
windows docker desktop 安装修改镜像学习
学习·docker·容器
原神启动136 分钟前
K8S(六)—— 企业级,Rancher安装配置与核心功能实操
容器·kubernetes·rancher
阿杰 AJie37 分钟前
安装 docker.io(不走外网 Docker 域名)
docker·容器·eureka
.hopeful.1 小时前
Docker——镜像仓库和镜像
运维·docker·容器
m0_485614671 小时前
K8S项目生命周期管理
云原生·容器·kubernetes
CodeCaptain1 小时前
Dify结合vllm-openai docker镜像出现docker: invalid reference format问题的解决方案
运维·docker·容器
LucidX1 小时前
Kubernetes Pod 详解与Rancher 部署
容器·kubernetes·rancher
星环处相逢1 小时前
从 Pod 核心原理到 Rancher 实战:K8s 容器管理全解析
容器·kubernetes·rancher
伞啊伞1 小时前
k8s(四) Rancher 管理集群
容器·kubernetes·rancher