如何在没有入口的情况下在 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 等都可以监听在不同的端口上。
因此,您可以选择LoadBalancer
或NodePort
类型的服务。由于 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 将在您的所有节点上选择一个随机端口,您可以将流量发送到侦听 <your-port>
的服务。因此,在这种情况下,您必须手动创建一个带有 TLS 的负载均衡器或一个侦听 TLS <your-port>
的流量源,并将其转发到所有节点上的 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上获取位置坐标(纬度和经度)