在项目中处理多个环境时组织kubernetes yaml的最佳实践

在项目中处理多个环境时组织kubernetes yaml的最佳实践,kubernetes,kubernetes-helm,Kubernetes,Kubernetes Helm,我不清楚在多个环境中组织树结构的最佳实践是什么。例如,我们每个阶段和生产有2个集群。我想在阶段集群中创建一个开发名称空间。我们想使用Helm进行打包,使用Jenkins进行部署 因此,我不确定k8s和Helm将应用程序部署到多个环境(如开发->测试->阶段->产品)的树结构应该是什么样子。在机械级别上,您可以让Jenkins使用任意标志运行Helm upgrade--installhelm-upgrade和helm-install将从正在运行的图表中获取值.yaml文件,但随后任何-f或-set

我不清楚在多个环境中组织树结构的最佳实践是什么。例如,我们每个阶段和生产有2个集群。我想在阶段集群中创建一个开发名称空间。我们想使用Helm进行打包,使用Jenkins进行部署


因此,我不确定k8s和Helm将应用程序部署到多个环境(如开发->测试->阶段->产品)

的树结构应该是什么样子。在机械级别上,您可以让Jenkins使用任意标志运行
Helm upgrade--install
helm-upgrade
helm-install
将从正在运行的图表中获取
值.yaml
文件,但随后任何
-f
-set
选项将覆盖
值.yaml
文件中的内容。因此,在某种形式上,您需要:

  • 如果设置正确,可以安装软件的舵图
  • 该图表中的默认
    values.yaml
    文件具有合理的默认值,可能适用于kind或minikube等本地环境
  • 覆盖
    values.yaml
    文件,可能是每个服务、每个环境,用于指定外部数据库等内容的位置
  • 这是一种专门设置图像标记的方法,因为Jenkins将在每个构建上生成一个带有新的唯一标记的新图像
这些设备的确切位置取决于“拥有”各种组件的人。我见过这样的布局:服务有足够的信息来构建Docker映像,但实际的Kubernetes部署由一个单独的操作团队拥有,他们有一个单独的存储库,其中只包含Helm图表。另一种模式是,每个服务都有自己的部署设置,拥有服务的团队也拥有部署。一般来说,文件系统/存储库的布局将遵循您的组织布局(如果devops团队拥有所有的Helm图表,那么一个只包含Helm图表的存储库就可以了,如果每次都管理自己的图表,则会让人沮丧)


不想把它说成是“最好的”,下面是我倾向于使用的总体布局。这是一个每个团队最终负责自己部署的设置。这意味着,对于每个服务存储库,源代码、Jenkins管道代码、Docker映像构建代码和Kubernetes清单都在同一个存储库中。这大致看起来像:

a-service
+-- Dockerfile                # to build the Docker image
+-- Jenkinsfile               # scripted pipeline code
+-- Makefile                  # or something similar to build the program
+-- charts
|   \-- a-service
|       +-- Chart.yaml        # Helm chart metadata
|       +-- templates
|       |   \-- ...
|       +-- values.yaml       # default values
|       +-- values.dev.yaml   # development override values
|       +-- values.prod.yaml  # production override values
\-- src                       # actual source code lives here
    \-- ...
Jenkinsfile
中,您可以执行以下操作启动安装

dir('charts/a-service'){
sh“头盔升级--安装a-service.-f值.$ENV.yaml--设置标签=$tag”
}

谢谢您的回复,这将非常有用。。但我对Helm非常熟悉,向模板传递值的最佳方式是什么。如何将values.dev.yaml和values.prod.yaml值传递给模板?这就是
-f
(使用附加值文件)和
-set
(设置一些特定值)选项在
helm upgrade
命令中所做的。好的,我假设我需要在deployment.yaml中添加多个值。但是deployment.yaml在helm创建之后保持原样,并将根据git分支值在jenkinsfile中使用此命令,对吗?我应该定义任何环境变量还是该方法涵盖了我想要的内容