如何用Go Client创建K6自定义资源?请求报404错误
解决Go Client创建K6自定义资源时的404错误
核心原因及修复步骤
1. 确认K6 CRD已正确安装到集群
首先检查集群中是否存在K6的自定义资源定义(CRD):
kubectl get crds | grep k6
如果没有输出,说明CRD未安装,需要先部署k6 operator对应的CRD(获取官方提供的CRD文件后,执行kubectl apply -f <CRD文件路径>完成安装)。
2. 修正API路径的复数形式错误
Kubernetes中CRD的API路径使用资源的复数名称,而非Kind的单数形式。从你的YAML示例来看,Kind是K6,对应的CRD定义中复数名称为k6s(可通过kubectl api-resources | grep k6查看NAME列确认)。
你当前的路径是单数的k6,需修改为复数:
// 原错误路径 AbsPath("/apis/k6.io/v1alpha1/namespaces/default/k6") // 修改为正确的复数路径 AbsPath("/apis/k6.io/v1alpha1/namespaces/default/k6s")
3. 使用更规范的Typed Client替代手动REST调用
直接拼接REST路径容易出错,推荐使用client-go生成的Typed Client来操作CRD,示例代码如下:
import ( k6v1alpha1 "<你的生成代码包路径>/k6.io/v1alpha1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "context" ) func createk6CR(k6Client k6v1alpha1.K6Interface) (string, error) { k6plugin := &k6v1alpha1.K6{ TypeMeta: metav1.TypeMeta{ APIVersion: "k6.io/v1alpha1", Kind: "K6", }, ObjectMeta: metav1.ObjectMeta{ Name: "k6-sample-1", Namespace: "default", }, Spec: k6v1alpha1.K6Spec{ Parallelism: 3, Script: k6v1alpha1.K6Script{ ConfigMap: k6v1alpha1.K6Configmap{ Name: "staging-stress-test", File: "staging.js", }, }, }, } _, err := k6Client.Create(context.TODO(), k6plugin, metav1.CreateOptions{}) if err != nil { return "", err } return "success", nil }
注:需先借助code-generator工具或kubebuilder,针对k6的CRD生成对应的client-go代码。
4. 调试验证API路径
如果仍有疑问,可通过kubectl proxy暴露集群API,然后用curl查看可用的资源路径:
# 启动API代理 kubectl proxy # 访问k6 API组的资源列表 curl http://localhost:8001/apis/k6.io/v1alpha1/namespaces/default/
返回结果中会列出该命名空间下k6 API组的所有可用资源,可直接确认复数资源名称。
内容的提问来源于stack exchange,提问作者shailesh gavathe
相关产品推荐
相关产品推荐

