Bladeren bron

The default port is used when there is no port number for k8s (#2598)

* k8s 没有端口号时使用默认端口

* Modify the not port test
bigrocs 2 jaren geleden
bovenliggende
commit
90828a0d4a

+ 15 - 12
zrpc/resolver/internal/kube/targetparser.go

@@ -32,18 +32,21 @@ func ParseTarget(target resolver.Target) (Service, error) {
 	}
 
 	endpoints := targets.GetEndpoints(target)
-	segs := strings.SplitN(endpoints, colon, 2)
-	if len(segs) < 2 {
-		return emptyService, fmt.Errorf("bad endpoint: %s", endpoints)
+	if strings.Contains(endpoints, colon) {
+		segs := strings.SplitN(endpoints, colon, 2)
+		if len(segs) < 2 {
+			return emptyService, fmt.Errorf("bad endpoint: %s", endpoints)
+		}
+
+		service.Name = segs[0]
+		port, err := strconv.Atoi(segs[1])
+		if err != nil {
+			return emptyService, err
+		}
+
+		service.Port = port
+	} else {
+		service.Name = endpoints
 	}
-
-	service.Name = segs[0]
-	port, err := strconv.Atoi(segs[1])
-	if err != nil {
-		return emptyService, err
-	}
-
-	service.Port = port
-
 	return service, nil
 }

+ 6 - 3
zrpc/resolver/internal/kube/targetparser_test.go

@@ -39,9 +39,12 @@ func TestParseTarget(t *testing.T) {
 			hasErr: true,
 		},
 		{
-			name:   "no port, no colon",
-			input:  "k8s://ns1/my-svc",
-			hasErr: true,
+			name:  "no port, no colon",
+			input: "k8s://ns1/my-svc",
+			expect: Service{
+				Namespace: "ns1",
+				Name:      "my-svc",
+			},
 		},
 		{
 			name:   "bad port",

+ 8 - 2
zrpc/resolver/internal/kubebuilder.go

@@ -40,6 +40,14 @@ func (b *kubeBuilder) Build(target resolver.Target, cc resolver.ClientConn,
 		return nil, err
 	}
 
+	if svc.Port == 0 {
+		endpoints, err := cs.CoreV1().Endpoints(svc.Namespace).Get(context.Background(), svc.Name, v1.GetOptions{})
+		if err != nil {
+			return nil, err
+		}
+		svc.Port = int(endpoints.Subsets[0].Ports[0].Port)
+	}
+
 	handler := kube.NewEventHandler(func(endpoints []string) {
 		var addrs []resolver.Address
 		for _, val := range subset(endpoints, subsetSize) {
@@ -64,12 +72,10 @@ func (b *kubeBuilder) Build(target resolver.Target, cc resolver.ClientConn,
 	threading.GoSafe(func() {
 		inf.Start(proc.Done())
 	})
-
 	endpoints, err := cs.CoreV1().Endpoints(svc.Namespace).Get(context.Background(), svc.Name, v1.GetOptions{})
 	if err != nil {
 		return nil, err
 	}
-
 	handler.Update(endpoints)
 
 	return &nopResolver{cc: cc}, nil