入下图红框中的内容,如果用我们自己转换的service.Spec替换从k8s中查询出的serviceK8s.Spec,我感觉是有问题的。serviceK8s中的spec.clusterIPs和spec.ipFamilies字段的值,就都没有了。我这执行这个更新逻辑的时候是报错的(我postman中只是修改了nodePort的端口)。
我自己的代码逻辑
// 提交数据到k8s
serviceApi := global.KubeConfigSet.CoreV1().Services(service.Namespace)
serviceK8s, err := serviceApi.Get(ctx, service.Name, metav1.GetOptions{})
fmt.Printf("%+v\n", serviceK8s)
//_, err = serviceApi.Get(ctx, serviceReq.Name, metav1.GetOptions{})
if err == nil {
// 查到了这个service,进行更新操作
serviceK8s.Spec = service.Spec // 通过查询 得到的在k8s中的service信息回比我们自己转换的service会多一些信息,比如uid等。
_, err := serviceApi.Update(ctx, serviceK8s, metav1.UpdateOptions{})
if err != nil {
response.FailWithDetail(ctx, "更新service失败", err.Error())
return
}
} else {
// 没有查到这个servie,进行新增操作
_, err := serviceApi.Create(ctx, &service, metav1.CreateOptions{})
if err != nil {
response.FailWithDetail(ctx, "创建service失败", err.Error())
return
}
}
报错信息:
{
"code": 1,
"data": "Service \"svc-web-30082\" is invalid: [spec.clusterIPs[0]: Invalid value: []string(nil): primary clusterIP can not be unset, spec.ipFamilies[0]: Invalid value: []core.IPFamily(nil): primary ipFamily can not be unset]",
"msg": "更新service失败"
}