k8s 서비스 업데이트 api

# 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:

댓글 쓰기