【问题标题】:Kubernetes Ingress With Dynamic routing?具有动态路由的 Kubernetes 入口?
【发布时间】:2021-06-20 12:55:49
【问题描述】:

我有一个 Jenkins 构建流程,可以将我们的代码部署到多个 Kubernetes 环境中。目前,它适用于已知/核心分支(开发、发布、主)等,但我们也希望制作我们所有的功能分支和错误修复分支。为了做到这一点,我们目前让它部署一个带有分支子域的入口,比如“{branchName}.domain.tld”。这里的问题是每个分支都有大量的入口等。

我想做一些类似“branch.domain.tld/{branchName}”的事情,并让入口根据“branchName”路径动态路由。不幸的是,我似乎每个子域/主机分配只有一个入口(branch.domain.tld/bugfix_nasty 没有路由,因为 branch.domain.tld/feat_cool 已经定义)。

我希望看到一个看起来像这样的单个入口:

apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    name: dynamic_ingress
    annotations:
      {...stuff here}
  spec:
    rules:
    - host: branch.domain.tld
      http:
        paths:
        - path: /{branchName}/*
          backend:
            serviceName: {branchName}
            servicePort: 80

有没有办法达到这样的禅宗入口?

我看到的关于这类事情的所有内容都是关于使用正则表达式作为路径来捕获和路由到已知的、已定义的服务的建议。我希望它路由到可变服务名称。

【问题讨论】:

  • 我不明白你到底想做什么,但这听起来像是 Istio VirtualService 的一些功能。这可能对你没有帮助,只是注意到相似之处。
  • 如果您使用 helm,您可以动态执行此操作。例如通过设置一个值。请记住,服务名称是唯一的,应该使用相同的值。
  • 问题是,re: helm 解决方案,如果我创建一个使用来自另一个入口的主机的入口,它们不会很好,只有 1 个入口有效
  • 我在生产中使用这样的解决方案,但我没有使用 Kubernetes Ingress,而是使用 vanilla nginx 部署解决了这个问题。我们有一个关于专用服务器数量的状态集。当我们的客户端匹配到一个时,它会被赋予它想要的服务器的名称,然后我们会路由到与 statefulset 名称匹配的主机名。 nginx 部署位于其前面,并映射到主机名中给出的无头服务。综上所述:这是可能的,但普通 Ingress 对象还不够复杂,无法提供这种逻辑。

标签: jenkins kubernetes kubernetes-ingress


【解决方案1】:

据我所知,Ingress 对象不允许您尝试执行此操作。但是,如果您可以在每次部署新分支时修改 Ingress 对象,则可能有一种解决方法。
每当部署新分支时,更新您的“dynamic_ingress”以包含新分支的额外路径。这可以使用一个小型实用程序来实现,该实用程序可以读取和写入 YAML,然后可以将其应用于更新现有 Ingress,或者您可以使用 kubectl patch 在部署时更新现有 Ingress。
这样,Ingress 定义具有静态路径,但您不必手动设置路径,也不需要多个 Ingress 对象。
所以你会有这样的东西。

apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    name: dynamic_ingress
    annotations:
      {...stuff here}
  spec:
    rules:
    - host: branch.domain.tld
      http:
        paths:
        - path: /bug_fix_nasty/
          pathType: Prefix
          backend:
            serviceName: bug_fix_nasty
            servicePort: 80
        - path: /feat_cool/
          pathType: Prefix
          backend:
            serviceName: feat_cool
            servicePort: 80

查看Ingress doc 中的所有示例,看看哪个最适合您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 2019-11-21
    • 1970-01-01
    • 2020-10-22
    • 2020-06-01
    • 1970-01-01
    • 2018-08-31
    相关资源
    最近更新 更多