如何通过K8S Go SDK部署Edtack自定义资源的YAML文件
操作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: vecvaluesname: ek
namespace: lg
path: rescharts/bingname: 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: apisname: 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

