istio 内部 GRPC 服务通信
istio internal GRPC services communication
我在使用两个集群内 GRPC 服务(用 netcore3.0 编写)时遇到问题,我得到 Grpc.Core.RpcException: Status(StatusCode=Unavailable, Detail="Connection reset by peer")
(使用 uri = <service>.default.svc.cluster.local
)或 Grpc.Core.RpcException: Status(StatusCode=Unimplemented, Detail="")
使用 uri = user.default.svc.cluster.local:80
.奇怪的是,如果它们从不同的集群进行通信,所有服务都可以正常工作。我正在使用正确的网址。这里附上其中一项服务的配置。
apiVersion: v1
kind: Service
metadata:
name: user
labels:
app: user
service: user
spec:
ports:
- port: 80
name: grpc-port
protocol: TCP
selector:
app: user
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: user-v1
labels:
app: user
version: v1
spec:
replicas: 1
template:
metadata:
labels:
app: user
version: v1
spec:
containers:
- name: user
image: ***
imagePullPolicy: IfNotPresent
env:
- name: GOOGLE_APPLICATION_CREDENTIALS
value: "***"
ports:
- containerPort: 80
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: user
spec:
hosts:
- user.default.svc.cluster.local
http:
- route:
- destination:
port:
number: 80
host: user.default.svc.cluster.local
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: user
spec:
host: user.default.svc.cluster.local
subsets:
- name: v1
labels:
version: v1
---
已修复:我设法通过使用 gRPC 的 .NETCORE3 客户端工厂集成使其正常工作,如 here
所述
而不是像通常那样手动创建频道和客户端。即
var endpoint = "test"; //or http://test
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
Channel channel = new Channel(endpoint, ChannelCredentials.Insecure);
client = new TestService.TestServiceClient(channel);
我像这样使用 GRPC 客户端工厂集成(在 ConfigureServices
(startup.cs)
中(添加 Grpc.Net.ClientFactory
包版本 0.1.22-pre1
:
services.AddGrpcClient<TestService.TestServiceClient>(o =>
{
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
o.BaseAddress = new Uri("http://test");
});
此后您可以使用依赖注入访问客户端。
我不确定为什么第二种方法有效,但第一种方法无效。
我在使用两个集群内 GRPC 服务(用 netcore3.0 编写)时遇到问题,我得到 Grpc.Core.RpcException: Status(StatusCode=Unavailable, Detail="Connection reset by peer")
(使用 uri = <service>.default.svc.cluster.local
)或 Grpc.Core.RpcException: Status(StatusCode=Unimplemented, Detail="")
使用 uri = user.default.svc.cluster.local:80
.奇怪的是,如果它们从不同的集群进行通信,所有服务都可以正常工作。我正在使用正确的网址。这里附上其中一项服务的配置。
apiVersion: v1
kind: Service
metadata:
name: user
labels:
app: user
service: user
spec:
ports:
- port: 80
name: grpc-port
protocol: TCP
selector:
app: user
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: user-v1
labels:
app: user
version: v1
spec:
replicas: 1
template:
metadata:
labels:
app: user
version: v1
spec:
containers:
- name: user
image: ***
imagePullPolicy: IfNotPresent
env:
- name: GOOGLE_APPLICATION_CREDENTIALS
value: "***"
ports:
- containerPort: 80
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: user
spec:
hosts:
- user.default.svc.cluster.local
http:
- route:
- destination:
port:
number: 80
host: user.default.svc.cluster.local
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: user
spec:
host: user.default.svc.cluster.local
subsets:
- name: v1
labels:
version: v1
---
已修复:我设法通过使用 gRPC 的 .NETCORE3 客户端工厂集成使其正常工作,如 here
所述而不是像通常那样手动创建频道和客户端。即
var endpoint = "test"; //or http://test
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
Channel channel = new Channel(endpoint, ChannelCredentials.Insecure);
client = new TestService.TestServiceClient(channel);
我像这样使用 GRPC 客户端工厂集成(在 ConfigureServices
(startup.cs)
中(添加 Grpc.Net.ClientFactory
包版本 0.1.22-pre1
:
services.AddGrpcClient<TestService.TestServiceClient>(o =>
{
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
o.BaseAddress = new Uri("http://test");
});
此后您可以使用依赖注入访问客户端。 我不确定为什么第二种方法有效,但第一种方法无效。