# k8s api(golang) 서비스 업데이트 사용시
# 서비스 내용을 구성하고
service := &corev1.Service{
ObjectMeta: metav1.ObjectMeta{
Name: "ysoftman-service",
},
Spec: corev1.ServiceSpec{
Selector: map[string]string{
"app": "ysoftman-deployment",
},
Type: corev1.ServiceTypeClusterIP,
Ports: []corev1.ServicePort{
{
Name: "http",
Protocol: "TCP",
Port: 9000,
TargetPort: intstr.IntOrString{
Type: intstr.Int,
IntVal: int32(9000),
},
},
{
Name: "https",
Protocol: "TCP",
Port: 443,
TargetPort: intstr.IntOrString{
Type: intstr.Int,
IntVal: int32(443),
},
},
},
},
}
# 서비스 Update() 수행하면
k8sClient := kubernetes.Clientset
k8sClient.CoreV1().Services(corev1.NamespaceDefault).Update(service)
# 서비스의 clusterIP 를 설정하지 않으면 에러 발생
Service \"ysoftman-service\" is invalid: spec.clusterIP: Invalid value: \"\": field is immutable"
# 서비스의 resourceVersion 을 설정하지 않으면 에러 발생
"Service \"ysoftman-service\" is invalid: metadata.resourceVersion: Invalid value: \"\": must be specified for an update"
# 해결방법
# 업데이트 할 서비스 정보 파악후
getoptions := metav1.GetOptions{}
s := k8sClient.CoreV1().Services(corev1.NamespaceDefault).Get("ysoftman-service", getoptions)
# clusterIP 설정과 기존 resourceVersion 값으로 업데이트를 수행해야 성공한다.
service.Spec.ClusterIP = s.Spec.ClusterIP
service.SetResourceVersion(s.GetResourceVersion())
k8sClient.CoreV1().Services(corev1.NamespaceDefault).Update(service)
comments:
댓글 쓰기