【K8S系列】在 K8S 中使用 Values 文件定制不同环境下的应用配置
写在前面
因为有小伙伴问这个问题,因此用这篇文章详细讲解一下:在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-image
tag: latest
service:
type: ClusterIP
port: 80
environment: development
database:
url: jdbc:mysql://localhost:3306/devdb
username: devuser
password: devpass
这里定义了副本数量、镜像信息、服务类型和端口,以及数据库的连接信息。但是,这些配置是通用的,我们需要为不同环境进行定制。
(三)为不同环境创建定制的 Values 文件
为每个环境创建一个单独的 Values 文件,将其保存在 Chart 目录中。例如:
- 开发环境:
values-dev.yaml
replicaCount: 1
image:
repository: my-image-dev
tag: latest-dev
service:
type: ClusterIP
port: 8080
environment: development
database:
url: jdbc:mysql://dev-db-server:3306/devdb
username: devuser
password: devpass
logging:
level: debug
- 测试环境:
values-test.yaml
replicaCount: 2
image:
repository: my-image-test
tag: latest-test
service:
type: NodePort
port: 8081
environment: testing
database:
url: jdbc:mysql://test-db-server:3306/testdb
username: testuser
password: testpass
logging:
level: info
- 预发环境:
values-preprod.yaml
replicaCount: 3
image:
repository: my-image-preprod
tag: latest-preprod
service:
type: LoadBalancer
port: 80
environment: preproduction
database:
url: jdbc:mysql://preprod-db-server:3306/preproddb
username: preproduser
password: preprodpass
logging:
level: warn
- 生产环境:
values-prod.yaml
replicaCount: 5
image:
repository: my-image-prod
tag: latest-prod
service:
type: LoadBalancer
port: 80
environment: production
database:
url: jdbc:mysql://prod-db-server:3306/proddb
username: produser
password: prodpass
logging:
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-application
template:
metadata:
labels:
app: {{.Release.Name }}-my-application
spec:
containers:
- name: my-application
image: {{.Values.image.repository }}:{{.Values.image.tag }}
ports:
- containerPort: {{.Values.service.port }}
env:
- name: DATABASE_URL
value: {{.Values.database.url }}
- name: DATABASE_USER
value: {{.Values.database.username }}
- name: DATABASE_PASSWORD
value: {{.Values.database.password }}
- name: LOGGING_LEVEL
value: {{.Values.database.logging.level }}
这里使用 {{.Values.xxx }}
语法来引用 Values 文件中的配置,将它们插入到 K8s 资源的相应位置。
(五)部署应用程序
使用 Helm 命令,根据不同的环境使用相应的 Values 文件进行部署:
- 开发环境:
helm install my-application-dev my-application --values my-application/values-dev.yaml
- 测试环境:
helm install my-application-test my-application --values my-application/values-test.yaml
- 预发环境:
helm install my-application-preprod my-application --values my-application/values-preprod.yaml
- 生产环境:
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-image
tag: latest
service:
type: ClusterIP
port: 80
database:
url: jdbc:mysql://default-db:3306/defaultdb
username: defaultuser
password: defaultpass
logging:
level: info
(三)创建不同环境的 Values 文件
- 开发环境:
values-dev.yaml
appName: my-webapp-dev
replicaCount: 1
image:
repository: my-webapp-dev-image
tag: latest-dev
service:
type: ClusterIP
port: 8080
database:
url: jdbc:mysql://dev-db:3306/devdb
username: devuser
password: devpass
logging:
level: debug
- 测试环境:
values-test.yaml
appName: my-webapp-test
replicaCount: 2
image:
repository: my-webapp-test-image
tag: latest-test
service:
type: NodePort
port: 8081
database:
url: jdbc:mysql://test-db:3306/testdb
username: testuser
password: testpass
logging:
level: info
- 预发环境:
values-preprod.yaml
appName: my-webapp-preprod
replicaCount: 3
image:
repository: my-webapp-preprod-image
tag: latest-preprod
service:
type: LoadBalancer
port: 80
database:
url: jdbc:mysql://preprod-db:3306/preproddb
username: preproduser
password: preprodpass
logging:
level: warn
- 生产环境:
values-prod.yaml
appName: my-webapp-prod
replicaCount: 5
image:
repository: my-webapp-prod-image
tag: latest-prod
service:
type: LoadBalancer
port: 80
database:
url: jdbc:mysql://prod-db:3306/proddb
username: produser
password: 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_URL
value: {{.Values.database.url }}
- name: DATABASE_USER
value: {{.Values.database.username }}
- name: DATABASE_PASSWORD
value: {{.Values.database.password }}
- name: LOGGING_LEVEL
value: {{.Values.logging.level }}
(五)部署应用程序
使用以下命令将应用程序部署到不同环境:
- 开发环境:
helm install my-webapp-dev my-webapp --values my-webapp/values-dev.yaml
- 测试环境:
helm install my-webapp-test my-webapp --values my-webapp/values-test.yaml
- 预发环境:
helm install my-webapp-preprod my-webapp --values my-webapp/values-preprod.yaml
- 生产环境:
helm install my-webapp-prod my-webapp --values my-webapp/values-prod.yaml
通过这种方式,我们可以轻松地在不同环境中部署应用程序,并根据每个环境的特点定制相应的配置。这种方法保证了应用程序在不同环境中的灵活性和可管理性,同时减少了因配置错误而导致的问题。
四、总结
使用 Values 文件定制 K8s 中不同环境下的应用程序配置是一种强大而灵活的方法。它利用了 Helm 的模板功能,允许开发人员和运维人员在不同的部署阶段轻松地调整应用程序的配置,而无需修改代码或 K8s 资源的定义文件。通过合理地使用 Values 文件,我们可以更好地管理应用程序的开发、测试、预发和生产环境,确保应用程序在不同阶段都能顺利运行,并满足相应的性能、安全和可用性要求。同时,这种方法也为应用程序的持续集成和持续部署(CI/CD)流程提供了便利,使团队能够更高效地进行软件交付和维护工作。
请记住,在实际应用中,需要根据应用程序的具体需求和 K8s 集群的特性进行适当的调整和优化,确保配置的准确性和有效性。同时,要注意对敏感信息(如数据库密码)的管理,避免在配置文件中明文存储,可以考虑使用 K8s 的 Secret 资源进行存储和管理。