解锁环境变量在云原生应用中的各种姿势
应用程序在某些时刻总是需要一些外挂配置,云原生应用的实践是在容器化之前就将应用程序配置保留在代码之外。
“
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}
介绍几种创建环境变量的方式:
windows:在CMD/Powershell
setx
命令设置永久环境变量;
linux:使用export
命令设置会话级别环境变量,修改bash_profile
文件设置系统级别环境变量
“
windows电脑还可以在-[我的电脑]-[高级设置]-[环境变量]操作
在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"}}]
}
若使用IIS托管 ASP.NET CORE,可在IIS[配置编辑器]新增、重写环境变量
“
IIS配置会落地到web.config 文件
Docker 环境变量
Docker-Compose有多重方式为容器设置环境变量,按照优先级如下:
在
environment
配置节写入通过
shell
传入环境变量从
env_file
配置节加载环境变量文件
“
① 文件中的环境变量并不会自动应用到容器,需要在Compose yml文件中以
${}
引用
②docker-compose
命令默认从命令执行的同一目录寻找.env
文件
在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中的容器设置环境变量,利用env
和envFrom
配置节。
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
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
配置节设置的环境变量会覆盖镜像内环境变量。
????????
- 环境变量的变更,需要重启应用。
- 环境变量在小范围内使用很方便,当您具有更复杂的配置方案时,应该选择其他数据注入方式,例如外挂文件。
学完这篇依赖注入,与面试官扯皮就没有问题了。
我又踩坑了!如何为HttpClient请求设置Content-Type标头?
临近年关,修复ASP.NET Core因浏览器内核版本引发的单点登录故障
在IIS中部署SPA应用,多么痛的领悟!
十二要素App方法论
解锁环境变量在云原生应用中的各种姿势相关推荐
- KubeMeet 直播 | 现场直击大规模集群、混合环境下的云原生应用交付难题
伴随着 Kubernetes 生态逐步完善,越来越多的大型互联网终端企业开始加入到云原生梯队中,云原生应用交付与管理正在成为 Kubernetes 之上重要的价值聚焦点. 2022 年 1 月 15 ...
- server2012JAVA环境变量_Windows2012云服务器怎么配置java环境变量?
一.Java为何要配置环境变量? 所有学习java的小伙伴应该都知道,学习的第一步就是要学习java的环境变量配置. 1.变量 知道吧? 对,就是可以随意给其赋值的一个存储单元. 2.那么环境呢? 首 ...
- K8S configmap详解:从文件创建、从文件夹创建及以volume、env环境变量的方式在pod中使用
K8S configmap详解:从文件创建.从文件夹创建及以volume.env环境变量的方式在pod中使用 ConfigMap是用来存储配置文件的kubernetes资源对象,所有的配置内容都存储在 ...
- linux中设置环境变量_如何在Linux中设置环境变量
linux中设置环境变量 Wondering how to set environment variables in Linux? This is exactly what we'll be doin ...
- 我的文档目录环境变量_从.env文件中为NodeJS加载环境变量
作者:Writer Staff 翻译:疯狂的技术宅 原文:https://coderrocketfuel.com/article/how-to-load-environment-variables-f ...
- pycharm配置python环境变量_求教大家 pycharm 中,环境变量 path 的问题!
问题的发现 在 pycharm 里把一个编译好的二进制文件放到/usr/local/bin/,然后在程序里调用. cmmd = "xxx ..." os.system(cmmd) ...
- 【最强干货】如何在拥抱云原生浪潮中脱颖而出呢?
每次听到有人喊着"云原生大势已来,我要积极拥抱"等口号,阿秃我就忍不住想来个素质三连:什么是云原生?核心是啥?怎么拥抱? 图片源自网络 OK OK anyway,友情科普一波先-! ...
- python设置环境变量_小白Python进行中
一.安装 安装包的下载 在官网进行下载,我选用Python3.8.0. Welcome to Python.orgwww.python.org 安装 安装的时候可以借鉴该视频. Windows 10 ...
- 「Shell」- 使用环境变量,替换在文件中的变量(envsubst) @20210401
问题描述 在部署服务时,脚本的部分内容是是动态生成的.我们可以使用 sed 进行替换,但是我们发现了更好的方法. 通过使用 envsubst 命令,可以替换在文件中的变量引用(类似于其他编程的模板引擎 ...
最新文章
- 云计算正在告别DIY时代 阿里云专有云挑起企业级市场大梁
- 1个Python特征选择工具,助力实现高效机器学习
- VS2015 打包添加系统必备组件
- 采用CreateThread()创建多线程程序
- JavaScript的语音识别
- 1、HTTP--Web's foundation
- 配置 Syslog 守护程序
- 工业机械类企业官网织梦模板源码
- 3个平台下的ffmpeg——ffmpeg编译
- Cocos2d-x学习笔记(3)
- 认识 Express 的 res.send() 和 res.end()
- 信号与线性系统管致中第六版pdf_第五讲 信号流图
- android模拟器电视,AndroidTV 模拟器的搭建
- 计算机制作节日贺卡教案,《制作节日贺卡》教学设计.doc
- 简单计算机硬件知识ppt,计算机硬件知识教程课件.ppt
- 合并算法详解原理和代码
- 全国计算机等级考试 三级网络技术 知识点总结
- 2019年,为大家推荐9个高质量公众号
- 简约大方的HTML表格样式
- ae怎么设置gpu渲染_AE/PR mac版如何开启GPU加速渲染?