如何在 K8S 中使用 Values 文件定制不同环境下的应用配置

 更新时间:2025年03月27日 16:36:56   作者:颜淡慕潇  
Kubernetes是一个开源的容器编排平台,它可以自动化容器的部署、扩展和管理,在 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 资源进行存储和管理。

到此这篇关于在 K8S 中使用 Values 文件定制不同环境下的应用配置的文章就介绍到这了,更多相关K8S 使用 Values 文件定制应用配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • K8S  Config应用配置小结

    K8S  Config应用配置小结

    本文主要介绍了Kubernetes中ConfigMap和Secret的使用方法,以及如何在Pod和容器中进行资源配置,文中详细讲解了如何创建和使用ConfigMap来管理非机密性配置,以及如何使用Secret来存储敏感信息,同时,还介绍了如何在Pod中配置资源请求和限制,感兴趣的朋友一起看看吧
    2025-03-03
  • Kubernetes中使用临时容器进行故障排查的方法

    Kubernetes中使用临时容器进行故障排查的方法

    在使用Kubernetes时,用户常常会遇到一些错误和迷惑,下面这篇文章主要给大家介绍了关于Kubernetes中使用临时容器进行故障排查的相关资料,需要的朋友可以参考下
    2022-03-03
  • 新版k8s拉取镜像失败问题解决办法

    新版k8s拉取镜像失败问题解决办法

    随着Kubernetes 1.23版本的发布,Docker作为默认容器运行时被弃用,转而默认采用Containerd,这一改变意味着用户在使用Kubernetes时,将不再通过Docker来拉取镜像,文中jiang,需要的朋友可以参考下
    2024-10-10
  • Kubernetes组件和架构简介

    Kubernetes组件和架构简介

    Kubernetes是google开源的容器编排工具,本质是一组服务器集群,在集群的各个节点上运行程序来进行容器进行管理,最终实现资源管理智能化、自动化,这篇文章主要介绍了Kubernetes组件和架构简介,需要的朋友可以参考下
    2023-09-09
  • k8s证书有效期时间修改的方法详解

    k8s证书有效期时间修改的方法详解

    K8S集群有证书的概念,之前一直是使用默认的,默认都是1年和10年的,1年有效期这显然对于生产环境是不合适的,下面这篇文章主要给大家介绍了关于k8s证书有效期时间修改的相关资料,需要的朋友可以参考下
    2022-08-08
  • 一文解析Kubernetes使用PVC后数据丢失

    一文解析Kubernetes使用PVC后数据丢失

    这篇文章主要为大家介绍了Kubernetes使用PVC后数据丢失原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 详解Kubernetes 中容器跨主机网络

    详解Kubernetes 中容器跨主机网络

    这篇文章主要为大家介绍了Kubernetes中容器跨主机网络是怎么样的,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • kubernetes 部署dashboard最新详细步骤

    kubernetes 部署dashboard最新详细步骤

    这篇文章主要介绍了kubernetes 部署dashboard最新详细步骤,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • k8s部署并测试ingress-nginx的详细过程

    k8s部署并测试ingress-nginx的详细过程

    这篇文章主要介绍了k8s部署并测试ingress-nginx的详细过程,本文通过一个demo示例给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-04-04
  • 一文讲解如何获取k8s容器里运行的jar包

    一文讲解如何获取k8s容器里运行的jar包

    K8S是Google开源的容器集群管理系统,其设计目标是在主机集群之间提供一个能够自动化部署、可拓展、应用容器可运营的平台,这篇文章主要给大家介绍了关于如何获取k8s容器里运行的jar包的相关资料,需要的朋友可以参考下
    2022-09-09

最新评论