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