一、概述

本文提供一份 K8s Deployment 配置文件示例,并对关键配置项进行详细说明,方便在实际项目部署时参考和使用。

二、配置示例

---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations: {}
  labels:
    app: msmp-mt-server
    k8s.kuboard.cn/name: msmp-mt-server-deployment
  name: msmp-mt-server-deployment
  namespace: hw-msmp
  resourceVersion: '10843811'
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: msmp-mt-server
      env: dev
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      annotations:
        kubectl.kubernetes.io/restartedAt: '2023-11-03T17:39:17+08:00'
      creationTimestamp: null
      labels:
        app: msmp-mt-server
        env: dev
    spec:
      containers:
        - env:
            - name: TZ
              value: Asia/Shanghai
          image: 'harbor.mos.com/hw/mt-server:v4.0.7'
          imagePullPolicy: Always
          name: msmp-mt-server
          ports:
            - containerPort: 8080
              name: http
              protocol: TCP
          resources:
            limits:
              cpu: '16'
              memory: 32Gi
            requests:
              cpu: '2'
              memory: 4Gi
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /root/mt-server/cache
              name: cache
              subPath: cache
            - mountPath: /root/mt-server/logs
              name: cache
              subPath: logs
      dnsPolicy: ClusterFirst
      nodeName: host-172.16.1.113
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
        - configMap:
            defaultMode: 420
            name: hw2-msmp-config
          name: config-volume
        - hostPath:
            path: /home/msmp/
            type: ''
          name: cache

三、配置项详解

3.1 元数据 (metadata)

配置项 说明
name Deployment 的名称,在命名空间中必须唯一
namespace 所属的命名空间
labels 标签,用于资源的组织和选择
annotations 注解,存储非识别信息,如重启时间等

3.2 规格配置 (spec)

3.2.1 基本配置

配置项 说明
replicas Pod 副本数量,此处为 1
revisionHistoryLimit 保留的历史版本数,用于回滚
progressDeadlineSeconds Deployment 进展超时时间(600秒)

3.2.2 选择器 (selector)

selector:
  matchLabels:
    app: msmp-mt-server
    env: dev

用于选择 Deployment 管理的 Pod,必须与 Pod 模板中的 labels 匹配。

3.2.3 更新策略 (strategy)

strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 25%
    maxUnavailable: 25%
配置项 说明
type 更新类型,RollingUpdate(滚动更新)或 Recreate(重建)
maxSurge 更新时最多可以超出期望 Pod 数的比例/数量
maxUnavailable 更新时最多不可用 Pod 数的比例/数量

3.3 Pod 模板 (template)

3.3.1 容器配置 (containers)

镜像配置:

配置项 说明
image 容器镜像地址和版本
imagePullPolicy 镜像拉取策略:Always(总是拉取)、IfNotPresent、Never

环境变量:

env:
  - name: TZ
    value: Asia/Shanghai

设置容器的时区为东八区,避免时间问题。

资源配置:

resources:
  requests:
    cpu: "2"
    memory: 4Gi
  limits:
    cpu: "16"
    memory: 32Gi
配置项 说明
requests 容器请求的最小资源,用于调度
limits 容器可使用的最大资源,超出会被限制或杀死

端口配置:

ports:
  - containerPort: 8080
    name: http
    protocol: TCP

声明容器暴露的端口,主要用于文档说明和 Service 关联。

3.3.2 卷配置 (volumes)

挂载卷:

volumeMounts:
  - mountPath: /root/mt-server/cache
    name: cache
    subPath: cache
  - mountPath: /root/mt-server/logs
    name: cache
    subPath: logs

定义卷:

volumes:
  - configMap:
      defaultMode: 420
      name: hw2-msmp-config
    name: config-volume
  - hostPath:
      path: /home/msmp/
      type: ''
    name: cache
卷类型 说明
configMap 从 ConfigMap 挂载配置文件
hostPath 挂载宿主机路径,用于持久化存储
emptyDir 临时目录,Pod 删除时数据也会删除

3.3.3 其他配置

配置项 说明
restartPolicy 重启策略:Always(总是重启)、OnFailure、Never
dnsPolicy DNS 策略,ClusterFirst 使用集群 DNS
nodeName 指定调度到的节点名称(不建议手动指定)
terminationGracePeriodSeconds Pod 终止宽限期(30秒)

四、使用示例

# 创建 Deployment
kubectl apply -f deployment.yaml

# 查看 Deployment 状态
kubectl get deployment msmp-mt-server-deployment -n hw-msmp

# 查看 Pod 状态
kubectl get pods -n hw-msmp -l app=msmp-mt-server

# 查看 Deployment 详情
kubectl describe deployment msmp-mt-server-deployment -n hw-msmp

# 扩容/缩容
kubectl scale deployment msmp-mt-server-deployment --replicas=3 -n hw-msmp

# 更新镜像
kubectl set image deployment/msmp-mt-server-deployment msmp-mt-server=harbor.mos.com/hw/mt-server:v4.0.8 -n hw-msmp

# 查看滚动更新状态
kubectl rollout status deployment/msmp-mt-server-deployment -n hw-msmp

# 回滚到上一个版本
kubectl rollout undo deployment/msmp-mt-server-deployment -n hw-msmp

五、注意事项

  1. 资源配置:合理设置 requests 和 limits,避免资源浪费或 OOM
  2. 时区配置:必须配置 TZ 环境变量,确保应用时间正确
  3. 持久化存储:hostPath 会将 Pod 绑定到特定节点,生产环境建议使用 PV/PVC
  4. 更新策略:根据业务特点调整 maxSurge 和 maxUnavailable,平衡更新速度和服务可用性
  5. 标签匹配:selector 必须与 Pod template 中的 labels 完全匹配