分享一个最近在排查的问题:
k8s的 secret 或 configmap 对象,如果 key 名称是带【.】的,比如【a.b.c 、db.host】这种名称,注入到POD后,使用env等命令查看不到变量名称
 
命令中 k=kubelet 
1、srcret 对象内容

[root@test-4 1]# k describe secret mysecret
...
Data
====
a.b.c: 9 bytes
pass: 12 bytes
user: 5 bytes

2、POD配置文件,ENV 引用 mysecret 对象。

apiVersion: v1
kind: Pod
metadata:
name: app
spec:
containers:
- envFrom:
- secretRef:
name: mysecret
- configMapRef:
name: czg-configmap
name: helloworld
image: registry.ap-southeast-5.aliyuncs.com/czg_namespace/helloworld:v2
 
2、进入POD查看环境环境
[root@test-4 1]# k exec -it app sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. # env | grep 'a.b.c'
#

3、开始排查

尝试使用 setenv 、export 等查看变量的命令,都不显示 'a.b.c' 这种环境变量名称。

后来以为是云厂商之间差的异,在阿里云和AWS测试,都有这个问题。

经过网上的搜索,k8s 对 'a.b.c' 这种带点的变量名称底层调用的是 【setenv】函数,
参考:https://robberphex.com/envvars-limitation/
 
通过此函数并不能添加或修改 shell 进程的环境变量,或者说通过setenv函数设置的环境变量只在本进程,而且是本次执行中有效。
也就是只针对 POD 中的进程有效,shell 登入POD后,看不到这种环境变量。
参考:https://blog.csdn.net/qq_41595735/article/details/90239159
 
4、验证
为了验证网上的结论,写了一小段 python 程序,打印当前环境变量;打成镜像部署到K8S环境中,python程序可以正常看到 'a.b.c' 环境变量。
 
 

python核心代码:
from flask import Flask
import socket
import os app = Flask(__name__) @app.route('/')
def hello():
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>"
return html.format(name=os.environ, hostname=os.getenv('a.b.c')) if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)

secret或configmap对象key名称带点,env命令不显示分析的更多相关文章

  1. javascript获取json对象的key名称的两种方法

    javascript获取json对象的key名称的两种方法 数据处理中,你可能接收到一个不确定内容格式的json对象,然后要把key的值提取出来.今天试过两种可以提取json key的方法,均可以正常 ...

  2. java 22 - 5 多线程之获取和设置线程对象的名称

    如何获取线程对象的名称呢? public final String getName():获取线程的名称.如何设置线程对象的名称呢? public final void setName(String n ...

  3. day 23 对象的名称空间 类,对象属性和方法 封装 接口提供

    一.对象的特有名称空间 # 对象独有的名称空间:在产生对象时就赋初值 '''class ted: def func(): 当func里不存在参数时,调用时不需要给值 print('hah')ted.f ...

  4. Python 入门基础10 --函数基础3 函数对象、名称空间、装饰器

    今日内容 1.函数对象 2.名称空间与作用域 3.函数的嵌套调用与闭包 4.装饰器 一.函数对象 1.1 定义 函数名存放的就是函数地址,所以函数名也就是对象,称之为函数对象 1.2 函数对象的应用 ...

  5. python基础之类和对象、对象之间的交互、类名称空间与对象/实例名称空间

    一 面向对象初识 Python要么是面向过程要么是面向对象. 概念及优缺点: 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东 ...

  6. Kubernetes的ConfigMap对象使用

    ConfigMap和Secret几乎一样,只是Secret会用base64加密,创建方式也可以彩yaml或者文件方式 下面演示一下通过文件创建configmap 创建配置文件my.yaml name: ...

  7. js for in对象key排序

    最近遇到一个比较奇葩的事情,for in 循环的时候,如果对象key 默认可以转化为整数,会把key转化为整数排序. code: 运行结果 大家看到data2的key默认顺序是"2" ...

  8. Java获取线程的对象和名称

    /*获取线程对象以及名称(很有意义的) 原来线程都有自己默认的名称Thread-编号  该编号从0开始 Thread 父类的方法static  Thread currentThread() :获取当前 ...

  9. jQuery获取当前对象标签名称

    获取当前对象标签名称 $(".classname")[0].tagName;

  10. python基础——类名称空间与对象(实例)名称空间

    python基础--类名称空间与对象(实例)名称空间 1 类名称空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类的良好总属性:数据属性和函数属性 其中类 ...

随机推荐

  1. Nginx基础02:配置文件nginx.conf(Part1)

    我们使用Nginx主要是通过其配置文件nginx.conf来实现的.按照一定的规则,编写特定的指令,可以帮助我们实现对Web服务的控制!所以,学习Nginx的用法,几乎就是学习nginx.conf! ...

  2. JZOJ 3479. 工作安排

    \(\text{solution}\) 比较显然的 \(dp\) 顺序既然无所谓,那为了方便处理贡献,就先排个序 然后设 \(f_i\) 表示分到前 \(i\) 个的最小工资 则 \(f_i=C+f_ ...

  3. Java面向对象进阶第一天

    面向对象高级第一天 static关键字 是静态的意思,可以修饰成员变量,也可以修饰成员方法 成员变量的分类 静态成员变量 有static修饰,属于类,与类一起加载,内存中只有一份,可以被共享访问. 什 ...

  4. MySQL数据类型补充

    数据类型 整数数据类型 特殊说明: ​ 对于整数类型,MySQL还支持在类型名称后面加小括号(M),而小括号中的M表示显示宽度,M的取值范围是(0, 255).int(M)这个M在字段的属性中指定了u ...

  5. ACR20新闻_RA指南更新_最大化应用MTX

    美国风湿病学院(ACR)学术年会2020新闻 译自Medscape官网 https://www.medscape.com/viewarticle/940636#vp_1 (注: 译文借助谷歌翻译助手, ...

  6. 记一次oracle单表改分区表 一波三折

    业务上要把单表还差分区表 ```SQL> @seg gwx.aopen SEG_MB OWNER SEGMENT_NAME SEG_PART_NAME SEGMENT_TYPE SEG_TABL ...

  7. 多个module的verilog文件分割为多个文件

    python 分割含有多个module的verilog文件,按照module名来命名文件 import re # 读取 Verilog 文件 with open('test.v', 'r') as f ...

  8. [C#]问号?和双问号??

    [C#]问号?和双问号?? 如何使用 问号?表示该变量可以为空 int?; 等价于:int? = null; 双问号??表示如果为双问号左边的变量为null,则取右边的值,否则取左边变量的值 c=a? ...

  9. []Linux 离线升级Openssh与Openssl版本

    https://blog.csdn.net/qq_45728838/article/details/120825845 离线的意思是为Linux无法链接网络,只能通过windows 将文件上传一.首先 ...

  10. 四点DLT (Direct Linear Transformation) 算法

    \(\mathrm{x}_{i}\) 表示变化前的齐次坐标 \(\mathbf{x}_{i}^{\prime}\) 表示变化后的齐次坐标 我们需要求到一个 \(3\times3\) 的变换矩阵 \(\ ...