1.4.7 HPA 横向自动扩容 4.8 statefulset

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.4.7 HPA 横向自动扩容 4.8 statefulset相关的知识,希望对你有一定的参考价值。

参考技术A HPA实现原理: 通过分析追踪指定RC控制的所有目标POD的负载变化情况,

来确定是否需要针对性地调整目标POD的副本数量

HPA度量指标: 1: CPU  2: 应用程序自定义的度量指标 比如服务在每秒内的相应请求数,如TPS  QPS

CPU利用率  Pod Request/ pod 使用量

如果没有定义Pod Request的值,则无法实现Pod 横向自动扩容

kubernetes 从1.2开始也在尝试支持应用程序自定义的度量指标

------------------------------------------------------------------------------------------------------------

CPU使用量通常是1MIN内的平均值

从1.7版本开始,kubernetes自身孵化了一个基础性能数据采集监控框架:

kubernetes Monitoring Architecture

HMA

kubernetes自定义了一套标准化的API接口, Resource Metrics API

客户端应用程序(HPA)

------------------------------------------------------------------------

下面是HPA定义的一个具体例子:

超过90% 会自动扩容,约束条件是Pod的副本数为1-10

也可以通过简单命令行直接创建等价的HPA对象:

POD的管理对象 RC Deployment DaemonSet Job都面向无状态的服务

复杂的中间件集群: 如mysql mongodb akka zookeeper集群都是有状态的

-----------------------------------------------------------------------------------

StatefulSet 可以看作是RC/Deployment  的一个特殊变种

RC/Deployment无法满足

1: 固定id 相互通信

2: 集群规模固定,不能随意变动

3: 每个节点都是有状态的,通常持久化数据到永久存储中

4: 磁盘顺坏则无法正常运行,集群功能受损

----------------------------------------------------------------

statefulSet有如下特性:

1: 稳定,唯一的网络标识

用来发现集群内其他成员 如第一个: kafka-0  第二个: kafka-1

2: statefulSet控制的POD启动顺序是受控的,操作n个POD,前面n-1是运行且准备好的状态

3: Pod采用稳定的持久化存储卷

通过PV或PVC来实现

删除POD时不会删除存储卷

-------------------------------------------------------------------------------------

StatefulSet 与PV 绑定以存储POD的状态数据

还要与Headless Service 配合使用

在每个StatefulSet中声明它属于哪个headless Service

HEADless Service 与 普通 Service的区别:

它没有Cluster IP 如果解析Headless Service的域名返回的是Service对应的全部POD的Endpoint列表

StateFulSet在HEadless Service的基础上又为StatefulSet 控制的每个POD 实例都创建了一个DNS域名,域名为 $(podname).$(headless service name)

如: kafka-1.kafka kafka-0.kafka

Docker Swarm 横向扩容/收缩简单使用

  Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。 Swarm 和 Kubernetes 比较类似,但是更加轻,具有的功能也较 kubernetes 更少一些。 

  Swarm 横向扩容准备服务器:

  swarm1(master):192.168.75.191

  swarm2(node1):192.168.75.192

  swarm3(node2):192.168.75.193

注:docker 1.12 版本后都自带 swarm 命令,无需安装

技术图片

 

 

 一、启动集群

在 swarm1 上启动集群,即 swarm1 为 master 节点:

[root@swarm1 ~]# docker swarm init --listen-addr 192.168.75.191:1234

技术图片

 

 

 #  --listen-addr 集群暴漏给外界调用的 HTTPAPI 的 socket 地址, IP 为本机 ip ,端口可自定义

上述命令运行成功会生成如下信息,此命令用于节点(被管理主机)加入集群

docker swarm join

--token SWMTKN-1-6ampzvvbv1ul5y9omr3lvcrodetcdc3ukr9tn7158fcebc7olo-dx61lgmjyi0wwvx8pluizyucy
    192.168.75.191:1234


在 swarm1 上查看各节点信息:

 [root@swarm1 ~]# docker node ls  #目前只有本机(管理主机 swarm1 )加入集群

技术图片

 

 

 二、分别将 swarm2 & swarm3 节点(被管理节点)加入集群

技术图片

 

 

 swarm1 (管理主机)再次查看节点信息,如下所示则集群添加成功

技术图片

 

 

Swarm 集群以搭建完毕接下来进行横向扩容/收缩

 三、测试:拉取tomcat镜像,横向扩容

  1、创建实例

  [swarm1 ~]# docker service create --replicas 1 --name tomcattest tomcat:latest

  # --replicas 始终运行实例数目

  # --name 运行服务名称,非容器名称

  [root@swarm1 ~]# docker service ps tomcattest #查看实例运行状态

  技术图片

 

 

   2、横向扩容/收缩

   [root@swarm1 ~]# docker service scale tomcattest=3

  #tomcattest服务增加为3个实例

  技术图片

 

 

  #实例自动在3台节点上分配,保证运行数量为3个实例,并且当某节点出现异常状态导致该节点上的服务宕机,

  将会在其余节点自动运行实例。始终保持实例数量为需求数量。 

  3、停止 swarm3 节点,查看实例状态

  [root@swarm3 ~]# systemctl stop docker

  技术图片

 

 

   在 swarm1 上查看服务运行状态:

  [root@swarm1 ~]# docker service ps tomcattest

  技术图片

 

 

   #swarm3节点服务自动转移至swarm1服务器上,实例数仍为3.

  swarm3 上 tomcat 实例为宕机状态,且在 swarm1 上新生成实例,使 tomcat 实例总数仍为3

 

至此 Swarm 集群搭建以及简单都横向扩容及收缩都已经完成了。

后话:

  Swarm 虽为 Docker 官方提供的管理工具,但因 swarm 本身功能的不完善性,以及与其他插件的耦合度较低,所以现在基本都不建议使用 swarm 作为管理工具,现在较为流行的管理工具为 k8s ,这里就不多说了,大家有兴趣就自行百度查看吧,另 Rancher 是目前比较新兴的管理工具,使用 Rancher 可以来管理 k8s 集群。。。

 

 

以上是关于1.4.7 HPA 横向自动扩容 4.8 statefulset的主要内容,如果未能解决你的问题,请参考以下文章

自动扩容之Horizontal Pod Autoscaling(HPA)

Kubernetes自动缩扩容HPA算法小结

k8s学习记录,HPA

k8s关于HPA扩容缩容

k8s关于HPA扩容缩容

k8s关于HPA扩容缩容