
# 配置Sidecar工具容器（动态注入）
#### 应用场景
使用CCE突发弹性引擎（对接CCI）插件弹性到CCI 2.0支持在Pod中自动注入客户的Sidecar工具容器的能力。
示例：如果客户需要使用CCE突发弹性引擎（对接CCI）插件弹性到CCI 2.0时将采集的日志上报至客户的日志中心，可以设置自动注入客户的日志采集工具容器策略。
您可参考以下几种方式配置Sidecar工具容器：
- [方式一：通过注解配置Sidecar]
- [方式二：通过ClusterExtensionProfile配置Sidecar]
- [方式三：通过ExtensionProfile配置Sidecar]
 
#### 前提条件
如果通过ClusterExtensionProfile或ExtensionProfile方式配置Sidecar工具容器，您需要先配置ClusterExtensionProfile或ExtensionProfile，操作步骤请参考[配置ClusterExtensionProfile或ExtensionProfile](https://support.huaweicloud.com/usermanual-cci2/cci_01_0030.html)。
#### 约束与限制
- 支持注入多个InitContainer、Container，注入的Container不能与原有Pod中其他Container重名。
- 支持注入多个Volume，Volume仅能配置CCI支持的类型，注入的Volume不能与原有pod.spec.volumes中的重名。

- 通过ClusterExtensionProfile或者ExtensionProfile方式配置时：
  - 不支持在配置actions.podSidecars的同时，在actions.annotations中配置键名为bursting.cci.io/pod-sidecars的注解。
  
  - profile匹配到的Pod，若已存在键为bursting.cci.io/pod-sidecars的注解，则根据profile的policy决定覆盖或忽略。
   
 
 #### 方式一：通过注解配置Sidecar
通过在Pod.Annotations中加入注解可以使弹至CCI的Pods添加Sidecar Container。
```
bursting.cci.io/pod-sidecars: '{
"containers":[{"name":"container-sidecar1","image":"busybox:latest","command":["sh","-c","sleep 3600"],"position":"head"}],
"initContainers":[{"command":["sh","-c","sleep 10"],"image":"busybox:latest","name":"initbusybox","position":"tail","resources":{},"volumeMounts":[{"mountPath":"/tmp/auth","name":"mysecret"}]}],
"volumes":[{"name":"mysecret","secret":{"secretName":"testsecret"}}]}'
```
 #### 方式二：通过ClusterExtensionProfile配置Sidecar
ClusterExtensionProfile的YAML模板如下：
```
apiVersion: bursting.cci.io/v1
kind: ClusterExtensionProfile
metadata:  
  name: podsidecar-cluster-profile
spec:  
  actions:    
    podSidecars:
      initContainers:
      - command:
        - sh
        - -c
        - sleep 10
        image: busybox:latest
        name: initbusybox
        position: tail
        resources: {}
        volumeMounts:
        - mountPath: /tmp/auth
          name: mysecret
      volumes:
      - name: mysecret
        secret:
          secretName: testsecret
  namespaceLabels:    
    matchLabels:      
        key: value
```
 #### 方式三：通过ExtensionProfile配置Sidecar
ExtensionProfile的YAML模板如下：
```
apiVersion: bursting.cci.io/v1
kind: ExtensionProfile
metadata:  
  name: podsidecar-profile
  namespace: default
spec:  
  actions:    
    podSidecars:
      containers:
      - command:
        - sh
        - -c
        - sleep 3600
        image: busybox:latest
        name: busybox
        volumeMounts:
        - mountPath: /tmp/auth
          name: mysecret
      volumes:
      - name: mysecret
        secret:
          secretName: testsecret
  objectLabels:
    matchLabels:
      key1: value1
```
#### 参数说明
表1关键参数说明 
| 参数             | 参数说明                                                                                                                                                                                             |
|:---|:---|
| InitContainers | 注入到CCI侧pod.spec.initContainers的initContainer列表。InitContainer对象的结构与Pod中initContainer的结构类似，并增加了position、envFromContainer、volumeMountFromContainer参数，详情请参见[表2]。 |
| containers     | 注入到CCI侧pod.spec.containers的Container列表。详情请参见[表2]。                                                                                                            |
| Volumes        | 注入到CCI侧pod.spec.volumes的volume列表。                                                                                                                                                                |
   
 表2Container参数描述 
| 参数            | 是否必选 | 参数类型   | 描述                                                                                                                        |
|:---|:---|:---|:---|
| position      | 否    | String | 可通过为container配置position字段指定注入位置，配置为head注入在头部，配置为tail注入在尾部，默认注入在尾部，相同position的container注入的先后顺序与actions.podSidecars配置的顺序一致。 |
| restartPolicy | 否    | String | 容器重启策略。仅在 initContainers中生效。若配置为 Always，该容器将作为 Kubernetes 原生 Sidecar 容器运行。该功能依赖CCE突发弹性引擎（对接 CCI）插件1.5.80及以上版本。            |
   
