通过 kubernetes/client-go 修补部署

Patching deployments via kubernetes/client-go

无法找出问题所在。我有一个远程 kubernetes 集群,并在本地复制了配置。我知道这是正确的,因为我已经得到了其他命令为我工作。

我无法开始工作的是部署补丁。我的代码:

const namespace = "default"
    
var clientset *kubernetes.Clientset

func init() {
    kubeconfig := "/Users/$USER/go/k8s-api/config"
    config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
    if err != nil {
        log.Fatal(err)
    }

    // create the clientset
    clientset, err = kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }
}

func main() {
    deploymentsClient := clientset.ExtensionsV1beta1().Deployments("default")

    patch := []byte(`[{"spec":{"template":{"spec":{"containers":[{"name":"my-deploy-test","image":"$ORG/$REPO:my-deploy0.0.1"}]}}}}]`)
    res, err := deploymentsClient.Patch("my-deploy", types.JSONPatchType, patch)
    if err != nil {
        panic(err)
    }
    fmt.Println(res)

}

我得到的只有: panic: the server rejected our request due to an error in our request

感谢任何帮助,谢谢!

您混淆了 JSONPatchType with MergePatchType; JSONPatchType wants the input to be RFC 6902 格式化的“命令”,在这种情况下可以是一个 JSON 数组,因为可以对输入文档应用多个命令

但是,您的负载看起来更接近您想要的 MergePatchType,在这种情况下,输入应该 而不是 是 JSON 数组,因为源文档不是 "spec" 个对象的数组。

因此,我敢打赌只删除前导 [ 和尾随 ],将参数更改为 types.MergePatchType 会让你走得更远

实际上你应该使用 types.StrategicMergePatchType 并从修补字符串中删除前导 ([) 和尾随 (]) 括号。

Merge-patch: 使用 JSON 合并补丁,如果你想更新一个列表,你必须指定整个新列表。并且新列表完全取代现有列表。

策略合并补丁: 使用策略合并补丁,列表根据其补丁策略被替换或合并。补丁策略由 Kubernetes 源代码中字段标记中 patchStrategy 键的值指定。例如,PodSpec 结构的 Containers 字段有一个 patchStrategy 合并:

type PodSpec struct {
  ...
  Containers []Container `json:"containers" patchStrategy:"merge" patchMergeKey:"name" ...`

N.B: kubectl 默认使用策略合并补丁来修补 kubernetes 资源。