【问题标题】:Patching deployments via kubernetes/client-go通过 kubernetes/client-go 修补部署
【发布时间】:2019-05-22 08:15:04
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    因此,我敢打赌,只要去掉前面的 [ 和后面的 ],将参数更改为 types.MergePatchType 会让你走得更远

    【讨论】:

    • 有效! MergePatchType 与 StrategicMergePatchType 上的任何 cmets?关于我上面评论的一些信息。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 所以,我已经尝试了这两种方法,并且似乎 StrategicMergePatchType 寻找第一个匹配的标签,在这种情况下为 container[0].name 然后合并它,但如果修补的名称与容器不匹配[0].name 然后它将一个新的容器对象添加到数组中。这听起来正确吗?为什么我要这个而不是 MergePatchType?
    • 编辑了我的答案,下面的链接有一些更有用的信息。 kubernetes.io/docs/tasks/run-application/…
    • 啊,有道理,谢谢你澄清!接受这个作为答案。
    • 对于非列表字段,使用策略合并补丁还是合并补丁的逻辑是什么?比如nodeselector是map的类型。
    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 2020-08-03
    • 2019-02-01
    • 2021-03-29
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多