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

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

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


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位置插入


a01e965fb303d1ab6025c27888830266.png


IConfiguration会拷贝环境变量键值对,后续同名配置会覆盖之前同名配置值,但是环境变量本身不会变化。

public static string? GetEnvironmentVariable(string variable);


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


// Specifies the location where an environment variable is stored or retrieved in  a set or get operation
    public 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[配置编辑器]新增、重写环境变量


de03b4f6581e7211185c17eadb8df6a4.png


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


Docker 环境变量


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


  1. environment配置节写入


  1. 通过shell传入环境变量


  1. 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 config
version: '3'
services:
  web:
    image: 'webapp:v1.5'
$ export TAG=v2.0
$ docker-compose config
version: '3'
services:
  web:
    image: 'webapp:v2.0'


Kubernetes 环境变量


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


  1. env配置节


apiVersion: v1
kind: Pod
metadata:
  name: envar-demo
  labels:
    purpose: demonstrate-envars
spec:
  containers:
  - name: envar-demo-container
    image: anjia0532/google-samples.node-hello:1.0
    env:
    - name: DEMO_GREETING
      value: "Hello from the environment"
    - name: DEMO_FAREWELL
      value: "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-config
  namespace: default
data:
  SPECIAL_LEVEL: very
  SPECIAL_TYPE: charm


kubectl create -f configmap-multikeys.yaml


apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: anjia0532/busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
      - configMapRef:
          name: special-config
  restartPolicy: Never


kubectl create -f pod-configmap-envFrom.yaml


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

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


- 环境变量的变更,需要重启应用。


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

相关文章
|
23天前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
24天前
|
运维 Cloud Native 安全
云原生技术在现代企业中的应用与挑战####
本文探讨了云原生技术在现代企业IT架构中的关键作用,分析了其带来的优势和面临的主要挑战。通过实际案例分析,揭示了如何有效应对这些挑战,以实现业务敏捷性和技术创新的平衡。 ####
|
21天前
|
Cloud Native 持续交付 开发者
云原生技术在现代企业中的应用与实践####
本文深入探讨了云原生技术的核心概念及其在现代企业IT架构转型中的关键作用,通过具体案例分析展示了云原生如何促进企业的敏捷开发、高效运维及成本优化。不同于传统摘要仅概述内容,本部分旨在激发读者对云原生领域的兴趣,强调其在加速数字化转型过程中的不可或缺性,为后续详细论述奠定基础。 ####
|
2月前
|
Cloud Native 安全 物联网
云原生技术在现代软件开发中的应用与挑战####
云原生,这一词汇如同一股强劲的科技风暴,席卷了整个信息技术领域,它不仅重塑了软件的开发模式,还引领了一场关于效率、可扩展性和弹性的深刻变革。本文旨在深入探讨云原生技术的核心概念,分析其在现代软件开发中的广泛应用,并直面伴随其发展而来的挑战,为读者勾勒出一幅既充满机遇又不乏考验的云原生技术图景。 ####
|
26天前
|
Kubernetes Cloud Native 物联网
云原生技术在现代软件开发中的应用与挑战####
本文探讨了云原生技术的兴起背景、核心理念及其在现代软件开发中的广泛应用。通过具体案例分析,揭示了云原生架构如何促进企业数字化转型,并指出了在实施过程中面临的主要挑战及应对策略。 ####
|
16天前
|
人工智能 缓存 异构计算
云原生AI加速生成式人工智能应用的部署构建
本文探讨了云原生技术背景下,尤其是Kubernetes和容器技术的发展,对模型推理服务带来的挑战与优化策略。文中详细介绍了Knative的弹性扩展机制,包括HPA和CronHPA,以及针对传统弹性扩展“滞后”问题提出的AHPA(高级弹性预测)。此外,文章重点介绍了Fluid项目,它通过分布式缓存优化了模型加载的I/O操作,显著缩短了推理服务的冷启动时间,特别是在处理大规模并发请求时表现出色。通过实际案例,展示了Fluid在vLLM和Qwen模型推理中的应用效果,证明了其在提高模型推理效率和响应速度方面的优势。
云原生AI加速生成式人工智能应用的部署构建
|
21天前
|
Cloud Native JavaScript Docker
云原生技术:构建现代应用的基石
在数字化转型的浪潮中,云原生技术如同一艘承载梦想的航船,引领企业驶向创新与效率的新海域。本文将深入探索云原生技术的核心价值,揭示其如何重塑软件开发、部署和运维模式,同时通过一个简易代码示例,展现云原生应用的构建过程,让读者领略到云原生技术的魅力所在。
|
28天前
|
消息中间件 Cloud Native 持续交付
云原生技术在现代企业中的应用与优势###
本文深入探讨了云原生技术在现代企业中的具体应用及其带来的显著优势。随着云计算的普及,云原生作为一种新兴的技术架构,正逐渐成为企业数字化转型的关键驱动力。文章将详细介绍云原生的核心概念、主要技术组件以及在实际业务场景中的成功案例,旨在为读者提供一个全面且实用的参考框架,以便更好地理解和应用云原生技术。 ###
|
1月前
|
监控 Cloud Native 持续交付
云原生技术在现代企业中的应用与实践
本文将深入探讨云原生技术如何改变现代企业的运作模式,提升业务灵活性和创新能力。通过实际案例分析,我们将揭示云原生架构的关键要素、实施步骤以及面临的挑战,为读者提供一套清晰的云原生转型指南。
|
1月前
|
Cloud Native 持续交付 云计算
深入理解云原生技术及其在现代IT架构中的应用
在数字化浪潮的推动下,云原生技术已成为企业转型的关键。本文将通过浅显易懂的语言和生动的比喻,带领读者探索云原生的核心概念、优势以及如何在企业中实现云原生架构。我们将一起揭开云原生的神秘面纱,了解它如何助力企业快速适应市场变化,提升业务的灵活性和创新能力。