Kubernetes 子域配置

Iva*_*anR 4 subdomain dns saas kubernetes

我正在开发一个将在 Kubernetes 中运行的 SaaS 应用程序。我们使用 Helm 图表将所有组件部署到集群中(为简单起见,我们假设它是前端服务、后端和数据库)。应用程序架构是多租户的(我们的每个服务都有一个由所有租户共享的实例),我们希望保持这种方式。我目前正在努力解决并想寻求建议/最佳实践的是,如何为租户自动配置自定义子域?

想象一下该应用程序托管在exampleapp.com。一个全新的客户来了并注册了一个新的组织some-company。此时,除了在系统中创建新租户之外,我还想配置一个新的子域some-company.exampleapp.com。我希望此配置自动完成,不需要任何手动干预。

  • 在 Kubernetes 中实现自动化子域配置有哪些选项?
  • 我们的 ( ) 域名注册商/名称服务器提供商如何exampleapp.com融入该解决方案?它是否必须提供用于动态 DNS 记录创建/修改的 API?

我很高兴我提出的问题非常广泛,所以我不期望任何比高级概念答案或指向一些可能帮助我实现这一目标的服务/库/工具的指针。

Wil*_*.F. 6

注意:由于这更多是一个理论问题,我将向您提供 Kubernetes 工程师的一些观点,我将您的问题分成几个部分以方便理解。

  • 关于您的多租户架构:保持“这种方式”是可以实现的。它简化了 Kubernetes 结构,但另一方面它更依赖于你的应用程序。

问题一:

想象一下该应用程序托管在 exampleapp.com。一个全新的客户来了并注册了一个新的组织 some-company。此时,除了在系统中创建新租户之外,我还想配置一个新的子域 some-company.exampleapp.com。我希望此配置自动完成,不需要任何手动干预。

建议:

  • 为此,您必须授予应用程序管理员权限和所需的工具,以便在添加新客户端时将入口规则条目添加到您的入口。从我的角度来看,使用脚本kubectl patch是更简单的解决方案。

对于这种方法,我建议安装Nginx Ingress Controller,因为它具有多功能性。

这是一个例子:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: <ingress-name>
spec:
  rules:
  - host: client1.exampleapp.com
    http:
      paths:
      - path: /client1
        backend:
          serviceName: <main-service>
          servicePort: <main-service-port>

  - host: client2.exampleapp.com
    http:
      paths:
      - path: /client2
        backend:
          serviceName: <main-service>
          servicePort: <main-service-port>
Run Code Online (Sandbox Code Playgroud)
  • kubectl patch这是用于添加新规则的一行命令:
kubectl patch ingress demo-ingress --type "json" -p '[{"op":"add","path":"/spec/rules/-","value":{"host":"client3.exampleapp.com","http":{"paths":[{"path":"/client3","backend":{"serviceName":"main-service","servicePort":80}}]}}}]'
Run Code Online (Sandbox Code Playgroud)

概念验证:

$ kubectl get ingress
NAME           HOSTS                                           ADDRESS         PORTS   AGE
demo-ingress   client1.exampleapp.com,client2.exampleapp.com   192.168.39.39   80      15m

$ kubectl patch ingress demo-ingress --type "json" -p '[{"op":"add","path":"/spec/rules/-","value":{"host":"client3.exampleapp.com","http":{"paths":[{"path":"/client3","backend":{"serviceName":"main-service","servicePort":80}}]}}}]'
ingress.extensions/demo-ingress patched

$ kubectl describe ingress demo-ingress
Rules:
  Host                    Path  Backends
  ----                    ----  --------
  client1.exampleapp.com  
                          /client1   main-service:80 (<none>)
  client2.exampleapp.com  
                          /client2   main-service:80 (<none>)
  client3.exampleapp.com  
                          /client3   main-service:80 (<none>)
Run Code Online (Sandbox Code Playgroud)

此规则将从子域传入的流量重定向到主应用程序内的子路径。


问题2 :

我们的 ( ) 域名注册商/名称服务器提供商如何exampleapp.com融入该解决方案?它是否必须提供用于动态 DNS 记录创建/修改的 API?

建议:

  • 我相信你已经有了类似的东西,但是你需要在你的DNS中使用通配符记录来指向*.example.app入口的IP,我不相信你需要更多的东西,因为它将所有内容重定向到入口并且入口转发它内部。

问题3:

如果有一些强有力的论据解释为什么多租户 + Kubernetes 不能很好地相处,那么这些论据也是受欢迎的。

观点:

  • 我不认为这会成为问题的任何主要原因。您只需再次让您的应用程序足以处理扩展,因为我相信从长远来看,您会希望您的应用程序能够扩展到多 Pod 结构以提供弹性可用性。

以上就是我对你的问题的2分回答,希望对你有帮助!