3.3. [kustz] 注入 ConfigMap 和 Secrets 到容器环境变量

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 3.3. [kustz] 注入 ConfigMap 和 Secrets 到容器环境变量

3.3. [kustz] 注入 ConfigMap 和 Secrets 到容器环境变量

大家好, 我是老麦。 一个运维小学生。
今天我们为容器提供另外一种注入环境变量的方式。

image.png

有了前面两张的铺垫, 今天这个很简单。 我们说说另外一种为容器注入环境变量的方式。

image.png

代码还是放在 Github
https://github.com/tangx/kustz/tree/chapter/08-container-env-from/cmd/kustz

容器变量注入 EnvFrom

前面我们提到过, Container 有两种方式定义环境变量, 其中一种就是 envFrom, 从 ConfigMap 或 Secret 中读取所有键值对作为容器的变量。

ConfigMap 和 Secret 看起来是这样的。 数据都在 data 字段。

apiVersion: v1
data:
  APP_NAME: gin-demo
  LOG_LEVEL: debug
kind: ConfigMap
metadata:
  name: config-demo

在定义引用的时候, 使用 envFrom 关键字, 参考官网案例 https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: registry.k8s.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
      - configMapRef:
          name: special-config
          # optional: false
  restartPolicy: Never

官网的 demo 中并没有提及 optional 这个字段, 但是在后面 限制条件 的时候做了详细解释。

限制
  1. 在 Pod 规约中引用某个 ConfigMap 之前,必须先创建这个对象, 或者在 Pod 规约中将 ConfigMap 标记为 optional(请参阅可选的 ConfigMaps)。 如果所引用的 ConfigMap 不存在,并且没有将应用标记为 optional 则 Pod 将无法启动。 同样,引用 ConfigMap 中不存在的主键也会令 Pod 无法启动,除非你将 Configmap 标记为 optional。
  2. 如果你使用 envFrom 来基于 ConfigMap 定义环境变量,那么无效的键将被忽略。 Pod 可以被启动,但无效名称将被记录在事件日志中(InvalidVariableNames)。 日志消息列出了每个被跳过的键。例如:
可选的 ConfigMap
你可以在 Pod 规约中将对 ConfigMap 的引用标记为 可选(optional)。 如果 ConfigMap 不存在,那么它在 Pod 中为其提供数据的配置(例如环境变量、挂载的卷)将为空。 如果 ConfigMap 存在,但引用的键不存在,那么数据也是空的。

optional 默认值为 false , 即配置文件必须存在,否则会报错。

编码

今天的编码很简单, 就几句话。

kustz.yml 配置

service.envs 中增加两个字段 configmapssecrets。 他们都是 字符串切片

# kustz.yml

service:
  name: nginx
  image: docker.io/library/nginx:alpine
  envs:
    configmaps:
      # - name:optional
      - srv-webapp-demo-envs:true
    secrets:
      - srv-webapp-demo-envs # default optional: false

字符串分两段 name:optional

解析字符串为 API 对象

代码很简单, 没什么好说的。

  1. /pkg/tokube/container.go 中, 函数 ParseEnvFromSource 解析字符串为 corev1.EnvFromSource 对象。
  2. /pkg/kustz/k_container.go 中, 循环遍历 configmaps 和 secrets 获取字符串。
补充说明

corev1.EnvFromSource 中, 有个字段叫 Prefix 是用于给变量 加前缀 的。

// EnvFromSource represents the source of a set of ConfigMaps
type EnvFromSource struct {
    // An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER.
    // +optional
    Prefix string `json:"prefix,omitempty" protobuf:"bytes,1,opt,name=prefix"`
}

我更喜欢 所见即所得, 所以我并没有处理这个字段。 另外环境变量是服务定义的, 也用不着我们画蛇添足。

测试

执行命令查看结果

$ make test.deployment
相关文章
|
7月前
|
Java 测试技术 开发工具
ApplicationArguments读取应用程序参数并注入到IOC容器
ApplicationArguments读取应用程序参数并注入到IOC容器
ApplicationArguments读取应用程序参数并注入到IOC容器
|
XML Java 数据格式
Spring的简介ioc容器及注入方式2
Spring的简介ioc容器及注入方式2
57 0
|
26天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
63 3
|
4月前
|
Kubernetes 容器 Perl
在k8S中,如何向Pod中指定容器传递环境变量?有哪些方式?
在k8S中,如何向Pod中指定容器传递环境变量?有哪些方式?
|
5月前
|
容器
Could not autowire No beans of ‘UserSerice,这样的bug,主要是idea检测到你没有往页面中,没有往容器中注入一个userService,容器注入UserSe
Could not autowire No beans of ‘UserSerice,这样的bug,主要是idea检测到你没有往页面中,没有往容器中注入一个userService,容器注入UserSe
|
7月前
|
Java 数据库连接 Docker
【Docker 专栏】Docker 容器内环境变量的管理与使用
【5月更文挑战第9天】本文介绍了Docker容器中环境变量的管理与使用,环境变量用于传递配置信息和设置应用运行环境。设置方法包括在Dockerfile中使用`ENV`指令或在启动容器时通过`-e`参数设定。应用可直接访问环境变量或在脚本中使用。环境变量作用包括传递配置、设置运行环境和动态调整应用行为。使用时注意变量名称和值的合法性、保密性和覆盖问题。理解并熟练运用环境变量能提升Docker技术的使用效率和软件部署质量。
512 0
【Docker 专栏】Docker 容器内环境变量的管理与使用
|
XML Java 数据格式
【Spring】全面讲解IOC、AOP、注入方式、bean的生命周期、aop通知应用 spring与web容器整合
Spring是一个开源的轻量级Java应用开发框架,它提供了一种简单、高效、灵活的方式来构建企业级应用程序。Spring框架的核心特点是依赖注入(Dependency Injection)和面向切面编程(Aspect-Oriented Programming),它通过一组模块化的组件提供全面的支持,使开发人员能够快速搭建可扩展、可维护的应用。
|
7月前
|
Kubernetes 测试技术 开发者
ChaosBlade常见问题之对isulad容器引擎做注入如何解决
ChaosBlade 是一个开源的混沌工程实验工具,旨在通过模拟各种常见的硬件、软件、网络、应用等故障,帮助开发者在测试环境中验证系统的容错和自动恢复能力。以下是关于ChaosBlade的一些常见问题合集:
|
监控 Cloud Native Go
部署Envoy Sidecar代理:演示如何将Envoy作为Sidecar代理注入到应用容器中
部署Envoy Sidecar代理:演示如何将Envoy作为Sidecar代理注入到应用容器中
143 0
|
前端开发 Java 应用服务中间件
“深入了解Spring框架:IOC、注入方式和与Web容器的整合“
“深入了解Spring框架:IOC、注入方式和与Web容器的整合“
69 0