You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过K8S Go SDK部署Edtack自定义资源的YAML文件

如何使用K8S Go SDK部署自定义资源Edtack

操作K8S自定义资源(CR)通过Go SDK实现有两种主流方案,你可以根据自己的场景选择:


方案1:动态客户端(推荐,无需预生成代码)

该方案使用client-go官方提供的dynamic客户端实现,不需要提前生成CR对应的结构体和客户端代码,适合临时操作、快速验证的场景。

实现步骤

  • 引入必要依赖:
    import (
      "context"
      metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
      "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
      "k8s.io/apimachinery/pkg/runtime/schema"
      "k8s.io/apimachinery/pkg/util/yaml"
      "k8s.io/client-go/dynamic"
      "k8s.io/client-go/tools/clientcmd"
    )
    
  • 核心代码示例:
    func main() {
      // 1. 加载kubeconfig配置,集群内运行可替换为rest.InClusterConfig()
      config, err := clientcmd.BuildConfigFromFlags("", "/path/to/your/kubeconfig")
      if err != nil {
        panic(err.Error())
      }
    
      // 2. 初始化动态客户端
      dynamicClient, err := dynamic.NewForConfig(config)
      if err != nil {
        panic(err.Error())
      }
    
      // 3. 定义Edtack资源的GVR(GroupVersionResource)
      edtackGVR := schema.GroupVersionResource{
        Group:    "aps.dp.com",
        Version:  "v1alpha1",
        Resource: "edtacks", // 一般为Kind的小写复数形式,可通过kubectl api-resources确认
      }
    
      // 4. 读取YAML文件并转换为unstructured对象
      yamlFile := []byte(`
    

apiVersion: aps.dp.com/v1alpha1
kind: Edtack
metadata:
name: ed01
namespace: ctr
spec:
intRef:
name: evr
stack:

  • name: vectnt
    namespace: aps
    path: https://packages.timber.io/helm/latest/vect-0.11.0.tgz
    valuesRef:
    name: vecvalues

  • name: ek
    namespace: lg
    path: rescharts/bing

  • name: apigw-gloo-ee
    namespace: apw
    path: https://common.cdn.repositories.cloud.sap/api-gateway/apigw-gloo-ee/apigw-gloo-ee-0.3.0.tgz
    pullSecretRef:
    name: svr-secret
    valuesSecretRef:
    name: apis

  • name: kuback
    namespace: kube-prom
    path: https://github.com/prometheus-community/helm-charts/releases/download/kube-prometheus-stack-16.12.0/kube-prometheus-stack-16.12.0.tgz
    valuesSecretRef:
    name: kubes
    `)
    obj := &unstructured.Unstructured{}
    err = yaml.Unmarshal(yamlFile, obj)
    if err != nil {
    panic(err.Error())
    }

    // 5. 创建资源,要指定对应namespace
    _, err = dynamicClient.Resource(edtackGVR).Namespace("ctr").Create(context.TODO(), obj, metav1.CreateOptions{})
    if err != nil {
    panic(err.Error())
    }
    println("Edtack资源创建成功")
    }

---
## 方案2:静态客户端(适合长期频繁操作该CR的场景)
该方案需要先为自定义资源生成Go结构体和对应客户端代码,操作时类型安全,适合长期维护的生产级项目。
### 实现步骤
- 第一步:定义Edtack资源的Go结构体,添加对应的序列化标签
```go
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

type Edtack struct {
  metav1.TypeMeta   `json:",inline"`
  metav1.ObjectMeta `json:"metadata,omitempty"`

  Spec EdtackSpec `json:"spec"`
}

type EdtackSpec struct {
  IntRef IntRef      `json:"intRef"`
  Stack  []StackItem `json:"stack"`
}

// 依次定义IntRef、StackItem等子结构体,和YAML字段一一对应
  • 第二步:使用K8S官方提供的代码生成工具deepcopy-gen、client-gen生成深度拷贝方法和客户端代码
  • 第三步:初始化生成的自定义客户端,直接和操作原生K8S资源一样调用Create、Update、Delete等方法即可

注意事项

  • 执行代码前需要确认集群已经提前安装了Edtack对应的CRD定义,否则API请求会直接返回404错误
  • 如果你需要实现和kubectl apply一致的幂等效果,可以在创建前先调用Get方法查询资源是否存在,存在就执行Update,不存在再执行Create

内容的提问来源于stack exchange,提问作者PJEM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:12:03