Deployment

一、Deployment介绍

Kubernetes 的 Deployment 是一种高层次的 API 对象,用于声明式地管理 Pod 的副本、升级、回滚等操作。它为应用的部署和维护提供了强大的功能。

Deployment是Replicat的一个升级版本,具备动态升级和回滚功能。 Deployment是kubernetes中最常用的资源对象,为ReplicaSet和Pod的创建提供了一种声明式的定义方法,在Deployment对象中描述一个期望的状态,Deployment控制器就会按照一定的控制速率把实际状态改成期望状态,通过定义一个Deployment控制器会创建一个新的ReplicaSet控制器,通过ReplicaSet创建pod,删除Deployment控制器,也会删除Deployment控制器下对应的ReplicaSet控制器和pod资源。

二、Deployment资源对象结构

Deployment 资源对象通常包括以下几个主要部分:

  1. apiVersion

  2. kind

  3. metadata

  4. spec

apiVersion

指定 API 的版本。对于 Deployment,通常使用 apps/v1

apiVersion: apps/v1

kind

指定资源的类型。对于 Deployment,这个字段的值为 Deployment

kind: Deployment

metadata

包含 Deployment 对象的元数据,如名称、命名空间、标签和注释等。

  • name: Deployment 的名称(必须唯一)。

  • namespace: Deployment 所在的命名空间(默认为 default)。

  • labels: 用于标记 Deployment 的键值对,方便后续的选择器和过滤。

  • annotations: 用于存储附加的信息和注释。

metadata:
  name: my-deployment
  namespace: default
  labels:
    app: my-app

spec

定义了 Deployment 的详细规格,包括副本数量、Pod 模板、选择器和更新策略等。

  • replicas: 指定 Pod 的副本数量。这决定了有多少个 Pod 应该同时运行。

replicas: 3
  • selector: 定义一个标签选择器,用于选择和管理 Pod。

matchLabels: 定义要匹配的标签键值对,用于选择与 Deployment 相关的 Pod。

selector:
  matchLabels:
    app: my-app
  • template: 定义 Pod 的模板。所有根据 Deployment 创建的 Pod 都会基于这个模板。

metadata: Pod 的标签,通常与 selector 中的标签匹配。

metadata:
  labels:
    app: my-app

spec: Pod 的规格,包括容器配置、卷、环境变量等。

containers: 容器列表,定义 Pod 中的容器。

      • name: 容器的名称。

      • image: 容器的镜像。

      • ports: 容器暴露的端口。

      • env: 环境变量配置。

      • resources: 资源请求和限制。

spec:
  containers:
  - name: my-container
    image: my-image:latest
    ports:
    - containerPort: 80

volumes: 定义 Pod 使用的卷(可选)

volumes:
- name: my-volume
  emptyDir: {}
  • strategy: 定义滚动更新的策略。

type: 更新策略类型。常用的有 RollingUpdateRecreate

strategy:
  type: RollingUpdate

rollingUpdate: 这是一个 RollingUpdateDeployment 类型的字段,仅在 type 设置为 RollingUpdate 时出现。它定义了滚动更新的配置参数。

      • maxSurge: 更新期间可以创建的额外 Pod 数量或百分比。

      • maxUnavailable: 更新期间允许不可用的 Pod 数量或百分比。

默认值:

      • 如果没有指定 type,默认使用 "RollingUpdate" 策略。

rollingUpdate:
  maxSurge: 1
  maxUnavailable: 1
  • minReadySeconds: Pod 在被认为可用之前必须在 Ready 状态下等待的最小秒数(可选)。
minReadySeconds: 10
  • revisionHistoryLimit: 保留的历史版本数量,默认是 10 个(可选)。

功能说明:

    • 回滚: 当你更新 Deployment 的配置时,Kubernetes 会创建一个新的 ReplicaSet 并逐步替换掉旧的 ReplicaSetrevisionHistoryLimit 用于控制保留多少个历史的 ReplicaSet,这样你可以在需要时将应用程序回滚到之前的版本。

    • 默认值: 如果没有显式设置这个字段,Kubernetes 默认会保留 10 个历史 ReplicaSet

    • 指针: 这个字段是一个指针,意味着可以将其设置为 0(表示不保留任何历史 ReplicaSet),或者将其留空以使用默认值 10

revisionHistoryLimit: 5

二、Deployment 的主要功能

  1. 滚动更新(Rolling Update):允许逐步替换旧版本的 Pod,以便在不停止服务的情况下部署新的版本。

  2. 重建式更新(Recreate)
  3. 回滚(Rollback):支持回滚到先前的版本,以便在新版本出现问题时快速恢复。

  4. 副本管理(Replica Management):自动创建、删除或更新 Pod 副本以保持所需的副本数量。

  5. 声明式配置:通过 YAML 文件定义 Pod 的期望状态,Kubernetes 会自动确保实际状态符合期望。

三、常用命令

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx-dep
spec:
  replicas: 10
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: harbor.hiuiu.com/nginx/nginx:1.21.5
        ports:
        - containerPort: 80

创建或更新 Deployment

kubectl apply -f deployment.yaml

查看 Deployment 状态

kubectl get deployments
kubectl describe deployment <deployment-name>

删除 Deployment

kubectl delete deployment <deployment-name>

升级版本管理

查看升级历史

kubectl rollout history deployment/nginx-deployment

回滚到指定版本

kubectl rollout undo deployment/nginx-deployment --to-revision=3

动态缩放

kubectl scale deployment/nginx-deployment --replicas=10

锁定当前版本

kubectl rollout pause deployment/nginx-deployment

解除锁定

kubectl rollout resume deployment/nginx-deployment

查看配置

kubectl explain deployment
kubectl describe deployments.apps nginx-deployment

使用deployment升级pod

#修改配置文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx-dep
spec:
  replicas: 10
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: harbor.hiuiu.com/nginx/nginx:1.22a
        ports:
        - containerPort: 80

kubectl apply -f deployment.yaml
#查看升级过程
watch kubectl get pod -o wide

 升级回滚

方法一:

命令形式升级

kubectl set image deployment.v1.apps/nginx-deployment nginx=harbor.hiuiu.com/nginx/nginx:1.21.5

方法二:

修改配置文件

kubectl edit deployment/nginx-deployment

 自动更新策略配置

##Recreate 重建式更新
---
spec:
  template:
    metadata:
    spec:
  startegy:
    type: Recreate
---

##rollingUpdate
maxSurge:允许超出期望副本数的最大 Pod 数量(跟新过程中的额外创建的pod)
maxUnavailable:允许的最大不可用 Pod 数量
#两种取值方式:1.给定数量,2.根据百分比
maxUnavailable  <string>
---
  strategy:
    type:RollingUpdate
    rollingupdate:
      maxSurge: 50%
      maxUnavailable: 50%

 

posted @ 2024-08-23 11:08  hx_ky36  阅读(8)  评论(0编辑  收藏  举报