Kubernetes Deployment

Kubernetes Deployment

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

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

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

创建一个 Deployment 对象来生成对应的 Replica Set 并完成 Pod 副本的创建过程。

检查 Deployment 的状态来部署动作是否完成(Pod 副本的数量是否达到预期的值)。

更新 Deployment 以创建新的 Pod(比如镜像升级)。

如果当前 Deployment 不稳定,则回滚到一个早先的 Deployment 版本。

暂停 Deployment 以便于下一次性修改多个 PotTemplateSpec 的配置项,之后再回复 Deployment,进行新的发布。

扩展 Deployment 以应对高负载。

查看 Deployment 的状态,以此作为发布是否完成的指标。

清理不在需要的旧版本 ReplicaSets。

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

apiVersion: extensions/v1beta1kind: Deploymentmetadata:  name: nginx-deployment

apiVersion: v1kind: ReplicaSetmetadata:  name: nginx-repset

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

tomcat-deployment.yaml

apiVersion: extensions/v1beta1kind: Deploymentmetadata:  name: tomcat-deploymentspec:  replicas: 1  selector:    matchLabels:      tier: frontend    matchExpressions:     - {key: tier, operator: In, values: [frontend]}  template:    metadata:      labels:        app: app-demo        tier: frontend    spec:      containers:      - name: tomcat-dome        image: tomcat        imagePullPolicy: IfNotPresent        ports:        - containerPort: 8080

创建命令:

$ kubectl apply -f tomcat-deployment.yamldeployment "tomcat-deployment"created

查看 Deployment 信息:

$ kubectl get deploymentNAME                DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGEtomcat-deployment   1         1         1            1           21s

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

DESIRED:Pod 副本数量的期望值,即 Deployment 里定义的 Replica。

CURRENT:当前 Replica 的值,实际上是 Deployment 所创建的 Replica Set 里的 Replica 值,这个值不断增加,直到达到 DESIRED 为止,表名整个部署过程完成。

UP-TO-DATE:最新版本的 Pod 的副本数量,用于只是在滚动升级的过程中,有多少个 Pod 副本已经成功升级。

AVAILABLE:当集群中可用的 Pod 副本数量,即集群中当前存活的 Pod 数量。

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

$ kubectl get rsNAME                           DESIRED   CURRENT   READY     AGEtomcat-deployment-7b54cd85d6   1         1         1         32s

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

$ kubectl get poNAME                                 READY     STATUS    RESTARTS   AGEtomcat-deployment-7b54cd85d6-4lpvx   1/1Running   0          48s

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

Pod 的管理对象,除了 RC 和 Deployment,还包括 ReplicaSetDeploymentStatefulSet、Job 等,分别用于不同的应用场景中。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容