Deployment
简称deploy。
一级字段依然是5个。其中,version最新的是apps/v1,文档里显示的版本是落后的。
|
|
deploy.spec下可定义的字段比rs.spec的要多。其中最重要的一个字段是 strategy。这个字段用来定义更新策略,滚动更新只是其中的一个策略。
|
|
type:
- Recreate:你删除一个Pod,它就创建1个新的Pod。
- RollingUpdate:滚动更新。
如果清单文件中定义type的值为RollingUpdate,还可以使用rollingUpdate来定义滚动更新的更新方式的。说白了就是控制更新粒度。比如在更新期间,Pod最多能比清单中定义的期望状态多几个,能少几个。如果type是Recreate,rollingUpdate这个字段就没有用了
|
|
rollingUpdate可定义两个字段,maxSurge和maxUnavailable。这两个值不能同时为0,可以同时为正,或者一个为正,一个为0。
- maxSurge: 能多出期望Pod数量几个,可以直接使用数字,或百分比。
- maxUnavailable: 最多比期望Pod数量少几个,可以使用数字或百分比。比如该值定义为1,期望为5,那么至少要保证有4个Pod可用。
再看看deploy.spec比rs.spec中多的几个其他字段:
- revisionHistoryLimit
做滚动更新后,最多在历史中保存过去多少个历史版本。默认是10个。 - paused
当启动更新后,没有立即更新,而是一启动就让它暂停了。一般而言默认都是不暂停的,上来就更新。
Deploy示例
示例1:声明式创建deploy
|
|
示例2:更新
deploy在实现更新应用时,可以直接通过编辑清单文件来实现或者patch打补丁(使用JSON格式给定补丁信息)实现,比如从副本数从2个改成3个。默认是滚动更新,见下图。如果只是更新镜像文件的,可以使用kubectl set image。
通过编辑清单文件更新
|
|
已经变成3个Pod了。67b6dfcd8这个值依然没变,因为我们没有修改模板。
apply可以执行多次,它可以把变化同步到apiserver,apiserver发现与etcd中不一致,从而改变etcd,从而实现修改期望状态,接下来让现有状态不断逼近期望状态。
跟踪滚动更新效果
在一个终端上,执行如下命令进行监控:
打开另一个终端,编辑清单文件来更新:
更新:
接着查看第一个终端:
查看rs:
通过patch打补丁更新
|
|
patch写结构定义很繁琐,不如vim修改清单文件,apply -f运行即可。但是这样会修改原有的清单文件,有些时候我们也许只是临时测试,修改文件不妥当。
【示例】:修改Pod副本数为5
Pod已经变为5个了。
【示例】:修改滚动更新策略
kubectl set image更新
如果只是更新镜像文件的,可以使用kubectl set image。
在一个终端上,执行如下命令进行监控:
打开另一个终端,使用kubectl set image来更新镜像文件:
下面恢复更新:
回滚
|
|
其中,子命令undo表示回滚。status查看更新历史。
回滚,默认是回滚到上一个版本,可以指定回滚到某一版本。
|
|
比如,回滚到第一个版本:
此时,在查看更新历史时,第1版已经没有,变成了第4版:
查看当前工作pod中镜像是第几个版本:
由此可见,Deployment可以对无状态的应用做到如此的灵活和简单。
DaemonSet
简称ds,主要作用在集群上符合条件的每个节点上只运行某个指定Pod,并且只运行1个副本。
一级字段依然是这5个。但是ds.spec中没有replicas字段了,因为符合条件的每个节点上只运行1个Pod。
DaemonSet示例
使用一个事先做好了的镜像filebeat,这个镜像在使用时要给两个变量:redis主机地址和redis日志级别。
|
|
【说明】:
- master上不会运行这个pod。除非指定Pod能够容忍master上的污点,master上才会也启动一个Pod。
- 启动一个redis pod,然后在default命名空间定义一个服务叫redis,这样filebeat就会连上那个redis服务了。
- 在一个清单文件中可定义多个资源,把有关联的资源定义在一起。用 — 分割。
- redis应该用StatefulSet来运行,我这里只运行1个,使用Deployment是没问题的,但是别扩展规模,只运行1个。对于redis来讲,还应该使用存储卷,后面的内容会讲,这里先不做了。
DaemonSet滚动更新
DaemonSet也支持滚动更新。
有个字段:updateStrategy
默认是是OnDelete。
DaemonSet的滚动更新字段没有maxSurge。
【注意】:只能先删除在更新。因为一个节点只能运行一个,假如现在3个节点,你要运行4个,第4个运行到哪去。没有可能性,不支持1个节点上运行两个。所以只能是先删除1个,在更新1个。当然也可以一次删除多个。