Deployment详解:助你快速部署无状态应用

科技   2024-10-28 07:30   广东  


1. Deployment概述

Deployment 是 Kubernetes 中一种声明式控制器,用来管理和维护一组 Pod 副本。主要用于管理无状态应用的生命周期。通过声明 Deployment,可以自动化地控制应用的副本数量、进行无停机更新、扩展、缩容等。

Deployment 主要作用如下:

(1)定义期望状态:指定希望部署的应用配置和数量。

(2)管理副本:确保应用副本数量与配置的期望值一致。

(3)无停机更新:支持滚动更新,逐步更新 Pod,更新过程中不会中断服务。

(4)版本回滚:可以回滚到之前的某个版本,以应对更新失败的情况。

(5)扩展性:支持自动扩容和缩容,通过 HPA 等资源进行弹性管理。

Pod,ReplicaSet和Deployment三者的关系

(1)Pod: 是 Kubernetes 中最基本的部署单元,表示一个或多个容器的集合。Pod 共享存储、网络和上下文。

(2)ReplicaSet: 确保指定数量的 Pod 实例在任何时候都在运行。它通过监控 Pod 的状态来管理 Pod 的创建和删除。如果某个 Pod 异常终止,ReplicaSet 会创建一个新的 Pod 来替代它。

(3)Deployment: 是更高级别的抽象,管理 ReplicaSet 的创建和更新。Deployment 允许用户声明希望运行的应用状态,包括 Pod 的模板、副本数量和更新策略。通过 Deployment,用户可以轻松实现滚动更新和回滚。


整个管理流程如下:

  • Deployment 创建并管理 ReplicaSet。

  • ReplicaSet 负责确保运行指定数量的 Pod。

  • Pod 是实际承载应用的实例。


下图是三个资源对象的关系简单呈现。

2. Deployment管理

2.1 YAML 配置文件详解

Deployment YAML 文件结构如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment   # 资源名称,根据实际填写
  namespace: prod   # 命名空间
  labels:
    app: my-app   # 标签键值对
spec:
  replicas: 3   # 副本数
  selector:       # 标签选择器
    matchLabels:
      app: my-app
  template:         # Pod模版
    metadata:
      labels:      # 标签与matchLabels处要保持一致
        app: my-app
    spec:
      containers:     # 定义容器的信息
        - name: my-container     
          image: nginx:1.25    # 定义镜像名称和版本
          imagePullPolicy: Always
          ports:
            - containerPort: 80
          resources:
            limits:
              memory: "128Mi"
              cpu: "500m"
          env:
            - name: ENV_VAR
              value: "production"
          livenessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 3
            periodSeconds: 3

字段解析

(1)基础字段

apiVersion指定 API 版本,Deployment 使用 apps/v1。

kind资源类型,这里为 Deployment。

(2)metadata字段:资源的元数据

name资源名称

namespace: 命名空间,默认是default命名空间

labels标签,使用键值对表示

(3)spec 字段

replicas:指定运行中的 Pod 副本数量。例如 replicas: 3 表示希望有3个 Pod 实例在运行。

selector:选择器,用于识别哪些 Pod 属于该 Deployment。selector.matchLabels 和 template.metadata.labels 必须一致,这样 Deployment 才可以管理对应的 Pod。

template:定义 Pod 模板,它描述了 Pod 的具体配置。Deployment 根据模板创建或更新 Pod。

(4)template.spec 字段

containers:容器列表。

name:容器名称。

image:容器使用的镜像,**生产环境一般都指向镜像仓库。**ports:定义容器暴露的端口(如 containerPort: 80 表示容器暴露80端口)。

resources:资源限制,用于限制 Pod 的 CPU 和内存资源。

env:环境变量配置,向容器传递环境变量。

imagePullPolicy: 镜像拉取策略,有三种。

  • Always:总是向镜像仓库拉取

  • IfNotPresent:如果本地没有镜像就向镜像仓库拉取

  • Never:不向镜像仓库拉取,只使用本地镜像

livenessProbe:定义健康检查,用于监控 Pod 是否健康运行,还有redinessProbe和Startup等探针。

2.2 基础管理

(1)创建deployment

有两种方式,一种是命令行直接创建,一种是写一个yaml文件,通过apply命令进行创建

生产环境通常使用后者,因为可以定制化deployment

# 命令行创建deployment
kubectl create deployment <deployment-name> --image=<container-image>

kubectl create deploy mynginx --image=nginx:1.25

# 基于yaml方式创建

kubectl apply -f my-deployment.yaml

(2)查看deployment

# 查看deployment信息
kubectl get deploy -n <namespace>
kubectl get deploy nginx

# 查看某个deploy详细信息
kubectl get deploy nginx -o wide
kubectl describe deploy nignx

(3)删除deployment

# 命令行删除
kubectl delete deploy <deploy-name>
kubectl delete deploy mynginx

# 基于资源清单删除
kubectl delete -f my-deployment.yaml

2.3 更新策略详解

Kubernetes 提供了灵活的 Deployment 更新策略,方便实现无停机更新、蓝绿部署等应用更新需求。

(1)更新策略配置

strategy 字段定义了 Deployment 的更新策略。Kubernetes 支持RollingUpdateRecreate 两种更新策略:

策略一:RollingUpdate(滚动更新):

RollingUpdate 是 Deployment 的默认更新策略。更新时会逐步创建新的 Pod 副本,替换旧的 Pod,确保应用保持在线状态。

更新策略是在spec字段下配置的,配置示例:

strategy:
  type: RollingUpdate
  rollingUpdate:
    maxUnavailable: 1
    maxSurge: 1

参数详解:

maxUnavailable:更新过程中允许的最大不可用 Pod 数量,支持绝对值或百分比(如 75%)。

maxSurge:更新过程中允许的最大新建 Pod 数量,同样支持绝对值或百分比。

更新具体步骤:

创建新 Pod(以符合 maxSurge 配置的上限)。

新 Pod 变为 Ready 状态时,停止旧的 Pod。

不断重复以上步骤,直到所有旧的 Pod 替换为新 Pod。


策略二:Recreate(重建):

Recreate 策略会直接停止所有旧的 Pod 并创建新的 Pod,适合无状态服务或无需保证持续在线的应用。

配置示例:

strategy:
  type: Recreate


生产环境一般是使用滚动更新方法。


(2)更新操作

方法一:通过 YAML 文件更新

编辑 YAML 文件并重新应用。

kubectl apply -f my-deployment.yaml

方法二:直接设置新镜像更新

kubectl set image deployment/my-deployment my-container=nginx:1.25

查看更新状态:

kubectl rollout status deployment my-deployment


在滚动更新中,您可以选择暂停更新,以便在每一步观察应用行为。

暂停更新:

kubectl rollout pause deployment my-deployment

恢复更新:

kubectl rollout resume deployment my-deployment

2.4 Deployment 回滚

如果更新发生错误或出现异常,可以将 Deployment 回滚到上一个稳定版本:


执行回滚:

kubectl rollout undo deployment my-deployment

查看历史记录:

kubectl rollout history deployment my-deployment

回滚到指定版本:如果有多个历史记录,可以通过 --to-revision 指定回滚的版本。

# 将版本回滚到第三个版本
kubectl rollout undo deployment my-deployment --to-revision=3

2.5 扩容和缩容详解

Deployment 支持动态扩容和缩容,通过更改 replicas 数量来控制 Pod 的副本数量。

(1)手动扩容或缩容:

kubectl scale deployment my-deployment --replicas=3

(2)自动扩容(HPA)

Kubernetes 支持基于 HorizontalPodAutoscaler(HPA)进行自动扩容,根据负载动态调整 Pod 副本数量:

# CPU超过85%就进行扩容
kubectl autoscale deployment my-deployment --min=3 --max=5 --cpu-percent=85

3 其他常用功能

3.1 探针配置

探针(Probe)用于监测 Pod 是否健康,Kubernetes 提供了三种探针类型:

  • Liveness Probe:检测 Pod 是否正常工作。如果检测失败,会重启 Pod,如果在重启后 Liveness 探针仍然失败,Pod 将被标记为失败。。

  • Readiness Probe:检测Pod是否准备好接收流量。如果检测失败,Pod 不会参与负载均衡,这确保了新版本的容器在完全准备好之前不会接收到流量,从而避免对应用的不良影响。。

  • Startup Probe:用于启动检测,尤其适合启动时间较长的应用。

如果对探针不是很熟悉,可以查看我之前是文章进行查看详细的介绍。

探针配置示例


containers:
  - name: my-container
    image: nginx:1.25
    ports:
      - containerPort: 80
    livenessProbe:   # 存活探针
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 5
    readinessProbe:     # 就绪探针
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 5
    startupProbe:      # 启动探针
      httpGet:
        path: /
        port: 80
      failureThreshold: 30
      periodSeconds: 10

探针参数:

  • initialDelaySeconds:在容器启动后首次探测前的延迟时间。

  • periodSeconds:两次探测之间的时间间隔。

  • failureThreshold:如果探测失败超过该值,容器会被重启或标记为不可用。

3.2 与ConfigMap/Secret 的集成

Deployment 支持从 ConfigMapSecret 中注入环境变量,使配置管理更方便灵活:

spec.template.spec.containers处设置

ConfigMap 加载环境变量:

envFrom:
  - configMapRef:

      name: my-config

Secret 加载环境变量:


envFrom:
  - secretRef:

      name: my-secret

3.3 资源限制

设置 CPU 和内存限制可以防止单个 Pod 占用过多资源:

resources:
  limits:
    memory: "256Mi"
    cpu: "500m"
  requests:
    memory: "128Mi"
    cpu: "250m"

limits:资源上限,容器无法超出该值。

requests:资源请求值,调度时优先分配该值的资源。

4 部署完整实例

下面是一个较为完整的 Deployment YAML 配置文件示例,包含了滚动更新、资源限制、环境变量、健康检查等配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
  labels:
    app: my-app
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: nginx:latest
          ports:
            - containerPort: 80
          envFrom:
            - configMapRef:
                name: my-config
          resources:
            limits:
              memory: "256Mi"
              cpu: "500m"
            requests:
              memory: "128Mi"
              cpu: "250m"
          livenessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 3
            periodSeconds: 3

上面的实例如何要用到生产环境的话,一般还需要volumevolumeMounts的部分参数,将数据持久化存储到对应的存储设备上这个存储卷将在后面文章详细讲解。

本次先分享到这里,后续将继续分享Service,K8S网络,存储卷PV/PVC和安全等相关重要知识,将跟已学的K8S基础知识点进行联动,更好得全面掌握K8S。


码字不易,戳下方名片,关注+星标



往期精彩文章


万字长文:K8S命令详解汇总【自用珍藏版】


安装部署K8S集群环境(实测有效版本)


手把手教你搭建企业级Harbor镜像仓库


【Docker系列知识】常用命令大全汇总


部署Docker的三种常用方法【值得收藏】


局域网内构建统一可访问的YUM源(基础运维必备技能)


Linux文件处理三剑客详解(运维高手必备)


Tomcat常用配置和调优(生产环境必备技巧)


Nginx配置文件详解及常用功能配置(实用率90%)


运维李哥不背锅
专注于各种运维技术、,分享Linux基础知识,服务器,数据库,云原生和网络安全等相关技术,各种进阶知识等着你,助你成为技术达人!
 最新文章