kustomize (三) devops和开发配合管理配置数据behavior: merge、namePrefix、nameSuffix

简介: kustomize (三) devops和开发配合管理配置数据behavior: merge、namePrefix、nameSuffix

文章目录

1. 场景

1.1 Property sharding

1.2 Plumbing properties

1.3 Secret properties

2. 混合管理方法

2.1 创建 base

2.2 创建并使用 overlay 用于 开发(development)

2.3 检查 ConfigMap 名称

2.4 创建并且使用 overlay 用于 生产(procduction)

1. 场景

在生产环境中有一个基于 Java 由多个内部团队(注册、结账和搜索等)共同开发的商店服务。


这个服务在不同的环境中运行:development、 testing、 staging 和 production,从 Java 的 properties 文件中读取配置。


为每个环境维护一个大的 properties 文件是很困难的。这个文件需要频繁的修改,并且这些修改都需要由 devops 工程师来进行,因为:


这个文件包含 devops 工程师需要知道,而开发人员不必知道的值

比如生产环境的 properties 包含敏感数据,比如生产数据库的登录凭据。

1.1 Property sharding

通过一些研究,我们注意到属性可以分为不同的类别。

例如:国际化数据、物理常量,外部服务位置等静态数据

这些无论哪个环境,都一样的配置。

这些都只需要一组配置。将这组配置放在一个文件中:common.properties

1.2 Plumbing properties

例如:静态资源(HTML、CSS、JavaScript)的位置,产品和用户的数据表,负载均衡的端口,日志收集等。


这些属性的不同,恰恰是环境的不同之处。


DevOps 或 SRE 工程师需要完全控制生产环境中的这些配置;测试需要调整数据库来支持测试;而开发则希望尝试开发中遇到的各种不同的情景。


将这些值放入


development/plumbing.properties

staging/plumbing.properties

production/plumbing.properties

1.3 Secret properties

例如:用户表的位置、数据库凭证、解密密钥等。


这些需要 devops 工程师控制,其他人没有访问权限。


将这些值放入


development/secret.properties

staging/secret.properties

production/secret.properties

例如使用 unix 文件权限和模式来限制访问控制,或者使用更好的方法-使用专门用于存储密码的服务,并且使用 kustomize 中的 secretGenerator 字段在 Kubernetes 中创建 secret 来存储密码。

2. 混合管理方法

基于相同的 base 创建 n 个 overlays 来创建 n 个集群环境的方法。


在本例的其余部分,我们将使用 n==2,这里只使用 development 和 production ,可以使用相同的方法来增加更多的环境。


运行 kustomize build 基于 overlay 的 target 来创建集群环境。


以下示例将执行此操作,但将侧重于 configMap 构建,而不用担心如何将 configMaps 关联到 Deployment(helloworld 示例中介绍的)。


所有文件(包括共享 property 文件)都将在目录树中创建,目录中包含 base 和 overlay 文件的目录,这些都与 helloworld 中演示的一致。


它将全部存在于此工作目录中:DEMO_HOME=$(mktemp -d)

2.1 创建 base

创建放置 base 配置的路径:

mkdir -p $DEMO_HOME/base

向 base 中的插入数据,base 中应该包含所有环境共有的资源,这里我们只定义一个 java properties 文件,以及一个引用他们的 kustomization 文件。

cat <<EOF >$DEMO_HOME/base/common.properties
color=blue
height=10m
EOF
cat <<EOF >$DEMO_HOME/base/kustomization.yaml
configMapGenerator:
- name: my-configmap
  files:
  - common.properties
EOF

2.2 创建并使用 overlay 用于 开发(development)

创建一个 overlays 目录:

OVERLAYS=$DEMO_HOME/overlays

创建 development overlay:

mkdir -p $OVERLAYS/development
cat <<EOF >$OVERLAYS/development/plumbing.properties
port=30000
EOF
cat <<EOF >$OVERLAYS/development/secret.properties
dbpassword=mothersMaidenName
EOF
cat <<EOF >$OVERLAYS/development/kustomization.yaml
resources:
- ../../base
namePrefix: dev-
nameSuffix: -v1
configMapGenerator:
- name: my-configmap
  behavior: merge
  files:
  - plumbing.properties
  - secret.properties
EOF

现在可以生成开发使用的 configMaps :

kustomize build $OVERLAYS/development
apiVersion: v1
data:
  common.properties: |
    color=blue
    height=10m
  plumbing.properties: |
    port=30000
  secret.properties: |
    dbpassword=mothersMaidenName
kind: ConfigMap
metadata:
  annotations: {}
  labels: {}
  name: dev-my-configmap-v1-2gccmccgd5

2.3 检查 ConfigMap 名称

可以在输出中看到生成的 ConfigMap 名称。

名称应该是这样的:dev-my-configmap-v1-2gccmccgd5

dev-” 来自 namePrefix 字段

“my-configmap” 来自 configMapGenerator/name 字段

“-v1” 来自 nameSuffix 字段

“-2gccmccgd5” 为哈希值,是 kustomize 根据 configMap 的内容计算的

哈希后缀很关键,如果 configMap 内容发生变化, configMap 的名称也会发生变化,以及从 kustomize 出现在 YAML 输出中的对该名称的所有引用。


名称更改意味着如果使用类似命令将此 YAML 应用于群集,则 Deployment 将执行滚动更新重启以获取新数据。

kustomize build $OVERLAYS/development | kubectl apply -f -

Deployment 无法自动检测 ConfigMap 是否发生改变。


如果更改 configMap 的数据, 而不更改其名称以及对该名称的所有引用, 则必须重新启动Deployment中的那些Pods以获取更改。


最佳的做法就是将 configMap 视为不变的。


不去编辑 configMap ,而是使用 新 的名称的 新 configMap,并在 Deployment 中引用新的 configMap 。而 kustomize 使用 configMapGenerator 指令和相关的命名控件使这很容易。

2.4 创建并且使用 overlay 用于 生产(procduction)

接下来创建 production overlay 的文件:

mkdir -p $OVERLAYS/production
cat <<EOF >$OVERLAYS/production/plumbing.properties
port=8080
EOF
cat <<EOF >$OVERLAYS/production/secret.properties
dbpassword=thisShouldProbablyBeInASecretInstead
EOF
cat <<EOF >$OVERLAYS/production/kustomization.yaml
resources:
- ../../base
namePrefix: prod-
configMapGenerator:
- name: my-configmap
  behavior: merge
  files:
  - plumbing.properties
  - secret.properties
EOF

现在可以生成用于生产的 configMap:

kustomize build $OVERLAYS/production

可以直接在 CI/CD 流程中执行如下命令,将应用部署到集群:

kustomize build $OVERLAYS/production | kubectl apply -f -

扩展阅读:


kustomize (一) 管理yaml部署入门hello world

kustomize (二) ConfigMap的生成和滚动更新

kustomize (三) devops和开发配合管理配置数据behavior: merge、namePrefix、nameSuffix

kustomize (四) generatorOptions详解

kustomize (五) 使用vars将 k8s runtime数据注入容器

kustomize(六)命令行常用编排

kustomize (七)patches、patchesJson6902、patchesStrategicMerge详解

kustomize (八)生成secret

kustomize(九)使用终章


相关文章
|
1月前
|
监控 安全 Devops
DevOps实践中,如何平衡开发速度和安全审核的效率
DevOps实践中,如何平衡开发速度和安全审核的效率
|
3月前
|
存储 缓存 Java
阿里云云效产品使用合集之如何配置不同的分钟走不同的步骤
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
8天前
|
监控 安全 Devops
DevOps实践中,如何平衡开发速度和安全审核的效率?
DevOps实践中,如何平衡开发速度和安全审核的效率?
|
4月前
|
监控 Devops 测试技术
利用DevOps提升开发效率:技术实践与策略
【7月更文挑战第4天】DevOps通过自动化、CI/CD、协作与沟通等手段,显著提升了软件开发的效率和质量。随着云计算、容器化、自动化测试等技术的不断发展,DevOps的实践将更加深入和广泛。未来,更多的企业将采用DevOps文化,构建高效、灵活、可靠的软件开发和运维体系,以应对快速变化的市场需求。 总之,利用DevOps提升开发效率是软件开发领域的重要趋势。通过实施上述实践策略,企业可以加速产品迭代,提高市场竞争力,实现可持续发展。
|
3月前
|
持续交付 jenkins Devops
WPF与DevOps的完美邂逅:从Jenkins配置到自动化部署,全流程解析持续集成与持续交付的最佳实践
【8月更文挑战第31天】WPF与DevOps的结合开启了软件生命周期管理的新篇章。通过Jenkins等CI/CD工具,实现从代码提交到自动构建、测试及部署的全流程自动化。本文详细介绍了如何配置Jenkins来管理WPF项目的构建任务,确保每次代码提交都能触发自动化流程,提升开发效率和代码质量。这一方法不仅简化了开发流程,还加强了团队协作,是WPF开发者拥抱DevOps文化的理想指南。
85 1
|
3月前
|
运维 Devops 持续交付
自动化运维之路:从脚本到DevOps探索后端开发:从基础到高级实践
【8月更文挑战第28天】在数字化时代的浪潮中,企业对于IT运维的要求越来越高。从最初的手动执行脚本,到如今的自动化运维和DevOps实践,本文将带你领略运维的演变之旅。我们将探索如何通过编写简单的自动化脚本来提升效率,进而介绍DevOps文化的兴起及其对现代运维的影响。文章将为你揭示,通过持续集成、持续部署和微服务架构的实践,如何构建一个高效、可靠的运维体系。准备好让你的运维工作变得更加智能化和自动化了吗?让我们一起踏上这段旅程。 【8月更文挑战第28天】 本文旨在为初学者和有一定经验的开发者提供一个深入浅出的后端开发之旅。我们将一起探索后端开发的多个方面,包括语言选择、框架应用、数据库设计
|
3月前
|
Kubernetes 应用服务中间件 测试技术
阿里云云效产品使用合集之怎么配置研发流程配置里的预置变量
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
3月前
|
敏捷开发 运维 Devops
DevOps文化:打破开发与运维之间的壁垒
【8月更文挑战第14天】DevOps文化是现代软件开发和运维的重要趋势之一。通过打破开发与运维之间的壁垒,实现自动化、持续集成/持续部署以及紧密协作等关键实践,可以显著提高软件交付的质量和效率。对于任何希望在数字化时代保持竞争力的企业来说,拥抱DevOps文化无疑是一个明智的选择。
|
3月前
|
持续交付 jenkins C#
“WPF与DevOps深度融合:从Jenkins配置到自动化部署全流程解析,助你实现持续集成与持续交付的无缝衔接”
【8月更文挑战第31天】本文详细介绍如何在Windows Presentation Foundation(WPF)项目中应用DevOps实践,实现自动化部署与持续集成。通过具体代码示例和步骤指导,介绍选择Jenkins作为CI/CD工具,结合Git进行源码管理,配置构建任务、触发器、环境、构建步骤、测试及部署等环节,显著提升开发效率和代码质量。
76 0
|
3月前
|
前端开发 Java UED
JSF遇上Material Design:一场视觉革命,如何让传统Java Web应用焕发新生?
【8月更文挑战第31天】在当前的Web开发领域,用户体验和界面美观性至关重要。Google推出的Material Design凭借其独特的动画、鲜艳的颜色和简洁的布局广受好评。将其应用于JavaServer Faces(JSF)项目,能显著提升应用的现代感和用户交互体验。本文介绍如何通过PrimeFaces等组件库在JSF应用中实现Material Design风格,包括添加依赖、使用组件及响应式布局等步骤,为用户提供美观且功能丰富的界面。
46 0