config-map kubernetes多个环境

A V*_*A V 6 deployment spring-boot kubernetes

我正在尝试使用来自Kubernetes集群的配置数据部署Spring Boot应用程序.我有一个简单的RestController,它通过从Kubernetes集群读取来打印消息.

    private String message = "Message not coming from Kubernetes config map";

@RequestMapping(value="/echo", method=GET)
public String printKubeConfig() {
    return message;
}
Run Code Online (Sandbox Code Playgroud)

在application.yml中指定配置映射的名称

spring:
  application:
    name: echo-configmap
Run Code Online (Sandbox Code Playgroud)

回声configmap

apiVersion: v1
kind: ConfigMap
metadata:
  name: echo-configmap
data:
  application.properties: |-
    message=Hello from dev Kubernetes Configmap
  application_qa.properties: |-
    message=Hello from qa Kubernetes Configmap
Run Code Online (Sandbox Code Playgroud)

我有几个环境,如qa,int,test等

  1. 在配置映射中指定特定于环境的属性的最佳方法是什么?以及如何在Spring启动应用程序中访问它们?
    例如:如果应用程序部署在qa中,我的服务应该返回消息"Hello from qa Kubernetes Configmap"
  2. 我们还计划将来从GIT读取这些配置文件.如何处理该用例?

Dav*_*err 7

让我尝试提供一个答案,我认为它可以满足您的需求,而无需使用您在大多数机器上安装的工具之外的任何工具。也许先尝试一下,如果您发现该方法变得难以管理和扩展,请转向更复杂的方法。

步骤 1:每个环境的版本控制配置映射

创建一个文件夹之类的k8s/configmaps,并为每个环境创建一个配置映射:

k8s/configmaps/properties.dev.yaml
k8s/configmaps/properties.qa.yaml
k8s/configmaps/properties.sit.yaml
k8s/configmaps/properties.uat.yaml
Run Code Online (Sandbox Code Playgroud)

每个 configmap 都应包含您的环境特定设置。

第 2 步:每个环境都有一个命名空间

为每个环境创建一个 k8s 命名空间,例如:

 application-dev
 application-qa
 application-sit
 application-uat
Run Code Online (Sandbox Code Playgroud)

第 3 步:为每个环境创建 configmap

一点点 bash 会在这里有所帮助:

#!/usr/bin/env bash
# apply-configmaps.sh
namespace="application-${ENVIRONMENT}"
for configmap in ./k8s/configmaps/*.${ENVIRONMENT}.yml; do
    echo "Processing ConfigMap $configmap"
    kubectl apply -n ${namespace} -f $configmap
done
Run Code Online (Sandbox Code Playgroud)

现在,为任何环境创建或更新配置映射所需要做的就是:

ENVIRONMENT=dev ./update-configmaps.sh
Run Code Online (Sandbox Code Playgroud)

第 4 步:使用 CI/CD 完成工作

现在您可以创建 CI/CD 管道 - 如果您的 configmap 源发生更改,只需运行上面显示的命令。

概括

基于原始命令,无需特殊工具,您可以:

  • 版本控制配置
  • 管理每个环境的配置
  • 当配置代码更改时更新或创建配置
  • 如果需要,可以在 CI/CD 管道中轻松应用相同的方法

我强烈建议您在使用更复杂的工具来解决相同的问题之前遵循这种基本的“第一原则”方法,在许多情况下,您可以毫不费力地自己完成,学习关键概念并将更复杂的工具保存到以后,如果你真的需要它。

希望有帮助!


hel*_*ert 6

这听起来像是Helm 的一个很好的用例。您可以将您的应用程序部署为Helm Chart,这基本上允许您从模板生成您的 Kubernetes 资源(如 ConfigMaps、Deployments 以及您需要的任何其他资源)。

您可以使用Helm Charts 上的文档开始使用 Helm。使用 创建图表后helm create,您将获得一个templates/目录,您可以在其中为 ConfigMap 放置以下 YAML 模板:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ printf "%s-%s" .Release.Name .Chart.Name }}
  labels:
    app: {{ .Chart.Name | trunc 63 | trimSuffix "-" }}
    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
data:
  application.properties: |-
    message={{ .Values.properties.message }}
Run Code Online (Sandbox Code Playgroud)

您可以为您的 Deployment 对象添加第二个 YAML 模板(实际上,helm create已经创建了一个合理的默认部署)。只需将您的 ConfigMap 添加为卷,在那里:

containers:
  - name: {{ .Chart.Name }}
    # [...]
    volumes:
      - name: property-volume
        mountPath: /etc/your-app/properties
volumes:
  - name: property-volume
    configMap:
      name: {{ printf "%s-%s" .Release.Name .Chart.Name }}
Run Code Online (Sandbox Code Playgroud)

每个 Helm 图表都有一个values.yaml文件,您可以在其中定义用于填充模板的默认值。该默认文件可能如下所示(请记住,上面的 ConfigMap 模板包含一个{{ .Values.properties.message }}表达式):

replicaCount: 1
image:
  repository: your-docker-image
  tag: your-docker-tag
properties:
  message: Hello!
Run Code Online (Sandbox Code Playgroud)

接下来,使用此 Helm 图表和helm install命令以不同的配置根据需要多次部署您的应用程序。您可以提供不同的 YAML 文件,您可以在其中覆盖文件中的特定值values.yaml,或使用--set以下方法覆盖单个值:

$ helm install --name dev --set image.tag=latest --set replicaCount=1 path/to/chart
$ helm install --name prod --set image.tag=stable --set replicaCount=3 --set properties.message="Hello from prod" path/to/chart
Run Code Online (Sandbox Code Playgroud)

至于你的第二个问题:当然你应该把你的 Helm Chart 放到版本控制中。然后,您可以使用该helm upgrade命令将更改应用于已部署的应用程序。


Mat*_*nkt 0

您的用例听起来很像您应该看看spring-cloud-config- https://cloud.spring.io/spring-cloud-config/

配置服务器是一个基础设施组件,它提供可以位于 git 存储库中的配置。

配置客户端应用程序将config-server在启动时连接并加载适用于当前配置文件的配置。

您可以为不同的环境设置不同的分支 - 或者为每个环境使用配置文件。在您的 kubernetes 部署清单中,您可以通过设置环境变量来设置配置文件SPRING_PROFILES_ACTIVE