如何从 go 程序获取/更新 Kubernetes 自定义资源?

Pau*_*ett 2 go kubernetes

我正在寻找相当于:

kubectl get some-custom-resource-kind some-custom-resource -o yaml > file.yaml
Modify the yaml file...
kubectl apply -f file.yaml
Run Code Online (Sandbox Code Playgroud)

Kubernetes 有一个用于标准资源类型的客户端 go 库。

并且各种供应商都有用于其自定义资源的客户端库。

但是我需要获取/更新没有公开可用的客户端 go 库的资源类型。该逻辑今天在 bash 脚本中实现,我正在尝试将该功能移至 go 控制器。

似乎应该有一种直接的方法来做相当于 kubectl 的事情。

谢谢,保罗

ers*_*les 5

对于任何类型,包括您的 CRD,请使用client.Client.

从文档:

// Using a typed object.
pod := &corev1.Pod{}
// c is a created client.
_ = c.Get(context.Background(), client.ObjectKey{
    Namespace: "namespace",
    Name:      "name",
}, pod)
pod.SetFinalizers(append(pod.GetFinalizers(), "new-finalizer"))
_ = c.Update(context.Background(), pod)

// Using a unstructured object.
u := &unstructured.Unstructured{}
u.SetGroupVersionKind(schema.GroupVersionKind{
    Group:   "apps",
    Kind:    "Deployment",
    Version: "v1",
})
_ = c.Get(context.Background(), client.ObjectKey{
    Namespace: "namespace",
    Name:      "name",
}, u)
u.SetFinalizers(append(u.GetFinalizers(), "new-finalizer"))
_ = c.Update(context.Background(), u)
Run Code Online (Sandbox Code Playgroud)

您可以轻松地换入SomeCustomResourceKind

myCR := &v1alpha1.SomeCustomResourceKind{}

// c is a created client.Client
_ = c.Get(context.TODO(), client.ObjectKey{
  Namespace: "namespace",
  Name:      "some-custom-resource", }, myCR)

myCR.MyProperty = "NewValue"

_ = c.Update(context.TODO(), myCR)
Run Code Online (Sandbox Code Playgroud)

您提到您正在尝试将此功能从 bash 脚本移动到 Go 控制器,因此值得查看Kubebuilder项目,该项目可以为您搭建一个控制器(以及您可能需要的任何其他 API)。它使用控制器运行时客户端创建功能齐全的控制器,并连接所有协调逻辑来管理您的 CRD。