Kubernetes Deployment介绍

原创
半兽人 发表于: 2018-11-20   最后更新时间: 2023-08-18 15:11:55  
{{totalSubscript}} 订阅, 12,391 游览

Deployment是Kubernetes v1.2引入的概念,引入的目的是为了更好地解决Pod的编排问题。为此,Deployment在内部使用了Replica Set来实现目的,无论从Deployment的作用与目的,它的YAML定义,还是从它的具体命令行操作来看,我们都可以把它看作RC的一次升级,两者相似度超过90%。

Deployment相对于RC的一个最大升级是我们随时知道当前Pod“部署”的进度。实际上由于一个Pod的创建、调度、绑定节点及在目标Node上启动对应的容器这一完整过程需要一定的时间,所以我们期待系统启动N个Pod副本的目标状态,实际上是一个连续变化的“部署过程”导致的最终状态。

Deployment的典型使用场景有以下几个。

  • 创建一个Deployment对象来生成对应的Replica Set并完成Pod副本的创建过程。
  • 检查Deployment的状态来看部署动作是否完成(Pod副本的数量是否达到预期的值)。
  • 更新Deployment以创建新的Pod(比如镜像升级)。
  • 如果当前Deployment不稳定,则回滚到一个早先的Deployment版本。
  • 暂停Deployment以便于一次性修改多个PodTemplateSpec的配置项,之后再恢复Deployment,进行新的发布。
  • 扩展Deployment以应对高负载。
  • 查看Deployment的状态,以此作为发布是否成功的指标。
  • 清理不再需要的旧版本ReplicaSets。

Deployment的定义与Replica Set的定义很类似,除了API声明与Kind类型等有所区别:

apiVersion: extensions/v1beta1      apiVersion: v1
kind: Deployment                    kind: ReplicaSet
metadata:                           metadata:
  name: nginx-deployment              name: nginx-repset

下面我们通过运行一些例子来一起直观地感受这个新概念。首先创建一个名为tomcat-deployment.yaml的Deployment描述文件,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      tier: tomcat-deploy
    matchExpressions:
      - {key: tier, operator: In, values: [frontend]}
  template:
    metadata:
      labels:
        app: app-demo
        tier: tomcat-deploy
    spec:
      containers:
      - name: tomcat-demo
        image: tomcat
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

运行下述命令创建Deployment:

# kubectl create -f tomcat-deployment.yaml
deployment "tomcat-deploy" created

运行下述命令查看Deployment的信息:

# kubectl get deployments
NAME            DESIRED     CURRENT     UP-TO-DATE      AVAILABLE   AGE
tomcat-deploy   1           1           1               1           4m

对上述输出中涉及的数量解释如下:

  • DESIRED:Pod副本数量的期望值,即Deployment里定义的Replica。
  • CURRENT:当前Replica的值,实际上是Deployment所创建的Replica Set里的Replica值,这个值不断增加,直到达到DESIRED为止,表明整个部署过程完成。
  • UP-TO-DATE:最新版本的Pod副本数量,用于指示在滚动升级的过程中,有多少个Pod副本已经成功升级。
  • AVAILABLE:当前集群中可用的Pod副本数量,即集群中当前可用的Pod数量。

运行下述命令查看对应的Replica Set,我们看到它的命名与Deployment的名字有关系:

# kubectl get rs
NAME                        DESIRED     CURRENT     AGE
tomcat-deploy-1640611518    1           1           1m

运行下述命令查看创建的Pod,我们发现Pod的命名以Deployment对应的Replica Set的名字为前缀,这种命名很清晰地表明了一个Replica Set创建了哪些Pod,对于滚动升级这种复杂的过程来说,很容易排查错误:

# kubectl get pods
NAME                            READY       STATUS      RESTARTS    AGE
tomcat-deploy-1640611518-zhrsc  1/1         Running     0           3m

运行kubectl describe deployments,可以清楚地看到Deployment控制的Pod的水平扩展过程。

Pod的管理对象,除了RC和Deployment,还包括ReplicaSet、DaemonSet、StatefulSet、Job等,分别用于不同的应用场景中,在其他专栏会进行详细介绍。

更新于 2023-08-18

link 7月前
运行下述命令创建Deploymeny:

单词拼写有误Deploymeny --> Deployment

半兽人 -> link 7月前

感谢,已更新。

骉騳马 2年前

根据selector的匹配方式:如果同时设置了matchLabels和matchExpression,则两组条件为“AND”关系,那么tomcat-deployment.yaml中的selector是不是有问题,下面的selector表明,tier=tomcat-deploy且tier IN[front-end]才会匹配

selector:
    matchLabels:
      tier: tomcat-deploy
    matchExpressions:
      - {key: tier, operator: In, values: [frontend]}
echo 3年前

为啥我执行kubectl get deployments NAME是frontend 而不是tomcat-deploy

半兽人 -> echo 3年前

我错了o(╥﹏╥)o,是我的yaml名字没提供对。

半兽人 -> echo 3年前

我更新了,你在看看。

matchExpressions:
      - {key: tier, operator: In, values: [frontend]}

这句也写错了吧?应该是下面的代码吧?

matchExpressions:
      - {key: tier, operator: In, values: [tomcat-deploy]}

下次复制代码前能不能review一下啊?

deployment的apiVersion,在kubernetes V1.18版本,好像是apps/V1了,希望老师标注一下

好的,新版本api转正了挺多的。

请问deployment的NAME为tomcat-deploy,在yaml文件中哪里定义的?

containers中,容器的名称。

查看kubernetes更多相关的文章或提一个关于kubernetes的问题,也可以与我们一起分享文章