Deployment概念

Kubernetes Deployment是Kubernetes中的一个控制器对象,用于管理应用程序的部署。它管理和自动更新应用程序的ReplicaSets,并确保应用程序在任何时候都有一定数量的可用实例。

Deployment提供了一些优秀的特性,如自动重启失败的实例,自动扩展和缩小实例数量,以及可以从一个版本升级到另一个版本的滚动更新。这些功能使得部署非常适合于在生产环境中部署和管理大型分布式应用程序。

通过使用Kubernetes Deployment,可以轻松地定义应用程序部署的目标状态,例如所需的实例数量和应用程序镜像,并让Kubernetes自动将其转换为实际状态。这使得应用程序部署更加高效和可靠。

Kubernetes deployment的组成

Kubernetes Deployment是一种资源对象,它描述了应用程序的期望状态和如何管理容器化的应用程序。它由以下组成部分组成:
Pod模板:描述了容器的镜像、环境变量、存储卷等。
ReplicaSet:管理Pod的副本数。
更新策略:控制Deployment的更新策略,包括滚动更新、快速更新等。
回滚策略:如果更新失败,控制回滚到之前的版本。
自动扩展:根据需求增加或减少副本数。
Service:通过提供一个固定的IP地址和DNS名称,将Pod暴露给外部。
这些部分结合在一起,允许用户管理容器化应用程序,并确保它始终处于期望的状态。

创建和管理Deployment

1. 使用资源清单方式创建Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example # deployment名称
spec:
  replicas: 3 # 副本数,也就是pod数量
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx # 容器名称
        image: nginx:1.14.2 # 容器镜像
        ports:
        - containerPort: 80 # 容器端口

示例讲解:
在该示例中创建了一个名为nginx-deployment的工作负载资源,其中指定的pod数量为3,pod容器镜像为nginx,镜像版本为nginx:1.14.2,容器端口为80

1.1 使用 kubectl apply -f <资源名单文件名> 创建资源

kubectl apply -f  /k8s_yaml/deployment-example.yaml

1.2 使用kubectl创建deployment资源

kubectl create deployment <deployment-name> --image=<image-name>:<tag>

2.查看deployment资源

kubectl get deployments.apps deployment-example
# 输出以下信息
NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment-example   3/3     3            3           657d

在检查集群中的 Deployment 时,所显示的字段有:
NAME 列出了名字空间中 Deployment 的名称。
READY 显示应用程序的可用的“副本”数。显示的模式是“就绪个数/期望个数”。
UP-TO-DATE 显示为了达到期望状态已经更新的副本数。
AVAILABLE 显示应用可供用户使用的副本数。
AGE 显示应用程序运行的时间。
2.使用 kubectl get deployments.apps <deployment name>获取已创建deployment资源

3.更新deployment

# 方法1
kubectl set image deployment.v1.apps/deployment-example nginx=nginx:1.16.1
# 方法2
kubectl set image deployment/deployment-example nginx=nginx:1.16.1

4.查看deployment发布状态

kubectl rollout status deployment deployment-example

# 命令输出结果
deployment "deployment-example" successfully rolled out

5.删除deployment

kubectl delete deployments.apps my-deployment 
# 命令输出结果
deployment.apps "my-deployment" deleted

6.编辑deployment,yaml文件

kubectl edit deployment/deployment-example
# 编辑保存后输出结果
deployment.apps/nginx-deployment edited

7.获取deployment详细信息

kubectl describe deployments deployment-example
# 命令输出结果
Name:                   deployment-example
Namespace:              default
CreationTimestamp:      Sun, 25 Apr 2021 10:53:37 +0800
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 24
                        kubectl.kubernetes.io/last-applied-configuration:
                          {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"deployment-example","namespace":"default"},"spec":{"repli...
Selector:               app=deployment-example
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:       app=deployment-example
  Annotations:  redeploy-timestamp: 1675647913508
  Containers:
   deployment-container:
    Image:      nginx:1.16.1
    Port:       <none>
    Host Port:  <none>
    Limits:
      cpu:     2
      memory:  2Gi
    Requests:
      cpu:        20m
      memory:     100Mi
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Progressing    True    NewReplicaSetAvailable
  Available      True    MinimumReplicasAvailable
OldReplicaSets:  <none>
NewReplicaSet:   deployment-example-d9df5cfc8 (3/3 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  34m   deployment-controller  Scaled up replica set deployment-example-d9df5cfc8 to 3

8.回滚上线版本

# 首先查看发布版本
kubectl rollout history deployment/deployment-example
# 回滚到上一个版本
kubectl rollout undo deployment/deployment-example
# 回滚到指定版本
kubectl rollout undo deployment/deployment-example --to-revision=2
# 命令执行输出结果
deployment.apps/deployment-example rolled back

9.扩缩容pod数

# 通过指定replicas数量来控制pod数量从而达到扩缩容目的
kubectl scale deployment/deployment-example --replicas=10

10.暂停deployment上线活动

# 执行完此命令后deployment更新操作将不被允许
kubectl rollout pause deployment/deployment-example 
# 执行完此命令后取消暂停动作
kubectl rollout resume deployment/deployment-example