使用TLS保护Kubernetes服务

22

我有一个应用程序,它是内部的并且只通过具有群集IP的服务向集群中的其他应用程序公开。其他服务通过其DNS (serviceName-namespace.svc.cluster.local) 访问这个应用程序。由于该应用程序处理敏感数据,因此尽管所有通信都在群集内部,但我仍希望使用TLS来保护与该应用程序的通信。

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

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

谢谢, Omer


你已经查看了Jetstack的cert-manager项目吗? - Michael Hausenblas
不,但是现在经过快速查看后 - 我不确定这对于内部服务和内部DNS是否有效。 - Omer Levi Hevroni
4个回答

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

有趣,而且比我的答案更容易。+1 - VonC
1
这对你来说可以工作吗?你提供的文档描述了将Pod IP放入证书中作为SAN。当Pod被回收并变得无效时,这些IP肯定会经常更改,不是吗? - Ieuan
我还没有尝试过它。如果有机会,我会尝试一下并更新。 - Omer Levi Hevroni
嗨,你好。我按照这个参考文档(https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster/)操作,但是遇到了同样的问题。现在,你可以使用 server.crt 和 server-key.pem 作为密钥对来启动你的 HTTPS 服务器。这是什么意思?example.default.svc.cluster.local 是所有服务的默认 URL。我们需要在哪里提供证书?@OmerLeviHevroni - Devi varalakshmi Tangilla
你需要在启动时将它提供给你的服务器,以便它可以用来提供TLS流量,你使用的是哪种语言? - Omer Levi Hevroni
显示剩余4条评论

3
根据下面@vonc的评论,我认为我有一个解决方案:
  • 购买一个公共有效的域名用于此服务(例如something.mycompany.com)。
  • 使用CoreDNS添加覆盖规则,以便所有请求something.mycompany.com都将转到something-namesapce.svc.cluster.local,因为该服务未在外部公开(对于我的用例也可以使用普通的A记录来完成)。
  • 使用Nginx或其他工具来处理TLS并提供something.mycompany.com的证书。
这听起来很复杂,但可能有效。你觉得呢?

服务在第四层工作,所以你说的第七层与此无关。 - Daniel Andrei Mincă

0

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

通过使用不同的Ingress控制器,可以支持不同的实现来支持Ingress。其中最受欢迎的是Nginx Ingress Controller,但也有其他可用选项,如TraefikRancherHAProxy等。每个控制器都应该支持基本配置,但还可以通过注释公开其他功能(例如重写规则、认证模式)。
给它一个域名并启用TLS。LetsEncrypt是一个免费的TLS证书颁发机构,使用kube-lego控制器,我们可以通过向Ingress定义中添加几行代码来自动请求和更新公共域名的LetsEncrypt证书!
为了使其正常工作,需要一个公共域名,并且应该有一个A记录指向Nginx服务的外部IP。

如果要限制在集群域内(svc.cluster.local),您可能需要使用CoreDNS


我知道这可以通过Ingress完成,我以前用过Ingress几次。但是我不想使用Ingress,因为我想将此服务保持在内部(例如,仅从集群内部访问)。根据这里的描述,似乎可能实现,但这似乎有点复杂。另外,我应该使用哪个证书? - Omer Levi Hevroni
@OmerLeviHevroni 你可以使用自签名证书进行测试(https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#securing-the-service) - VonC
我知道,但那似乎不是我想在生产中使用的东西。这意味着我应该为每个使用此服务的客户端生成自签名证书。 - Omer Levi Hevroni
@OmerLeviHevroni 同意:在工作中,我们使用由F5(我们的代理:https://f5.com/glossary/reverse-proxy)管理的通配符证书。 - VonC
F5正在集群上运行并充当CA?如果这是一个琐碎的问题,我不太熟悉它,所以抱歉。此外,这听起来像是昂贵的解决方案... - Omer Levi Hevroni
1
是的,我没有通用解决方案,我只是指出我们的做法。 - VonC

-5
在Google Cloud上,您可以将负载均衡器服务设置为内部,就像这样:
    annotations = {
      "cloud.google.com/load-balancer-type" = "Internal"
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接