通过kubernetes / client-go修补部署

时间:2018-12-21 23:31:25

标签: kubernetes kubernetes-go-client client-go

在找出问题所在时遇到了麻烦。我有一个远程的Kubernetes集群,并已在本地复制了配置。我知道这是正确的,因为我还有其他命令可以为我工作。

我无法上班的是一个部署补丁。我的代码:

1 a
2 b
3 c
4 d
5 a
6 b

我得到的是: 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) }

任何帮助表示感谢,谢谢!

2 个答案:

答案 0 :(得分:2)

您混淆了JSONPatchType with MergePatchTypeJSONPatchType希望输入为RFC 6902格式的“命令”,在这种情况下可以为JSON数组,因为可以将多个命令应用于输入文档

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

因此,我敢打赌,仅丢掉前导"spec"而尾随[,将参数更改为]可以使您走得更远

答案 1 :(得分:1)

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

合并补丁程序:使用JSON合并补丁程序,如果要更新列表,则必须指定整个新列表。并且新列表完全替换了现有列表。

Strategic-merge-patch :使用战略性合并补丁程序,列表将根据其补丁程序策略进行替换或合并。补丁策略由Kubernetes源代码中字段标签中的patchStrategy键的值指定。例如,PodSpec结构的“容器”字段具有patchStrategy的合并:

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

N.B:默认情况下,kubectl使用战略合并补丁来修补kubernetes资源。