首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HorizontalPodAutoscaler:缺失字段“条件”

HorizontalPodAutoscaler:缺失字段“条件”
EN

Stack Overflow用户
提问于 2020-12-10 19:56:17
回答 1查看 1.4K关注 0票数 3

朋友们,我试图在hpa教程 of k8s之后实现HPA,并且我有以下错误:

ValidationError(HorizontalPodAutoscaler.status):缺少io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerStatus.中所需的“条件”字段

我找不到任何关于这个领域的“条件”。有人知道我可能做错了什么吗?这是我的HPA的YAML:

代码语言:javascript
复制
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

在这里,我的部署清单:

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.name }}
spec:
  replicas: {{ .Values.deployment.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Values.labels}}
  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
      labels:
        app: {{ .Values.labels }}
    spec:
      initContainers:
      - name: check-rabbitmq
        image: {{ .Values.initContainers.image }}
        command: ['sh', '-c',
        'until wget http://$(RABBITMQ_DEFAULT_USER):$(RABBITMQ_DEFAULT_PASS)@rabbitmq:15672/api/aliveness-test/%2F; 
        do echo waiting; sleep 2; done;']
        envFrom:
        - configMapRef:
            name: {{ .Values.name }}
      - name: check-mysql
        image: {{ .Values.initContainers.image }}
        command: ['sh', '-c', 'until nslookup mysql-primary.default.svc.cluster.local; do echo waiting for mysql; sleep 2; done;']
      containers:
      - name: {{ .Values.name }}
        image: {{ .Values.deployment.image }}
        ports:
        - containerPort: {{ .Values.ports.containerPort }} 
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 200m
        envFrom:
        - configMapRef:
            name: {{ .Values.name }}
EN

回答 1

Stack Overflow用户

发布于 2020-12-11 11:15:43

背景

不确定,为什么要创建HPAstatus部分。如果要删除此部分,它将创建HPA,而不存在任何问题。

在文档理解Kubernetes对象-对象规范和状态中,您可以找到信息:

几乎每个Kubernetes对象都包含两个嵌套的对象字段,它们控制对象的配置: object spec和object status。对于具有spec的对象,必须在创建对象时设置它,提供对资源所具有的特性的描述:它的期望状态。status描述对象的当前状态,由Kubernetes系统及其组件提供和更新的- Kubernetes控制平面持续和主动地管理每个对象的实际状态,以匹配您提供的状态。

您的情况在附录:卧式Pod自动分频器的状态中有部分描述

当使用HorizontalPodAutoscalerHorizontalPodAutoscaler表单时,您将能够看到由Kubernetes在HorizontalPodAutoscaler上设置的状态条件。这些状态条件指示HorizontalPodAutoscaler是否能够scale,以及它目前是否以任何方式受到限制。

来自我的GKE测试集群的示例

正如我前面提到的,如果要删除status部分,就可以创建HPA

代码语言:javascript
复制
$ 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

HPA文档之后,我创建了PHP Deployment

代码语言:javascript
复制
$ kubectl apply -f https://k8s.io/examples/application/php-apache.yaml
deployment.apps/php-apache created
service/php-apache created

执行命令kubectl autoscale时,您已经为部署php-apache创建了HPA

代码语言:javascript
复制
$ kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
horizontalpodautoscaler.autoscaling/php-apache autoscaled

现在您可以看到hpa资源使用kubectl get hpakubectl get hpa.v2beta2.autoscaling。输出是相同的。

第一个命令将显示具有任何HPA (v2beta2v2beta1等)的所有HPA对象,第二个命令将仅用apiVersion: hpa.v2beta2.autoscaling显示HPA。默认情况下,我的集群使用v2beta2,因此这两个命令的输出是相同的。

代码语言:javascript
复制
$ 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配置的新文件。此文件基于以前的HPA命令中已经创建的kubectl autoscale

代码语言:javascript
复制
$ 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

结论

status描述对象的当前状态,由Kubernetes系统及其组件提供和更新的

如果要使用YAML使用status创建基于status的资源,则必须在status.conditions中提供价值,在status.conditionscondition需要array值。

代码语言:javascript
复制
status:
  conditions:
  - lastTransitionTime: "2020-12-11T10:44:43Z"

快速解

只需从YAML中删除status部分即可。

如果您在从YAML清单中删除status部分后仍然遇到任何问题,请告诉我。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65241439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档