【发布时间】:2021-10-02 19:43:57
【问题描述】:
我在从节点/集群外部连接到在 kubernetes 中运行的 gRPC 应用程序时遇到问题。在集群内,连接没有问题,从集群外我得到以下错误:
注意:集群内外的服务使用同一个 gRPC 客户端进行连接。
在服务器端:
ssl_transport_security.cc:1824] No match found for server name: <myDomain.com>
在客户端:
raise _InactiveRpcError(state)
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
status = StatusCode.UNAVAILABLE
details = "failed to connect to all addresses"
debug_error_string = "{"created":"@1627334018.361000000","description":"Failed to pick subchannel","file":"src/core/ext/filters/client_channel/client_channel.cc","file_line":5420,"referenced_errors":[{"created":"@1627334018.361000000","description":"failed to connect to all addresses","file":"src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc","file_line":398,"grpc_status":14}]}"
>
Kubernetes 设置如下:
- 在安全通道上运行 gRPC 应用的部署
- 使用 nodePorts 将节点绑定到 pod 端口运行的服务。例如安全通道为
0.0.0.0:50051,服务节点端口配置如下:节点端口:30001 端口:50051 目标端口:50051
- SSL 证书/密钥被设置为不透明的秘密,集群内的其他服务使用它来访问 gRPC 应用程序。 SSL 证书是使用正确的 alt 名称创建的,其中之一是我创建的 gRPC Kubernetes 服务的服务名称。这些服务可以毫无问题地连接到 gRPC 应用
如果我理解正确,这应该将所有流量路由到节点上的 30001 和 pod 上的 50051。
问题:
- 由于我运行的是安全通道,我认为 SSL 终止发生在我的 gRPC 服务器上。怎么可能在集群内部,当其他服务连接到服务时,SSL 正在工作,但从外部它却失败了?
【问题讨论】:
-
假设这是一个自签名证书,客户端是否使用公共证书连接到服务。
-
您正在使用 Kubernetes 内部服务 DNS 名称解析集群内,该名称位于服务的证书 alt-name 但在集群外,该服务将由IP 或至少不是服务的替代名称之一的不同名称
-
我认为 (!) 通常您希望 SSL 在 Ingress 处终止。这使您能够在外围更一致地解析证书,然后您可以在集群内使用 mTLS 以利用 Kubernetes DNS 解析和证书管理
-
感谢讨论:在内部,我们使用 kubernetes 内部服务 DNS 名称进行解析,该名称被列为 alt 名称。我们的节点位于一个分配有主机名的网络上,该主机名也在 alt 名称列表中。我们不使用任何公共证书进行连接。
-
每当您在“原点”(服务器)之前终止时,您可能会遇到问题。但是,正如您所体验的那样,终止服务会使生活变得更加……不灵活。如果 Kubernetes(入口)终止,您仍然可以重新 TLS 内部到 Kubernetes 连接。或者,如果您想保留端到端,则需要为服务提供更稳定(和公共)的 DNS 名称。
标签: kubernetes grpc kubernetes-ingress