ssl - 支持 TLS 的通配符域:GKE 上的 Kubernetes Ingress
问题描述
我正在开发一个动态部署 kubernetes 资源的应用程序,我希望能够为所有这些资源提供一个共享的 SSL 证书。在任何给定时间,所有服务都有路径*.*.*.example.com
。
我听说 cert-manager 会自动配置/重新配置证书,但如果开销太大,我不一定需要自动配置。该解决方案还需要能够处理这些嵌套的 url 子域。
对最简单的方法有什么想法吗?
解决方案
看看nginx-ingress,它是一个 Kubernetes 入口控制器,它基本上可以在 Kubernetes 上运行Nginx反向代理/Web 服务器/负载均衡器。
nginx-ingress 是围绕Ingress资源构建的。它将监视 Ingress 对象并在配置映射中管理 nginx 配置。您可以通过 Kubernetes Ingress 资源规则和nginx 特定注释来定义强大的流量路由规则、缓存、url 重写等等。
这是一个带有一些路由的 Ingress 示例。你可以用它做更多的事情,它确实支持通配符域路由。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$1
cert-manager.io/cluster-issuer: letsencrypt-prod
name: my-ingress
spec:
rules:
- host: app1.domain.com
http:
paths:
- backend:
serviceName: app1-service
servicePort: http
path: /(.*)
- host: app2.sub.domain.com
http:
paths:
- backend:
serviceName: app2-service
servicePort: http
path: /(.*)
tls:
- hosts:
- app1.domain.com
secretName: app1.domain.com-tls-secret
- hosts:
- app2.sub.domain.com
secretName: app2.sub.domain.com-tls-secret
注释部分非常重要。上面表明 nginx-ingress 应该管理这个 Ingress 定义。这个 annotations 部分允许指定额外的 nginx 配置,在上面的例子中它指定了一个 url 重写目标,可以用来重写规则部分中的 url。
有关在 GKE 上安装 nginx-ingress 的信息,请参阅此社区帖子。
您会注意到注释还有一个证书管理器特定的注释,如果安装了该注释,它将指示证书管理器根据该tls
部分下定义的主机和机密颁发证书。
将cert-manager与 nginx-ingress 结合使用,这并不复杂,您可以设置自动证书创建/更新。
很难知道部署动态应用程序的设置的确切性质。但实现配置的一些可能方法是:
- 让每个应用程序使用自己的路由规则和 TLS 配置定义自己的 Ingress,每次部署应用程序时都会安装/更新
- 每个域/子域都有一个入口。然后,您可以使用该子域的路由规则指定通配符子域和 tls 部分
- 或者,您可能拥有一个处理所有域和路由的 uber Ingress。
粒度越细,控制越多,但活动部件也越多。我不认为这是一个问题。对于最后两个选项,它实际上取决于您的动态应用程序部署的性质。
推荐阅读
- python-3.x - 将包含字符串和缺失的列转换为 DateTime
- python - 打印度数符号 (°) 会产生“未知符号”(romb 中的问号)
- c++ - C++ 编译器如何检测非常量函数体?
- ruby-on-rails - 没有路由映射到我的控制器的操作
- r - 使用 R 访问 Facebook 的 API,无需创建应用程序
- c# - 带有 LINQ 查询的长处理方法应该在队列中
- c - 编译步骤
- angular - 即使请求从 Angular 客户端传递访问令牌,Azure AD WebAPI 也会返回 Not Authorization
- windows - 如何在 Windows 7 中使用波浪号复制文件名?
- ksqldb - 使用 KSQL 加入 KTable-KTable 时,单独设置状态的保留时间