K8S - Java微服务配置之ConfigMap

devtools/2024/12/22 5:37:55/

前言

参考文档:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/#interim-cleanup

使用 ConfigMaps 和 Secrets 配置环境变量,使用 MicroProfile Config 来消费这些变量

可以使用以下方式为docker容器设置环境变量:

使用 ConfigMaps 或 Secrets 这两种最新的环境变量设置方式:

  • 变量会注入到你的微服务里,多个容器可以重复使用
  • 不同的容器也可以使用不同的环境变量

ConfigMap_15">ConfigMap

可以理解为K8S里的一个 明文存储 的 key-value键值对的 资源对象
允许你注入数据到pod应用中,同时将应用的配置与镜像解耦,以保持容器应用的可移植性。比如使用相同的容器镜像,通过配置实现本地开发环境、测试环境、生产环境

ConfigMap 中保存的数据不可超过 1MiB 。如果需要保存超出此尺寸限制的数据, 可以考虑挂载存储卷或者使用独立的数据库或者文件服务。

1. 作用

引入 Configmap 资源对象,对服务的扩容和配置修改,实现统一管理。
● 可以当成 volume 挂载到 pod 中
● 将配置信息与 docker 镜像解耦,以实现镜像的可移植性和可复用性
● 实现配置共享

java代码中,貌似也有3种方法可以读取configmap中配置,这个感兴趣的自己下去搞吧

ConfigMap_26">2. 创建ConfigMap

#这里的 map-name 必须是标准  DNS子域名 格式,data-source 可以是 目录、文件或字面值
kubectl create configmap <map-name> <data-source>#清理ConfigMap
kubectl delete configmap special-config
kubectl delete configmap env-config
kubectl delete configmap -l 'game-config in (config-4,config-5)'

ConfigMap_37">2.1 通过目录创建ConfigMap

mkdir -p configure-pod-container/configmap/# Download the sample files into `configure-pod-container/configmap/` directory
wget https://kubernetes.io/examples/configmap/game.properties -O configure-pod-container/configmap/game.properties
wget https://kubernetes.io/examples/configmap/ui.properties -O configure-pod-container/configmap/ui.properties# Create the ConfigMap
kubectl create configmap game-config --from-file=configure-pod-container/configmap/# 获取注入的配置详情
kubectl describe configmaps game-configkubectl get configmaps game-config -o yaml

这里可以不用纠结,直接用官方给的线上环境做测试也很OK:https://killercoda.com/playgrounds/scenario/kubernetes

我因为本地已有环境,直接在本地测试了
在这里插入图片描述
在这里插入图片描述

ConfigMap_61">2.2 通过文件创建ConfigMap

#通过文件加载配置变量
kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties
#查看加载结果
kubectl describe configmaps game-config-2#也可以同时加载多个文件
kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties --from-file=configure-pod-container/configmap/ui.properties#也可以通过 env 文件创建, --from-env-file 加载 env-file 文件
wget https://kubernetes.io/examples/configmap/game-env-file.properties -O configure-pod-container/configmap/game-env-file.properties
wget https://kubernetes.io/examples/configmap/ui-env-file.properties -O configure-pod-container/configmap/ui-env-file.properties
cat configure-pod-container/configmap/game-env-file.properties
enemies=aliens
lives=3
allowed="true"kubectl create configmap game-config-env-file \--from-env-file=configure-pod-container/configmap/game-env-file.properties
#从 Kubernetes 1.23 版本开始,kubectl 支持多次指定 --from-env-file 参数来从多个数据源创建 ConfigMap#在使用 --from-file 参数时,你可以定义在 ConfigMap 的 data 部分出现键名, 而不是按默认行为使用文件名

ConfigMap_90">2.3 根据参数值创建 ConfigMap

kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm#查看
kubectl get configmaps special-config -o yaml#内容如下
apiVersion: v1
kind: ConfigMap
metadata:creationTimestamp: 2022-02-18T19:14:38Zname: special-confignamespace: defaultresourceVersion: "651"uid: dadce046-d673-11e5-8cd0-68f728db1985
data:special.how: veryspecial.type: charm

ConfigMap_111">2.4 基于生成器创建ConfigMap

你还可以基于生成器(Generators)创建 ConfigMap,然后将其应用于集群的 API 服务器上创建对象。 生成器应在目录内的 kustomization.yaml 中指定。

#基于 configure-pod-container/configmap/game.properties 文件生成一个 ConfigMap
#创建包含 ConfigMapGenerator 的 kustomization.yaml 文件
cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: game-config-4labels:game-config: config-4files:- configure-pod-container/configmap/game.properties
EOF

这里感觉坑爹了,跟着官方文档操作出错了。。。。

https://access.crunchydata.com/documentation/postgres-operator/latest/tutorials/day-two/monitoring

我们随便选取一种方式更新一下 kustomize 到最新版的 v5.4.3,发现依然报错,猜测可能是kubectl与 kustomize 版本兼容性问题,先跳过吧,不影响学习,不用一直在这里纠结

3. 临时清理

kubectl delete configmap special-config
kubectl delete configmap env-config
kubectl delete configmap -l 'game-config in (config-4,config-5)

ConfigMap_136">4. ConfigMap的使用

ConfigMap__137">4.1 使用 ConfigMap 数据定义容器环境变量

使用单个 ConfigMap 中的数据定义容器环境变量

#在 ConfigMap 中将环境变量定义为键值对
kubectl create configmap special-config --from-literal=special.how=very#将 ConfigMap 中定义的 special.how 赋值给 Pod 规约中的 SPECIAL_LEVEL_KEY 环境变量
#pods/pod-single-configmap-env-variable.yaml
apiVersion: v1
kind: Pod
metadata:name: dapi-test-pod
spec:containers:- name: test-containerimage: registry.k8s.io/busybox:1.27.2#image: registry.k8s.io/busyboxcommand: [ "/bin/sh", "-c", "sleep 3600" ]#command: [ "/bin/sh", "-c", "env" ]env:# 定义环境变量- name: SPECIAL_LEVEL_KEYvalueFrom:configMapKeyRef:# ConfigMap 包含你要赋给 SPECIAL_LEVEL_KEY 的值name: special-config# 指定与取值相关的键名key: special.howrestartPolicy: Never#创建 Pod,这里创建时拉取镜像失败,我我改了下配置,拉取 busybox:1.27.2后OK
kubectl create -f https://kubernetes.io/examples/pods/pod-single-configmap-env-variable.yaml
#kubectl create -f pod-single-configmap-env-variable.yaml#kubectl describe pod dapi-test-pod 显示如下 -> OK
Containers:test-container:...Environment:SPECIAL_LEVEL_KEY:  <set to the key 'special.how' of config map 'special-config'>  Optional: false

ConfigMap_178">4.2 使用多个ConfigMap定义容器环境变量

#configmap/configmaps.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: special-confignamespace: default
data:special.how: very
---
apiVersion: v1
kind: ConfigMap
metadata:name: env-confignamespace: default
data:log_level: INFO#pods/pod-multiple-configmap-env-variable.yaml   
apiVersion: v1
kind: Pod
metadata:name: weiheng-dapi-test-pod
spec:containers:- name: test-containerimage: registry.k8s.io/busybox:1.27.2#command: [ "/bin/sh", "-c", "env" ]command: [ "/bin/sh", "-c", "sleep 3600" ]env:- name: SPECIAL_LEVEL_KEYvalueFrom:configMapKeyRef:name: special-configkey: special.how- name: LOG_LEVELvalueFrom:configMapKeyRef:name: env-configkey: log_levelrestartPolicy: Never#创建pod
kubectl create -f pod-multiple-configmap-env-variable.yaml  
#进去后查看
kubectl exec -it weiheng-dapi-test-pod -- /bin/sh#kubectl describe pod dapi-test-pod 可看到环境变量如下
Environment:SPECIAL_LEVEL_KEY:  <set to the key 'special.how' of config map 'special-config'>  Optional: falseLOG_LEVEL:          <set to the key 'log_level' of config map 'env-config'>        Optional: false#删除pod
kubectl delete pod dapi-test-pod --now

进入容器后打印变量
在这里插入图片描述
容器退出后查看
在这里插入图片描述

ConfigMap__238">4.3 在Pod 命令中使用 ConfigMap 定义的环境变量

apiVersion: v1
kind: Pod
metadata:name: dapi-test-pod
spec:containers:- name: test-containerimage: registry.k8s.io/busybox:1.27.2command: [ "/bin/echo", "$(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]env:- name: SPECIAL_LEVEL_KEYvalueFrom:configMapKeyRef:name: special-configkey: SPECIAL_LEVEL- name: SPECIAL_TYPE_KEYvalueFrom:configMapKeyRef:name: special-configkey: SPECIAL_TYPErestartPolicy: Never

ConfigMap__262">4.4 将 ConfigMap 数据添加到一个卷中

#创建
#kubectl create -f https://kubernetes.io/examples/configmap/configmap-multikeys.yaml  
#更新
#kubectl apply -f https://kubernetes.io/examples/configmap/configmap-multikeys.yaml  #pods/pod-configmap-volume.yaml 
apiVersion: v1
kind: Pod
metadata:name: weiheng2-dapi-test-pod
spec:containers:- name: test-containerimage: registry.k8s.io/busybox:1.27.2command: [ "/bin/sh", "-c", "ls /etc/config/" ]volumeMounts:- name: config-volumemountPath: /etc/configvolumes:- name: config-volumeconfigMap:# 提供包含要添加到容器中的文件的 ConfigMap 的名称name: special-configrestartPolicy: Never#创建POD  
kubectl create -f pod-configmap-volume.yaml
kubectl exec -it weiheng2-dapi-test-pod -- /bin/sh

在这里插入图片描述

4.5 配置文件热更新

#我把这个文件拿到本地来修改一下
wget https://kubernetes.io/examples/configmap/configmap-multikeys.yaml  #我把 very 改为 fantastic
apiVersion: v1
kind: ConfigMap
metadata:name: special-confignamespace: default
data:SPECIAL_LEVEL: fantastic#SPECIAL_LEVEL: verySPECIAL_TYPE: charm

在这里插入图片描述
热更新OK


http://www.ppmy.cn/devtools/99062.html

相关文章

汽车功能安全--AutoSAR中的功能安全机制

目录 1. Memory Partitioning 2. Timing\Excute Monitor 3. E2E 4.小结 大家好&#xff0c;这里是高温下认真码字的肌肉&#xff1b;许久没有聊中间件的问题&#xff0c;正巧可能要启动SafetyPack的开发&#xff0c;因此今天回顾回顾在AUTOSAR文档中关于Safety的一些机制。…

二叉树练习

1.认识树 树的根节点及其子树&#xff0c;都是相对的概念。在任何一棵树中都有一个根节点&#xff0c;而这棵树本身又可以是别的树的子树。树的基本概念有&#xff1a; A)双亲和孩子&#xff1a;一个节点的后继节点被称为该节点的孩子&#xff0c;该节点称为这些孩子的双亲。…

【微服务】Nacos配置中心和客户端数据同步模式

一、Nacos概述 Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它提供了一组简单易用的特性集&#xff0c;帮助用户快速实现动态服务发现、服务配置、服务元数据及流量管理。 二、数据同步模式 1. 实时同步 Push模式&#xff1a;在服务端的配置信…

leetcode_59. 螺旋矩阵 II

59. 螺旋矩阵 II 题目描述&#xff1a;给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a;​ 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2&…

[Matsim]Matsim学习笔记-drt场景中车辆调度的学习

学习需求 在用matsim实现交通流模拟drt场景时&#xff0c;遇到这样一个问题&#xff1a;车辆接送完乘客后&#xff0c;在没有新的订单之前&#xff0c;车辆一直停在最后一个停靠点上&#xff0c;这样车辆的利用率会较低&#xff0c;想实现一个送完最后一个乘客后&#xff0c;车…

【最经典的79个】软件测试面试题(内含答案)

001.软件的生命周期(prdctrm) 计划阶段(planning)-〉需求分析(requirement)-〉设计阶段(design)-〉编码(coding)->测试(testing)->运行与维护(running maintrnacne) 测试用例 用例编号 测试项目 测试标题 重要级别 预置条件 输入数据 执行步骤 预期结果 0002.问&…

VBA技术资料MF185:图片导入Word添加不同格式说明文字

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

探索TensorFlow:深度学习的未来

标题&#xff1a;探索TensorFlow&#xff1a;深度学习的未来 在当今快速发展的人工智能领域&#xff0c;TensorFlow无疑是最耀眼的明珠之一。TensorFlow是由Google Brain团队开发的一个开源机器学习框架&#xff0c;它以其强大的灵活性、易用性和高效的性能&#xff0c;迅速成…