【K8S系列】在 K8S 中使用 Values 文件定制不同环境下的应用配置

embedded/2025/1/22 11:21:38/

在这里插入图片描述

写在前面

因为有小伙伴问这个问题,因此用这篇文章详细讲解一下:在k8s中怎么实现通过使用Values文件,定制不同环境(开发、测试、预发、生产)下的应用配置的问题。
希望对你有所帮助~

一、基础介绍

(一)Kubernetes 概述

Kubernetes(简称 K8s)是一个开源的容器编排平台,它可以自动化容器的部署、扩展和管理。在 K8s 中,应用程序通常以容器的形式运行,这些容器被组织在不同的资源对象中,如 Deployment、Service、ConfigMap、Secret 等。为了确保应用程序在不同环境(开发、测试、预发、生产)中都能稳定运行,需要为每个环境定制相应的配置。

(二)Values 文件的重要性

Values 文件是在使用 Helm 管理 K8s 应用部署时使用的配置文件,通常采用 YAML 格式。Helm 是 K8s 的包管理器,它将 K8s 资源作为一个整体进行打包和管理,称为 Chart。Values 文件在其中扮演着关键角色,它允许我们在不同的部署环境中修改和调整应用程序的配置,而无需修改应用程序的代码或 K8s 资源的定义文件。这样可以确保应用程序在不同阶段都能按照预期运行,同时保持了配置的灵活性和可维护性。

(三)不同环境的配置需求差异

  • 开发环境:主要用于开发人员进行代码开发和调试,通常对配置的更新频率较高,可能使用较小的资源规模,对性能和可靠性的要求相对较低。例如,开发环境可以使用本地数据库或简单的开发环境数据库,日志级别可以设置为详细级别,以便开发人员及时发现和解决代码中的问题。
  • 测试环境:用于功能测试、集成测试和性能测试,需要与生产环境具有相似的配置,但又允许一定的灵活性。测试环境的数据库可能是测试专用的,其数据和性能要求可能会根据测试目的而有所不同,例如可能会模拟生产环境的数据量或负载。
  • 预发环境:是生产环境的预演,旨在尽可能地模拟生产环境,包括配置、资源规模和性能要求,以确保在正式上线前发现和解决可能出现的问题。
  • 生产环境:要求最高的稳定性、性能和安全性,需要使用真实的生产数据库,资源规模通常较大,并且对服务的可用性和性能有着严格的要求。

二、实现方法

(一)创建 Helm Chart

首先,需要创建一个 Helm Chart,它是一个包含了应用程序的 K8s 资源模板和默认 Values 文件的目录结构。使用以下命令可以创建一个新的 Helm Chart:

helm create my-application

这个命令将创建一个名为 my-application 的目录,包含了多个子目录和文件,其中 templates 目录包含了 K8s 资源的模板文件,而 values.yaml 是默认的 Values 文件。

(二)修改默认的 Values 文件

values.yaml 文件中,可以定义应用程序的各种配置参数,例如:

replicaCount: 1
image:repository: my-imagetag: latest
service:type: ClusterIPport: 80
environment: development
database:url: jdbc:mysql://localhost:3306/devdbusername: devuserpassword: devpass

这里定义了副本数量、镜像信息、服务类型和端口,以及数据库的连接信息。但是,这些配置是通用的,我们需要为不同环境进行定制。

(三)为不同环境创建定制的 Values 文件

为每个环境创建一个单独的 Values 文件,将其保存在 Chart 目录中。例如:

  1. 开发环境values-dev.yaml
replicaCount: 1
image:repository: my-image-devtag: latest-dev
service:type: ClusterIPport: 8080
environment: development
database:url: jdbc:mysql://dev-db-server:3306/devdbusername: devuserpassword: devpasslogging:level: debug
  1. 测试环境values-test.yaml
replicaCount: 2
image:repository: my-image-testtag: latest-test
service:type: NodePortport: 8081
environment: testing
database:url: jdbc:mysql://test-db-server:3306/testdbusername: testuserpassword: testpasslogging:level: info
  1. 预发环境values-preprod.yaml
replicaCount: 3
image:repository: my-image-preprodtag: latest-preprod
service:type: LoadBalancerport: 80
environment: preproduction
database:url: jdbc:mysql://preprod-db-server:3306/preproddbusername: preproduserpassword: preprodpasslogging:level: warn
  1. 生产环境values-prod.yaml
replicaCount: 5
image:repository: my-image-prodtag: latest-prod
service:type: LoadBalancerport: 80
environment: production
database:url: jdbc:mysql://prod-db-server:3306/proddbusername: produserpassword: prodpasslogging:level: error

(四)使用模板语言

templates 目录中的 K8s 资源模板文件中,可以使用 Helm 的模板语言引用 Values 文件中的配置。例如,在 deployment.yaml 模板文件中:

apiVersion: apps/v1
kind: Deployment
metadata:name: {{.Release.Name }}-my-application
spec:replicas: {{.Values.replicaCount }}selector:matchLabels:app: {{.Release.Name }}-my-applicationtemplate:metadata:labels:app: {{.Release.Name }}-my-applicationspec:containers:- name: my-applicationimage: {{.Values.image.repository }}:{{.Values.image.tag }}ports:- containerPort: {{.Values.service.port }}env:- name: DATABASE_URLvalue: {{.Values.database.url }}- name: DATABASE_USERvalue: {{.Values.database.username }}- name: DATABASE_PASSWORDvalue: {{.Values.database.password }}- name: LOGGING_LEVELvalue: {{.Values.database.logging.level }}

这里使用 {{.Values.xxx }} 语法来引用 Values 文件中的配置,将它们插入到 K8s 资源的相应位置。

(五)部署应用程序

使用 Helm 命令,根据不同的环境使用相应的 Values 文件进行部署:

  1. 开发环境
helm install my-application-dev my-application --values my-application/values-dev.yaml
  1. 测试环境
helm install my-application-test my-application --values my-application/values-test.yaml
  1. 预发环境
helm install my-application-preprod my-application --values my-application/values-preprod.yaml
  1. 生产环境
helm install my-application-prod my-application --values my-application/values-prod.yaml

三、实现案例

假设我们有一个简单的 Web 应用程序,以下是一个完整的实现案例:

(一)创建 Helm Chart

helm create my-webapp

(二)修改 values.yaml 文件

appName: my-webapp
replicaCount: 1
image:repository: my-webapp-imagetag: latest
service:type: ClusterIPport: 80
database:url: jdbc:mysql://default-db:3306/defaultdbusername: defaultuserpassword: defaultpass
logging:level: info

(三)创建不同环境的 Values 文件

  1. 开发环境values-dev.yaml
appName: my-webapp-dev
replicaCount: 1
image:repository: my-webapp-dev-imagetag: latest-dev
service:type: ClusterIPport: 8080
database:url: jdbc:mysql://dev-db:3306/devdbusername: devuserpassword: devpass
logging:level: debug
  1. 测试环境values-test.yaml
appName: my-webapp-test
replicaCount: 2
image:repository: my-webapp-test-imagetag: latest-test
service:type: NodePortport: 8081
database:url: jdbc:mysql://test-db:3306/testdbusername: testuserpassword: testpass
logging:level: info
  1. 预发环境values-preprod.yaml
appName: my-webapp-preprod
replicaCount: 3
image:repository: my-webapp-preprod-imagetag: latest-preprod
service:type: LoadBalancerport: 80
database:url: jdbc:mysql://preprod-db:3306/preproddbusername: preproduserpassword: preprodpass
logging:level: warn
  1. 生产环境values-prod.yaml
appName: my-webapp-prod
replicaCount: 5
image:repository: my-webapp-prod-imagetag: latest-prod
service:type: LoadBalancerport: 80
database:url: jdbc:mysql://prod-db:3306/proddbusername: produserpassword: prodpass
logging:level: error

(四)修改模板文件

templates/deployment.yaml 中:

apiVersion: apps/v1
kind: Deployment
metadata:name: {{.Release.Name }}-{{.Values.appName }}
spec:replicas: {{.Values.replicaCount }}selector:matchLabels:app: {{.Release.Name }}-{{.Values.appName }}template:metadata:labels:app: {{.Release.Name }}-{{.Values.appName }}spec:containers:- name: {{.Values.appName }}image: {{.Values.image.repository }}:{{.Values.image.tag }}ports:- containerPort: {{.Values.service.port }}env:- name: DATABASE_URLvalue: {{.Values.database.url }}- name: DATABASE_USERvalue: {{.Values.database.username }}- name: DATABASE_PASSWORDvalue: {{.Values.database.password }}- name: LOGGING_LEVELvalue: {{.Values.logging.level }}

(五)部署应用程序

使用以下命令将应用程序部署到不同环境:

  1. 开发环境
helm install my-webapp-dev my-webapp --values my-webapp/values-dev.yaml
  1. 测试环境
helm install my-webapp-test my-webapp --values my-webapp/values-test.yaml
  1. 预发环境
helm install my-webapp-preprod my-webapp --values my-webapp/values-preprod.yaml
  1. 生产环境
helm install my-webapp-prod my-webapp --values my-webapp/values-prod.yaml

通过这种方式,我们可以轻松地在不同环境中部署应用程序,并根据每个环境的特点定制相应的配置。这种方法保证了应用程序在不同环境中的灵活性和可管理性,同时减少了因配置错误而导致的问题。

四、总结

使用 Values 文件定制 K8s 中不同环境下的应用程序配置是一种强大而灵活的方法。它利用了 Helm 的模板功能,允许开发人员和运维人员在不同的部署阶段轻松地调整应用程序的配置,而无需修改代码或 K8s 资源的定义文件。通过合理地使用 Values 文件,我们可以更好地管理应用程序的开发、测试、预发和生产环境,确保应用程序在不同阶段都能顺利运行,并满足相应的性能、安全和可用性要求。同时,这种方法也为应用程序的持续集成和持续部署(CI/CD)流程提供了便利,使团队能够更高效地进行软件交付和维护工作。

请记住,在实际应用中,需要根据应用程序的具体需求和 K8s 集群的特性进行适当的调整和优化,确保配置的准确性和有效性。同时,要注意对敏感信息(如数据库密码)的管理,避免在配置文件中明文存储,可以考虑使用 K8s 的 Secret 资源进行存储和管理。


http://www.ppmy.cn/embedded/156039.html

相关文章

VSCode+EIDE 环境搭建

一、安装插件 请在魔法的情况下,去下载安装该插件。 二、配置 导入一个例程。 编译器选择 AC5或者AC6,当然AC5需要你自己去整,具体可以参照这篇文章Keil5 MDK安装Compiler Version5(即ARM Compiler 5,简称AC5&#x…

【科研建模】Pycaret自动机器学习框架使用流程及多分类项目实战案例详解

Pycaret自动机器学习框架使用流程及项目实战案例详解 1 Pycaret介绍2 安装及版本需求3 Pycaret自动机器学习框架使用流程3.1 Setup3.2 Compare Models3.3 Analyze Model3.4 Prediction3.5 Save Model4 多分类项目实战案例详解4.1 ✅ Setup4.2 ✅ Compare Models4.3 ✅ Experime…

如何用数据编织、数据虚拟化与SQL-on-Hadoop打造实时、可扩展兼容的数据仓库?

在大数据技术迅猛发展的背景下,许多人认为传统数据仓库已过时。然而,这种观点忽略了数据仓库的核心价值:统一的数据视图、强大的业务逻辑支撑以及丰富的数据分析能力。在企业数据架构转型中,数据仓库不仅未被淘汰,反而…

蓝桥杯小白备考指南

一、了解蓝桥杯 蓝桥杯大赛是工业和信息化部人才交流中心举办的全国性专业信息技术赛事 ,旨在促进软件和信息领域专业技术人才培养,提升高校毕业生的就业竞争力。比赛涵盖多个编程语言组别,如 Java、C/C、Python 等。不同组别和参赛类别&…

数字化的三大战场与开源AI智能名片2+1链动模式S2B2C商城小程序源码的应用探索

摘要:本文深入探讨了数字化转型背景下,电商平台、社交平台和内容平台作为数字化的三大战场,在推动各行业变革中的关键作用。同时,本文引入了开源AI智能名片21链动模式S2B2C商城小程序源码的概念,分析了其在快消品行业数…

Vue平台开发三——项目管理页面

前言 对于多个项目的使用,可能需要进行项目切换管理,所以这里创建一个项目管理页面,登录成功后跳转这个页面,进行选择项目,再进入Home页面展示对应项目的内容。 一、实现效果图预览 二、页面内容 功能1、项目列表展…

Node.js path.resolve

path.resolve 是 Node.js 中的 path 模块提供的一个方法,用于解析文件路径。它会根据传入的路径参数,结合当前工作目录(process.cwd())以及给定的路径参数,计算出一个绝对路径。 语法 const path require(path); pa…

C语言之装甲车库车辆动态监控辅助记录系统

🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 C语言之装甲车库车辆动态监控辅助记录系统 目录 一、前言 1.1 (一)…