我正在编写一个平台来自动化日常业务运营,这是一个 SaaS 产品,每个客户都有自己的数据库。
我目前正在使用以下工具;Gitlab(带有许多基于 DevOps 的工具的 Git Repo)、Sentry(与 Gitlab 集成的错误跟踪)、Kubernetes(容器编排)、PHPStorm(IDE)。
这个想法是将代码推送到 Gitlab,它将执行 CI/CD 流程,并作为滚动更新部署到所有由 Kubernetes 中的命名空间分隔的客户。问题是每个客户都需要自己的环境变量,包括加密密钥、数据库凭据和 API 密钥,这些密钥用于中央 API,以实现每个客户部署之间的通信。我知道我应该在哪里为一个客户输入环境变量,但我该如何为许多客户输入环境变量。
我已经研究过为每个客户分叉代码并设置镜像,但是当尝试镜像同一个 Gitlab 服务器时,Gitlab 总是出现 500 错误。
这导致我的整个项目陷入停顿。
非常感谢任何指导。
由于一些原因,包括数据隔离,每个客户都在单独的代码库副本上运行,并且我们根据资源使用情况而不是每个用户计费。
答案1
我的答案是:
- 使用相同的代码库
- 使用以下方式注入可配置设置Kubernetes ConfigMaps
- 使用以下方式注入机密Kubernetes 的秘密
- 如果你脱离 Kubernetes,总会有一个通用的
docker secret
- 如果你脱离 Kubernetes,总会有一个通用的
我所说的“注入”是指区分一个部署与另一个部署的内容不应该存在于 git repo 中。这也是运行一个或多个 test/dev/qa/staging 部署的完美方式。请参阅 12 要素应用(但不要按照他们建议的那样使用环境变量)。
因此,在某个地方部署代码库的每个过程中,首先都需要记录“如何准备 ConfigMaps/Secrets”的步骤。
答案2
这可能微不足道,但只需进行一些代码更改即可接受所有变量作为环境变量。现在,即使您的客户端可以在同一个命名空间中使用相同的代码库并从同一个存储库中提取 docker 镜像,您所要做的就是修改部署文件,瞧!您所有的客户现在都可以拥有自己的环境,而且由于您使用的是 Kubernetes,您可以利用滚动更新,并且作为一种保障,无论您在哪里使用环境变量都不要提供默认值(尽管这是一种很好的做法)。据我了解,您希望仅向客户提供与其环境相关的内容。因此,提供默认值可能会让您错过一个或两个环境变量,有时会给您带来问题。
参考: https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/