
# 资源更新适配
 #### 镜像更新适配
由于本例使用的Wordpress和MySQL镜像均可从SWR正常拉取，因此不会出现镜像拉取失败（ErrImagePull）问题。如迁移应用为私有镜像，请执行以下步骤完成镜像更新适配。
1. 将镜像资源迁移至容器镜像服务（SWR），具体步骤请参考[客户端上传镜像](https://support.huaweicloud.com/usermanual-swr/swr_01_0011.html)。
2. 登录SWR控制台查看获取迁移后的镜像地址。 
   镜像地址格式如下：
   ```
   'swr.{区域}.myhuaweicloud.com/{所属组织名称}/{镜像名称}:{版本名称}'
   ```
   
   
3. 使用如下命令对工作负载进行修改，并将YAML文件中的image字段替换成迁移后的镜像地址。 
   ```
   kubectl edit deploy wordpress
   ```
   
   
4. 查看应用实例运行情况。
 
 #### 访问服务更新适配
集群迁移后，原有集群的访问服务可能无法生效，可执行如下步骤更新服务。如原集群中设置了Ingress资源，迁移后需重新对接ELB，您可参考[添加Ingress-对接已有ELB](https://support.huaweicloud.com/usermanual-cce/cce_10_0252.html#section3)。
1. 通过kubectl连接集群。
2. 编辑对应Service的YAML文件，修改服务类型及端口。 
   ```
   kubectl edit svc wordpress
   ```
   LoadBalancer资源进行更新时，需要重新对接ELB。请参考[通过kubectl命令行创建-使用已有ELB](https://support.huaweicloud.com/usermanual-cce/cce_10_0681.html#section3)，添加如下Annotation：
   ```
   annotations: 
     kubernetes.io/elb.class: union   #共享型ELB
     kubernetes.io/elb.id: 9d06a39d-xxxx-xxxx-xxxx-c204397498a3    #ELB的ID，可前往ELB控制台查询
     kubernetes.io/elb.session-affinity-mode: SOURCE_IP    #开启会话保持，基于源IP地址
   ```
   
   
3. 浏览器访问查看服务是否可用。
 
 #### StorageClass更新适配
由于集群的存储基础设施不同，迁移后的集群将无法正常挂载存储卷，您可执行以下方法的任意一种来完成存储卷的更新适配。
![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/notice_3.0-zh-cn.png)
两种StorageClass的适配方法均需在**目标集群** 中于**恢复应用前** 完成，否则可能出现PV数据资源无法恢复的情况，此时在完成StorageClass适配后使用Velero重新恢复应用即可，请参考[目标集群应用恢复](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_0024.html#cce_bestpractice_0024__section482103142819)。
**方式一：** **创建ConfigMap映射**
1. 在CCE集群中创建如下所示的ConfigMap，将原集群使用的StorageClass映射到CCE集群默认的StorageClass。 
   ```
   apiVersion: v1
   kind: ConfigMap
   metadata:
     name: change-storageclass-plugin-config
     namespace: velero
     labels:
       app.kubernetes.io/name: velero
       velero.io/plugin-config: "true"
       velero.io/change-storage-class: RestoreItemAction
   data:
     {原集群StorageClass name01}: {目标集群StorageClass name01}
     {原集群StorageClass name02}: {目标集群StorageClass name02}
   ```
   
   
2. 执行以下命令，应用上述的 ConfigMap 配置。 
   ```
   kubectl create -f change-storage-class.yaml
   configmap/change-storageclass-plugin-config created
   ```
   
   
**方式二：** **创建同名StorageClass**
1. 查询CCE支持的默认StorageClass。 
   ```
   kubectl get sc
   ```
   回显如下：
   ```
   csi-disk             everest-csi-provisioner         Delete          Immediate              true                   77d
   csi-disk-dss         everest-csi-provisioner         Delete          Immediate              true                   77d
   csi-disk-topology    everest-csi-provisioner         Delete          WaitForFirstConsumer   true                   77d
   csi-local            everest-csi-provisioner         Delete          Immediate              false                  19d
   csi-local-topology   everest-csi-provisioner         Delete          WaitForFirstConsumer   true                   19d
   csi-nas              everest-csi-provisioner         Delete          Immediate              true                   77d
   csi-obs              everest-csi-provisioner         Delete          Immediate              false                  77d
   csi-sfs              everest-csi-provisioner         Delete          Immediate              false                  77d
   csi-sfsturbo         everest-csi-provisioner         Delete          Immediate              true                   77d
   ```
   表1StorageClass 
   | StorageClass名称     | 对应的存储资源              |
   |:---|:---|
   | csi-disk           | 云硬盘                  |
   | csi-disk-topology  | 延迟绑定的云硬盘             |
   | csi-disk-dss       | 专属存储                 |
   | csi-local          | 本地持久卷                |
   | csi-local-topology | 延迟绑定的本地持久卷           |
   | csi-nas            | 文件存储（SFS 1.0）        |
   | csi-sfs            | 通用文件系统（原SFS 3.0 容量型） |
   | csi-obs            | 对象存储                 |
   | csi-sfsturbo       | 极速文件存储               |
      
   
   
2. 通过如下命令将所需的StorageClass详细信息输出为YAML格式。 
   ```
   kubectl get sc <storageclass-name> -o=yaml
   ```
   
   
3. 复制YAML文件并创建一个新的StorageClass。 
   编辑StorageClass名称，将其命名为原有集群中使用的名称，用于调用云上基础存储资源。
   以csi-obs的YAML文件为例。请删除metadata字段下的不必要信息（creationTimestamp、resourceVersion、selfLink、uid），并修改name字段，其余参数不建议修改。
   ```
   apiVersion: storage.k8s.io/v1
   kind: StorageClass
   metadata:
     creationTimestamp: "2021-10-18T06:41:36Z"
     name: <your_storageclass_name>     #命名为原有集群中使用的StorageClass名称
     resourceVersion: "747"
     selfLink: /apis/storage.k8s.io/v1/storageclasses/csi-obs
     uid: 4dbbe557-ddd1-4ce8-bb7b-7fa15459aac7
   parameters:
     csi.storage.k8s.io/csi-driver-name: obs.csi.everest.io
     csi.storage.k8s.io/fstype: s3fs
     everest.io/obs-volume-type: STANDARD
   provisioner: everest-csi-provisioner
   reclaimPolicy: Delete
   volumeBindingMode: Immediate
   ```
   ![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
   - CCE不支持ReadWriteMany的云硬盘存储，在原集群中存在该类型资源时，需要先修改为ReadWriteOnce。
    
   
   
4. 参考[目标集群应用恢复](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_0024.html#cce_bestpractice_0024__section482103142819)进行集群应用恢复，检查PVC是否创建成功。
   
   ```
   kubectl get pvc
   ```
   回显如下，其中VOLUME列为通过StorageClass自动创建的PV名称。
   ```
   NAME   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
   pvc    Bound    pvc-4c8e655a-1dbc-4897-ae6c-446b502f5e77   5Gi        RWX            local          13s
   ```
   
   
 
 #### 数据库更新适配
本例中数据库为本地MySQL数据库，迁移后无需重新配置。若您通过**数据复制服务DRS**将本地数据库迁移至云数据库RDS，则在迁移后需重新配置数据库的访问，请您根据实际情况进行配置。
![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
- 若云数据库RDS实例与CCE集群处于同一VPC下，则可通过内网地址访问，否则只能通过绑定EIP的方式进行公网访问。建议使用内网访问方式，安全性高，并且可实现RDS的较好性能。
- 请确认RDS所在安全组入方向规则已对集群放通，否则将连接失败。
 
1. 登录RDS控制台，在该实例的"基本信息"页面获取其"内网地址"及端口。
2. 使用如下命令对Wordpress工作负载进行修改。 
   ```
   kubectl edit deploy wordpress
   ```
   设置env字段下的环境变量：
   - WORDPRESS_DB_HOST：数据库的访问地址和端口，即上一步中获取的内网地址及端口。
   
   - WORDPRESS_DB_USER：访问数据库的用户名。
   
   - WORDPRESS_DB_PASSWORD：访问数据库的密码。
   
   - WORDPRESS_DB_NAME：需要连接的数据库名。
   
   
   
   
3. 检查RDS数据库是否正常连接。
 
