【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:

bash 复制代码
helm create my-application

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

(二)修改默认的 Values 文件

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

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 目录中。例如:

  1. 开发环境values-dev.yaml
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
  1. 测试环境values-test.yaml
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
  1. 预发环境values-preprod.yaml
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
  1. 生产环境values-prod.yaml
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 模板文件中:

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 文件进行部署:

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

三、实现案例

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

(一)创建 Helm Chart

bash 复制代码
helm create my-webapp

(二)修改 values.yaml 文件

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 文件

  1. 开发环境values-dev.yaml
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
  1. 测试环境values-test.yaml
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
  1. 预发环境values-preprod.yaml
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
  1. 生产环境values-prod.yaml
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 中:

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 }}

(五)部署应用程序

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

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

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

四、总结

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

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

相关推荐
ShareBeHappy_Qin27 分钟前
ZooKeeper 中的 ZAB 一致性协议与 Zookeeper 设计目的、使用场景、相关概念(数据模型、myid、事务 ID、版本、监听器、ACL、角色)
分布式·zookeeper·云原生
旦沐已成舟4 小时前
K8S-Pod的环境变量,重启策略,数据持久化,资源限制
java·docker·kubernetes
github_czy4 小时前
(k8s)k8s部署mysql与redis(无坑版)
redis·容器·kubernetes
超级阿飞4 小时前
利用Kubespray安装生产环境的k8s集群-实施篇
elasticsearch·容器·kubernetes
SkyXZ7 小时前
VScode配置X11转发!让你彻底摆脱显示屏!!!
环境配置
来恩100312 小时前
Kubernetes学习指南与资料分享
云原生·容器·kubernetes
encoding-console12 小时前
docker安装consul并启动的详细步骤
docker·容器·consul
m0_7482299913 小时前
从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CICD)
docker·容器·node.js
weixin_3875456415 小时前
探索云原生可观测性:技术与团队协作的深度结合
云原生