问题:
如何解析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服务器?
1条答案
按热度按时间slhcrj9b1#
直接寻址pod不是一个好的解决方案,因为kubernetes可能需要在集群中移动pod。例如,由于发生故障的节点,可能会发生这种情况。
为了让您的客户机/流量轻松找到所需的容器,您可以将它们放置在具有单个静态ip地址的服务后面。服务ip可以通过dns查询。
这是通过fqdn连接到服务的方式:
哪里
my-service
是你的服务名称,default
为您的命名空间和svc.cluster.local
是所有群集服务中使用的可配置群集域后缀。值得一提的是你可以跳过
svc.cluster.local
后缀,甚至名称空间(如果pod位于同一名称空间中)。所以你只需要把服务称为my-service
.有关更多信息,请查看有关dns的k8s文档。