繁体   English   中英

从其他 pod 创建 grpc 客户端时如何解析 kube.netes pod 的主机名?

[英]How to resolve host name of kubernetes pod while creating grpc client from other pod?

问题:

如何解析 kube.netes pod 的主机名?

我有以下要求,我们将 grpc 与 java 一起使用,其中我们有一个应用程序正在运行 grpc 服务器,另一个应用程序正在创建 grpc 客户端并连接到 grpc 服务器(在另一个 pod 上运行)。


我们在运行 grpc 服务器的地方运行了三个 kube.netes pod。

让我们说:我的服务0,我的服务1,我的服务2

我的服务有一个集群 IP 作为:10.44.5.11


我们还有另外三个 kube.netes pod 在我们的 gprc 客户端运行的地方运行。

让我们说:我的客户0,我的客户1,我的客户2


没有安全:

我正在尝试将 grpc 服务器 pod 与 grpc 客户端 pod 连接起来,它工作正常。

grpc client (POD -> my-client) ----------------> groc server(POD -> my-service)

因此,在没有安全性的情况下,我将主机名作为我的服务,并且工作正常,没有任何问题..

ManagedChannel channel = ManagedChannelBuilder.forAddress("my-service", 50052)
                .usePlaintext()
                .build();

使用 SSL 安全性:

如果我尝试连接 grpc 服务器,它会抛出主机名不匹配。 我们创建了一个带有通配符 *.default.pod.cluster.local 的证书

它会抛出以下错误:

java.security.cert.CertificateException: No name matching my-service found
    at java.base/sun.security.util.HostnameChecker.matchDNS(HostnameChecker.java:225) ~[na:na]
    at java.base/sun.security.util.HostnameChecker.match(HostnameChecker.java:98) ~[na:na]
    at java.base/sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:455) ~[na:na]

Not Working Code:
     ManagedChannel channel = NettyChannelBuilder.forAddress("my-service", 50052)
                    .sslContext(GrpcSslContexts.forClient().trustManager(new File(System.getenv("GRPC_CLIENT_CA_CERT_LOCATION"))).build())
                    .build();

但如果我像这样给出主机名 ==> 10-44-5-11.default.pod.cluster.local它将正常工作。

Working Code
      ManagedChannel channel = NettyChannelBuilder.forAddress("10-44-5-11.default.pod.cluster.local", 50052)
                        .sslContext(GrpcSslContexts.forClient().trustManager(new File(System.getenv("GRPC_CLIENT_CA_CERT_LOCATION"))).build())
                        .build();

现在我的问题是 pod 的集群 ip 是动态的,每次在应用程序部署期间它都会改变。 解析此主机名的正确方法是什么?

如果我提供主机名并且它会返回 ip 是否有可能然后我将 append default.pod.cluster.local 到主机名并尝试连接到 grpc 服务器?

直接寻址您的 Pod 并不是一个好的解决方案,因为 Kube.netes 可能需要在集群中移动您的 Pod。 例如,这可能是由于节点故障而发生的。

为了让您的客户/流量轻松找到所需的容器,您可以将它们放在具有单个 static IP 地址的服务后面。 服务IP可以通过DNS查询。

这是您可以通过它的 FQDN 连接到该服务的方式:

my-service.default.svc.cluster.local 

其中my-service是您的服务名称, default为您的命名空间, svc.cluster.local是所有集群服务中使用的可配置集群域后缀。

值得一提的是,如果 pod 在同一命名空间中,您可以跳过svc.cluster.local后缀甚至命名空间。 因此,您只需将该服务称为my-service

更多信息可以查看关于DNS的K8s 文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM