解锁环境变量在云原生应用中的各种姿势

应用程序在某些时刻总是需要一些外挂配置,云原生应用的实践是在容器化之前就将应用程序配置保留在代码之外。

12-Factors App:Store config in the environment

① 外挂配置文件:业务配置 appsettings.json

“可以在代码中要求加载appsetting.serect.json配置文件,但是不加入代码版本管理==>敏感信息分离。

② 环境变量:

  • 单条业务配置(API_URL_PREFIX)

  • 框架配置(ASPNETCORE_ENVIRONMENT=Production)

  • 部署配置(Tag=v1.2)

  • 敏感信息(AppId,AppAuthIssuer,AppSerect)

环境变量

现代操作系统均支持存储key-value环境变量,所有程序都能从OS获取特定环境变量。

ASP.NET Core默认脚手架:环境变量配置在第4位置插入

IConfiguration会拷贝环境变量键值对,后续同名配置会覆盖之前同名配置值,但是环境变量本身不会变化。
public static string? GetEnvironmentVariable(string variable);

环境变量来自三个级别:进程、用户、系统

 // Specifies the location where an environment variable is stored or retrieved in  a set or get operationpublic enum EnvironmentVariableTarget{Process = 0,User = 1,Machine = 2}

介绍几种创建环境变量的方式:

  1. windows:在CMD/Powershell setx命令设置永久环境变量;
    linux:使用export命令设置会话级别环境变量,修改bash_profile文件设置系统级别环境变量

windows电脑还可以在-[我的电脑]-[高级设置]-[环境变量]操作

  1. 在Visual Studio IDE launchsettings.json 设置进程级别环境变量

{"profiles": {"Gridsum.EAP.Web": {"commandName": "Project","launchBrowser": false,"environmentVariables": {"ASPNETCORE_ENVIRONMENT": "production""IsAuthEnabled": "true",},"applicationUrl": "https://localhost:5002;http://localhost:5001/"}}
}

Visual Studio Code 设置环境变量

{"version": "0.1.0","configurations": [{"name": ".NET Core Launch (web)","type": "coreclr","env": {"ASPNETCORE_ENVIRONMENT": "Development"}}]
}
  1. 若使用IIS托管 ASP.NET CORE,可在IIS[配置编辑器]新增、重写环境变量

IIS配置会落地到web.config 文件

Docker 环境变量

Docker-Compose有多重方式为容器设置环境变量,按照优先级如下:

  1. environment配置节写入

  2. 通过shell传入环境变量

  3. env_file配置节加载环境变量文件

①  文件中的环境变量并不会自动应用到容器,需要在Compose yml文件中以${}引用
docker-compose命令默认从命令执行的同一目录寻找.env文件

  1. 在Dockerfile内置环境变量
    ASP.NETCore3.1 Runtime镜像作为基础镜像的应用, 会发现应用使用Production配置80端口提供服务。

基础镜像Dockerfile内置:
ENV ASPNETCORE_ENVIRONMENT=Production
ENV ASPNETCORE_URLS=http://+:80
ENV DOTNET_RUNNING_IN_CONTAINER=true

高优先级会覆盖低优先级环境变量值。

下面的例子:shell传递的环境变量值覆盖了.env文件同名环境变量。

$ cat .env
TAG=v1.5$ cat docker-compose.yml
version: '3'
services:web:image: "webapp:${TAG}"
# 启动容器,web服务使用 webapp:v1.5的镜像
$ docker-compose configversion: '3'
services:web:image: 'webapp:v1.5'
$ export TAG=v2.0
$ docker-compose configversion: '3'
services:web:image: 'webapp:v2.0'

Kubernetes 环境变量

你可以为运行在Pod中的容器设置环境变量,利用envenvFrom配置节。

  1. env配置节

apiVersion: v1
kind: Pod
metadata:name: envar-demolabels:purpose: demonstrate-envars
spec:containers:- name: envar-demo-containerimage: anjia0532/google-samples.node-hello:1.0env:- name: DEMO_GREETINGvalue: "Hello from the environment"- name: DEMO_FAREWELLvalue: "Such a sweet sorrow"

进入Pod, 打印环境变量(kubectl exec envar-demo -- printenv):

NODE_VERSION=4.4.2
EXAMPLE_SERVICE_PORT_8080_TCP_ADDR=10.3.245.237
HOSTNAME=envar-demo
...
DEMO_GREETING=Hello from the environment
DEMO_FAREWELL=Such a sweet sorrow

  1. envFrom配置节
    先创建configmap(作为配置来源)

apiVersion: v1
kind: ConfigMap
metadata:name: special-confignamespace: default
data:SPECIAL_LEVEL: verySPECIAL_TYPE: charm

kubectl create -f configmap-multikeys.yaml

apiVersion: v1
kind: Pod
metadata:name: dapi-test-pod
spec:containers:- name: test-containerimage: anjia0532/busyboxcommand: [ "/bin/sh", "-c", "env" ]envFrom:- configMapRef:name: special-configrestartPolicy: Never

kubectl create -f pod-configmap-envFrom.yaml

现在Pod的输出环境变量SPECIAL_LEVEL=very , SPECIAL_TYPE=charm

使用env,envFrom配置节设置的环境变量会覆盖镜像内环境变量。

????????


- 环境变量的变更,需要重启应用。
- 环境变量在小范围内使用很方便,当您具有更复杂的配置方案时,应该选择其他数据注入方式,例如外挂文件。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python字符串截取方法_如何使用python语言中的字符串方法截取字符串

在我们使用python语言中的字符串方法时,可能会判断某个字符串是否以什么开头,可以使用什么进行截取等。下面利用几个实例说明字符串中的方法的用法,操作如下:工具/原料 python 截图工具 方法/步骤 1 第一步,打开python…

数据结构——二叉树的层次遍历

问题描述: 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 示例: 二叉树:[3,9,20,null,null,15,7] 返回其层次遍历结果: [ [3], [9,…

asp.net core 使用 TestServer 来做集成测试

asp.net core 使用 TestServer 来做集成测试Intro之前我的项目里的集成测试是随机一个端口,每次都真实的启动一个 WebServer,之前也有看到过微软文档上 TestServer 的介绍,当时没仔细看过以为差不多就没用,一直是启动了一个真正的…

python os system_python中os. popen system的区别

python调用Shell脚本或者是调用系统命令,有两种方法: os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,正确会返回0,错误会返回其他数字。 后者的返回值是脚本执行过程中的输出内容。实际使用时视需求情况而选择。 p…

android 文件 c语言 jni,Android jni 调用的so文件一个函数的反汇编 高手来看看

[Asm] 纯文本查看 复制代码var_104 -0x104var_A0 -0xA0var_48 -0x48var_34 -0x34var_2C -0x2Cvar_28 -0x28STMFD SP!, {R4-R11,LR}LDR R8, (_GLOBAL_OFFSET_TABLE_ - 0x2B34)LDR R11, (__stack_chk_guard_ptr - 0xA104)SUB SP, SP, #0xE4ADD R8, PC, R8LDR R3, [R8,R11]ADD R4,…

数据结构——交换左右子树

递归——层次遍历—交换左右子树算法 思路&#xff1a; 与先序递归遍历类似 1如果有子树&#xff0c;交换这个节点的左右子树&#xff08;和交换两个变量的值一样&#xff09; 2再递归这个节点的左子树&#xff0c;右子树&#xff1b; #include<stdio.h> #include<b…

python人工智能面试题_人工智能面试题分享(含答案)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1、深度学习框架TensorFlow中有哪四种常用交叉熵&#xff1f; 答&#xff1a; tf.nn.weighted_cross_entropy_with_logits tf.nn.sigmoid_cross_entropy_with_logits tf.nn.softmax_cross_entropy_with_logits tf.nn.sparse_softm…

微服务很香--麻辣味,但要慢慢消化

前言微服务在编程圈火的是不行不行的啦&#xff0c;可能还有很多小伙伴还没有进行微服务实操&#xff0c;但这个词&#xff0c;要说没听过、没看过&#xff0c;那小伙伴一定是假Programmer。虽然微服务很火&#xff0c;但不能盲目使用&#xff1b;先不说涉及技术和工具有多少&a…

c语言实现灰度图像阈值分割,灰度图像--图像分割 阈值处理之平均阈值

学习DIP第52天转载请标明本文出处&#xff1a;http://blog.csdn.net/tonyshengtan &#xff0c;出于尊重文章作者的劳动&#xff0c;转载请标明出处&#xff01;文章代码已托管&#xff0c;欢迎共同开发&#xff1a;https://github.com/Tony-Tan/DIPpro开篇空话好久没写博客了&…

数据结构——二叉树的双序遍历

设计二叉树的双序遍历算法(双序遍历是指对于二叉树的每一个结点来说,先访问这个结 点,再按双序遍历它的左子树,然后再一次访问这个结点,接下来按双序遍历它的右子树 思路&#xff1a; 1.双序遍历与中序遍历类似&#xff0c;是中序遍历的变形 2.中序遍历是指对于二叉树的每一…

python如何封装成可调用的库_Python实现打包成库供别的模块调用

1.创建python项目bricewulib2.新建test_package包并创建info1类以及print_hello方法3.为了让包的结构再复杂点&#xff0c;我们再在test_package下面新建一个test_package2包并创建Info2类以及print_hello2方法&#xff08;注意&#xff1a;这里是Info2&#xff0c;不是上面的I…

从零开始实现 ASP.NET Core MVC 的插件式开发(九) - 如何启用预编译视图

标题&#xff1a;从零开始实现 ASP.NET Core MVC 的插件式开发(九) - 升级.NET 5及启用预编译视图作者&#xff1a;Lamond Lu地址&#xff1a;https://www.cnblogs.com/lwqlun/p/13992077.html源代码&#xff1a;https://github.com/lamondlu/Mystique适用版本&#xff1a;.NET…

android arp工具,GitHub - SummerSnow274/ARP_sed_rev: 在Android通过ARP询问实现获取同一网络所有设备的MAC地址,AP隔离的网络除外...

ARP_sed_rev在Android通过ARP询问实现获取同一网络所有设备的MAC地址&#xff0c;AP隔离的网络除外arpsed.c编译&#xff1a;gcc arpsed.c -o arpsed运行&#xff1a;sudo ./arpsed ens33 192.168.1.123 //ens33是网卡名&#xff0c;参数放在外面易于操作交叉编译在Android上运…

数据结构——二叉树的层次遍历进阶

之前的一个博客 数据结构——二叉树的层次遍历看完这个&#xff0c;可以简单实现下面的问题 问题&#xff1a; 1.计算二叉树的最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值。 2.用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。 解决问题的思路…

future.cancel不能关闭线程_多线程与高并发笔记

1. 创建线程的四种方式实现Runnable 重写run方法继承Thread 重写run方法线程池创建 Executors.newCachedThreadPool()实现Callable接口2. Thread线程操作方法当前线程睡眠指定mills毫秒Thread.sleep([mills])当前线程优雅让出执行权Thread.yield()例如Thread t1, t2&#xff0c…

ANDROID手表怎么设置壁纸,表盘背景随心换 果壳智能手表换壁纸教程

在智能手机和电脑上&#xff0c;我们一般都会换一张自己喜欢的图片作为壁纸&#xff0c;当我们想把一张喜欢的图片做成果壳GEAK Watch表盘时&#xff0c;应该怎么做呢&#xff1f;其实只要简单的几个步骤&#xff0c;你就能获得独一无二的专属表盘。首先&#xff0c;打开一张你…

如何踢掉 sql 语句中的尾巴,我用 C# 苦思了五种办法

一&#xff1a;背景 1. 讲故事这几天都在修复bug真的太忙了&#xff0c;期间也遇到了一个挺有趣bug&#xff0c;和大家分享一下&#xff0c;这是一块sql挺复杂的报表相关业务&#xff0c;不知道哪一位大佬在错综复杂的 嵌套 平行 if判断中sql拼接在某些UI组合下出问题了&#…

数据结构——二叉树的最长路径问题

题目&#xff1a; 求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。 描述 设二叉树中每个结点的元素均为一个字符&#xff0c;按先序遍历的顺序建立二叉链表&#xff0c;编写算法求出该二叉树中第一条最长的路径。 输入 一行数据&#xff0c;为二叉树的先序序…

android http请求缓存,Android Http请求和响应使用协议缓冲区

我对协议缓冲区主题非常陌生.但我知道json解析等等现在,我实际上正在此协议缓冲区上工作,我正在制作一个使用带有协议缓冲区的android进行Http请求和响应的应用程序.我正在使用android中的协议缓冲区制作一个登录页面.服务中的一切正常工作墙返回了我想要的每个字段的响应,但是…

.NET 应用如何优雅的做功能开关(Feature Flag)

点击上方蓝字关注“汪宇杰博客”导语曾经&#xff0c;我们要在应用程序里做功能开关&#xff0c;就避免不了在配置文件里加上一堆 bool 类型的配置项&#xff0c;然后在代码里用 if else 去判断。尽管这种做法是可行的&#xff0c;但我们现在有办法让代码更加整洁&#xff0c;避…