Kubernetes 的动态通配符子域入口

Posted

技术标签:

【中文标题】Kubernetes 的动态通配符子域入口【英文标题】:Dynamic wildcard subdomain ingress for Kubernetes 【发布时间】:2017-09-01 23:33:18 【问题描述】:

我目前在 GKE 上使用 Kubernetes,通过 Ingress 资源在不同子域上为我的产品的各个部分提供服务。例如:api.mydomain.comconsole.mydomain.com

ingress.yml(当前)

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
spec:
  rules:
  - host: api.mydomain.com
    http:
      paths:
        - backend:
            serviceName: api-service
            servicePort: 80
  - host: console.mydomain.com
    http:
      paths:
        - backend:
            serviceName: console-service
            servicePort: 80

使用 L7 GCE 负载平衡器路由到适当的位置,效果非常好。然而,我想做的是将许多功能分支部署部署为子域,以便在投入生产之前测试和演示新功能。这些可能是 new-stylesheet.console.mydomain.comupgraded-algorithm.api.mydomain.com,受 GitLab CI 的 environments 启发。

以下是每个部署的潜在工作流程:

    创建 feature-api-deployment.yml 创建 feature-api-service.yml 使用新的子域规则更新 ingress.yml:feature.api.mydomain.com 指定 serviceName: feature-api-service

但枚举和维护所有子域->服务映射会因拆除部署而变得混乱,并创建大量 GCE 后端(默认配额为 5...),因此并不理想。

我忽略了 Kubernetes 内置的什么来处理这个问题?根据匹配的子域选择目标服务是理想的选择:

ingress.yml(需要)

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
spec:
  rules:
  - host: *.api.mydomain.com
    http:
      paths:
        - backend:
            serviceName: value of *-api-service
            servicePort: 80

【问题讨论】:

您是否能够实施所需的自动化解决方案?如果是的话,你能分享一些细节吗? @AngelTodorov 的开发重点最终发生了转变,这个特殊的项目从雷达上消失了。最好的办法是遵循已接受答案中的建议。如果我有时间实际实施答案,我会更新这个问题。 【参考方案1】:

在 kubernetes 中肯定没有通配符域可用,但您可以使用 Helm 获得想要的东西

使用 helm,您可以在清单中模板化变量,因此您可以将分支的名称放在 helm values file

从那里,您可以让 gitlab-ci 在构建管道中进行 helm 安装,如果您正确配置图表,则可以指定管道名称的 helm 参数。

关于这种工作流程here 有一篇很棒的博客文章 - 希望这能让你到达你需要去的地方。

【讨论】:

您会根据您的上述建议提供一个示例解决方案吗? @Angel Todorov 你最终想出了解决方案吗? 其实不是,其实我早就放弃这个话题了……【参考方案2】:

服务在本地可用

my-svc.svc.cluster.local

您可以编写一个简单的 nginx 代理,它可以转发,它可以解析子域,只要子域和服务名称匹配,就可以将其传递给 http://$service。

【讨论】:

您能否提供一个关于建议方法的简单实现示例?【参考方案3】:

这是一个例子:

 apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-wildcard-host
    spec:
      rules:
      - host: "foo.bar.com"
        http:
          paths:
          - pathType: Prefix
            path: "/bar"
            backend:
              service:
                name: service1
                port:
                  number: 80
      - host: "*.foo.com"
        http:
          paths:
          - pathType: Prefix
            path: "/foo"
            backend:
              service:
                name: service2
                port:
                  number: 80

还有source。

【讨论】:

以上是关于Kubernetes 的动态通配符子域入口的主要内容,如果未能解决你的问题,请参考以下文章

需要通配符子域帮助

cname vhosts 将 cname 设置为动态子域 laravel

默认虚拟主机覆盖通配符子域虚拟主机

Ruby on Rails 将通配符子域路由到控制器/操作

在 Netlify 上使用通配符子域

二级子域的通配符