ingress-nginx-为每个主机创建一个入口?还是将许多主机组合成一个入口并重新加载?

时间:2018-09-18 08:54:00

标签: kubernetes kubernetes-ingress google-kubernetes-engine nginx-ingress

我正在构建一项服务,用户可以在其中构建Web应用程序-这些应用程序将以虚拟DNS名称* .laska.io

托管

例如,如果Tom和Jerry都构建了一个应用,则将其托管在以下位置:

tom.laska.io
jerry.laska.io

现在,假设我有1000个用户。 我应该创建一个看起来像这样的大入口吗?

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - host: tom.laska.io
    http:
      paths:
      - backend:
          serviceName: nginx-service
          servicePort: 80
  - host: jerry.laska.io
    http:
      paths:
      - backend:
          serviceName: nginx-service
          servicePort: 80          
  ...and so forth             

我担心停机时间-例如,如果我有一个带有websockets的应用程序。另外,该文件将在1000个用户的情况下变得庞大。重新加载入口是否足够快?另外,我应该如何重新加载它?

我想到的第二个选择是为每个网络应用简单创建一个入口。我担心的是,ingress-nginx是否可以处理许多入口?还是这是反模式?

哪个更好?

2 个答案:

答案 0 :(得分:8)

您可以为每个Web应用程序创建一个入口资源。如果您搜索官方的公共图表回购,则会看到many of the charts define an ingress resource within them。每个应用定义自己的入口资源是正常的。

值得注意的是,入口资源只是路由规则的定义。 (它没有添加额外的入口控制器或任何其他额外的运行时组件。)因此,对于应用程序定义其自己的路由规则非常有意义。

您提供的示例在一个资源定义中包含所有入口路由。当您拥有多个相关应用程序时,这种方法易于掌握并且非常有意义,因为您可能希望同时查看它们的路由配置。您也可以在fanout ingress example in the kubernetes docs中看到这一点。

在不同的资源中分别定义规则时,我看不到任何性能方面的问题。仅当创建新规则时,入口控制器才会listen for new rules并更新其配置,因此读取资源应该没有问题。而且我希望组合选项与分离选项会导致在nginx的后台设置相同的路由规则。

官方图表回购中最常见的模式是每个应用程序的图表定义其入口资源,并通过values.yaml公开它,以便用户可以根据需要选择启用或自定义它。然后,您可以将多个图表组合在一起,并在values.yaml的相关部分中为每个图表配置规则。 (这里是一个example I've worked on that does this,带有通配符dns。)或者,您也可以在其各自的掌舵版本中分别部署每个应用。

答案 1 :(得分:0)

ingress资源只是一条规则。最好将ingress资源拆分到不同的文件中,然后重新应用需要更改的资源。 应用资源时,我从未注意到停机时间。