代码之家  ›  专栏  ›  技术社区  ›  Łukasz Baran

Kubernetes群集中的C GRPC无法将DNS名称解析为其他服务

  •  1
  • Łukasz Baran  · 技术社区  · 6 年前

    我试着调试了几个小时却没有效果。我要么知道怎么用谷歌搜索,要么就知道这是个不寻常的问题。

    我在google云上有kubernetes引擎集群。为了测试它,我部署了简单的应用程序: https://github.com/iniside/uSpark 它由三个控制台应用程序组成:

    • GreeterServer-带有GRPC和Google端点的前端
    • Greeter.后端-带有GRPC服务的后端。
    • uspark-客户端控制台应用程序。

    它们都使用.NET Core 2.1、GRPC 1.12和C。Kubernetes引擎是1.10

    我已经试过在集群内解析服务dns。 我还尝试在创建通道时直接通过它的IP调用服务。

    其中任何一个结果是:

    Grpc.Core.RpcException: 'Status(StatusCode=Unavailable, Detail="Name resolution failure")'
    

    GreeterServer正在尝试与Greeter对话。后端:

    public override Task<HelloReply> SayHelloAgain(HelloRequest request, ServerCallContext context)
    {
        Channel channel = new Channel("grpc-greeter-backend.default.svc.cluster.local", 9000, ChannelCredentials.Insecure);
        var backendClient = new GreeterBackend.GreeterBackendClient(channel);
    
        var reply = backendClient.SayHelloFromBackend(new BackendHelloRequest { Name = "iniside" });
        channel.ShutdownAsync().Wait(); //not neeed to wait, but easier to debug now.
        return Task.FromResult<HelloReply>(new HelloReply { Message = "Hello Again " + request.Name + " " + reply.Message });
    }
    

    这是我后台的代码:

    class GreeterBackendImpl : GreeterBackend.GreeterBackendBase
    {
        public override Task<BackendHelloReply> SayHelloFromBackend(BackendHelloRequest request, ServerCallContext context)
        {
            return Task.FromResult<BackendHelloReply>(new BackendHelloReply { Message = "Hello " + request.Name + " From Backend"});
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
    
            Server server = new Server
            {
                Services = { GreeterBackend.BindService(new GreeterBackendImpl()) },
                Ports = { new ServerPort("127.0.0.1", 9000, ServerCredentials.Insecure) }
            };
    
            server.Start();
    
            Console.WriteLine("Gretter server is linstening on port 50051");
            Console.WriteLine("Press any key to stop server");
    
            int read = Console.Read();
            while (read < 0)
            {
    
            }
        }
    }
    

    前端配置:

    apiVersion: v1
    kind: Service
    metadata:
      name: esp-grpc-greeter
    spec:
      ports:
      # Port that accepts gRPC and JSON/HTTP2 requests over HTTP.
      - port: 80
        targetPort: 9100
        protocol: TCP
        name: http2
      selector:
        app: esp-grpc-greeter
      type: LoadBalancer
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: esp-grpc-greeter
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            app: esp-grpc-greeter
        spec:
          containers:
          - name: esp
            image: gcr.io/endpoints-release/endpoints-runtime:1
            args: [
              "--http2_port=9100",
              "--service=hellohorld3.endpoints.sa-game-206414.cloud.goog",
              "--rollout_strategy=managed",
              "--backend=grpc://127.0.0.1:9000"
            ]
            ports:
              - containerPort: 9100
          - name: greeter
            image: eu.gcr.io/sa-game-206414/greeter-service:v1
            ports:
              - containerPort: 8000
    

    后端配置:

    apiVersion: v1
    kind: Service
    metadata:
      name: grpc-greeter-backend
    spec:
      ports:
      # Port that accepts gRPC and JSON/HTTP2 requests over HTTP.
      - port: 8080
        targetPort: 9000
        protocol: TCP
        name: http2
      - port: 9000
        targetPort: 9000
        protocol: TCP
        name: http2900
      selector:
        app: grpc-greeter-backend
      type: ClusterIP
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: grpc-greeter-backend
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            app: grpc-greeter-backend
        spec:
          containers:
          - name: greeter-backend
            image: eu.gcr.io/sa-game-206414/greeter-backend:b1
            ports:
              - containerPort: 9000
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Łukasz Baran    6 年前

    我解决了问题,有两个问题。首先,@spender建议我将grpc地址改为0.0.0.0,包括后端和前端。

    但这些变化并没有被集群发现。因为这一切都是错误的图像。

    每次我做了更改,我都会删除带有旧标签(本地和GCR上)的旧图像。使用相同的远程存储库和标记创建新映像,并将它们推送到gcr。

    由于某些原因,图像没有更新。