前言

 继续我的学习输出,今天来攻克 Kubernetes 的部署核心:怎么把应用真正跑起来? K8s 里“部署”不是简单跑个容器,而是用 Deployment(或其他控制器)来管理 Pod 的生命周期,包括副本数、更新策略、健康检查等。 我花了半天时间把官方最新文档 + 社区实践过了一遍,下面是精华总结 + 实战示例(基于 K8s v1.28+,2026 年主流版本)。

1. K8s 常见部署方式对比(先搞清楚用哪个)

K8s 有多种控制器来管理 Pod,根据应用类型选对的才能少踩坑:

  • Deployment:最常用,适合无状态应用(如 Web 服务、微服务 API)。支持滚动更新、回滚、自动扩缩容。
  • StatefulSet:适合有状态应用(如数据库 MySQL、Redis、ZooKeeper)。Pod 有固定顺序、唯一身份、持久存储。
  • DaemonSet:每个 Node 只跑一个 Pod,适合守护进程(如日志收集 agent、监控 agent、网络代理)。
  • Job / CronJob:适合一次性任务或定时任务(如数据迁移、备份)。

我的快速选择口诀

  • 无状态、需要高可用 → Deployment
  • 有状态、需要固定身份/顺序 → StatefulSet
  • 每个节点都要跑一个 → DaemonSet
  • 只跑一次或定时跑 → Job/CronJob

今天重点讲 Deployment,因为 80% 的场景都用它。

2. Deployment 核心概念

Deployment → ReplicaSet → Pod

  • Deployment 管理 ReplicaSet(副本控制器)
  • ReplicaSet 保证 Pod 数量始终等于 replicas
  • Pod 是实际运行的容器实例

关键字段(YAML 里最常改的):

  • replicas:想要的副本数
  • selector:怎么找自己管理的 Pod(matchLabels)
  • template:Pod 模板(镜像、端口、资源限制等)
  • strategy:更新策略(RollingUpdate 最常用)

3. 实战:用 Deployment 部署 Nginx(完整 YAML 示例)

咱们来部署一个经典的 Nginx Web 服务器,三副本 + 服务暴露。

nginx-deployment.yaml(直接 kubectl apply -f 这个文件就能跑)

YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default          # 可改成你的命名空间
  labels:
    app: nginx
spec:
  replicas: 3                 # 启动 3 个副本
  selector:
    matchLabels:
      app: nginx
  strategy:
    type: RollingUpdate       # 滚动更新(默认)
    rollingUpdate:
      maxSurge: 1             # 最多多出 1 个 Pod
      maxUnavailable: 0       # 更新时不允许有 Pod 不可用(高可用)
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25       # 用最新稳定版(2026 年推荐)
        ports:
        - containerPort: 80
        resources:              # 资源限制(生产必加,避免 OOM)
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "500m"
            memory: "256Mi"
        livenessProbe:          # 存活探针(容器挂了自动重启)
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 15
          periodSeconds: 10
        readinessProbe:         # 就绪探针(未就绪不加流量)
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5

配套 Service(暴露服务) — nginx-service.yaml

YAML

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80          # Service 端口
    targetPort: 80    # Pod 端口
  type: LoadBalancer  # 云上会自动创建 LB;在本地用 NodePort 或 ClusterIP 测试

部署命令(一步步来):

Bash

# 创建 Deployment
kubectl apply -f nginx-deployment.yaml

# 创建 Service
kubectl apply -f nginx-service.yaml

# 查看状态
kubectl get deployments
kubectl get pods -l app=nginx          # 看 3 个 Pod 是否 Running
kubectl get svc nginx-service          # 看 EXTERNAL-IP 或 NodePort

# 测试访问(云上直接 curl EXTERNAL-IP;本地用 minikube service 或 port-forward)
kubectl port-forward svc/nginx-service 8080:80
# 浏览器打开 http://localhost:8080 看到 Welcome to nginx!

4. 常用操作 & 最佳实践(生产必知)

  • 扩容:kubectl scale deployment nginx-deployment --replicas=5
  • 滚动更新镜像:改 YAML image 字段 → kubectl apply -f ...(自动滚动)
  • 回滚:kubectl rollout undo deployment/nginx-deployment
  • 查看历史:kubectl rollout history deployment/nginx-deployment
  • 最佳实践(2026 最新总结):
    1. 永远加 resources requests/limits(防节点资源耗尽)
    2. liveness/readiness probes(健康检查)
    3. RollingUpdate + maxUnavailable=0(零宕机更新)
    4. YAML 存 Git,用 kubectl apply -f dir/ 批量管理
    5. 避免直接改 Pod,永远通过 Deployment 修改

5. 今日感悟 & 避坑总结

  • 第一次自己写 Deployment YAML 时,我卡在了 selector 和 labels 必须匹配上,花了半小时 debug。
  • 学完后最大的收获:Deployment 不是跑容器,而是“声明式运维”——你只告诉 K8s “我要 3 个 Nginx”,它自动帮你维护。
  • 生产里别用默认镜像 tag :latest,固定版本如 nginx:1.25-alpine 更安全。

明日计划: 继续深挖 Service 类型(ClusterIP vs NodePort vs LoadBalancer vs Ingress),再部署一个带 Ingress 的多服务应用!

欢迎评论区交流:

  • 你第一次部署 K8s 应用踩过什么坑?
  • 工作中最常用 Deployment 还是 StatefulSet?

参考:Kubernetes 官方文档(2025-2026 更新)、CSDN 社区多篇最新实践。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐