HPA(Horizontal Pod Autoscaler)是Openshift中的一个非常重要的对象,它定义了系统如何根据收集对应的Pod的状态(CPU/Memory)对DeploymentConfig、ReplicationController对象进行扩容与缩容。
HPA依赖于收集到的Pod资源的使用状态,要监控的指定的pod必须 安装cluster metrics应用和设置spec.containers.resources.requests属性。
支持对象:DeploymentConfig、ReplicationController、Deployment、Replica Set
指标:内存使用率,cpu使用率
HPA创建一个水平Pod自动缩放器,以指定要运行的Pod的最小和最大数量,以及Pod应该定位的CPU利用率或内存利用率。因此。可以使用水平容器自动缩放器(HPA)来指定OpenShift容器平台如何根据从属于该复制控制器或部署的容器中收集的指标自动增加或减少复制控制器或部署配置的规模和组态。
HPA进行伸缩过程
收集该HPA控制下所有Pod最近的cpu使用情况(CPU utilization)
对比在扩容条件里记录的cpu限额(CPUUtilization)
调整实例数(必须要满足不超过最大/最小实例数)
每隔30s做一次自动扩容的判断
CPU utilization的计算方法是用cpu usage(最近一分钟的平均值,通过heapster可以直接获取到)除以cpu request(这里cpu request就是我们在创建容器时制定的cpu使用核心数)得到一个平均值,这个平均值可以理解为:平均每个Pod CPU核心的使用占比。
最重要的步骤为3,这里即为HPA的算法,计算当前需要启动几个Pod
HPA进行伸缩算法
启动Pod数量计算方式
TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)
ceil()表示取大于或等于某数的最近一个整数
举个例子:
我们有一个集群实例数是3 pods,同时Pod的cpu资源的Request为1.4。cpu限额,即Target是CPU使用率为80%,当cpu的使用量CurrentPodsCPUUtilization为1.1,1.4,1.3时,ceil((1.1+1.4+1.3)/1.4/0.8)= 4
所以扩容成四个实例。
实例刚启动时及刚完成扩容/缩容,会有一段冷却时间
由于启动实例时cpu的使用度会陡增,所以自动扩容会等待一段时间以收集准确的运行时监控数据。每次扩容后冷却3分钟才能再次进行扩容,而缩容则要等5分钟后。这是因为自动扩容使用保守的方法,尽可能满足pods业务的正常使用,所以扩容的优先级要大于缩容。
当前Pod Cpu使用率与目标使用率接近时,不会触发扩容
当满足以下条件才会真正触发扩容/缩容:
avg(CurrentPodsConsumption) / Target >1.1 或 <0.9这是为了避免出现频繁的扩容缩容。
扩容条件的相对与绝对度量
创建水平容器自动缩放器后,OpenShift容器平台开始查询容器上的CPU和/或内存资源指标。当这些指标可用时,水平吊舱自动缩放器将计算当前指标利用率与所需指标利用率的比率,并相应地进行缩放。查询和扩展以固定的时间间隔进行,但是可能需要一到两分钟才能使用度量。
对于复制控制器,此缩放比例直接对应于复制控制器的副本。对于部署配置,扩展直接对应于部署配置的副本数。请注意,自动缩放仅适用于该Complete阶段中的最新部署。
OpenShift容器平台会自动考虑资源并防止在资源高峰(例如启动期间)期间不必要的自动扩展。该unready状态下0 CPU的Pod会在放大时使用,而自动缩放器会在缩小时忽略Pod。没有已知指标的Pod会0% CPU在放大和100% CPU缩小时使用。这样可以在HPA决策过程中提高稳定性。要使用此功能,必须配置准备情况检查,以确定是否可以使用新的Pod。
为了使用水平Pod自动缩放器,您的群集管理员必须具有正确配置的群集指标。
以下命令创建一个水平Pod自动缩放器,该缩放器image-registry将维护由DeploymentConfig 控制的Pod的1至10个副本,以将所有Pod 的平均CPU利用率维持在50%。
$ oc autoscale dc/image-registry --min 1 --max 10 --cpu-percent=50
该命令创建以下对象配置:
用于CPU利用率的水平Pod自动缩放器对象定义
oc edit hpa image-registry
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
annotations:
autoscaling.alpha.kubernetes.io/conditions: '[{"type":"AbleToScale","status":"True","lastTransitionTime":"2019-05-22T20:49:57Z","reason":"SucceededGetScale","message":"the
HPA controller was able to get the target''s current scale"},{"type":"ScalingActive","status":"False","lastTransitionTime":"2019-05-22T20:49:57Z","reason":"FailedGetResourceMetric","message":"the
HPA was unable to compute the replica count: missing request for cpu"}]'
creationTimestamp: 2019-05-22T20:49:42Z
name: image-registry
namespace: default
resourceVersion: "325215"
selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/image-registry
uid: 1fd7585a-7cd3-11e9-9d00-0e2a93384702
spec:
maxReplicas: 10
minReplicas: 1
scaleTargetRef:
apiVersion: apps.openshift.io/v1
kind: DeploymentConfig
name: image-registry
targetCPUUtilizationPercentage: 50
status:
currentReplicas: 3
desiredReplicas: 0
使用直接类型AverageValue而不是请求值的百分比来指定资源指标,方法是使用目标类型代替AverageUtilization,然后设置相应的target.averageValue字段代替target.averageUtilization。
水平Pod自动定标器对象定义以提高内存利用率
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: memory-autoscale
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
name: example
kind: DeploymentConfig
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
先决条件
为了使用水平Pod自动缩放器,您的群集管理员必须具有正确配置的群集指标。您可以使用该oc describe PodMetrics 命令来确定是否配置了指标。如果配置了度量标准,则输出看起来类似于以下内容,Cpu并在下Memory显示Usage。
$ oc describe PodMetrics openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Name: openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Namespace: openshift-kube-scheduler
Labels:
Annotations:
API Version: metrics.k8s.io/v1beta1
Containers:
Name: wait-for-host-port
Usage:
Memory: 0
Name: scheduler
Usage:
Cpu: 8m
Memory: 45440Ki
Kind: PodMetrics
Metadata:
Creation Timestamp: 2019-05-23T18:47:56Z
Self Link: /apis/metrics.k8s.io/v1beta1/namespaces/openshift-kube-scheduler/pods/openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Timestamp: 2019-05-23T18:47:56Z
Window: 1m0s
Events:
以下命令为部署控制器或复制控制器创建用于CPU利用率的水平Pod自动缩放器:
oc autoscale dc/ \
--min \
--max \
--cpu-percent=
oc autoscale rc/ --min --max --cpu-percent=
oc autoscale rc / <文件名> --min --max --cpu-percent =
指定所有Pod上的目标平均CPU利用率,以请求的CPU百分比表示。如果未指定或为负,则将使用默认的自动缩放策略。
例如:
oc autoscale dc/example --min=5 --max=7 --cpu-percent=75
oc自动缩放dc / example --min = 5 --max = 7 --cpu-percent = 75
以下示例显示了example部署配置的自动扩展。初始部署需要3个Pod。HPA对象将最小数量增加到5,并且如果Pod上的CPU使用率达到75%,则会将Pod增加到7个:
$ oc get dc example
NAME REVISION DESIRED CURRENT TRIGGERED BY
example 1 3 3 config
$ oc autoscale dc/example --min=5 --max=7 --cpu-percent=75
horizontalpodautoscaler.autoscaling/example autoscaled
$ oc get dc
NAME REVISION DESIRED CURRENT TRIGGERED BY
example 1 5 5 config
创建一个水平Pod自动缩放器对象以提高内存利用率
您可以创建水平容器自动缩放器,以在内存使用量超过指定限制时自动缩放部署中的容器。
自动缩放以提高内存利用率仅是“技术预览”功能。Red Hat生产服务级别协议(SLA)不支持Technology Preview功能,功能可能不完整,因此Red Hat不建议将其用于生产。这些功能提供了对即将推出的产品功能的早期访问,使客户能够测试功能并在开发过程中提供反馈。
$ oc describe PodMetrics openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
要创建用于内存利用率的水平Pod自动缩放器,请执行以下操作:
创建一个YAML文件
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: memory-autoscale
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
name: example
kind: DeploymentConfig
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: memory
target:
name: memory-absolute
targetAverageValue: 500Mi
使用设置的状态条件来确定HPA是否能够缩放以及当前是否以任何方式受到限制。
HPA状态条件v2beta1在自动缩放API版本中可用。
HPA响应以下状态条件:
AbleToScale条件指示HPA是否能够获取和更新指标,以及任何与退避相关的条件是否会阻止扩展。
True条件指示缩放是允许的。False条件指示缩放不允许对指定的原因。
ScalingActive条件指示HPA是否已启用(例如,目标的副本数不为零)并且能够计算所需的指标。
True状态表示度量是否工作正常。False条件通常指示与提取的指标中的问题。
ScalingLimited条件表明所需的刻度被水平荚式自动缩放器的最大值或最小值所限制。
True条件表明,你需要提高或级别较低的最小或最大副本数量规模。False状态指示请求的比例是允许的。
$ oc describe hpa cm-test
Name: cm-test
Namespace: prom
Labels:
Annotations:
CreationTimestamp: Fri, 16 Jun 2017 18:09:22 +0000
Reference: ReplicationController/cm-test
Metrics: ( current / target )
"http_requests" on pods: 66m / 500m
Min replicas: 1
Max replicas: 4
ReplicationController pods: 1 current / 1 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale the last scale time was sufficiently old as to warrant a new scale
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from pods metric http_request
ScalingLimited False DesiredWithinRange the desired replica count is within the acceptable range
Events:
查看水平Pod自动定标器状态条件
您可以查看由水平窗格自动缩放器(HPA)在窗格上设置的状态条件。
v2beta1自动调整API 的版本提供了水平Pod自动调整器状态条件。
先决条件
为了使用水平Pod自动缩放器,您的群集管理员必须具有正确配置的群集指标。您可以使用该oc describe PodMetrics 命令来确定是否配置了指标。如果配置了度量标准,则输出看起来类似于以下内容,Cpu并在下Memory显示Usage。
$ oc describe PodMetrics openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Name: openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Namespace: openshift-kube-scheduler
Labels:
Annotations:
API Version: metrics.k8s.io/v1beta1
Containers:
Name: wait-for-host-port
Usage:
Memory: 0
Name: scheduler
Usage:
Cpu: 8m
Memory: 45440Ki
Kind: PodMetrics
Metadata:
Creation Timestamp: 2019-05-23T18:47:56Z
Self Link: /apis/metrics.k8s.io/v1beta1/namespaces/openshift-kube-scheduler/pods/openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Timestamp: 2019-05-23T18:47:56Z
Window: 1m0s
Events:
要查看容器的状态条件,请使用以下命令以及容器的名称:
$ oc describe hpa
$ oc describe hpa cm-test
条件出现在Conditions输出的字段中。
Name: cm-test
Namespace: prom
Labels:
Annotations:
CreationTimestamp: Fri, 16 Jun 2017 18:09:22 +0000
Reference: ReplicationController/cm-test
Metrics: ( current / target )
"http_requests" on pods: 66m / 500m
Min replicas: 1
Max replicas: 4
ReplicationController pods: 1 current / 1 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale the last scale time was sufficiently old as to warrant a new scale
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from pods metric http_request
ScalingLimited False DesiredWithinRange the desired replica count is within the acceptable range
总结与提升
1,pod自动缩放仅支持CPU/Memory使用率的判断,如果自定义监控项,只能根据惯例使用经验值,不能使用使用率。
2,使用多种metrics组合,HPA会根据每个metric的值计算出scale的值,并将最大的那个值作为扩容的最终结果。
3,联动Prometheus实现预测告警和预测伸缩。