3

很难找出问题所在。我有一个远程 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

任何帮助表示赞赏,谢谢!

4

2 回答 2

4

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

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

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

于 2018-12-22T07:37:22.767 回答
1

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

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

战略合并补丁:使用战略合并补丁,列表根据其补丁策略被替换或合并。patchStrategy补丁策略由Kubernetes 源代码中的 field tag 中的 key的值指定。例如PodSpecstruct 的 Containers 字段有一个patchStrategy合并:

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

注意:kubectl 默认使用策略合并补丁来修补 kubernetes 资源。

于 2018-12-22T07:52:51.833 回答