Deployment 简介

deployment 是用来管理无状态应用的,面向的集群的管理,而不是面向的是一个不可变的个体,举例:有一群鸭子,要吃掉一个,只需要再放一个新的鸭仔就好了,不会影响什么,而有状态的应用,就同时养三条狗一样,而每个狗都是无法代替用新的事物代替的,因为有“感情”这个状态在里面。

Deployment 为Pod 和 ReplicaSet 之上,提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController 来方便的管理应用。

你只需要在 Deployment 中描述您想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和ReplicaSet 的实际状态改变到您的目标状态。您可以定义一个全新的 Deployment 来

创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。也就是说Deployment是可以管理多个ReplicaSet的,如下图:

典型的应用场景包括:

  • 定义Deployment来创建Pod和ReplicaSet,使用Deployment来创建ReplicaSet。ReplicaSet在后台创建pod。检查启动状态,看它是成功还是失败。
  • 然后,通过更新Deployment的PodTemplateSpec字段来声明Pod的新状态。这会创建一个新的ReplicaSet,Deployment会按照控制的速率将pod从旧的ReplicaSet移动到新d的ReplicaSet中。
  • 如果当前状态不稳定,回滚到之前的Deployment revision。每次回滚都会更新Deployment的revision。
  • 扩容Deployment以满足更高的负载。
  • 暂停Deployment来应用PodTemplateSpec的多个修复,然后恢复上线。
  • 根据Deployment 的状态判断上线是否hang住了。
  • 清除旧的不必要的 ReplicaSet。

Deployment 升级

kubectl explain deploy.spec.strategy   策略订是配置怎么滚动升级的,支持两种策略:

  • Recreate   重建式更新,就是删一个建一个。
  • rollingUpdate  滚动更新,简单定义 更新期间pod最多有几个等

rollingUpdate 有两种策略

  • maxSurge  指定超出副本数有几个,两种方式:1、指定数量 2、百分比
  • maxUnavailable 最多有几个不可用

Deployment 历史版本

kubectl explain deploy.spec.revisionHistoryLimit

最多保存多少个历史版本,默认是10个

Deployment 模板

kubectl explain deploy.spec.template

通过template 创建我们的目标状态

类似pod的定义(包含 spec 、 metadata)

   spec <Object>
Specification of the desired behavior of the pod. More info: https://
git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status/ metadata <Object>
Standard object's metadata. More info:
https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata

案例:

apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas:
selector:
matchLabels:
app: myapp
release: dev
template:
metadata:
labels:
app: myapp
release: dev
spec:
containers:
- name: myapp-containers
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort:

结果

看一下deploy 是否成功
$ kubectl get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
myapp-deploy 2m
因为deploy 是三层架构 现在会自动启动一个replicasets 我们看一下是否启动
$ kubectl get rs
NAME DESIRED CURRENT READY AGE
myapp-deploy-f4bcc4799 5m
我们看自动创建一个rs.名称后面的字符串是 模板的哈希值。是不会发生变化的,最后pod的是随机值 我们再看一下最后一层,最后一层为pod
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-deploy-f4bcc4799-cs5xc / Running 7m
myapp-deploy-f4bcc4799-k4tq5 / Running 7m

滚动升级案例:

我们通过修改yaml的方式升级

apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas:
selector:
matchLabels:
app: myapp
release: dev
template:
metadata:
labels:
app: myapp
release: dev
spec:
containers:
- name: myapp-containers
image: ikubernetes/myapp:v2
ports:
- name: http
containerPort:

升级过程(我们看到,是停止一台,升级一台的这种循环。)

kubectl get pods -l app=myapp -w
NAME READY STATUS RESTARTS AGE
myapp-deploy-f4bcc4799-cs5xc / Running 23m
myapp-deploy-f4bcc4799-cwzd9 / Running 14m
myapp-deploy-f4bcc4799-k4tq5 / Running 23m
myapp-deploy-f4bcc4799-shbmb / Running 14m
myapp-deploy-f4bcc4799-vtk6m / Running 14m myapp-deploy-f4bcc4799-shbmb / Terminating 16m
myapp-deploy-869b888f66-mv5c6 / Pending 0s
myapp-deploy-869b888f66-mv5c6 / Pending 0s
myapp-deploy-869b888f66-vk9j6 / Pending 0s
myapp-deploy-869b888f66-vk9j6 / Pending 0s
myapp-deploy-869b888f66-mv5c6 / ContainerCreating 0s
myapp-deploy-869b888f66-r57t5 / Pending 0s
myapp-deploy-869b888f66-r57t5 / Pending 0s
myapp-deploy-869b888f66-vk9j6 / ContainerCreating 1s
myapp-deploy-869b888f66-r57t5 / ContainerCreating 1s
myapp-deploy-869b888f66-r57t5 / ContainerCreating 1s
myapp-deploy-869b888f66-mv5c6 / ContainerCreating 1s
myapp-deploy-869b888f66-vk9j6 / ContainerCreating 2s
myapp-deploy-f4bcc4799-shbmb / Terminating 16m
myapp-deploy-f4bcc4799-shbmb / Terminating 16m
myapp-deploy-869b888f66-r57t5 / Running 4s
myapp-deploy-f4bcc4799-vtk6m / Terminating 16m
myapp-deploy-869b888f66-rxzbb / Pending 1s
myapp-deploy-869b888f66-rxzbb / Pending 1s
myapp-deploy-869b888f66-rxzbb / ContainerCreating 1s
myapp-deploy-869b888f66-vk9j6 / Running 5s
myapp-deploy-f4bcc4799-cwzd9 / Terminating 16m
myapp-deploy-869b888f66-vvwwv / Pending 0s
myapp-deploy-869b888f66-vvwwv / Pending 0s
.....

我们查看一下 rs的情况 以下可以看到原的rs作为备份,而现在是启动新的rs

$  kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR
myapp-deploy-869b888f66 3m myapp-containers ikubernetes/myapp:v2 app=myapp,pod-template-hash=,release=dev
myapp-deploy-f4bcc4799 29m myapp-containers ikubernetes/myapp:v1 app=myapp,pod-template-hash=,release=dev

修改滚动升级策略

$ kubectl patch deplop  myapp-deploy -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":,"maxUnavailable":}}}}'
$  kubectl describe deploy  myapp-deploy
Name:            myapp-deploy
Namespace:        default
CreationTimestamp:    Tue, 28 Aug 2018 09:52:03 -0400
Labels:            app=myapp
            release=dev
Annotations:        deployment.kubernetes.io/revision=4
            kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"myapp-deploy","namespace":"default"},"spec":{"replicas":3,"selector":{...
Selector:        app=myapp,release=dev
Replicas:        3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:        RollingUpdate
MinReadySeconds:    0
RollingUpdateStrategy:    0 max unavailable, 1 max surge
Pod Template:
....

金丝雀发布

##通过 set image 发布新的镜像 也可以通过yaml文件发布 myapp-containers 是containers 的名称
$ kubectl set image deploy myapp-deploy myapp-containers=ikubernetes/myapp:v3 && kubectl rollout pause deploy myapp-deploy
deployment "myapp-deploy" image updated
deployment "myapp-deploy" paused #查看更新情况(新增加一个资源,但是没执行。是因为pause暂停命令,所以发布一个,这样形成了金丝雀发布,这个金丝雀就是让真实用户验证的)
$ kubectl get pods -l app=myapp -w
NAME READY STATUS RESTARTS AGE
myapp-deploy-869b888f66-dpwvk / Running 24m
myapp-deploy-869b888f66-frspv / Running 24m
myapp-deploy-869b888f66-sgsll / Running 24m
myapp-deploy-7cbd5b69b9-5s4sq / Pending 0s
myapp-deploy-7cbd5b69b9-5s4sq / Pending 0s
myapp-deploy-7cbd5b69b9-5s4sq / ContainerCreating 1s
myapp-deploy-7cbd5b69b9-5s4sq / ContainerCreating 2s
myapp-deploy-7cbd5b69b9-5s4sq / Running 19s #那个金丝雀没问题,可以发布后续的更新了
kubectl rollout resume deploy myapp-deploy #查看更新情况
kubectl get pods -l app=myapp -w
NAME READY STATUS RESTARTS AGE
myapp-deploy-869b888f66-dpwvk / Running 24m
myapp-deploy-869b888f66-frspv / Running 24m
myapp-deploy-869b888f66-sgsll / Running 24m
myapp-deploy-7cbd5b69b9-5s4sq / Pending 0s
myapp-deploy-7cbd5b69b9-5s4sq / Pending 0s
myapp-deploy-7cbd5b69b9-5s4sq / ContainerCreating 1s
myapp-deploy-7cbd5b69b9-5s4sq / ContainerCreating 2s
myapp-deploy-7cbd5b69b9-5s4sq / Running 19s
myapp-deploy-869b888f66-dpwvk / Terminating 31m
myapp-deploy-7cbd5b69b9-p6kzm / Pending 1s
myapp-deploy-7cbd5b69b9-p6kzm / Pending 1s
myapp-deploy-7cbd5b69b9-p6kzm / ContainerCreating 1s
myapp-deploy-7cbd5b69b9-p6kzm / ContainerCreating 2s
myapp-deploy-869b888f66-dpwvk / Terminating 31m
myapp-deploy-869b888f66-dpwvk / Terminating 31m
myapp-deploy-869b888f66-dpwvk / Terminating 31m
myapp-deploy-7cbd5b69b9-p6kzm / Running 18s
myapp-deploy-869b888f66-frspv / Terminating 31m
myapp-deploy-7cbd5b69b9-q8mvs / Pending 0s
myapp-deploy-7cbd5b69b9-q8mvs / Pending 0s
myapp-deploy-7cbd5b69b9-q8mvs / ContainerCreating 0s
myapp-deploy-7cbd5b69b9-q8mvs / ContainerCreating 1s
myapp-deploy-869b888f66-frspv / Terminating 31m
myapp-deploy-869b888f66-frspv / Terminating 31m
myapp-deploy-869b888f66-frspv / Terminating 31m
myapp-deploy-869b888f66-frspv / Terminating 31m

回滚

查看现在有几个版本

 kubectl rollout history deploy  myapp-deploy
deployments "myapp-deploy"
REVISION CHANGE-CAUSE
<none>
<none>
<none>
<none>

回滚到第0版(默认回滚上一版,可以通过 --to-revision指定版本)

$ kubectl rollout undo deploy  myapp-deploy --to-revision=
deployment "myapp-deploy" rolled back
#查看回滚情况
$ kubectl get pods -l app=myapp -w
NAME READY STATUS RESTARTS AGE
myapp-deploy-7cbd5b69b9-5s4sq / Running 6m
myapp-deploy-7cbd5b69b9-p6kzm / Running 1m
myapp-deploy-7cbd5b69b9-q8mvs / Running 54s
^[[Amyapp-deploy-869b888f66-7shh9 / Pending 0s
myapp-deploy-869b888f66-7shh9 / Pending 0s
myapp-deploy-869b888f66-7shh9 / ContainerCreating 0s
myapp-deploy-869b888f66-7shh9 / ContainerCreating 1s
myapp-deploy-869b888f66-7shh9 / Running 3s
myapp-deploy-7cbd5b69b9-q8mvs / Terminating 5m
myapp-deploy-869b888f66-4l4cv / Pending 0s
myapp-deploy-869b888f66-4l4cv / Pending 0s
myapp-deploy-869b888f66-4l4cv / ContainerCreating 0s
myapp-deploy-869b888f66-4l4cv / ContainerCreating 1s
myapp-deploy-7cbd5b69b9-q8mvs / Terminating 5m
myapp-deploy-869b888f66-4l4cv / Running 2s
myapp-deploy-7cbd5b69b9-p6kzm / Terminating 6m
myapp-deploy-869b888f66-vwgj2 / Pending 0s
myapp-deploy-869b888f66-vwgj2 / Pending 0s
myapp-deploy-869b888f66-vwgj2 / ContainerCreating 0s
myapp-deploy-7cbd5b69b9-q8mvs / Terminating 5m
myapp-deploy-7cbd5b69b9-q8mvs / Terminating 5m
myapp-deploy-7cbd5b69b9-p6kzm / Terminating 6m
myapp-deploy-869b888f66-vwgj2 / ContainerCreating 1s
myapp-deploy-869b888f66-vwgj2 / Running 3s
myapp-deploy-7cbd5b69b9-5s4sq / Terminating 11m
myapp-deploy-7cbd5b69b9-5s4sq / Terminating 11m
myapp-deploy-7cbd5b69b9-5s4sq / Terminating 11m
myapp-deploy-7cbd5b69b9-p6kzm / Terminating 6m
myapp-deploy-7cbd5b69b9-p6kzm / Terminating 6m
myapp-deploy-7cbd5b69b9-5s4sq / Terminating 11m
myapp-deploy-7cbd5b69b9-5s4sq / Terminating 11m $ kubectl get rs -l app=myapp -o wide
NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR
myapp-deploy-7cbd5b69b9 14m myapp-containers ikubernetes/myapp:v3 app=myapp,pod-template-hash=,release=dev
myapp-deploy-869b888f66 1h myapp-containers ikubernetes/myapp:v2 app=myapp,pod-template-hash=,release=dev
myapp-deploy-f4bcc4799 1h myapp-containers ikubernetes/myapp:v1 app=myapp,pod-template-hash=,release=dev

kubectl patch 打补丁的方式更新

格式案例(通过json格式)

kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'

更新一个images

 kubectl patch  deploy myapp-deploy -p '{"spec":{"template":{"spec":{"containers":[{"name":"myapp-containers","image":"ikubernetes/myapp:v1"}]}}}}'

Kubernetes之Deployment控制器的更多相关文章

  1. 【Kubernetes】Deployment控制器模型

    在Kubernetes中,Deployment是最基本的控制器对象 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deploym ...

  2. 如何将云原生工作负载映射到 Kubernetes 中的控制器

    作者:Janakiram MSV 译者:殷龙飞 原文地址:https://thenewstack.io/how-to-map-cloud-native-workloads-to-kubernetes- ...

  3. 使用Deployment控制器创建Pods并使Service发布到外网可访问

    由于NFS支持节点共同读取及写入,所以可使用Deployment控制器创建多个Pod,并且每一个Pod都共享同一个目录 k8s-master kubnet@hadoop2 volumes]$ vim ...

  4. 06 . Kubernetes之Pod控制器详细介绍及应用

    Pod API属性详解 Pod是k8s集群中的最小编排单位.将这个设计落实到API对象上,容器就成了Pod属性里一个普通的字段.那么到底哪些属性属于Pod对象,哪些属性属于容器的呢?先看下面的一段描述 ...

  5. 容器编排系统之ReplicaSet和Deployment控制器

    前文我们了解了k8s上的Pod资源的生命周期.健康状态和就绪状态探测以及资源限制相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14143610.htm ...

  6. kubernetes 核心技术-Controller 控制器

    一.什么是Controller? Controller是在集群上管理和运行容器的对象,Controller是实际存在的,Pod是抽象的,主要创建管理pod 二.Pod和Controller的关系 Po ...

  7. Kubernetes中Deployment部署故障排除

    Kubernetes中Deployment部署故障排除 字符型思维导图 排查pod状态(带标签):kubectl get pods,是否有等待处理的pod? 是?kubectl describe po ...

  8. kubernetes的Deployment, DaemonSet, Job 和 CronJob事例

    k8s kubernetes给node节点添加标签和删除node节点标签 Deployment配置文件exampledeploymentv1.yaml apiVersion: apps/v1 kind ...

  9. Deployment控制器(pod)更新策略

    最小就绪时间: 配置时,用户可以使用Deplpoyment控制器的spec.minReadySeconds属性来控制应用升级的速度.新旧更替过程中,新创建的Pod对象一旦成功响应就绪探测即被视作可用, ...

随机推荐

  1. 【原】Java学习笔记001 - JAVA开发环境搭建

    1.JDK下载并安装,以jdk-7u45-windows-i586.exe为例(注意JDK的安装和JRE的安装是分开的) 2.“我的电脑”右键属性,找到“高级系统设置”,找到“高级”tab下的“环境变 ...

  2. sklearn使用——梯度下降及逻辑回归

    一:梯度下降: 梯度下降本质上是对极小值的无限逼近.先求得梯度,再取其反方向,以定步长在此方向上走一步,下次计算则从此点开始,一步步接近极小值.需要注意的是步长的取值,如果过小,则需要多次迭代,耗费大 ...

  3. Linux下的快速配置虚拟环境virtualenvwrapper

    一 安装包 pip3 install virtualenv virtualenvwrapper 二 设置linux的用户个人配置文件~/.bashrc WORKON_HOME=~/Envs 设置vir ...

  4. k8s--如何使用Namespaces

    Namespaces 使用示例 Viewing namespaces Creating a new namespace Deleting a namespace Subdividing your cl ...

  5. python接口自动化-get请求

    一.环境安装 1.用pip安装requests模块 >>pip install requests 二.get请求 1.  url 1.1:   response 的返回内容还有很多信息,例 ...

  6. Django-CRM项目学习(五)-stark的action以及多级筛选功能

    1.stark的组件之action(自定制函数多选功能效果) 1.1  admin效果 1.2 多选效果前端和后端进行的操作 1.2.1 前端发过来的参数是?号后各个参数用&来拼接 1.2.2 ...

  7. MicroPython实例之TPYBoard开发板控制OLED显示中文

    0x00 前言 之前看到一篇文章是关于TPYBoard v102控制OLED屏显示的,看到之后就想尝试一下使用OLED屏来显示中文.最近利用空余时间搞定了这个实验,特此将实验过程及源码分享出来,方便以 ...

  8. richedit缩放

    本程序下载地址: 要使文本在richedit控件上进行放大缩小,可以通过设置字体的大小,从而来达到缩放文本的目的. 下面是一个例子:通过调整滚动条,从而控制richedit文本缩放. 程序运行结果如下 ...

  9. DisplayAttribute没作用,why?

    namespace WebBulletinBoard.DataAccess { using System; using System.ComponentModel.DataAnnotations; u ...

  10. Django缓存和内置信号

    缓存 简单概括就是将对数据库操作查询所得到的数据放入另外一台机器上(缓存)中,当用户再次请求时,直接去缓存中拿,避免对数据库的频繁操作,加快数据的显示时间,需要知道的是,缓存里面的数据一般都设置有超时 ...