# 配置镜像免密下载
在容器化应用部署过程中，通常需要配置imagePullSecrets来确保容器镜像能够从私有仓库中被正确拉取。然而，这一过程不仅操作繁琐，还存在安全风险，因为长期有效的凭据容易泄露，而临时凭据则需要定期更新。为了解决这一问题，CCE引入了免密下载容器镜像的功能。配置镜像免密后，您在创建CCE工作负载时，无需显式指定imagePullSecrets，即可自动下载镜像，简化了操作流程，同时提高了安全性。
您可以通过以下方式配置镜像免密下载：
- [使用节点委托实现镜像免密下载]
- [使用Service Account委托实现镜像免密下载]
 
#### 约束与限制
- 使用节点委托实现镜像免密下载功能仅支持v1.28.15-r70、v1.29.15-r30、v1.30.14-r30、v1.31.10-r30、v1.32.6-r30、v1.33.5-r20、v1.34.1-r0及以上版本的集群。
- 使用Service Account委托实现镜像免密下载功能仅支持v1.34.3-r10、v1.35.1-r0及以上版本的集群。
- 镜像免密下载功能仅支持在节点池上使用，且启用该功能需要为节点池/Service Account配置委托并授予相应权限。
- 节点池如果已开启镜像免密下载，其中的节点迁移到DefaultPool后不支持镜像免密下载。
- 使用过程中请勿删除委托，以及确保委托未过期，否则镜像免密下载将不可用。
- 镜像免密下载功能暂不支持使用SWR企业版自定义域名的镜像地址。
 
 #### 使用节点委托实现镜像免密下载
您可以为节点池配置SWR相关的委托权限，然后开启镜像免密下载功能，后续在该节点池中创建工作负载即可实现镜像免密下载。
#### 创建委托并授权
1. 登录[统一身份认证服务控制台](https://console.huaweicloud.com/iam/#/iam/users)，选择左侧导航栏中的"委托"。
2. 单击右上角"创建委托"，委托类型选择"云服务"，将其授权给"弹性云服务器 ECS 裸金属服务器 BMS"，详情请参见[创建委托并授权](https://support.huaweicloud.com/usermanual-iam/iam_06_0002.html)。
   
   ![](https://support.huaweicloud.com/bestpractice2-swr/public_sys-resources/note_3.0-zh-cn.png)
   建议您创建永久的委托，否则委托过期之后会影响CCE的业务部署。
   ![](https://support.huaweicloud.com/bestpractice2-swr/zh-cn_image_0000002515481935.png "点击放大")
   
   
   
3. 单击"完成"创建委托，然后继续为创建的委托授予SWR相关权限。 
   - 如果您只需要使用基础版SWR镜像免密下载，需授予以下权限：
     - swr:repo:download：授予容器镜像服务下载镜像的权限
     
     - swr:system:createLoginSecret：授予容器镜像服务生成临时登录指令的权限
     
     
     JSON示例如下：
     ```
     {
         "Version": "1.1",
         "Statement": [
             {
                 "Effect": "Allow",
                 "Action": [
                     "swr:repo:download",
                     "swr:system:createLoginSecret"
                 ]
             }
         ]
     }
     ```
     
   
   - 如果您需要使用容器镜像服务企业版镜像免密下载，需授予以下权限：
     - swr:repository:downloadArtifact：授予容器镜像服务企业版下载镜像的权限
     
     - swr:instance:createTempCredential：授予容器镜像服务企业版创建临时访问凭证的权限
     
     - swr:instance:list：授予查询容器镜像服务企业版实例列表信息的权限
     
     - sts::createServiceBearerToken：（该权限仅使用IAM 5.0时需要）授予获取Bearer Token的权限
     
     
     JSON示例如下：
     ```
     {
         "Version": "1.1",
         "Statement": [
             {
                 "Effect": "Allow",
                 "Action": [
                     "swr:repository:downloadArtifact",
                     "swr:instance:createTempCredential",
                     "swr:instance:list"
                 ]
             }
         ]
     }
     ```
     ![](https://support.huaweicloud.com/bestpractice2-swr/public_sys-resources/note_3.0-zh-cn.png)
     如果使用新版IAM（IAM 5.0）则需要增加"sts::createServiceBearerToken"的Action，授予获取Bearer Token的权限。
     ```
     {
         "Version": "5.0",
         "Statement": [
             {
                 "Effect": "Allow",
                 "Action": [
                     "swr:repository:downloadArtifact",
                     "swr:instance:createTempCredential",
                     "swr:instance:list",
                     "sts::createServiceBearerToken"
                 ]
             }
         ]
     }
     ```
     
   
   
   
   
 
#### 配置启用镜像免密下载
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
2. 单击集群名称进入集群，在左侧选择"节点池"。
3. 创建一个节点池，并在"高级配置 \> 委托"配置中选择刚才创建的委托，然后继续完成节点池创建。 
   ![](https://support.huaweicloud.com/bestpractice2-swr/zh-cn_image_0000002515538211.png "点击放大")
   
   如果之前已经在集群里创建了节点池，则可以更新节点池，在"高级配置 \> 委托"配置中选择刚才创建的委托。
   ![](https://support.huaweicloud.com/bestpractice2-swr/public_sys-resources/caution_3.0-zh-cn.png)
   - 如果节点池下已存在节点，由于更新节点池委托对已有节点不生效，需要跳转到节点对应的ECS界面手动为节点关联委托。
   
   - 如果节点池之前已经配置了委托，只需在原有委托里授权SWR相关权限，无需新建委托。
    
   
   
4. 单击节点池名称后的"更多 \> 配置管理"，在"kubelet组件配置"中开启镜像免密下载（enable-swr-credential-provider），单击"确定"。 
   ![](https://support.huaweicloud.com/bestpractice2-swr/public_sys-resources/caution_3.0-zh-cn.png)
   此操作将触发kubelet进程的重启。为确保平稳过渡，建议在业务低峰期执行此操作，此时节点池内的所有节点配置将逐步生效。
   
   
 
#### 验证免密拉取
在已配置免密拉取的节点池中创建工作负载时，无需配置imagePullSecrets即可成功拉取SWR私有镜像。
工作负载配置示例如下：
```
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    appgroup: ''
    version: v1
  name: deployment1
  namespace: default
spec:
  selector:
    matchLabels:
      app: deployment1
      version: v1
  template:
    metadata:
      labels:
        app: deployment1
        version: v1
    spec:
      containers:
        - name: container-1
          image: "{image_name}"  # SWR私有镜像地址
          imagePullPolicy: Always
      terminationGracePeriodSeconds: 30
      affinity:  # 将工作负载亲和调度至已配置镜像免密拉取的节点池
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: cce.cloud.com/cce-nodepool
                    operator: In
                    values:
                      - "{nodepool_name}"  # 已配置镜像免密拉取的节点池名称
  replicas: 1
  revisionHistoryLimit: 10
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  progressDeadlineSeconds: 600
```
以上示例中未配置镜像访问凭证imagePullSecrets，创建该工作负载，工作负载被调度到指定的节点池中，且SWR的私有镜像可以正常拉取，说明该节点池的镜像免密配置成功。
 #### 使用Service Account委托实现镜像免密下载
您可以为Service Account配置SWR相关的委托权限，然后开启节点池的镜像免密下载功能，后续在该节点池中创建工作负载即可实现镜像免密下载。
#### 创建委托并授权
1. 登录[统一身份认证服务控制台](https://console.huaweicloud.com/iam/#/iam/users)，选择左侧导航栏中的"委托"。
2. 单击右上角"创建委托"，委托类型选择"云服务"，将其授权给"云容器引擎服务 CCE"，详情请参见[创建委托并授权](https://support.huaweicloud.com/usermanual-iam/iam_06_0002.html)。
   
   ![](https://support.huaweicloud.com/bestpractice2-swr/public_sys-resources/note_3.0-zh-cn.png)
   建议您创建永久的委托，否则委托过期之后会影响CCE的业务部署。
   ![](https://support.huaweicloud.com/bestpractice2-swr/zh-cn_image_0000002537913478.png "点击放大")
   
   
   
3. 单击"完成"创建委托，然后继续为创建的委托授予SWR相关权限。 
   - 如果您只需要使用基础版SWR镜像免密下载，需授予以下权限：
     - swr:repo:download：授予容器镜像服务下载镜像的权限
     
     - swr:system:createLoginSecret：授予容器镜像服务生成临时登录指令的权限
     
     
     JSON示例如下：
     ```
     {
         "Version": "1.1",
         "Statement": [
             {
                 "Effect": "Allow",
                 "Action": [
                     "swr:repo:download",
                     "swr:system:createLoginSecret"
                 ]
             }
         ]
     }
     ```
     
   
   - 如果您需要使用容器镜像服务企业版镜像免密下载，需授予以下权限：
     - swr:repository:downloadArtifact：授予容器镜像服务企业版下载镜像的权限
     
     - swr:instance:createTempCredential：授予容器镜像服务企业版创建临时访问凭证的权限
     
     - swr:instance:list：授予查询容器镜像服务企业版实例列表信息的权限
     
     - sts::createServiceBearerToken：（该权限仅使用IAM 5.0时需要）授予获取Bearer Token的权限
     
     
     JSON示例如下：
     ```
     {
         "Version": "1.1",
         "Statement": [
             {
                 "Effect": "Allow",
                 "Action": [
                     "swr:repository:downloadArtifact",
                     "swr:instance:createTempCredential",
                     "swr:instance:list"
                 ]
             }
         ]
     }
     ```
     ![](https://support.huaweicloud.com/bestpractice2-swr/public_sys-resources/note_3.0-zh-cn.png)
     如果使用新版IAM（IAM 5.0）则需要增加"sts::createServiceBearerToken"的Action，授予获取Bearer Token的权限。
     ```
     {
         "Version": "5.0",
         "Statement": [
             {
                 "Effect": "Allow",
                 "Action": [
                     "swr:repository:downloadArtifact",
                     "swr:instance:createTempCredential",
                     "swr:instance:list",
                     "sts::createServiceBearerToken"
                 ]
             }
         ]
     }
     ```
     
   
   
   
   
 
#### 创建Service Account并绑定委托
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，在左侧导航栏中选择"权限管理"，切换至"容器组身份关联"页签。
2. 在左边下拉列表中选择需要创建容器组身份关联的集群，单击"创建"。
3. 选择创建好的委托，并选择工作负载的命名空间。
4. 单击"创建服务账户"，配置以下参数。 
   - 命名空间：选择Service Account的命名空间，需要与工作负载命名空间保持一致。
   
   - 服务账户（Service Account）名称：自定义Service Account名称。
   
   - 注解：需要为添加credential.swr.io/enable-workload-cred: "true"的注解。
   
   
   ![](https://support.huaweicloud.com/bestpractice2-swr/zh-cn_image_0000002568754229.png "点击放大")
   
   
   
5. 选择上一步创建的服务账户，单击"确定"完成容器组身份关联。
 
#### 配置启用镜像免密下载
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
2. 单击集群名称进入集群，在左侧选择"节点池"。
3. 创建一个节点池，或者使用已有节点池。
4. 单击节点池名称后的"更多 \> 配置管理"，在"kubelet组件配置"中开启Service Account 委托镜像免密下载 (enable-swr-credential-serviceaccount-provider)，单击"确定"。 
   ![](https://support.huaweicloud.com/bestpractice2-swr/public_sys-resources/caution_3.0-zh-cn.png)
   此操作将触发kubelet进程的重启。为确保平稳过渡，建议在业务低峰期执行此操作，此时节点池内的所有节点配置将逐步生效。
   
   
 
#### 验证免密拉取
在已配置免密拉取的节点池中创建工作负载时，无需配置imagePullSecrets即可成功拉取SWR私有镜像。
工作负载配置示例如下：
```
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    appgroup: ''
    version: v1
  name: deployment1
  namespace: default # 选择配置Service Account的命名空间
spec:
  selector:
    matchLabels:
      app: deployment1
      version: v1
  template:
    metadata:
      labels:
        app: deployment1
        version: v1
        credential.swr.io/enable-workload-cred: on # 关键配置：通过label标识该工作负载使用免密下载
    spec:
      serviceAccountName: swr-secretless-sa  # 关键配置：指定已绑定委托的ServiceAccount，不配置则默认使用default
      containers:
        - name: container-1
          image: "{image_name}"  # SWR私有镜像地址
          imagePullPolicy: Always
      terminationGracePeriodSeconds: 30
      affinity:  # 将工作负载亲和调度至已配置镜像免密拉取的节点池
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: cce.cloud.com/cce-nodepool
                    operator: In
                    values:
                      - "{nodepool_name}"  # 已配置镜像免密拉取的节点池名称
  replicas: 1
  revisionHistoryLimit: 10
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  progressDeadlineSeconds: 600
```
以上示例中未配置镜像访问凭证imagePullSecrets，创建该工作负载，工作负载被调度到指定的节点池中，且SWR的私有镜像可以正常拉取，说明该节点池的Service Account委托免密拉取镜像成功。
