Kubernetes HorizontalPodAutoscaler:缺少字段“;条件“;

Kubernetes HorizontalPodAutoscaler:缺少字段“;条件“;,kubernetes,horizontal-pod-autoscaling,Kubernetes,Horizontal Pod Autoscaling,朋友们,我正试图按照k8s的要求实施HPA,但我遇到了以下错误: 验证错误(HorizontalPodAutoscaler.status):io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerStatus中缺少必填字段“条件” 我找不到有关此字段“条件”的任何信息。有人知道我做错了什么吗?这是我的HPA的YAML: apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler m

朋友们,我正试图按照k8s的要求实施HPA,但我遇到了以下错误:

验证错误(HorizontalPodAutoscaler.status):io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerStatus中缺少必填字段“条件”

我找不到有关此字段“条件”的任何信息。有人知道我做错了什么吗?这是我的HPA的YAML:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: {{ .Values.name }}
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: {{ .Values.name}}
  minReplicas: {{ .Values.deployment.minReplicas }}
  maxReplicas: {{ .Values.deployment.maxReplicas }}
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
status:
  observedGeneration: 1
  lastScaleTime: <some-time>
  currentReplicas: 2
  desiredReplicas: 2
  currentMetrics:
  - type: Resource
    resource:
      name: cpu
      current:
        averageValue: 0
背景 不确定,为什么要使用
status
部分创建
HPA
。如果删除此部分,将创建
HPA
,而不会出现任何问题

在文档中,您可以找到以下信息:

几乎每个Kubernetes对象都包含两个嵌套的对象字段,用于控制对象的配置:对象
spec
和对象
status
。对于具有
规范的对象,您必须在创建对象时设置此参数,以提供您希望资源具有的特征描述:其所需状态

状态
描述由Kubernetes系统及其组件提供和更新的对象的当前状态。
Kubernetes控制平面持续主动地管理每个对象的实际状态,以匹配您提供的所需状态

您的情况在中有部分描述

使用
HorizontalPodAutoscaler
自动缩放/v2beta2
形式时,您将能够看到Kubernetes在HorizontalPodAutoscaler上设置的状态条件。这些状态条件指示
HorizontalPodAutoscaler
是否能够
缩放
,以及当前是否受到任何限制

来自我的GKE测试集群的示例 正如我前面提到的,如果您将删除
状态
部分,您将能够创建
HPA

$ kubectl apply -f - <<EOF
> apiVersion: autoscaling/v2beta2
> kind: HorizontalPodAutoscaler
> metadata:
>   name: hpa-apache
> spec:
>   scaleTargetRef:
>     apiVersion: apps/v1
>     kind: Deployment
>     name: php-apache
>   minReplicas: 1
>   maxReplicas: 3
>   metrics:
>   - type: Resource
>     resource:
>       name: cpu
>       target:
>         type: Utilization
>         averageUtilization: 50
> EOF
horizontalpodautoscaler.autoscaling/hpa-apache created
当您执行命令
kubectl autoscale
时,您已经为部署
php-apache
创建了
HPA

$ kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
horizontalpodautoscaler.autoscaling/php-apache autoscaled
现在您可以使用
kubectl get hpa
kubectl get hpa.v2beta2.autoscaling
查看
hpa
资源。输出是相同的

$ kubectl get hpa
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    1         10        1          76s
$ kubectl get hpa.v2beta2.autoscaling
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    1         10        1          84s
第一个命令将显示所有
HPA
对象以及任何
apiVersion
v2beta2
v2beta1
,等等),第二个命令将仅显示
HPA
对象以及
apiVersion:HPA.v2beta2.autoscaling
。默认情况下,我的集群使用的是
v2beta2
,因此两个命令的输出是相同的

$ kubectl get hpa
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    1         10        1          76s
$ kubectl get hpa.v2beta2.autoscaling
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    1         10        1          84s
当执行下面的命令时,将创建带有
hpa
配置的新文件。此文件基于先前的
kubectl autoscale
命令中已创建的
HPA

$ kubectl get hpa.v2beta2.autoscaling -o yaml > hpa-v2.yaml
# If I would use command `kubectl get hpa hpa-apache > hpa-v2.yaml` file would look the same
$ cat hpa-v2.yaml
apiVersion: v1
items:
- apiVersion: autoscaling/v2beta2
  kind: HorizontalPodAutoscaler
  metadata:
...
status:
    conditions:
    - lastTransitionTime: "2020-12-11T10:44:43Z"
      message: recent recommendations were higher than current one, applying the highest
        recent recommendation
      reason: ScaleDownStabilized
      status: "True"
      type: AbleToScale
      ...
    currentMetrics:
    - resource:
        current:
          averageUtilization: 0
          averageValue: 1m
结论
状态描述了Kubernetes系统及其组件提供和更新的对象的当前状态。

如果要基于
YAML
创建资源,且
状态为
状态,则必须在
状态.条件中提供值,其中
条件
需要
数组

status:
  conditions:
  - lastTransitionTime: "2020-12-11T10:44:43Z"
快速解决方案 只需从YAML中删除
状态
部分

如果从YAML清单中删除
状态
部分后仍遇到任何问题,请告知我

status:
  conditions:
  - lastTransitionTime: "2020-12-11T10:44:43Z"