Kubernetes入口随部署更新

时间:2019-12-12 15:00:55

标签: nginx kubernetes kubernetes-ingress nginx-ingress

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

  • 问题1:动态后端路由

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

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)如何更新入口路由?这样就可以确定,集群中不需要手动干预,并且每条路由都与相应的服务一起部署了吗?

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

4 个答案:

答案 0 :(得分:0)

在您的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/

答案 1 :(得分:0)

  

问题1:动态后端路由

每个入口规则应包含路径列表,每个路径具有一个由uri: @git-local-url@ serviceName定义的关联后端。后端是Service doc中所述的服务名和端口名的组合。

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

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

还有很多其他Ingress controllers。我是其中一些支持此类功能的人。

  

第2个问题

我同意戴维·沃尔顿的观点。最好在CI / CD管道中增加步骤。

答案 2 :(得分:0)

第2个问题的解决方案最终是,每个服务部署都可以与每个入口一起部署,因此不需要第一点。也就是说,您可以部署多个入口规则。

答案 3 :(得分:0)

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

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

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