最近写一点东西, 需要 patch 操作, 百度 Google 都没找到 明了的 文章
- 一篇内容多处搬运, 勤劳的 搬砖码农啊
- 各种 封装 七绕八拐, 菜鸟看不懂啊
因此 分享下自己的使用 作为记录, 只包含使用过程 ,原理 自行查看 官方文档, 只能保证 步骤正确, 并分享下自己的 使用想法。
准备一份 可以patch的内容。
spec:
template:
spec:
tolerations:
- effect: NoSchedule
key: disktype
value: ssd
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node
operator: In
values:
- worker
使用 client-go 的patch 要求就是 模拟可用的 数据结构。
我们使用 json 格式 来生成 相同结构的 数据。
姿势 1: 使用 golang map 构建 json 数据结构
patchData=map[string]interface{}{
"spec": map[string]interface{}{
"template": map[string]interface{}{
"spec": map[string]interface{}{
"tolerations": []map[string]string{{
"key": "disktype",
"operator": "Equal",
"value": "ssd",
"effect": "NoSchedule",
},
},
},
},
}
打印一下 生成的结构 ,是否符合预期
patchByte,_:=json.Marshal(patchData)
println(string(patchByte))
patchByte2,_:=yaml.Marshal(patchData)
println(string(patchByte2))
这里我转义了两种格式, 通过yaml 对比 是否 和我 在集群执行的 patch字段 对应
返回内容如下:
{"spec":{"template":{"spec":{"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node","operator":"In","values":["worker"]}]}]}}},"tolerations":[{"effect":"NoSchedule","key":"status","operator":"Equal","value":"stable"}]}}}}
spec:
template:
spec:
tolerations:
- effect: NoSchedule
key: disktype
value: ssd
使用 client-go patch 打补丁。
_,err:=clientset.AppsV1().Deployments("default").Patch(svc,types.MergePatchType,patchByte)
姿势2: 使用 client-go 提供的 基于 k8s的结构 做构建。 在使用姿势1 的时候, 有些内容很繁琐 ,go 搞这种活 真的不舒服, 所以想偷懒使用 k8s 现成的 结构体生成 json
patchData=map[string]interface{}{
"spec": map[string]interface{}{
"template": map[string]interface{}{
"spec": map[string]interface{}{
"tolerations": []map[string]string{{
"key": "status",
"operator": "Equal",
"value": "stable",
"effect": "NoSchedule",
},
},
//使用 k8s 现成的结构体
"affinity": v1.Affinity{
NodeAffinity: &v1.NodeAffinity{
RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{
NodeSelectorTerms: []v1.NodeSelectorTerm{
{
MatchExpressions: []v1.NodeSelectorRequirement{
{
Key: "node",
Operator: "In",
Values: []string{"worker"},
},
},
},
},
},
},
},
},
},
},
}
虽然使用 现成的 看着有点复杂, 其实 写的时候 很简单, 好处就是有各种补全, 不用担心 有个别单词 因为拼写 或者复制问题 的错误, 我们只需要 ctl + b 去看一下 对应结构体的 里面嵌套的是什么 把它 复制 过来就行了。
姿势3: 最简单也是最丑的 方式 我们直接 写 json 不就好了, 转来转去 的多麻烦,不过需要注意的是 要把它转成 [ ]byte类型 。
patchData3 := fmt.Sprintf(`{
"spec": {
"template": {
"spec": {
"tolerations": [
{
"effect": "NoSchedule",
"key": "disktype",
"value": "ssd"
}
],
"affinity": {
"nodeAffinity": {
"requiredDuringSchedulingIgnoredDuringExecution": {
"nodeSelectorTerms": [
{
"matchExpressions": [
{
"key": "node",
"operator": "In",
"values": [
"worker"
]
}
]
}
]
}
}
}
}
}
}
}`)
_,err=clientset.AppsV1().Deployments("default").Patch(svc,types.MergePatchType, []byte(patchData3))
if err != nil {
println(err.Error())
}
}