在找出问题所在时遇到了麻烦。我有一个远程的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)
}
任何帮助表示感谢,谢谢!
答案 0 :(得分:2)
您混淆了JSONPatchType with MergePatchType
; JSONPatchType
希望输入为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资源。