如何在没有入口的情况下在 AKS 上获取 HTTPS

Posted

技术标签:

【中文标题】如何在没有入口的情况下在 AKS 上获取 HTTPS【英文标题】:How to get HTTPS on AKS without ingress 【发布时间】:2019-03-31 08:25:32 【问题描述】:

我的问题很简单。我有一个带有 LoadBalancer 服务的 AKS 部署,该服务需要使用带有证书的 HTTPS。

我该怎么做?

我在网上看到的一切都特别涉及 Ingress 和 nginx-ingress。

但我的部署不是一个网站,它是一个 Dropwizard 服务,一个端口上有一个 REST API,另一个端口上有一个管理服务。我不想将端口映射到端口 80 上的路径,我想保持端口不变。为什么 HTTPS 与入口绑定?

我只想要带有证书的 HTTPS,没有其他任何改变,有没有简单的解决方案?

【问题讨论】:

【参考方案1】:

是的,在撰写本文时,Ingress 目前可以在端口 80 或端口 443 上工作,可能它可以扩展为使用任何端口,因为 nginx、Traefik、haproxy 等都可以监听在不同的端口上。

因此,您可以选择LoadBalancerNodePort 类型的服务。由于 Azure 负载均衡器是 layer 4,因此 LoadBalancer 类型不能直接与 TLS 一起使用。所以你必须使用Application Gateway,出于安全原因,最好使用internal load balancer。

由于您使用的是 Azure,您可以运行类似这样的操作(假设您的 K8s 集群配置正确,可以使用 Azure 云提供商,--cloud-provider 选项或 cloud-controller-manager):

$ cat <<EOF
apiVersion: v1
kind: Service
metadata:
  name: your-app
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-internal: "true"
spec:
  type: LoadBalancer
  ports:
  - port: <your-port>
  selector:
    app: your-app
EOF | kubectl apply -f -

这将在您喜欢的端口上为您的服务创建一个 Azure 负载均衡器。在幕后,负载均衡器将指向节点上的一个端口,在节点内,会有防火墙规则路由到您的容器。然后你可以配置Application Gateway。 Here's 一篇描述它的好文章,但使用端口 80,您必须更改它使用端口 443 并配置 TLS 证书,并且应用程序网关还支持 end to end TLS,以防您也想直接在您的应用程序上终止 TLS。

另一个选项是 NodePort,你可以像这样运行:

$ kubectl expose deployment <deployment-name> --type=NodePort

然后 Kubernetes 将在您的所有节点上选择一个随机端口,您可以将流量发送到侦听 &lt;your-port&gt; 的服务。因此,在这种情况下,您必须手动创建一个带有 TLS 的负载均衡器或一个侦听 TLS &lt;your-port&gt; 的流量源,并将其转发到所有节点上的 NodePort,这个负载均衡器可以是 haproxy、nginx、 Traefik 或其他支持终止 TLS 的东西。您还可以使用Application Gateway 直接转发到您的节点端口,换句话说,定义一个侦听您集群的NodePort 的侦听器。

【讨论】:

是的,我已经在使用带有 dns 和公共 IP 的 LoadBalancer 服务。我只为 https 添加了 Ingress,你的回答没有解决 https。 我可以回答,但如果你投反对票,我没有动力回答,我宁愿删除我的答案:) 嗯,当答案解决问题时,我会投票。我认为这样做也符合 SO 的精神,但如果您认为可以提供帮助,我会继续删除反对票 您必须先编辑答案才能更改投票,但仍然认为这是合理的 当然,让我改一下。谢谢【参考方案2】:

带有正确证书(可能从 Secret 或 ConfigMap 加载)的带有 nginx 的 sidecar 容器将在没有入口的情况下完成这项工作。 This 似乎是一个很好的例子,使用nginx-ssl-proxy container。

【讨论】:

这绝对是我正在寻找的东西,谢谢。当我真正可以得到一些工作时,我正在等待选择一个答案,但到目前为止这看起来最接近

以上是关于如何在没有入口的情况下在 AKS 上获取 HTTPS的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有谷歌地图 API 的情况下在我的应用程序中获取经度和纬度?

如何在没有地图视图的情况下在自定义图像上显示用户位置

如何在没有警报消息(iOS)的情况下在 webview 中获得地理定位许可?

在没有互联网的情况下在android上获取位置坐标(纬度和经度)

如何在没有互联网连接的情况下在android中获取当前纬度和经度?

如何在没有时区干扰的情况下在树枝中渲染时间