如何解析kubernetes pod的主机名,同时从其他pod创建grpc客户端?

tf7tbtn2  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(321)

问题:
如何解析kubernetes吊舱的主机名?
我有以下要求,我们正在使用grpc与java,我们有一个应用程序,我们正在运行的grpc服务器其他应用程序,我们正在创建grpc客户端和连接到grpc服务器(这是运行在另一个吊舱)。
我们有三个kubernetes吊舱在grpc服务器运行的地方运行。
假设:my-service-0,my-service-1,my-service-2
我的服务的群集ip为:10.44.5.11
我们还有另外三个kubernetes pod在gprc客户端运行。
假设:my-client-0,my-client-1,my-client-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是动态的,在app部署过程中每次都会发生变化。解析此主机名的正确方法是什么?
有没有可能,如果我给主机名,它会返回我的ip,然后我会附加default.pod.cluster.local到主机名,并尝试连接到grpc服务器?

slhcrj9b

slhcrj9b1#

直接寻址pod不是一个好的解决方案,因为kubernetes可能需要在集群中移动pod。例如,由于发生故障的节点,可能会发生这种情况。
为了让您的客户机/流量轻松找到所需的容器,您可以将它们放置在具有单个静态ip地址的服务后面。服务ip可以通过dns查询。
这是通过fqdn连接到服务的方式:

my-service.default.svc.cluster.local

哪里 my-service 是你的服务名称, default 为您的命名空间和 svc.cluster.local 是所有群集服务中使用的可配置群集域后缀。
值得一提的是你可以跳过 svc.cluster.local 后缀,甚至名称空间(如果pod位于同一名称空间中)。所以你只需要把服务称为 my-service .
有关更多信息,请查看有关dns的k8s文档。

相关问题