.Net Core微服务:在Azure上的KubernetesAKS上使用HTTPS

问题描述

我正在容器化各种.NET核心API项目,并使用Linux在Kubernetes集群中运行它们。对于这种情况,我是个新手(我通常在Windows上使用App Services),有关安全连接的最佳做法的问题开始浮出水面:

  1. 由于这些将作为集群中的pod运行,我的假设是我只需要正确公开端口80?所有内部流量都由服务和入口管理。但这是一个好习惯吗?一旦我为域配置了证书并且安全流量开始到达运行中的Pod,会出现问题吗?

  2. 当需要集成SSL时,我将不得不担心在容器上打开端口443或管理容器本身内的任何证书,或者全部由Ingress,Services(或Application Gateway)管理。我正在使用AKS)?现在,当我需要使用HTTPS在本地进行测试时,我必须向容器添加一个自签名证书并打开端口443,我的假设是该产品不适合生产!

  3. 当我确实在仅打开端口80的情况下将其部署到群集中时(我正在使用AKS),并且分配了LoadBalancer服务时,便获得了公共IP地址。我习惯使用Azure应用服务,您可以在其中使用开箱即用的全局Miscrosoft SSL证书,如下所示: https://your-app.azurewebsites.net 但是,当我转到公用IP并配置DNS时标签类似: your-app.southcentralus.cloudapp.azure.com ,它不允许我像App Services一样使用HTTPS。 IP地址也没有。也许我的Kubernetes实例没有正确配置某些东西?

  4. 由于这些服务中有许多将是面向公众的API端点(但由客户端应用程序使用),因此它们不需要具有自定义域名,因为大多数服务都不会看到它们。上市。有没有办法利用IP地址或 .cloudapp.azure.com 域的安全连接?如果必须为我的每项服务管理证书,那将是成本/时间的限制!

解决方法

  1. 这取决于您要终止TLS的位置。在大多数情况下,ignress控制器是终止TLS流量并将所有内容保留在群集内的HTTP上的好地方。在这种情况下,任何HTTP端口都可以正常工作。如果默认情况下端口80是由dotnet核心公开的,则应保留该端口。

  2. 由于没有配置入口控制器,因此正在本地打开端口443。您也可以在本地安装Ingress。在生产中,只要入口控制器正在处理TLS流量,就不需要打开除单个HTTP端口之外的任何其他端口。

  3. 理想情况下,您不应将每个服务都公开为负载均衡器。服务应为ClusterIP类型,仅在群集内部公开。部署入口控制器时,它将创建负载均衡器服务。这将是集群中的唯一入口点。然后,入口控制器将通过主机名或路径接受流量并将流量路由到各个服务。

  4. Let's Encrypt是一项免费的TLS证书签名服务,可用于设置。如果您不拥有域名,则可以使用https-01挑战来验证您的身份并获取证书。 Cert Manager项目使在任何k8s群集中轻松配置“让我们加密证书”变得容易。

侧栏:如果您使用Application Gateway来放置应用程序的前端,请考虑使用Application Gateway Ingress Controller