在Kubernetes水平波德自动配置器演练https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/解释了我们可以执行自动缩放自定义指标。我不明白的是,当使用两个版本的API:v2beta1和v2beta2。如果有人可以解释,我将非常感谢。
谢谢。
答案 0 :(得分:3)
第一个指标 autoscaling / V2beta1 不允许您基于自定义指标来扩展广告连播。这仅允许您根据CPU
和memory
对应用程序的利用率来扩展应用程序
第二个指标 autoscaling / V2beta2 允许用户根据自定义指标进行自动缩放。它允许基于来自Kubernetes外部的指标进行自动缩放。此API中添加了新的“外部”指标来源。
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
它将基于度量标准名称和标签选择器识别要自动缩放的特定度量标准。这些指标可以来自堆栈驱动程序或Prometheus监视应用程序之类的任何位置,并且可以基于您想扩展应用程序的Prometheus的某些查询得出。
始终最好使用V2beta2
api,因为它可以在CPU和内存以及自定义指标上进行缩放,而V2beta1 API仅可以在内部指标上进行缩放。
我在答案中提到的代码段表示如何在V2beta2
API中指定目标CPU利用率
答案 1 :(得分:3)
更新: v2beta1
在1.19版已不推荐使用,您应该继续使用v2beta2
。
此外,v2beta2
在1.18中添加了新api字段spec.behavior
,该字段可让您定义缩放荚的快慢程度。
最初,两个版本在功能上相同,但具有不同的API。
autoscaling/v2beta2
在Kubernetes 1.12版中发布,发行说明指出:
- 我们发布了autoscaling / v2beta2,它可以清理并统一API
“清理并统一API”是指v2beta2
始终使用MetricIdentifier
和MetricTarget
对象的事实:
spec:
metrics:
external:
metric: MetricIdentifier
target: MetricTarget
object:
describedObject: CrossVersionObjectReference
metric: MetricIdentifier
target: MetricTarget
pods:
metric: MetricIdentifier
target: MetricTarget
resource:
name: string
target: MetricTarget
type: string
在v2beta1
中,这些字段具有完全不同的规格,(我认为)使其更难弄清楚如何使用。
v2beta1字段上的Kubernetes 1.12参考:
v2beta2字段上的Kubernetes 1.12参考:
答案 2 :(得分:0)
如果您需要使用自定义的外部度量标准来驱动水平转接器自动缩放器,并且只有v2beta1可用(我认为GKE仍然如此),我们将在GKE中常规执行此操作。您需要:
gcr.io/google-containers/custom-metrics-stackdriver-adapter:v0.10.0
中)。有一个有关如何部署此适配器here的教程。您需要确保将所需的RBAC权限授予运行适配器的服务帐户,如here所示。您可能会或可能不想授予本教程中所述的部署配置集群管理员角色的主体;我们使用带Tiller的Helm 2,并谨慎地将Tiller的部署权限授予最小。以这种方式配置HPA:
kind: HorizontalPodAutoscaler
apiVersion: autoscaling/v2beta1
metadata:
...
spec:
scaleTargetRef:
kind: e.g., StatefulSet
name: name-of-pod-to-scale
apiVersion: e.g., apps/v1
minReplicas: 1
maxReplicas: ...
metrics:
type: External
external:
metricName: "custom.googleapis.com|your_metric_name"
metricSelector:
matchLabels:
resource.type: "generic_task"
resource.labels.job: ...
resource.labels.namespace: ...
resource.labels.project_id: ...
resourcel.labels.task_id: ...
targetValue: e.g., 0.7 (i.e., if you publish a metric that measures the ratio between demand and current capacity)
如果您要求kubectl作为HPA对象,则不会看到自动缩放/ v2beta1设置,但这很好用:
kubectl get --raw /apis/autoscaling/v2beta1/namespaces/your-namespace/horizontalpodautoscalers/your-autoscaler | jq
到目前为止,我们仅在GKE上进行了此操作。显然,这是特定于Stackdriver的。如果可以将Stackdriver部署在其他公共管理的k8s平台上,则它实际上可能是可移植的。或者,您可能最终会使用不同的方式来发布每个平台的自定义指标,即使用cronjob中的不同指标发布库以及不同的自定义指标适配器。例如,我们知道存在Azure。
答案 3 :(得分:-1)
与其他任何软件产品一样,k8也发布了具有新功能的新版本。在k8中,每个对象都使用api版本指定。在每个新的api版本中,k8对象将获得新功能或其他功能。
因此,对于HPA,beta2具有比beta1更多的功能,这些功能在文档中已提到。因此,请始终记住使用稳定版本(exp。V1)(如果不可用)对k8对象使用最新版本(对于HPA,为beta2)。