朋友们,我试图在hpa教程 of k8s之后实现HPA,并且我有以下错误:
ValidationError(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在这里,我的部署清单:
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 }}发布于 2020-12-11 11:15:43
背景
不确定,为什么要创建HPA和status部分。如果要删除此部分,它将创建HPA,而不存在任何问题。
在文档理解Kubernetes对象-对象规范和状态中,您可以找到信息:
几乎每个Kubernetes对象都包含两个嵌套的对象字段,它们控制对象的配置: object
spec和objectstatus。对于具有spec的对象,必须在创建对象时设置它,提供对资源所具有的特性的描述:它的期望状态。status描述对象的当前状态,由Kubernetes系统及其组件提供和更新的。- Kubernetes控制平面持续和主动地管理每个对象的实际状态,以匹配您提供的状态。
您的情况在附录:卧式Pod自动分频器的状态中有部分描述
当使用
HorizontalPodAutoscaler的HorizontalPodAutoscaler表单时,您将能够看到由Kubernetes在HorizontalPodAutoscaler上设置的状态条件。这些状态条件指示HorizontalPodAutoscaler是否能够scale,以及它目前是否以任何方式受到限制。
来自我的GKE测试集群的示例
正如我前面提到的,如果要删除status部分,就可以创建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在HPA文档之后,我创建了PHP Deployment。
$ 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
$ kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
horizontalpodautoscaler.autoscaling/php-apache autoscaled现在您可以看到hpa资源使用kubectl get hpa或kubectl get hpa.v2beta2.autoscaling。输出是相同的。
第一个命令将显示具有任何HPA (v2beta2、v2beta1等)的所有HPA对象,第二个命令将仅用apiVersion: hpa.v2beta2.autoscaling显示HPA。默认情况下,我的集群使用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配置的新文件。此文件基于以前的HPA命令中已经创建的kubectl autoscale。
$ 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.conditions中condition需要array值。
status:
conditions:
- lastTransitionTime: "2020-12-11T10:44:43Z"快速解
只需从YAML中删除status部分即可。
如果您在从YAML清单中删除status部分后仍然遇到任何问题,请告诉我。
https://stackoverflow.com/questions/65241439
复制相似问题