当前位置: 首页 > article >正文

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

  1. 开发环境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
  1. 测试环境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
  1. 预发环境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
  1. 生产环境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 文件进行部署:

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

(五)部署应用程序

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

  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.kler.cn/a/512483.html

相关文章:

  • 逆波兰表达式求值(力扣150)
  • 数据分析 基础定义
  • MFC 使用 32位带Alpha通道的位图
  • HDFS的Java API操作
  • 整数的分离与合成
  • ToDesk云电脑、顺网云、网易云、易腾云、极云普惠云横测对比:探寻电竞最佳拍档
  • 【深度学习】2.视觉问题与得分函数
  • JavaScript笔记APIs篇03——DOM节点Bom操作本地存储正则表达式
  • Ant Design Vue 的 a-input-number 组件限制最小值和最大值
  • c++常见设计模式之适配器模式
  • Ubuntu如何安装redis服务?
  • 【王树森搜素引擎技术】相关性03:文本匹配(TF-IDF、BM25、词距)
  • goodreads书籍评论爬取NRC Emotion Lexicon分析
  • Ae 表达式语言引用:Layer - 3D
  • excel 判断某个单元格的日期,如果超过3天,则在另一个单元格显示超过三天的公式
  • 【前端学习路线】前端入门 详细知识点学习路径(附学习资源)
  • VSCode下EIDE插件开发STM32
  • K8S中Pod控制器之DaemonSet(DS)控制器
  • Windows 服务器访问慢解决办法
  • 如何使用Spring Boot框架整合Redis:超详细案例教程
  • 日志(elk stack)基础语法学习,零基础学习
  • 【每日一题】LeetCode - 最长公共前缀
  • WPF 使用webView显示浏览器网页
  • Edu邮箱免费获取Photoshop等设计软件
  • 第七篇:vue3 计算属性:computed
  • Golang Gin系列-3:Gin Framework的项目结构