在Kubernetes中,Deployment是最基本的控制器对象

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas:
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.
ports:
- containerPort:

  这个Deployment定义的编排动作非常简单:确保携带了app=nginx标签的Pod个数永远等于spec.replicas指定的个数,即两个

  那究竟是Kubernetes项目中的哪个组件在执行这些操作呢?

  是kube-controller-manage组件。这个组件是一系列控制器的集合,它们被统一放在pkg/controller目录下,因为它们遵循Kubernetes中一个通用的编排方式,控制循环(control loop)

$ cd kubernetes/pkg/controller/
$ ls -d */
deployment/ job/ podautoscaler/
cloud/ disruption/ namespace/
replicaset/ serviceaccount/ volume/
cronjob/ garbagecollector/ nodelifecycle/ replication/ statefulset/ daemon/
...

  上面这个目录的每一个控制器都以独有的方式负责某种编排功能,Deployment是这些控制器中的一种。

  例如,如果现在有一种待编排的对象X,它有一个对应的控制器,那可以用一段伪代码描述这个控制循环

for {
实际状态 := 获取集群中对象 X 的实际状态(Actual State)
期望状态 := 获取集群中对象 X 的期望状态(Desired State)
if 实际状态 == 期望状态{
什么都不做
} else {
执行编排动作,将实际状态调整为期望状态
}
}

  实际状态一般来自于Kubernetes集群本身(kubelet心跳汇报容器状态和节点状态)

  期望状态一般用于用户提交的YAML文件

  像这种控制器设计原理就是用一种对象管理另一种对象。其中控制器对象本身负责定义被管理对象的期望状态(如replicas=2),而被控制对象的定义,则来自于一个模板(如template)

  Deployment中template字段里的内容跟一个标准Pod对象的API定义丝毫不差,所有被这个Deployment管理的Pod实例,都是根据这个template字段内容创建出来的。

  Deployment看似简单,实际上它实现了Kubernetes项目中一个非常重要的功能:Pod水平扩展伸缩(horizontal scaling out/in)

  如果更新Deployment的Pod模板(比如修改了容器的镜像),Deployment就需要遵循滚动更新(rolling update)的方式来升级现有的容器。而这个能力的实现,依赖的是一个API对象:ReplicaSet

apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-set
labels:
app: nginx
spec:
replicas:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.

  从这个YAML文件中可以看到,一个ReplicaSet对象,七九就是由副本数目定义和一个Pod模板组成的,它的定义起就是Deployment的一个子集。Deployment控制器实际操纵的是这个ReplicaSet对象,而不是Pod对象。

  它们三个之间的关系如下图:

  从上图中可以看出,Deployment是两层控制器,首先它通过ReplicaSet的个数来描述应用的版本,然后再通过ReplicaSet的属性来保证Pod的副本数量。即Deployment控制ReplicaSet,ReplicaSet控制Pod。

  水平扩展的指令也就非常简单

$ kubectl scale deployment nginx-deployment --replicas=
deployment.apps/nginx-deployment scaled

【Kubernetes】Deployment控制器模型的更多相关文章

  1. (六)Kubernetes Pod控制器-ReplicaSet和Deployment和DaemonSet

    Pod控制器相关知识 控制器的必要性 自主式Pod对象由调度器调度到目标工作节点后即由相应节点上的kubelet负责监控其容器的存活状态,容器主进程崩溃后,kubelet能够自动重启相应的容器.但对出 ...

  2. Kubernetes Deployment(部署无状态应用)

    Kubernetes Deployment(部署无状态应用) Pod与controllers的关系 • controllers:在集群上管理和运行容器的对象 • 通过label-selector相关联 ...

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

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

  4. Kubernetes Deployment故障排除图解指南

     个人K8s还在学习中,相关博客还没有写,准备学第二遍再开始学,发现这篇文章挺好,先转载一下. 原创: 白明的赞赏账户 下面是一个示意图,可帮助你调试Kubernetes Deployment(你可以 ...

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

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

  6. Kubernetes Deployment 源码分析(一)

    概述Deployment 基础创建 DeploymentReplicaSet滚动更新失败回滚历史版本回滚其他特性小结 概述 Deployment 是最常用的 Kubernetes 原生 Workloa ...

  7. Kubernetes Deployment 源码分析(二)

    概述startDeploymentController 入口逻辑DeploymentController 对象DeploymentController 类型定义DeploymentController ...

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

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

  9. 回滚Deployment控制器下的应⽤发布

    若因各种原因导致滚动更新⽆法正常进⾏,如镜像⽂件获取失败."⾦丝雀"遇险等,则应该将应⽤回滚到之前的版本,或者回滚到由⽤户指定的历史记录中的版本. Deployment控制器的回滚 ...

随机推荐

  1. gcc&g++

    原文章 误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序:后缀为.cpp的,两者都会认为是c++程序,注 ...

  2. [windows]桌面中添加我的电脑,我的文档和网上邻居图标

    xp系统: 操作步骤:桌面任意位置--〉右键--〉属性--〉桌面选项卡--〉自定义桌面--〉常规:勾选相关图标确定即可. win7系统: 操作步骤:桌面任意位置--〉右键--〉个性化--〉(右侧)更改 ...

  3. SVN几个重要的问题

    本文不是系统地讲解SVN,只是对SVN中一些重要的或者笔者一直混淆的问题做简要归纳. SVN的安装可以参考笔者的另一篇技术随笔<SVN安装使用小结>. 1.既然能够通过SVN得到“每一个版 ...

  4. 机器学习之-奇异值分解(SVD)原理详解及推导

    转载 http://blog.csdn.net/zhongkejingwang/article/details/43053513 在网上看到有很多文章介绍SVD的,讲的也都不错,但是感觉还是有需要补充 ...

  5. android 焦点 ListView 点击事件获取失败

    1. 在ListView 中, 创建一个app_item.xml 布局文件 在布局文件中有如下的代码:  <CheckBox         android:id="@+id/cb_t ...

  6. myna代码

    https://github.com/TalkingData/Myna/tree/master/Dataset https://github.com/TalkingData/Myna

  7. Android之通过adb shell 模拟器 error: more than one device and emulator 改ip dns

    error: more than one device and emulator 如果出现上面那种情况 请关闭  ide 输入下面的  再次重新启动 模拟器 如果实际上只有一个设备或模拟器,并且查到有 ...

  8. Xcode中的约束用法

    这篇文章用几个简单的例子来介绍XCode6.1故事板中约束的使用方法.   现在iOS设备屏幕的尺寸也有很多种了,尤其是有了iPhone6 Plus以后,再不关注界面的尺寸适配就有点说不过去了.   ...

  9. CSS在线压缩

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. VUE2中axios的使用方法

    一,安装 npm install axios 二,在http.js中引入 import axios from 'axios'; 三,定义http request 拦截器,添加数据请求公用信息 axio ...