GitOps - 在同一个仓库或单独的仓库中配置?
GitOps - Config in same repo or seperate repo?
首先,这是在 Kubernetes 内部运行的单一存储库应用程序的上下文中。
在 GitOps 中,我的理解是一切都是声明式的,并写在 YAML 等配置文件中。这允许 git 内的完整更改历史记录。分支代表环境。例如:
- BRANCH develop 可以是已部署的 QA 或暂存环境
- BRANCH feature/foo-bar 可以是用于评估的已部署功能分支
- TAG v1.2.0 可能是生产中的最新版本 运行
这对我来说很有意义,任何和所有分支都可以部署为应用程序的 运行 版本。
问题
我记得读过……某处……配置应该在主存储库之外,在另一个“配置存储库”中。根据记忆,这个想法是应用程序不应该知道特定的配置......只知道如何使用配置?
这是真的吗?我应该有一个应用程序存储库和一个应用程序配置存储库吗?例如
- 应用回购:
foo-organisation/bar-application
- 配置回购:
foo-organisation/bar-application-config
不同环境的配置分支模型位于该存储库中的哪个位置?为什么以及有什么优势?
否则它应该只存在于应用程序存储库的目录中吗?
除了您的环境的所有内容都应在 git 存储库中表示外,没有真正的硬性规定(例如,停止将配置存储在 Jenkins 环境变量 Steve 中!)。配置所在的位置更多的是实现细节。
如果您的应用程序作为单一存储库进行管理,那么为什么不使用相同的设置进行部署呢?通常最好适应您现有的发布流程,而不是创建新的东西。
一个问题是应用程序的单个版本通常需要支持多个部署,并且部署配置通常会在应用程序构建和发布后发生变化。所以需要有一个“应用程序”到许多“配置”的关系。无论是使用文件、目录、分支还是存储库来实现。只要是 versioned/released.
都可以工作
另一个发布考虑因素是应用程序构建。对于小型部署更新,您不想构建和发布一个完整的新应用程序映像。最好只应用配置并重用现有的人工制品。这通常是单独 deploy/config 回购的驱动程序,因此问题完全分开。
安全可以发挥作用。您可能在部署配置中拥有所有开发人员都不需要访问的系统信息,或者您甚至不希望有机会将其放入容器映像中。这也推动了单独存储库的使用。
基础设施的规模是另一回事。如果我管理多个应用程序,通用部署配置将不会存储在单个应用程序存储库中。
我坚信配置应该与代码一起存在并进行版本控制,主要是因为更改它会影响系统的行为,因此必须遵循 SDLC 以确保更改不会破坏其他任何东西。
让我列举一些想法:
- 凭据或机密 不属于应用程序配置,它们应该安全管理,必须加密,我建议为它们使用像 Hashicrop Vault 这样的东西并获得它们在运行时。
- 平台资源 像数据库表或 Kafka 主题应该是应用程序的一部分,它们很少改变,当它们改变时我更愿意遵循 SDLC 以确保它们是不破坏应用程序。
- 基础设施资源 像CPU,内存应该是应用程序发布的一部分,它们可能会对系统的行为产生很大的影响而你不想在更高的环境中试验它们。
- 指向其他服务的端点 应使用 DNS 进行解析,指向不同的位置应进行版本更改并应进行测试以保持环境奇偶校验
如果您将配置保存在与代码相同的存储库中,您将遵循一个已知的过程来处理任何可能产生影响的事情,不这样做会导致人为错误、配置错误、未经测试的更改达到 PROD,以及更多失败场景。
首先,这是在 Kubernetes 内部运行的单一存储库应用程序的上下文中。
在 GitOps 中,我的理解是一切都是声明式的,并写在 YAML 等配置文件中。这允许 git 内的完整更改历史记录。分支代表环境。例如:
- BRANCH develop 可以是已部署的 QA 或暂存环境
- BRANCH feature/foo-bar 可以是用于评估的已部署功能分支
- TAG v1.2.0 可能是生产中的最新版本 运行 这对我来说很有意义,任何和所有分支都可以部署为应用程序的 运行 版本。
问题 我记得读过……某处……配置应该在主存储库之外,在另一个“配置存储库”中。根据记忆,这个想法是应用程序不应该知道特定的配置......只知道如何使用配置?
这是真的吗?我应该有一个应用程序存储库和一个应用程序配置存储库吗?例如
- 应用回购:
foo-organisation/bar-application
- 配置回购:
foo-organisation/bar-application-config
不同环境的配置分支模型位于该存储库中的哪个位置?为什么以及有什么优势?
否则它应该只存在于应用程序存储库的目录中吗?
除了您的环境的所有内容都应在 git 存储库中表示外,没有真正的硬性规定(例如,停止将配置存储在 Jenkins 环境变量 Steve 中!)。配置所在的位置更多的是实现细节。
如果您的应用程序作为单一存储库进行管理,那么为什么不使用相同的设置进行部署呢?通常最好适应您现有的发布流程,而不是创建新的东西。
一个问题是应用程序的单个版本通常需要支持多个部署,并且部署配置通常会在应用程序构建和发布后发生变化。所以需要有一个“应用程序”到许多“配置”的关系。无论是使用文件、目录、分支还是存储库来实现。只要是 versioned/released.
都可以工作另一个发布考虑因素是应用程序构建。对于小型部署更新,您不想构建和发布一个完整的新应用程序映像。最好只应用配置并重用现有的人工制品。这通常是单独 deploy/config 回购的驱动程序,因此问题完全分开。
安全可以发挥作用。您可能在部署配置中拥有所有开发人员都不需要访问的系统信息,或者您甚至不希望有机会将其放入容器映像中。这也推动了单独存储库的使用。
基础设施的规模是另一回事。如果我管理多个应用程序,通用部署配置将不会存储在单个应用程序存储库中。
我坚信配置应该与代码一起存在并进行版本控制,主要是因为更改它会影响系统的行为,因此必须遵循 SDLC 以确保更改不会破坏其他任何东西。
让我列举一些想法:
- 凭据或机密 不属于应用程序配置,它们应该安全管理,必须加密,我建议为它们使用像 Hashicrop Vault 这样的东西并获得它们在运行时。
- 平台资源 像数据库表或 Kafka 主题应该是应用程序的一部分,它们很少改变,当它们改变时我更愿意遵循 SDLC 以确保它们是不破坏应用程序。
- 基础设施资源 像CPU,内存应该是应用程序发布的一部分,它们可能会对系统的行为产生很大的影响而你不想在更高的环境中试验它们。
- 指向其他服务的端点 应使用 DNS 进行解析,指向不同的位置应进行版本更改并应进行测试以保持环境奇偶校验
如果您将配置保存在与代码相同的存储库中,您将遵循一个已知的过程来处理任何可能产生影响的事情,不这样做会导致人为错误、配置错误、未经测试的更改达到 PROD,以及更多失败场景。