分享一个最近在排查的问题:
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. 开源免费视频会议Jitsi-meet介绍

    Jitsi Meet 是基于WebRTC技术的开源语音.视频会议和即时消息服务 Jitsi 集合的一部分.通过 Jitsi Meet,你可以即刻主持群组视频通话(即视频会议),你甚至都不需要建立帐户. ...

  2. Quartz.Net 主要概念介绍和吐槽

    我们经常遇到需要定时执行某些任务的情况,比如清理缓存.异步结果轮询等,如果不打算造轮子,那么选择一款合适的定时任务组件就很关键了.所幸,.Net 世界中的选项并不多:) 选型 主要有以下四款: Qua ...

  3. Sonarqube安装(Docker)

    一,拉取相关镜像并运行 # 拉取sonarqube镜像 docker pull sonarqube:9.1.0-community 在运行之前要提前安装postgres并允许,新建数据库名为sonar ...

  4. 实现 JSON 高亮

    JSON 转换 HTML function formatJson(json) { let regexp = /("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"]) ...

  5. Socket:由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作

    https://blog.csdn.net/weixin_45932157/article/details/113999801 最近服务器的Socket代理软件经常报这个错误:log:Error On ...

  6. ubutu22.04开启ssh配置

    1.查看ubuntu版本信息 lsb_release -a 2.更新系统 sudo apt update && sudo apt upgrade -y 如果出现Ign:1 ...InR ...

  7. Altium Designer Winter 09 — 01 — 快速创建项目

    新建项目 新建原理图 导入所需的库 添加元器件和接插件 连接导线 自动标注.修改元件属性 编译前--修改项目属性 编译,查看消息 生成网表.BOM.简易BOM,打印文件

  8. 2021年全国II巻高考作文刚刚认真看了一下发现很经典,用漫画书法的形式告诉做人的道理!!!说说自己的想法

    我觉得做人就应该做到这三句话: 1.逆风起笔 藏而不露    ---- 懂得在逆境中潜行 2.中锋用笔 不偏不倚   ---- 做人要正直  不要走歪路 3.停滞迂回  缓缓出头 --   借喻青年人 ...

  9. 获取select的选中的值

    var select = document.getElementById("sec")//获取元素 var idx = select.selectedIndex;//获取当前选中的 ...

  10. 浅谈spark

    spark spark是一个开源分布式计算框架,在于让计算更加快速,通常使用资源调度器yarn和spark自带的资源调度器standalond进行调度,spark相对于Hadoop更加快速,基于它是内 ...