组件功能
此组件监视集群的可调度节点和核心的数量,并调整所需资源的副本数量。对于需要随集群大小自动扩展的应用程序,例如 DNS 和其他随集群中节点/pod 数量扩展的服务。
实现方案
通过使用核心和节点的数量作为所选控制器的输入来计算所需的副本数量。目前支持linear(线性模式)
和ladder(阶梯模式)
两种控制模式。
ConfigMap配置示例和计算方式
ConfigMap 提供配置参数,允许即时更改(包括控制模式),而无需重建或重新启动cluster-proportional-autoscaler组件的pod。
ConfigMap 中的参数必须是 JSON,并且使用 linear 或ladder作为 key。
Linear(线性模式)
配置示例
代码语言:yaml复制apiVersion: v1
kind: ConfigMap
metadata:
name: linear-example
data:
linear: |-
{
"coresPerReplica": 2,
"nodesPerReplica": 1,
"min": 1,
"max": 100,
"preventSinglePointFailure": true,
"includeUnschedulableNodes": true
}
coresPerReplica
和nodesPerReplica
可以均配置,也可以二选一。min
和max
必须都要配置。preventSinglePointFailure
和includeUnscheduleableNodes
均为可选配置,如果不设置,默认值均为false
,且最小副本数根据min
的配置,可以是1。- 当
preventSinglePointFailure
设置为true
时,如果有多个节点,控制器会确保至少 2 个副本。 - 当
includeUnschedulableNodes
设置为true
时,副本将根据节点总数进行扩展。否则,副本将仅根据可调度节点的数量进行扩展(即不包括封锁和驱逐的节点。)
计算方式
代码语言:txt复制replicas = max( ceil( cores * 1/coresPerReplica ) , ceil( nodes * 1/nodesPerReplica ) )
replicas = min(replicas, max)
replicas = max(replicas, min)
例如,给定一个集群有 4 个节点和 13 个核心。使用上述参数,"coresPerReplica": 2
表示每个副本可以处理 2 个核心,我们需要 ceil(13 / 2) = 7 个副本来处理所有 13 个核心。"nodesPerReplica": 1
表示每个副本可以处理 1 个节点,所以我们需要 4 / 1 = 4 个副本来处理所有 4 个节点。控制器将选择较大的一个,这里是 7,作为结果。
ladder(阶梯模式)
配置示例
代码语言:yaml复制apiVersion: v1
kind: ConfigMap
metadata:
name: ladder-example
data:
ladder: |-
{
"coresToReplicas":
[
[ 1, 1 ], #格式为 [核心数,期望副本数],下同
[ 64, 3 ],
[ 512, 5 ],
[ 1024, 7 ],
[ 2048, 10 ],
[ 4096, 15 ]
],
"nodesToReplicas":
[
[ 1, 1 ], #格式为 [节点数,期望副本数],下同
[ 2, 2 ]
]
}
coresToReplicas
和nodesToReplicas
可以均配置,也可二选一。其中的所有元素都应该是 int。- 副本可以设置为 0(与线性模式不同)。例如当节点为0时,组件数为0,当到达6个时为1。
data:
ladder: |-
{
"nodesToReplicas":
[
[ 0, 0 ],
[ 6, 1 ]
]
}
计算方式
阶梯模式通过使用阶梯函数(不知道该怎么翻译,原文是step function)给出所需的副本数。阶梯函数使用来自 ConfigMap 的配置的核心、节点和副本数的关系来进行pod副本数伸缩。
例如:给定一个集群有 100 个节点和 400 个核心。使用上述参数,coresToReplicas
计算的副本将是 3(因为 64 < 400 < 512),nodesToReplicas
计算的副本数是 2 (因为 100
> 2
)。结果取大,则为 3。
和HPA(Horizontal Pod Autoscaler)功能的比较
Horizontal Pod Autoscaler通过配置metrics的目标值,并监控该metrcis的值来进行比对,以便让pod根据资源负载的情况进行动态的扩所容。
cluster-proportional-autoscaler通过configmap的配置,即可进行简单的缩放,这里只需关注集群中节点、核心数,和目标副本数的关系即可。
参考文档
https://github.com/kubernetes-sigs/cluster-proportional-autoscaler
实验示例
直接部署
参考官网示例,可在此文档找到
https://github.com/kubernetes-sigs/cluster-proportional-autoscaler/tree/master/examples
代码语言:yaml复制# 创建RBAC和SA,以便组件能够正常请求集群
kind: ServiceAccount
apiVersion: v1
metadata:
name: cluster-proportional-autoscaler-example
namespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cluster-proportional-autoscaler-example
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["list", "watch"]
- apiGroups: [""]
resources: ["replicationcontrollers/scale"]
verbs: ["get", "update"]
- apiGroups: ["extensions","apps"]
resources: ["deployments/scale", "replicasets/scale"]
verbs: ["get", "update"]
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "create"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cluster-proportional-autoscaler-example
subjects:
- kind: ServiceAccount
name: cluster-proportional-autoscaler-example
namespace: default
roleRef:
kind: ClusterRole
name: cluster-proportional-autoscaler-example
apiGroup: rbac.authorization.k8s.io
#创建configmap,写明期望的扩缩容规则
---
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-autoscaler
namespace: default
data:
ladder: |-
{
"coresToReplicas":
[
[ 1,1 ],
[ 3,3 ],
[ 512,5 ],
[ 1024,7 ],
[ 2048,10 ],
[ 4096,15 ],
[ 8192,20 ],
[ 12288,30 ],
[ 16384,40 ],
[ 20480,50 ],
[ 24576,60 ],
[ 28672,70 ],
[ 32768,80 ],
[ 65535,100 ]
],
"nodesToReplicas":
[
[ 1,1 ],
[ 2,2 ]
]
}
# 创建业务pod,这里示例是nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-autoscale-example
namespace: default
spec:
selector:
matchLabels:
run: nginx-autoscale-example
replicas: 1
template:
metadata:
labels:
run: nginx-autoscale-example
spec:
containers:
- name: nginx-autoscale-example
image: nginx
ports:
- containerPort: 80
# 创建autoscaler监控组件,以便根据核心和节点数,扩缩容业务pod
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-autoscaler
namespace: default
labels:
app: autoscaler
spec:
selector:
matchLabels:
app: autoscaler
replicas: 1
template:
metadata:
labels:
app: autoscaler
spec:
containers:
- image: gcr.io/google_containers/cluster-proportional-autoscaler-amd64:1.8.1
name: autoscaler
command:
- /cluster-proportional-autoscaler
- --namespace=default # 监控的命名空间
- --configmap=nginx-autoscaler # 使用的configmap配置
- --target=deployment/nginx-autoscale-example # 监控的资源
- --logtostderr=true
- --v=2
serviceAccountName: cluster-proportional-autoscaler-example # 使用的SA
helm方式部署
添加 cluster-proportional-autoscaler Helm 存储库
代码语言:txt复制helm repo add cluster-proportional-autoscaler https://kubernetes-sigs.github.io/cluster-proportional-autoscaler
helm repo update
安装组件
代码语言:txt复制helm upgrade --install cluster-proportional-autoscaler
cluster-proportional-autoscaler/cluster-proportional-autoscaler
--values <<name_of_your_values_file>>.yaml
<<name_of_your_values_file>>.yaml
为您指定的value.yaml配置,默认的value.yaml可参考官网:charts default values file