程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在 kubernetes 集群中使用 FQDN 连接到 gRPC 服务器?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何在 kubernetes 集群中使用 FQDN 连接到 gRPC 服务器??

开发过程中遇到如何在 kubernetes 集群中使用 FQDN 连接到 gRPC 服务器?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何在 kubernetes 集群中使用 FQDN 连接到 gRPC 服务器?的解决方法建议,希望对你解决如何在 kubernetes 集群中使用 FQDN 连接到 gRPC 服务器?有所启发或帮助;

在本地机器上设置了 Docker 桌面 Kubernetes 集群,并且运行良好。 现在我正在尝试将 .Net Core gRPC 服务器和 .Net Core Console 负载生成器部署到我的集群。

我正在为 gRPC 应用程序使用 Visualstudio(2019) 的默认模板

服务器:

原型文件

Syntax = "proto3";

option csharp_namespace = "KubernetesLoadSample";

package greet;

// The greeTing service deFinition.
service Greeter {
  // Sends a greeTing
  rpc SayHello (Hellorequest) returns (HelloReply);
}

// The request message containing the user's name.
message Hellorequest {
  String name = 1;
}

// The response message containing the greeTings.
message HelloReply {
  String message = 1;
}

.net 核心 gRPC 应用

public class Greeterservice : Greeter.GreeterBase
{
    private Readonly ILogger<Greeterservice> _logger;
    public Greeterservice(ILogger<Greeterservice> logger)
    {
        _logger = logger;
    }

    public overrIDe Task<HelloReply> SayHello(Hellorequest request,ServerCallContext context)
    {
        _logger.Loginformation("Compute started");
        double result = 0;
        for (int i = 0; i < 10000; i++)
        {
            for (int j = 0; j < i; j++)
            {
                result += Math.Sqrt(i) + Math.Sqrt(j);
            }
        }
        return Task.Fromresult(new HelloReply
        {
            message = "Completed"
        }); ;
    }
}

和此项目的 Dockerfile 如下,

FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
workdir /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
workdir /src
copY ["KubernetesLoadSample.csproj","KubernetesLoadSample/"]
RUN dotnet restore "KubernetesLoadSample/KubernetesLoadSample.csproj"

workdir "/src/KubernetesLoadSample"
copY . .
RUN dotnet build "KubernetesLoadSample.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "KubernetesLoadSample.csproj" -c Release -o /app/publish

FROM base AS final
workdir /app
copY --from=publish /app/publish .
ENTRYPOINT ["dotnet","KubernetesLoadSample.dll"]

我能够使用

在本地检查此图像
PS C:\Users\user> docker run -it -p 8000:80 kubernetesloadsample:latest
info: Microsoft.HosTing.lifetime[0]
      Now Listening on: http://[::]:80
info: Microsoft.HosTing.lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.HosTing.lifetime[0]
      HosTing environment: Production
info: Microsoft.HosTing.lifetime[0]
      Content root path: /app
info: KubernetesLoadSample.Greeterservice[0]
      Compute started // called from BloomrPC ClIEnt

客户

ClIEnt 是一个 .net 控制台应用程序,循环调用服务器

    static async Task Main(String[] args)
    {
        var grpcServer = Environment.GetEnvironmentvariable("GRPC_SERVER");
        ChAnnel chAnnel = new ChAnnel($"{grpcServer}",ChAnnelCredentials.InsecurE);

        Console.Writeline($"Sending load to port {grpcServer}");
        while(true)
        {
            try
            {
                var clIEnt = new Greeter.GreeterClIEnt(chAnnel);
                var reply = await clIEnt.SayHelloAsync(
                                  new Hellorequest { name = "GreeterClIEnt" });

                Console.Writeline("result: " + reply.messagE);
                await Task.Delay(1000);
            }
            catch (Exception eX)
            {
                Console.Writeline($"{datetiR_788_11845@e.UtcNow} : trIEd to connect : {grpcServer}  Crashed : {ex.messagE}");
            }
        }
    }

客户端的 Docker 文件:

FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
workdir /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
workdir /src
copY ["GrpcclIEntConsole.csproj","GrpcclIEntConsole/"]
RUN dotnet restore "GrpcclIEntConsole/GrpcclIEntConsole.csproj"

workdir "/src/GrpcclIEntConsole"
copY . .
RUN dotnet build "GrpcclIEntConsole.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "GrpcclIEntConsole.csproj" -c Release -o /app/publish

FROM base AS final
workdir /app
copY --from=publish /app/publish .
ENTRYPOINT ["dotnet","GrpcclIEntConsole.dll"]

和部署文件如下,

---
APIVersion: v1
kind: namespace
Metadata:
  name: core-load
---
APIVersion: apps/v1
kind: Deployment
Metadata:
  creationtimestamp: null
  name: compute-server
  namespace: core-load
spec:
  replicas: 4
  SELEctor:
    matchLabels:
      app: compute-server-svc
  strategy: {}
  template:
    Metadata:
      creationtimestamp: null
      labels:
        app: compute-server-svc
    spec:
      containers:
      - env:
        image: kubernetesloadsample:latest
        imagePullPolicy: Never
        name: compute-server-svc
        ports:
        - containerPort: 80
          name: grpc
        resources: {}
status: {}
---
APIVersion: v1
kind: service
Metadata:
  name: compute-server-svc
  namespace: core-load
spec:
  clusterIP: None
  
  ports:
  - name: grpc
    port: 5000
    targetPort: 80
    protocol: TCP
  SELEctor:
    app: compute-server-svc
---
APIVersion: apps/v1
kind: Deployment
Metadata:
  creationtimestamp: null
  name: compute-clIEnt
  namespace: core-load
spec:
  replicas: 1
  SELEctor:
  
    matchLabels:
      app: compute-clIEnt
  strategy: {}
  template:
    Metadata:
      creationtimestamp: null
      labels:
        app: compute-clIEnt
    spec:
      containers:
      - env:
        - name: GRPC_SERVER
          value: compute-server-svc.core-load.svc.cluster.local:5000
        image: grpc-clIEnt-console:latest
        imagePullPolicy: Never
        name: compute-clIEnt
        resources: {}
status: {}
---

问题

客户端无法使用此计算服务器-svc.core-load.svc.cluster.local:5000 名称连接 gRPC 服务器。我也尝试过计算服务器-svc.core-load,但面临以下问题

PS E:\study\core\k8sgrpc\KubernetesLoadSample> k get pods -n core-load
name                              READY   STATUS    RESTARTS   AGE
compute-clIEnt-bff5f666-cjwf5     1/1     Running   0          15s
compute-server-545567f589-5blkv   1/1     Running   0          15s
compute-server-545567f589-bv4r2   1/1     Running   0          15s
compute-server-545567f589-mdp2x   1/1     Running   0          15s
compute-server-545567f589-wdff5   1/1     Running   0          15s
PS E:\study\core\k8sgrpc\KubernetesLoadSample> k logs compute-clIEnt-bff5f666-cjwf5 -n  core-load --tail 5
07/09/2021 17:18:35 : trIEd to connect : compute-server-svc.core-load.svc.cluster.local:5000 Crashed : Status(StatusCode=Unavailable,Detail="Failed to connect to all addresses")
07/09/2021 17:18:35 : trIEd to connect : compute-server-svc.core-load.svc.cluster.local:5000 Crashed : Status(StatusCode=Unavailable,Detail="Failed to connect to all addresses")

我没有从与此类似的 stackoverflow 问题中得到任何解决方案,所以我创建了这个。

谁能告诉我我错过了什么或做错了什么?

TIA

解决方法

您定义了您的服务:

clusterIP: None

用于创建无头服务。这可能是问题的原因,因此删除它可以解决您的错误。


当您创建 ClusterIP 类型的服务(这是默认类型)时,Kubernetes 会自动为该服务分配一个虚拟 IP(也称为集群 IP,正如类型所建议的),然后用于代理与 Pod 的通信由相关服务选择。

这意味着有一个“新”的 IP 地址(仅从集群内部可见),不同于分配给服务背后的 Pod(或单个 Pod)的各种 IP,然后使用某种方式路由流量对站在后面的 Pod 进行负载平衡。

如果你指定

clusterIP: None

您创建了一个无头服务。您基本上是在告诉 Kubernetes,您不希望将虚拟 IP 分配给服务。代理没有负载平衡,因为没有 IP 进行负载平衡。

相反,DNS 配置将为服务后面(选择)的每个 Pod 返回 A 记录(IP 地址)。

如果您的应用程序需要发现服务背后的每个 Pod,然后使用自己的 IP 地址做任何他们想做的事情,这会很有用。

也许是为了通过内部实现进行负载平衡,也许是因为不同的 Pod(隐藏在同一个服务之下)用于不同的事情......或者也许是因为这些 Pod 中的每一个都想发现其他 Pod(虑多实例主Kafka 或 Zookeeper 等应用程序,例如)


我不确定您的问题到底是什么,这可能取决于该特定应用程序如何解析主机名..但是您不应该使用无头服务,除非您有必要决定哪个您要联系的 svc 选择的 Pod。

与虚拟 IP 相比,使用 DNS 循环进行负载平衡也(几乎总是)不是一个好主意。例如,每当它们重新启动时的 IP 地址),在访问它们时可能会出现网络问题......等等。

文档中有大量信息: https://kubernetes.io/docs/concepts/services-networking/service/

大佬总结

以上是大佬教程为你收集整理的如何在 kubernetes 集群中使用 FQDN 连接到 gRPC 服务器?全部内容,希望文章能够帮你解决如何在 kubernetes 集群中使用 FQDN 连接到 gRPC 服务器?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。