天天看点

Kubernetes全栈架构师(资源调度下)--学习笔记

StatefulSet扩容缩容

StatefulSet更新策略

StatefulSet灰度发布

StatefulSet级联删除和非级联删除

守护进程服务DaemonSet

DaemonSet的使用

DaemonSet的更新和回滚

Label&Selector

什么是HPA?

自动扩缩容HPA实践

查看nginx副本

StatefulSet副本启动顺序按照名称0,1,2,只有web-0完全启动之后才会启动web-1,web-1完全启动之后才会启动web-2

删除的时候顺序与启动相反,从最后一个序号开始,2,1,0,如果web-2删除过程中,web-0挂掉了,那么web-1不会被删除,必须等待web-0启动状态变为ready之后,才会删除web-1

打开另一个窗口监控StatefulSet

扩容到5个副本

监控情况(可以看到按顺序启动)

缩容到2个副本

监控情况(可以看到删除的顺序与启动的顺序相反)

StatefulSet滚动更新的时候会先删除旧的副本,再创建新的副本,如果只有一个副本的话,会导致业务不可用,所以要根据自己的实际情况选择使用StatefulSet或者Deployment,如果必须固定主机名或者pod名称,建议使用StatefulSet

查看主机名称

RollingUpdate

OnDelete

StatefulSet和Deployment一样,有几种更新方式

查看更新方式

扩容到3个副本

查看pod

滚动更新顺序是web-2,web-1,web-0,从下往上更新,如果更新过程中web-0挂掉了,则会等待web-0恢复到状态为ready之后再继续从下往上滚动更新

修改镜像地址触发更新

查看更新过程

查看监控

修改更新状态为OnDelete

修改镜像地址

查看pod,可以看到没有更新

手动删除pod触发更新

查看web-2镜像,可以看到更新成功

查看web-1镜像,可以看到没有更新,所以只有删除的时候才会更新镜像

删除两个pod

查看监控,可以看到按照删除顺序创建

查看所有pod镜像,可以看到三个pod的镜像都更新了

修改配置

打开另一个窗口监控

修改镜像(nginx:1.15.2 -> nginx:1.15.3)

查看监控,可以看到只有大于2的在更新

查看镜像,可以看到web-2的镜像是nginx:1.15.3,另外两个是nginx:1.15.2

可以使用这种机制实现灰度机制,先发布一两个实例,确认没有问题之后再发布所有实例,这就是stateful的分段更新,相当于灰度发布的机制,也可以使用其它的方式,比如服务网格,或者myservices

级联删除:删除sts时同时删除Pod

非级联删除:删除sts时不删Pod

获取sts

级联删除

创建pod

非级联删除

查看sts,可以看到sts被删除了

查看pod,可以看到pod依然存在,只是没有sts管理了,再次删除pod不会被重新创建

删除web-1,web-0

查看pod,可以看到没有sts管理的pod,删除之后不会重新创建

DaemonSet:守护进程集,缩写为ds,在所有节点或者是匹配的节点上都部署一个Pod。

使用DaemonSet的场景

运行集群存储的daemon,比如ceph或者glusterd

节点的CNI网络插件,calico

节点日志的收集:fluentd或者是filebeat

节点的监控:node exporter

服务暴露:部署一个ingress nginx

新建DaemonSet

创建一个ds,因为没有配置notselect,所有它会在每个节点启动一个

给需要部署的容器打标签

查看容器标签

修改nginx-ds.yaml

更新配置

查看pod,可以看到不符合标签的pod被删除了

Statefulset 和 DaemonSet 更新回滚和 Deployment 一致

更新策略推荐使用 OnDelete

因为 DaemonSet 可能部署在 k8s 集群的很多节点上,一开始先在一些节点上进行测试,删除后触发更新不影响其他节点

查看更新记录

Label:对k8s中各种资源进行分类、分组,添加一个具有特别属性的一个标签

Selector:通过一个过滤的语法进行查找到对应标签的资源

当Kubernetes对系统的任何API对象如Pod和节点进行“分组”时,会对其添加Label(key=value形式的“键-值对”)用以精准地选择对应的API对象。而Selector(标签选择器)则是针对匹配对象的查询方法。注:键-值对就是key-value pair

例如,常用的标签tier可用于区分容器的属性,如frontend、backend;或者一个release_track用于区分容器的环境,如canary、production等

定义 Label

通过Selector对其筛选

在Deployment或其他控制器中指定将Pod部署到该节点

对Service进行Label

查看Labels

查看所有Version为v1的svc

Selector主要用于资源的匹配,只有符合条件的资源才会被调用或使用,可以使用该方式对集群中的各类资源进行分配

假如对Selector进行条件匹配,目前已有的Label如下

选择app为reviews或者productpage的svc

选择app为productpage或reviews但不包括version=v1的svc

选择labelkey名为app的svc

在实际使用中,Label的更改是经常发生的事情,可以使用overwrite参数修改标签

修改标签,比如将version=v1改为version=v2

删除标签,比如删除version

Horizontal Pod Autoscaler

水平 pod 自动伸缩器

k8s 不推荐使用 VPA,因为节点有很多,推荐将流量分发到不同的节点上,而不是分发到同一个节点上

HPA v1为稳定版自动水平伸缩,只支持CPU指标

V2为beta版本,分为v2beta1(支持CPU、内存和自定义指标)

v2beta2(支持CPU、内存、自定义指标Custom和额外指标ExternalMetrics)

必须安装metrics-server或其他自定义metrics-server

必须配置requests参数

不能扩容无法缩放的对象,比如DaemonSet

dry-run导出yaml文件,以便于进行二次修改

编辑文件 hpa-nginx.yaml,containers 添加参数

创建

暴露一个服务

配置autoscale

循环执行提高cpu,暂停后cpu下降

http://www.kubeasy.com/

Kubernetes全栈架构师(资源调度下)--学习笔记

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。