
# 设置环境变量
#### 操作场景
环境变量是指容器运行环境中设定的一个变量，环境变量可以在工作负载部署后修改，为工作负载提供极大的灵活性。
通过控制台设置的环境变量与Dockerfile中的"ENV"效果相同。
![](https://support.huaweicloud.com/usermanual-ucs/public_sys-resources/notice_3.0-zh-cn.png)
容器启动后，容器中的内容不应修改。如果修改配置项（例如将容器应用的密码、证书、环境变量配置到容器中），当容器重启（例如节点异常重新调度Pod）后，会导致配置丢失，业务异常。
配置信息应通过入参等方式导入容器中，以免重启后配置丢失。
环境变量支持如下几种方式设置。
- **自定义**：自行填写变量名称及变量值。
- **配置项导入**：将配置项中所有键值都导入为环境变量。
- **配置项键值导入**：将配置项中某个键的值导入作为某个环境变量的值。例如将configmap-example这个配置项中configmap_key的值configmap_value导入为环境变量key1的值，导入后容器中有一个名为key1的环境变量，其值为configmap_value。
- **密钥导入**：将密钥中所有键值都导入为环境变量。
- **密钥键值导入**：将密钥中某个键的值导入作为某个环境变量的值。例如将secret-example这个配置项中secret_key的值secret_value导入为环境变量key2的值，导入后容器中有一个名为key2的环境变量，其值为secret_value。
- **变量引用**：用Pod定义的字段作为环境变量的值，例如Pod的名称。
- **资源引用**：用Container定义的字段作为环境变量的值，例如容器的CPU限制。
 
#### 添加环境变量
1. 在创建工作负载时，配置容器信息，选择"环境变量"。
2. 设置环境变量。 
   图1添加环境变量   
   ![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000001883029440.png "点击放大")
   
   
 
#### YAML样例
```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: env-example
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: env-example
  template:
    metadata:
      labels:
        app: env-example
    spec:
      containers:
        - name: container-1
          image: nginx:alpine
          imagePullPolicy: Always
          resources:
            requests:
              cpu: 250m
              memory: 512Mi
            limits:
              cpu: 250m
              memory: 512Mi
          env:
            - name: key                     # 自定义
              value: value
            - name: key1                    # 配置项键值导入
              valueFrom:
                configMapKeyRef:
                  name: configmap-example
                  key: key1
            - name: key2                    # 密钥键值导入
              valueFrom:
                secretKeyRef:
                  name: secret-example
                  key: key2
            - name: key3                    # 变量引用，用Pod定义的字段作为环境变量的值
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
            - name: key4                    # 资源引用，用Container定义的字段作为环境变量的值
              valueFrom:
                resourceFieldRef:
                  containerName: container1
                  resource: limits.cpu
                  divisor: 1
          envFrom:
            - configMapRef:                 # 配置项导入
                name: configmap-example
            - secretRef:                    # 密钥导入
                name: secret-example
      imagePullSecrets:
        - name: default-secret
```
#### 环境变量查看
如果configmap-example和secret-example的内容如下。
```
$ kubectl get configmap configmap-example -oyaml
apiVersion: v1
data:
  configmap_key: configmap_value
kind: ConfigMap
...
$ kubectl get secret secret-example -oyaml
apiVersion: v1
data:
  secret_key: c2VjcmV0X3ZhbHVl              # c2VjcmV0X3ZhbHVl为secret_value的base64编码
kind: Secret
...
```
则进入Pod中查看的环境变量结果如下。
```
$ kubectl get pod
NAME                           READY   STATUS    RESTARTS   AGE
env-example-695b759569-lx9jp   1/1     Running   0          17m
$ kubectl exec env-example-695b759569-lx9jp  -- printenv
/ # env
key=value                             # 自定义环境变量
key1=configmap_value                  # 配置项键值导入
key2=secret_value                     # 密钥键值导入
key3=env-example-695b759569-lx9jp     # Pod的metadata.name
key4=1                                # container1这个容器的limits.cpu，单位为Core，向上取整
configmap_key=configmap_value         # 配置项导入，原配置项中的键值直接会导入结果
secret_key=secret_value               # 密钥导入，原密钥中的键值直接会导入结果
```
