K8S | Config应用配置
绕不开的Config配置;
一、背景
在自动化流程中,对于一个应用来说,从开发阶段的配置管理,到制作容器镜像,再到最后通过K8S集群发布为服务,整个过程涉及到的配置非常多;

应用环境:通常是指代码层面的依赖配置,以常用的Nacos来说,通常会涉及框架、组件、自定义等几个层面的配置管理;
运行环境:以微服务架构来说,实际环境中需要管理多个应用的服务发布,在整个过程中必然会存在很多配置的管理,比如应用的资源分配、不同环境交互时的身份认证、敏感信息的安全管理等;
不论是应用还是运行层面的配置,都会涉及到一个基本的逻辑:配置可以抽取出来单独管理,在流程中直接引入该配置即可;
二、ConfigMap
ConfigMap用来将非机密性的数据保存到键值对中,Pod可以将其用作环境变量、命令行参数或者存储卷中的配置文件,会将环境配置信息和容器镜像解耦,便于应用配置的修改;
1、创建
ConfigMap中data字段用来保存UTF-8字符串,binaryData用来保存二进制数据作为base64编码的字串;
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config-map
namespace: default
data:
active: test
started: hello
program: world
创建【ConfigMap】
kubectl apply -f app-config-map.yaml
查看【ConfigMap】
kubectl get cm/app-config-map -o yaml
K8S界面查看【ConfigMap】

2、使用
用法一:使用「app-config-map」中的值来配置【Pod】,在env中定义多个环境变量,但是值从ConfigMap中读取;
apiVersion: v1
kind: Pod
metadata:
name: auto-client-one
spec:
containers:
- name: auto-client
image: auto-client:1.1.3
imagePullPolicy: Never
ports:
- containerPort: 8079
env:
- name: DATA_ACTIVE
valueFrom:
configMapKeyRef:
name: app-config-map
key: active
- name: DATA_STARTED
valueFrom:
configMapKeyRef:
name: app-config-map
key: started
- name: DATA_PROGRAM
valueFrom:
configMapKeyRef:
name: app-config-map
key: program
创建【Pod】
kubectl create -f auto-client-one.yaml
用法二:在【Pod】配置中,直接使用envFrom引入「app-config-map」,从而完成环境变量的设置;
apiVersion: v1
kind: Pod
metadata:
name: auto-client-two
spec:
containers:
- name: auto-client
image: auto-client:1.1.3
imagePullPolicy: Never
ports:
- containerPort: 8079
envFrom:
- configMapRef:
name: app-config-map
查看环境变量
# 1、执行该命令
kubectl exec -it auto-client-one -- bash
# 2、输入命令:env
env
# 3、打印的环境变量,只留下【app-config-map】配置的参数
DATA_ACTIVE=test
DATA_PROGRAM=world
DATA_STARTED=hello
# 4、查看【DATA_STARTED】的变量值
echo $DATA_STARTED
在【auto-client:1.1.3】容器镜像中,添加了一个输出环境变量的定时任务,通过查看运行日志,可以看到相关配置会被代码正确读取;
@Component
public class PrintEnvJob {
private static final Logger LOG = LoggerFactory.getLogger(PrintEnvJob.class.getName()) ;
@Scheduled(fixedDelay = 60000)
public void systemData () {
Map<String,String> envMap = System.getenv();
for (Map.Entry<String, String> entry:envMap.entrySet()){
String key = entry.getKey();
String value = entry.getValue();
LOG.info("【key:{},value:{}】",key,value);
}
}
}
【auto-client-one】日志输出

【auto-client-two】日志输出

注意事项
- ConfigMap在设计上不是用来保存大量数据的,因此保存的数据不可超过
1MiB; - ConfigMap并不提供保密或者加密功能,如果存储的数据是机密的,可以使用Secret对象,或者使用其它方式确保数据的私密性;
- ConfigMap中可以通过将
immutable字段设置为true创建不可变更的配置,如果要修改只能删除后重建;
三、Secret
Secret是一种包含少量敏感信息例如密码、令牌或密钥的对象,这样的信息可能会被放在Pod规约中或者镜像中,使用Secret意味着不需要在应用程序代码中包含敏感数据;
1、创建
将【auto-client:1.1.3】镜像推送到云端的docker私有仓库里,并且删除本地相关镜像,测试下面的流程;

这里以最常见的镜像拉取场景来说,通常容器镜像文件是放在私有的云端仓库,K8S在访问时需要提供身份证明,可以通过Secret配置来处理该场景;
kubectl create secret docker-registry 【secret名称】 --docker-server=【仓库地址】 --docker-username=【用户名】 --docker-password=【密码】 --namespace=【命名空间】 -o yaml > cloud-registry-secret.yaml
2、使用
在上面配置了镜像拉取的Secret对象,在Pod层面使用imagePullSecrets来引用该对象,当从私有仓库拉取容器镜像时,节点上的kubelet能够完成与镜像仓库的身份认证;
apiVersion: apps/v1
kind: Deployment
metadata:
name: auto-client-deployment
labels:
app: auto-client
spec:
replicas: 1
selector:
matchLabels:
app: auto-client
template:
metadata:
labels:
app: auto-client
spec:
imagePullSecrets:
- name: cloud-registry-secret
containers:
- name: auto-client
image: 【仓库地址】/auto-client:1.1.3
imagePullPolicy: Always
ports:
- containerPort: 8079
注意事项
- 默认情况下Secret未加密地存储在
etcd中,任何拥有权限的用户都可以检索或修改Secret信息; - 每个Secret的大小最多为
1MiB,施加这一限制是为了避免用户创建非常大的Secret,进而导致API服务器和kubelet内存耗尽;
四、Pod与容器
在定义Pod时可以选择性地为每个容器设定所需要的资源数量,最常见的可设定资源是CPU和内存大小,或者其他类型的资源,这样有利于调度器给Pod选择合适的节点;
apiVersion: apps/v1
kind: Deployment
metadata:
name: auto-client-rs-deployment
labels:
app: auto-client
spec:
replicas: 1
selector:
matchLabels:
app: auto-client
template:
metadata:
labels:
app: auto-client
spec:
containers:
- name: auto-serve
image: auto-client:1.1.3
imagePullPolicy: Never
ports:
- containerPort: 8079
resources:
requests:
cpu: "250m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "256Mi"
注意事项
- CPU和内存统称为计算资源,计算资源的数量是可测量的,可以被请求、被分配、被消耗;
requests为容器指定资源需求,limits为容器设置资源限制;- 如果Pod运行所在节点有足够的可用资源,容器可以使用超出对应资源
request属性所设置的资源量,但是不可以使用超出其资源limit属性所设置的资源量;
五、参考源码
文档仓库:
https://gitee.com/cicadasmile/butte-java-note
脚本仓库:
https://gitee.com/cicadasmile/butte-auto-parent
K8S | Config应用配置的更多相关文章
- Spring Cloud Config整合Spring Cloud Kubernetes,在k8s上管理配置
1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Kubernetes有专门的ConfigMap和Secret来管理配置,但它也有一些局限性,所以还是希望通过Spring C ...
- K8s nginx-ingress 如何配置二级目录转发远程静态服务器基于Vue路由history模式打包的应用程序
背景 首先这标题有点绕,我先解释下: 首先我们有静态服务器,上面某个目录有Vue路由history模式打包的应用程序(也就是build后的产物): 但是静态服务器一般不做对外域名用的,我们需要在k8s ...
- JMeter学习-010-JMeter 配置元件实例之 - CSV Data Set Config 参数化配置
众所周知,在进行接口测试的过程中,需要创建不同的场景(不同条件的输入,来验证不同的入参的返回结果).因而,在日常的自动化接口监控或商品监控等线上监控过程中,需要配置大量的入参来监控接口的返回是否正确. ...
- membership 在web.config中配置信息
<?xml version="1.0" encoding="utf-8"?><configuration> <configSect ...
- c# MVC在WEB.Config中配置MIME
在IIS中,默认没有添加.json格式的MIME,所有无法读取服务器中的.json格式的文件,返回结果404 方式一:在IIS中手动添加MIME 1.点击MIME进入MIME列表 2.添加MIME 3 ...
- HttpModule在Web.config的配置和动态配置
学习笔记 ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后, ...
- c#与vb.net在App_Code里面编译要通过,需要以下web.config的配置
web.config的配置: <system.web> <codeSubDirectories> <add directoryName="VB"/&g ...
- asp.net 多个域名重定向,在web.Config中配置
一个网站有多个域名,但是需要在访问其中某个域名之后跳转到另一域名. Web.config 中配置 </system.webServer> <!--重定向 域名 开始--> &l ...
- Web.Config Transformation配置灵活的配置文件
使用Web.Config Transformation配置灵活的配置文件 发布Asp.net程序的时候,开发环境和发布环境的Web.Config往往不同,比如connectionstring等.如果常 ...
- web.config中配置数据库(多数据)连接的两种方式
这是我的第一篇文章,既然是第一篇了,那就从最基础的只是说起--web.config中配置数据库连接. 网上有很多这方面的资料,但发现并没有一篇从头到位很清楚明了说完的,今天就把我的整理写在这里吧. 在 ...
随机推荐
- Swift WisdomProtocol 面向协议编程(下)
WisdomProtocol 面向协议编程(下) @[TOC] WisdomProtocol SDK 面向协议编程 # Welcome to use WisdomProtocol WisdomProt ...
- 2023-04-29:一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。 给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 由于答案可能非常大,请返回对 109
2023-04-29:一个序列的 宽度 定义为该序列中最大元素和最小元素的差值. 给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 由于答案可能非常大,请返回对 109 ...
- 2023-03-21:音视频解混合(demuxer)为MP3和H264,用go语言编写。
2023-03-21:音视频解混合(demuxer)为MP3和H264,用go语言编写. 答案2023-03-21: 步骤1:安装github.com/moonfdd/ffmpeg-go go get ...
- 2022-11-12:以下rust语言代码中,结构体S实现了crate::T1::T2的方法,如何获取方法列表?以下代码应该返回[“m1“,“m2“,“m5“],顺序不限。m3是S的方法,但并不属于c
2022-11-12:以下rust语言代码中,结构体S实现了crate::T1::T2的方法,如何获取方法列表?以下代码应该返回["m1","m2"," ...
- 2022-07-27:小红拿到了一个长度为N的数组arr,她准备只进行一次修改, 可以将数组中任意一个数arr[i],修改为不大于P的正数(修改后的数必须和原数不同), 并使得所有数之和为X的倍数。
2022-07-27:小红拿到了一个长度为N的数组arr,她准备只进行一次修改, 可以将数组中任意一个数arr[i],修改为不大于P的正数(修改后的数必须和原数不同), 并使得所有数之和为X的倍数. ...
- vue全家桶进阶之路33:Vue3 计算属性computed
在Vue3中,计算属性可以使用computed函数来定义. computed函数接受两个参数:第一个参数是一个函数,该函数返回计算属性的值:第二个参数是一个可选的配置对象,可以包含getter和set ...
- kali系统安装redis步骤
环境: 攻击机:Kali 5.16.0-kali7-amd64 192.168.13.78 靶机: Kali 5.16.0-kali7-amd64 192.168.13.94 安装 ...
- [MAUI]模仿Chrome下拉标签页的交互实现
@ 目录 创建粘滞效果的圆控件 贝塞尔曲线绘制圆 创建控件 创建形变 可控形变 形变边界 形变动画 创建手势控件 创建页面布局 更新拖拽物位置 其它细节 项目地址 今天来说说怎样在.NET MAUI中 ...
- 新风向标:学术界开始从 Python 转向 Rust
作者 | Jeffrey M. Perkel 策划 | Tina 来源 | Rust语言中文社区 Rust 现在已经越来越受到科学家们的欢迎了,比起 Python,Rust 有着更高效的性能,同时在社 ...
- 大家都说Java有三种创建线程的方式!并发编程中的惊天骗局!
在Java中,创建线程是一项非常重要的任务.线程是一种轻量级的子进程,可以并行执行,使得程序的执行效率得到提高.Java提供了多种方式来创建线程,但许多人都认为Java有三种创建线程的方式,它们分别是 ...