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