17

我有一个内部应用程序,仅通过具有集群 IP 的服务向集群上的其他应用程序公开。其他服务正在通过它的 DNS ( serviceName-namespace.svc.cluster.local) 访问此应用程序。此应用程序处理敏感数据,因此尽管所有通信都在集群内,但我想使用 TLS 来保护与此应用程序的通信。

我的问题是 - 如何在服务上启用 TLS?是否已经存在某些东西或者我应该在应用程序代码上处理它?此外,是否已经有一个可以在集群上使用的 CA 来签署证书.svc.cluster.local

澄清一下,我知道我可以为此目的使用入口。唯一的问题是仅将此服务保持在内部 - 因此只有集群内的服务才能访问它。

谢谢, 奥马尔

4

4 回答 4

7

我刚刚发现 Kubernetes API 可用于生成一个证书,该证书将被集群上运行的所有 Pod 信任。此选项可能比其他选项更简单。您可以在此处找到文档,包括生成证书和使用证书的完整流程。

于 2018-07-17T14:02:30.737 回答
3

根据下面的@vonc 评论,我想我有一个解决方案:

  • 为此服务购买一个公共有效域(例如something.mycompany.com)。
  • 使用 CoreDNS 添加覆盖规则,因此所有请求都something.mycompany.com将转到something-namesapce.svc.cluster.local,因为该服务没有暴露在外部(这也可以通过我的用例的普通 A 记录来完成)。
  • 使用 Nginx 或其他东西来处理带有something.mycompany.com.

这听起来很复杂,但可能会奏效。你怎么看?

于 2018-06-17T04:34:55.147 回答
0

检查教程“使用 Ingress、TLS 和 LetsEncrypt 保护 Kubernetes 服务”是否适用于您:

Ingress 可以通过使用不同的 Ingress Controller 由不同的实现支持。其中最受欢迎的是Nginx Ingress Controller,但还有其他可用选项,例如TraefikRancherHAProxy等。每个控制器都应支持基本配置,但甚至可以通过以下方式公开其他功能(例如重写规则、身份验证模式)注释。

给它一个域名并启用 TLS。LetsEncrypt是一个免费的 TLS 证书颁发机构,使用kube-lego控制器,我们可以自动请求和更新公共域名的 LetsEncrypt 证书,只需在我们的 Ingress 定义中添加几行!

为了使其正常工作,需要一个公共域名,并且应该有一个指向 Nginx 服务的外部 IP 的 A 记录。

为了限制在集群域内部(svc.cluster.local),您可能需要 CoreDNS

于 2018-06-17T04:18:34.700 回答
-4

在 Google Cloud 上,您可以将负载平衡器服务设为内部,如下所示:

    annotations = {
      "cloud.google.com/load-balancer-type" = "Internal"
    }
于 2019-07-29T08:25:24.720 回答