【问题标题】:Kubernetes ingress update with deploymentKubernetes 入口更新与部署
【发布时间】:2020-04-06 00:15:07
【问题描述】:

我们目前正在建立一个 kubernetes 集群来部署我们的生产工作负载(主要是 http rest 服务)。 在这个集群中,我们设置了 nginx 入口控制器来将流量从外部世界路由到我们的服务。由于入口控制器将主要用于路径路由,因此我确实有以下问题:

  • 问题 1:动态后端路由

是否可以将流量路由到后端,而无需在入口规范中具体指定后端名称?例如我有以下入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
        - path: /apple
          backend:
            serviceName: apple-service
            servicePort: 8080

是否有可能将 /apple 请求路由到 apple-service 而不在 serviceName 中具体指定?那么 /apple 自动路由到 apple-service 服务,/orange 自动路由到 orange 服务而不显式指定后端名称?

  • 问题编号 2

如果没有解决方案 1 以便我们可以根据一些约定进行部署,那么现在的问题是如何以自动化方式管理入口。 由于服务将由自动化 CI/CD 管道部署,并且在将服务添加到集群时可能会添加新路径,所以 ci/cd 编排器(例如 jenkins)如何在部署应用程序时更新入口路由?这样我们就可以确定,集群中不需要人工干预,并且每个路由都与相应的服务一起部署?

我希望所提供的信息足以理解问题。 非常感谢您的支持。

【问题讨论】:

    标签: nginx kubernetes kubernetes-ingress nginx-ingress


    【解决方案1】:

    只需在 ci/cd 管道中执行一个步骤,检查当前入口是什么,以及是否需要更新某种参数。

    高级步骤...

    kubectl get ingress example-ingress -o yaml > ex-ingress.yaml
    
    

    您可以将该输出写入文件并读取、更新、验证等。

    然后将其与您的部署一起推送到集群

    kubectl replace -f ex-ingress.yaml 
    

    https://kubernetes.io/docs/concepts/services-networking/ingress/

    【讨论】:

      【解决方案2】:

      问题 1:动态后端路由

      每个入口规则应包含一个路径列表,每个路径都有一个关联的后端,该后端定义为 serviceName 和 servicePort。后端是Service doc 中描述的服务和端口名称的组合。

      没有规则的 Ingress 将所有流量发送到单个默认后端。默认后端通常是 Ingress 控制器的配置选项,并且未在您的 Ingress 资源中指定。

      如果没有任何主机或路径与 Ingress 对象中的 HTTP 请求匹配,则流量将路由到您的默认后端。

      还有很多额外的 Ingress controllers 。我是其中一些支持这样的功能。

      问题 2

      我同意大卫沃尔顿的观点。在 CI/CD 管道中增加步骤可能是这里的最佳选择。

      【讨论】:

        【解决方案3】:

        解决方案 2,最终每个服务部署都可以与每个自己的入口一起部署,因此不需要第 1 点。话虽如此,您可以部署多个入口规则。

        【讨论】:

          【解决方案4】:

          我的解决方案是为每个环境(k8s 命名空间)的入口部署提供单独的掌舵图。在值中,我有一个我的应用程序列表,它可以在应用/更新舵图部署期间重新定义。 Helm 图表模板有一个循环来为列表中的每个元素添加规则。

          在 jenkins 作业中,我运行 kubectl 以获取命名空间中当前服务的列表,并将此列表作为此舵图的输入变量。 在每次应用程序部署后,都会触发此“alb-update-rules”作业。如果我用多个服务部署整个环境,我只会在最后触发这项工作。

          效果很好,在这种情况下可能就足够了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-08-27
            • 2021-09-21
            • 1970-01-01
            • 2019-04-25
            • 1970-01-01
            • 2017-05-25
            • 2017-06-03
            相关资源
            最近更新 更多