3.2. [kustz] ConfigMap 和 Secret 的生成器

简介: 3.2. [kustz] ConfigMap 和 Secret 的生成器

3.2. [kustz] ConfigMap 和 Secret 的生成器

大家好, 我是老麦, 一个运维小学生。
今天我们通过 kustomize 管理 ConfigMapSecret

image.png

上一节我们通过 k-vYAML文件 为容器添加环境变量。 同时也提到了可以通过 envFrom 这个关键字, 直接读取 ConfigMap 或 Secret 中的 k-v 作为容器的环境变量。

除了环境变量之外, ConfigMap 和 Secret 还能管理的东西还很多。 所以我个人觉得单应用管理部署的话, 对于配置的管理,还是比较重要的。

Kustomize 中的 ConfigMap Env File

在 kustzomize 中, ConfigMap 和 Secret 都是通过 生成器 Generator 管理的, 有很多配置。

https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/generatoroptions/

先切到 ConfigMapGenerator, 可以看到有三种模式提供数据, files , literals, envs

如果按照我们之前说的, 为容器提供环境变量, 使用 envs 是最方便的。 从名字就可以看到, 就是为了环境变量而提供的。

https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/configmapgenerator/#configmap-from-env-file

但是这种模式提供数据有也有限制的

  1. 必须使用 key=value 这种结构

    1. 但这并不是 SHELL 变量赋值的形式
  2. 每一对 k-v 只能是单行。 key 作为变量名还好说, value 作为值就 不能支持多行 数据了。

    1. 另外 value 中的所有字符都是字面值。

举个例子

HTTPS_CERT="---RSA---\nasdfjal\n---END"

通常在 Shell 中 " 双引号 是可以保留 \n 换行符 转义的含义的。 但是在这里 " 和 \n 都是字面意思, 没有任何特殊。

ConfigMap / Secret 生成器

看看定义, ConfigMapArgs 和 SecretArgs

  1. 都是通过 GeneratorArgs 管理数据的。
  2. Secret 比 ConfigMap 多了一个 Type 字段。
type ConfigMapArgs struct {
    GeneratorArgs `json:",inline,omitempty" yaml:",inline,omitempty"`
}

// SecretArgs contains the metadata of how to generate a secret.
type SecretArgs struct {
    GeneratorArgs `json:",inline,omitempty" yaml:",inline,omitempty"`
    // This is the same field as the secret type field in v1/Secret:
    // It can be "Opaque" (default), or "kubernetes.io/tls".
    Type string `json:"type,omitempty" yaml:"type,omitempty"`
}

对于数据源我计划都从文件中读取。 这样三个模式就有了相同过的抽象结构体。 抽象结果为 Generator 结构体, 在 /pkg/kustz/kustz.go 中可以看到。

kustz.yml 配置

  1. kustz.yml 中新增加了两个字段 configmaps, secrets
  2. 每个字段都有三个模式 envs, files, literals
  3. 每个模式都有三个字段

    1. name: 最终生成的 ConfigMap 或 Secret 名字。
    2. files: 数据源。 [target_name=]source_name。 target_name 就是 ConfigMap 中的文件 key。 如省略, 默认与 source_name 相同。
    3. type: 类型。 Secret 专有。 取值范围参考 https://kubernetes.io/docs/concepts/configuration/secret/#secret-types

# kustz.yml

# https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/configmapgenerator/
configmaps:
  envs:
    - name: srv-webapp-demo-envs
      files:
        - src_name.txt

# https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/secretgenerator/
secrets:
  literals:
    - name: srv-webapp-demo-literals
      files:
        - foo.yml
      # type: Opaque # default
  files:
    - name: srv-webapp-demo-files
      files:
      - tls.crt=catsecret/tls.crt
      - tls.key=secret/tls.key
      type: "kubernetes.io/tls"

编码

type Config struct {
    ConfigMaps Generator `json:"configmaps"`
    Secrets    Generator `json:"secrets"`
}

// Generator 定义数据源种类
type Generator struct {
    Literals []GeneratorArgs `json:"literals,omitempty"`
    Envs     []GeneratorArgs `json:"envs,omitempty"`
    Files    []GeneratorArgs `json:"files,omitempty"`
}

//  GeneratorArgs 定义数据源类型参数
type GeneratorArgs struct {
    Name  string   `json:"name,omitempty"`
    Files []string `json:"files,omitempty"`
    Type  string   `json:"type,omitempty"`
}

Generator 也就承担关于 ConfigMap 和 Secret 所有工作。

/pkg/kustz/k_kustomize.go 中, 为 Generator 创建了两个方法创建对应参数。

// toConfigMapArgs 返回 ConfigMap 参数
func (genor *Generator) toConfigMapArgs() []types.ConfigMapArgs {
    args := []types.ConfigMapArgs{}
    for _, data := range genor.datas() {
        for _, garg := range data.gargs {
            arg := tokust.ConfigMapArgs(garg.Name, garg.Files, data.mode)
            args = append(args, arg)
        }
    }
    return args
}
// toSecretArgs 返回 Secret 参数
func (genor *Generator) toSecretArgs() []types.SecretArgs {}

由于 ConfigMap 和 Secret 确实太过相似, 所以对于处理 GeneratorArgs 使用循环, 从而添加了一个 Mode 类型的概念。 这个 Mode 的取值范围就是 envs, literals, files

type GeneratorArgsData struct {
    mode  tokust.GeneratorMode
    gargs []GeneratorArgs
}

// datas 整合生成器数据
func (genor *Generator) datas() []GeneratorArgsData {
    return []GeneratorArgsData{
        {mode: tokust.GeneratorMode_Envs, gargs: genor.Envs},
        {mode: tokust.GeneratorMode_Files, gargs: genor.Files},
        {mode: tokust.GeneratorMode_Literals, gargs: genor.Literals},
    }
}

/pkg/tokust/generator.go 文件中, 定义了几个函数创建 kustomize 对象的方法。

func ConfigMapArgs(name string, files []string, mode GeneratorMode) types.ConfigMapArgs {
}
func SecretArgs(name string, files []string, typ string, mode GeneratorMode) types.SecretArgs {
    // 处理默认类型
    if typ == "" {
        typ = "Opaque"
    }
}

相应的, 也创建三种模式的对应的方法。

func generatorArgs_literals(name string, files []string) types.GeneratorArgs {
    data := make(map[string]string, 0)
    for _, file := range files {
        err := marshalYaml(file, data)
        if err != nil {
            panic(err)
        }
    }
    sources := mapToSlice(data)
    // ... 省略
}

func generatorArgs_files(name string, files []string) types.GeneratorArgs {
}

func generatorArgs_envs(name string, files []string) types.GeneratorArgs {
}

在 literals 中, 由于我们传入的是 文件, 但是在 kustomization.yml 是键值对。
所以多了一个读取数据的步骤, 并且定义了一个规则, 如果出现同名变量, 后面出现的覆盖先出现的

测试

执行命令, 查看结果。

$ make test.kustomize
这里不会直接生成 ConfigMap 和 Secret, 而是生成 Kustomization.yml 规则。
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
Prometheus Kubernetes 监控
云原生|kubernetes |使用Prometheus监控k8s cAdvisor篇(进阶篇--- 一)(centos操作系统)
云原生|kubernetes |使用Prometheus监控k8s cAdvisor篇(进阶篇--- 一)(centos操作系统)
3095 0
|
9月前
|
编解码 自然语言处理 开发者
通义音乐生成技术InspireMusic开源!
通义音乐生成技术InspireMusic开源!
581 2
|
存储 NoSQL 关系型数据库
微服务Zipkin链路追踪原理,图解版,一文吃透!
本文重点讲解Zipkin链路追踪的原理与使用,帮助解决微服务架构下的服务响应延迟等问题,提升系统性能与稳定性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
微服务Zipkin链路追踪原理,图解版,一文吃透!
|
安全 关系型数据库 MySQL
揭秘MySQL海量数据迁移终极秘籍:从逻辑备份到物理复制,解锁大数据迁移的高效与安全之道
【8月更文挑战第2天】MySQL数据量很大的数据库迁移最优方案
1449 17
|
存储 Kubernetes Perl
pv和pvc的区别、关系,如何设置使用的步骤
PV(Persistent Volume)和 PVC(Persistent Volume Claim)是 Kubernetes 中用于管理持久化存储的两个关键概念。 PV 是集群中的一个持久化存储资源,它是由集群管理员预先创建和配置的。PV 可以是物理存储设备、存储阵列、网络存储等。PV 有自己的生命周期,并且可以被多个 Pod 共享。 PVC 是 Pod 对 PV 的请求,它用于声明 Pod 对存储的需求。PVC 描述了 Pod 所需的存储容量、访问模式等属性。当创建 PVC 时,Kubernetes 会尝试将其与可用的 PV 进行匹配和绑定。一旦 PVC 成功绑定到 PV,Pod 就可
1598 0
|
编解码 前端开发 Java
【推荐100个unity插件之12】UGUI的粒子效果(UI粒子)—— Particle Effect For UGUI (UI Particle)
【推荐100个unity插件之12】UGUI的粒子效果(UI粒子)—— Particle Effect For UGUI (UI Particle)
1651 0
|
Oracle 关系型数据库 Shell
实时计算 Flink版操作报错合集之遇到报错:Error: Could not find or load main class org.apache.flink.cdc.cli.CliFrontend,是什么导致的
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
467 0
|
机器学习/深度学习 JavaScript 前端开发
「译文」如何在 YAML 中输入多行字符串?
「译文」如何在 YAML 中输入多行字符串?
|
JSON 监控 Shell
搭建公司网络监控系统的基础设施:使用Terraform
在当今数字化的商业环境中,公司网络的稳定性和安全性至关重要。为了实现对公司网络的全面监控,搭建一个强大而灵活的监控系统是至关重要的一步。本文将介绍如何使用Terraform构建公司网络监控系统的基础设施,并通过一些实际的代码示例来说明。
548 2
|
JSON Kubernetes Devops
kustomize (七) patches、patchesJson6902、patchesStrategicMerge详解
kustomize (七) patches、patchesJson6902、patchesStrategicMerge详解