使用K8s Go客户端创建HorizontalPodAutoscaler遇资源未找到错误求助
问题分析与解决方案
你遇到的the server could not find the requested resource错误,核心原因是HPA对象缺少必要元数据,且CreateOptions配置错误。以下是具体修复点:
错误点1:HPA对象缺少TypeMeta和ObjectMeta
Kubernetes所有API对象必须包含TypeMeta(指定资源类型和API版本)和ObjectMeta(指定名称、命名空间等元数据),你只定义了Spec部分,导致API服务器无法识别这是一个HPA资源。
错误点2:CreateOptions中的TypeMeta配置错误
你在CreateOptions里错误设置了Kind: "Pod"和APIVersion: "apps/v1",这完全不符合HPA的资源类型,而且CreateOptions根本不需要手动设置TypeMeta,客户端会自动处理。
修正后的完整代码
func (k *KubeClient) createAutoScaler(deploymentName string) (*v22.HorizontalPodAutoscaler, error) { // 定义HPA的元数据,名称建议和Deployment对应,命名空间要和Deployment一致 hpaName := deploymentName + "-hpa" namespace := "mlu-showroom-test" autoscaler := &v22.HorizontalPodAutoscaler{ // 必须设置TypeMeta,指定HPA的资源类型和API版本 TypeMeta: apimetav1.TypeMeta{ Kind: "HorizontalPodAutoscaler", APIVersion: "autoscaling/v2", }, // 必须设置ObjectMeta,指定名称和命名空间 ObjectMeta: apimetav1.ObjectMeta{ Name: hpaName, Namespace: namespace, }, Spec: v22.HorizontalPodAutoscalerSpec{ ScaleTargetRef: v22.CrossVersionObjectReference{ Kind: "Deployment", Name: deploymentName, APIVersion: "apps/v1", }, MinReplicas: pointer.Int32(2), MaxReplicas: 5, Metrics: []v22.MetricSpec{ { Type: v22.ResourceMetricSourceType, Resource: &v22.ResourceMetricSource{ Name: "cpu", Target: v22.MetricTarget{ Type: "Utilization", AverageUtilization: pointer.Int32(70), }, }, }, // 可以取消注释启用内存指标 //{ // Type: v22.ResourceMetricSourceType, // Resource: &v22.ResourceMetricSource{ // Name: "memory", // Target: v22.MetricTarget{ // Type: "Utilization", // AverageUtilization: pointer.Int32(70), // }, // }, //}, }, // 可以取消注释启用自定义缩容行为 //Behavior: &v22.HorizontalPodAutoscalerBehavior{ // ScaleDown: &v22.HPAScalingRules{ // StabilizationWindowSeconds: pointer.Int32(120), // Policies: []v22.HPAScalingPolicy{ // { // Type: v22.PodsScalingPolicy, // Value: 1, // PeriodSeconds: 60, // }, // }, // }, //}, }, } // 移除CreateOptions中错误的TypeMeta配置,使用默认的CreateOptions即可 apply, err := k.client.AutoscalingV2().HorizontalPodAutoscalers(namespace). Create(context.Background(), autoscaler, apimetav1.CreateOptions{ FieldValidation: "Ignore", }) if err != nil { return nil, err } return apply, nil }
关键修复说明
- 添加TypeMeta:明确指定
Kind: "HorizontalPodAutoscaler"和APIVersion: "autoscaling/v2",和你使用的v22(对应autoscaling/v2)版本匹配。 - 添加ObjectMeta:设置HPA的名称和命名空间,确保命名空间和目标Deployment一致。
- 修正CreateOptions:删除错误的
TypeMeta配置,客户端会根据你调用的AutoscalingV2().HorizontalPodAutoscalers()自动识别资源类型。
验证时可以用kubectl get hpa -n mlu-showroom-test查看是否创建成功,和kubectl autoscale创建的HPA对比元数据和Spec是否一致。
内容的提问来源于stack exchange,提问作者Loc Truong
相关产品推荐
相关产品推荐

