
# 复制业务容器环境变量和卷挂载点
#### 使用场景
在容器的日志收集与处理、配置管理、数据同步等场景中，可以通过环境变量传递配置文件的路径，或者通过共享卷挂载点将主业务容器的卷挂载到Sidecar容器中来实现特定功能。云容器实例提供了复制业务容器的环境变量（env）和卷挂载点（volumeMounts）的能力，从而简化了这些操作并实现特定功能。
您可参考以下几种方式复制业务容器环境变量和卷挂载点：
- [方式一 通过注解复制业务容器环境变量和卷挂载点]
- [方式二 通过ClusterExtensionProfile复制业务容器环境变量和卷挂载点]
- [方式三 通过ExtensionProfile复制业务容器环境变量和卷挂载点]
 
#### 前提条件
如果使用ClusterExtensionProfile或ExtensionProfile方式复制业务容器环境变量和卷挂载点，您需要先配置Sidecar工具容器，操作步骤请参考[配置Sidecar工具容器](https://support.huaweicloud.com/usermanual-cci2/cci_01_0128.html)。
#### 功能规格
表1功能规格 
| 功能描述                             | 功能说明                                                                                                                                                                                                                     |
|:---|:---|
| 注入Sidecar时支持复制业务容器env的能力         | - 通过容器名和环境变量名来复制环境变量。  - 通过容器序号和环境变量名来复制环境变量。                  |
| 注入Sidecar时支持复制业务容器volumeMount的能力 | - 通过容器名和volumeMount名来复制卷挂载点。  - 通过容器序号和volumeMount名来复制卷挂载点。   |
   
#### 约束与限制
表2功能约束 
| 功能字段                     | 字段约束                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|:---|:---|
| envFromContainer         | - envFromContainer的name不能为空。  - envFromContainer的name不能重复或与sidecarContainer的env配置中的env名重复。  - containerFieldRef中的name和index至少配置其中一个。  - containerFieldRef的fieldPath须为"name"或以"env."开头。   |
| volumeMountFromContainer | - volumeMountFromContainer的volumeMountName不能为空。  - volumeMountFromContainer的volumeMountName不能重复或与sidecarContainer的volumeMount配置中的name重复。  - containerRef中的name和index至少配置其中一个。                                                                        |
   
 #### 方式一 通过注解复制业务容器环境变量和卷挂载点
通过在Pod.Annotations中加入注解添加envFromContainer、volumeMountFromContainer复制业务容器的环境变量和卷挂载点。
```
bursting.cci.io/pod-sidecars: '{"containers":[{"name":"busybox","image":"busybox:latest","command":["sh","-c","sleep 3600"],"resources":{},"envFromContainer":[{"name":"POD_IP","containerFieldRef":{"index":0,"fieldPath":"env.POD_IP"}},{"name":"POD_NAME","containerFieldRef":{"name":"nginx","fieldPath":"env.POD_NAME"}},{"name":"CONTAINER_NAME","containerFieldRef":{"index":0,"fieldPath":"name"}}],"volumeMountFromContainer":[{"volumeMountName":"log-storage","containerRef":{"index":0}},{"volumeMountName":"log-storage1","containerRef":{"name":"nginx"}}]}]}'
```
 #### 方式二 通过ClusterExtensionProfile复制业务容器环境变量和卷挂载点
1. 生成YAML文件。通过ClusterExtensionProfile来配置Sidecar容器的环境变量和卷挂载点。 
   YAML示例：
   ```
   apiVersion: bursting.cci.io/v1
   kind: ClusterExtensionProfile
   metadata:  
     name: podsidecar-cluster-profile
   spec:  
     actions:    
       podSidecars:
         containers:
         - command:
           - sh
           - -c
           - sleep 3600
           image: busybox:latest
           name: busybox
           envFromContainer:
           - containerFieldRef:
               fieldPath: env.POD_IP
               index: 0
             name: POD_IP
           - containerFieldRef:
               fieldPath: env.POD_NAME
               name: nginx
             name: POD_NAME
           - containerFieldRef:
               fieldPath: name
               index: 0
             name: CONTAINER_NAME
           volumeMountFromContainer:
           - containerRef:
               index: 0
             volumeMountName: log-storage
           - containerRef:
               name: nginx
             volumeMountName: log-storage1
     namespaceLabels:    
       matchLabels:      
           key: value
   ```
   
   
2. 使用以下命令创建配置。 
   ```
   kubectl apply -f <podsidecar-cluster-profile>     #所创建的YAML文件名，替换为实际值
   ```
   
   
3. （可选）查询是否配置成功。 
   ```
   kubectl get cextp
   ```
   
   
 
 #### 方式三 通过ExtensionProfile复制业务容器环境变量和卷挂载点
1. 生成YAML文件。通过ExtensionProfile来配置Sidecar容器的环境变量和卷挂载点。 
   YAML示例：
   ```
   apiVersion: bursting.cci.io/v1
   kind: ExtensionProfile
   metadata:  
     name: podsidecar-profile
   spec:  
     actions:    
       podSidecars:
         containers:
         - command:
           - sh
           - -c
           - sleep 3600
           image: busybox:latest
           name: busybox
           envFromContainer:
           - containerFieldRef:
               fieldPath: env.POD_IP
               index: 0
             name: POD_IP
           - containerFieldRef:
               fieldPath: env.POD_NAME
               name: nginx
             name: POD_NAME
           - containerFieldRef:
               fieldPath: name
               index: 0
             name: CONTAINER_NAME
           volumeMountFromContainer:
           - containerRef:
               index: 0
             volumeMountName: log-storage
           - containerRef:
               name: nginx
             volumeMountName: log-storage1
     objectLabels:
       matchLabels:
         key1: value1
   ```
   
   
2. 使用以下命令创建配置。 
   ```
   kubectl apply -f <podsidecar-profile>     #所创建的YAML文件名，替换为实际值
   ```
   
   
3. （可选）使用以下命令查询是否配置成功。 
   ```
   kubectl get extp
   ```
   
   
 
#### 参数说明
表3关键参数说明 
| 参数             | 参数说明                                                                                                                                                                                                         |
|:---|:---|
| InitContainers | 注入到CCI侧pod.spec.initContainers的initContainer列表。InitContainer对象的结构与Pod中initContainer的结构类似，并增加了position、envFromContainer、volumeMountFromContainer参数，详情请参见[表4]。 |
| containers     | 注入到CCI侧pod.spec.containers的Container列表。详情请参见[表4]。                                                                                                            |
| Volumes        | 注入到CCI侧pod.spec.volumes的volume列表。                                                                                                                                                                            |
   
 表4Container参数描述 
| 参数            | 是否必选 | 参数类型   | 描述                                                                                                                        |
|:---|:---|:---|:---|
| position      | 否    | String | 可通过为container配置position字段指定注入位置，配置为head注入在头部，配置为tail注入在尾部，默认注入在尾部，相同position的container注入的先后顺序与actions.podSidecars配置的顺序一致。 |
| restartPolicy | 否    | String | 容器重启策略。仅在 initContainers中生效。若配置为 Always，该容器将作为 Kubernetes 原生 Sidecar 容器运行。该功能依赖CCE突发弹性引擎（对接 CCI）插件1.5.80及以上版本。            |
   
