
# 使用kubectl对接已有云硬盘
#### 约束与限制
如下配置示例适用于Kubernetes 1.13及以下版本的集群。
#### 操作步骤
1. 登录EVS控制台，创建一个EVS云硬盘，记录云硬盘的VolumeID、容量和磁盘类型。
2. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用kubectl连接集群。
3. 新建两个yaml文件，用于创建PersistentVolume（PV）、PersistentVolumeClaim（PVC），假设文件名分别为**pv-evs-example.yaml** 、**pvc-evs-example.yaml** 。
   
   **touch pv-evs-example.yaml** **pvc-evs-example.yaml**
   
   | K8s集群版本（K8s version）         | 说明                | yaml示例                                                       |
   |:---|:---|:---|
   | 1.11.7 ≤ K8s version ≤ 1.13  | 1.11.7以上及1.13版本集群 | 请参见[1.11.7\~1.13 yaml文件配置示例]  |
   | 1.11 ≤ K8s version \< 1.11.7 | 1.11.7之前的1.11版本集群 | 请参见[1.11\~1.11.7 yaml文件配置示例] |
   | K8s version = 1.9            | 1.9版本集群           | 请参见[1.9 yaml文件配置示例]            |
      
   **1.11.7 ≤ K8s version ≤ 1.13（1.11.7以上及1.13版本集群）**
   - **PV yaml文件配置示例如下：**
     ```
     apiVersion: v1 
     kind: PersistentVolume 
     metadata: 
       labels: 
         failure-domain.beta.kubernetes.io/region: cn-north-4
         failure-domain.beta.kubernetes.io/zone:  cn-north-4b
       annotations:
         pv.kubernetes.io/provisioned-by: flexvolume-huawei.com/fuxivol
       name: pv-evs-example 
     spec: 
       accessModes: 
       - ReadWriteOnce 
       capacity: 
         storage: 10Gi 
       claimRef:
         apiVersion: v1
         kind: PersistentVolumeClaim
         name: pvc-evs-example
         namespace: default
       flexVolume: 
         driver: huawei.com/fuxivol 
         fsType: ext4 
         options:
           disk-mode: SCSI
           fsType: ext4 
           volumeID: 0992dbda-6340-470e-a74e-4f0db288ed82 
       persistentVolumeReclaimPolicy: Delete 
       storageClassName: sas
     ```
     表1关键参数说明 
     | 参数                                       | 描述                                                                                                                                                                                                                                           |
     |:---|:---|
     | failure-domain.beta.kubernetes.io/region | 集群所在的region。                                                                                                                                                                                                                                 |
     | failure-domain.beta.kubernetes.io/zone   | 创建云硬盘所在的可用区，必须和工作负载规划的可用区保持一致。                                                                                                                                                                                                               |
     | storage                                  | 云硬盘的容量，单位为Gi。                                                                                                                                                                                                                                |
     | storageClassName                         | 云硬盘类型，当前支持高I/O（SAS）、超高I/O（SSD）。                                                                                                                                                                                                              |
     | driver                                   | 挂载依赖的存储驱动。 EVS云硬盘配置为"huawei.com/fuxivol"。                                                                                                                                                                       |
     | volumeID                                 | 云硬盘的volumeID。 **获取方法：**在CCE控制台，单击左侧栏目树中的"资源管理-存储管理"，在"云硬盘存储卷"页签下单击PVC的名称，在PVC详情页中复制"PVC UID"后的内容即可。                                                                                                            |
     | disk-mode                                | 云硬盘磁盘模式，取值可以是VBD和SCSI。 v1.11.7之前的CCE集群，该字段无需填写，默认都是VBD。 v1.11.7+以及v1.13的Linux x86 CCE集群要求该字段值必须存在，且基于PVC触发动态创建的都是EVS SCSI模式的卷，因此这里静态PV形式优先选用SCSI模式的云硬盘；同时支持升级后的老集群中VBD卷能够继续正常使用。 |
     | spec.claimRef.apiVersion                 | 固定值"v1"。                                                                                                                                                                                                                                     |
     | spec.claimRef.kind                       | 固定值"PersistentVolumeClaim"。                                                                                                                                                                                                                  |
     | spec.claimRef.name                       | pvc名称；与下一步创建的pvc的name一致。                                                                                                                                                                                                                     |
     | spec.claimRef.namespace                  | pvc的namespace；与下一步创建的pvc的namespace一致；                                                                                                                                                                                                        |
        
     
   
   - **PVC yaml文件配置示例如下：**
     ```
     apiVersion: v1  
     kind: PersistentVolumeClaim  
     metadata:  
       annotations:  
         volume.beta.kubernetes.io/storage-class: sas
         volume.beta.kubernetes.io/storage-provisioner: flexvolume-huawei.com/fuxivol 
       labels: 
         failure-domain.beta.kubernetes.io/region: cn-north-4
         failure-domain.beta.kubernetes.io/zone: cn-north-4b     
       name: pvc-evs-example 
       namespace: default  
     spec:  
       accessModes:  
       - ReadWriteOnce  
       resources:  
         requests:  
           storage: 10Gi
       volumeName: pv-evs-example
     ```
     表2关键参数说明 
     | 参数                                            | 描述                                                                |
     |:---|:---|
     | volume.beta.kubernetes.io/storage-class       | 存储类型，必须和已有PV保持一致。                                                 |
     | volume.beta.kubernetes.io/storage-provisioner | 必须使用flexvolume-huawei.com/fuxivol。                                |
     | failure-domain.beta.kubernetes.io/region      | 集群所在的region。                                                      |
     | failure-domain.beta.kubernetes.io/zone        | EVS云硬盘所在可用区，必须和工作负载规划的可用区保持一致。                                    |
     | storage                                       | PVC申请容量，单位为Gi。 必须和已有PV的storage大小保持一致。 |
     | volumeName                                    | PV的名称。                                                            |
        
     
   
   
   **1.11 ≤ K8s version \< 1.11.7（1.11.7之前的1.11版本集群）**
   - **PV yaml文件配置示例如下：**
     ```
     apiVersion: v1 
     kind: PersistentVolume 
     metadata: 
       labels: 
         failure-domain.beta.kubernetes.io/region: cn-north-4
         failure-domain.beta.kubernetes.io/zone:  cn-north-4b
       name: pv-evs-example 
     spec: 
       accessModes: 
       - ReadWriteOnce
       capacity: 
         storage: 10Gi 
       flexVolume: 
         driver: huawei.com/fuxivol 
         fsType: ext4 
         options:
           fsType: ext4 
           volumeID: 0992dbda-6340-470e-a74e-4f0db288ed82 
       persistentVolumeReclaimPolicy: Delete 
       storageClassName: sas
     ```
     表3关键参数说明 
     | 参数                                       | 描述                                                                                                                                                                                                                                        |
     |:---|:---|
     | failure-domain.beta.kubernetes.io/region | 集群所在的region。                                                                                                                                                                                                                              |
     | failure-domain.beta.kubernetes.io/zone   | 创建云硬盘所在的可用区，必须和工作负载规划的可用区保持一致。                                                                                                                                                                                                            |
     | storage                                  | 云硬盘的容量，单位为Gi。                                                                                                                                                                                                                             |
     | storageClassName                         | 云硬盘类型，当前支持高I/O（SAS）、超高I/O（SSD）。                                                                                                                                                                                                           |
     | driver                                   | 挂载依赖的存储驱动。 EVS云硬盘配置为"huawei.com/fuxivol"。                                                                                                                                                                 |
     | volumeID                                 | 云硬盘的volumeID。 **获取方法：**在CCE控制台，单击左侧栏目树中的"资源管理-存储管理"，在"云硬盘存储卷"页签下单击PVC的名称，在PVC详情页中复制"PVC UID"后的内容即可。                                                                                                         |
     | disk-mode                                | 云硬盘磁盘模式，取值可以是VBD和SCSI。 v1.11.7之前的CCE集群，该字段无需填写，默认都是VBD。 v1.11.7+以及v1.13的Linux x86 CCE集群要求该字段值必须存在，且基于PVC触发动态创建的都是EVS SCSI模式的卷，因此这里静态PV形式优先选用SCSI模式的云硬盘；同时支持升级后的老集群中VBD卷能够继续正常使用。 |
        
     
   
   - **PVC yaml文件配置示例如下：**
     ```
     apiVersion: v1  
     kind: PersistentVolumeClaim  
     metadata:  
       annotations:  
         volume.beta.kubernetes.io/storage-class: sas
         volume.beta.kubernetes.io/storage-provisioner: flexvolume-huawei.com/fuxivol 
       labels: 
         failure-domain.beta.kubernetes.io/region: cn-north-4
         failure-domain.beta.kubernetes.io/zone: cn-north-4b     
       name: pvc-evs-example 
       namespace: default  
     spec:  
       accessModes:  
       - ReadWriteOnce
       resources:  
         requests:  
           storage: 10Gi
       volumeName: pv-evs-example
     ```
     表4关键参数说明 
     | 参数                                            | 描述                                                                  |
     |:---|:---|
     | volume.beta.kubernetes.io/storage-class       | 存储类型，支持sas，ssd。必须和已有PV保持一致。                                         |
     | volume.beta.kubernetes.io/storage-provisioner | 必须使用flexvolume-huawei.com/fuxivol。                                  |
     | failure-domain.beta.kubernetes.io/region      | 集群所在的region。                                                        |
     | failure-domain.beta.kubernetes.io/zone        | EVS云硬盘所在可用区，必须和工作负载规划的可用区保持一致。                                      |
     | storage                                       | PVC申请容量，单位为Gi。 必须和已有PV的storage大小保持一致。 |
     | volumeName                                    | PV的名称。                                                              |
        
     
   
   
   **K8s version = 1.9（1.9版本集群）**
   - **PV yaml文件配置示例如下：**
     ```
     apiVersion: v1 
     kind: PersistentVolume 
     metadata: 
       labels: 
         failure-domain.beta.kubernetes.io/region: cn-north-4
         failure-domain.beta.kubernetes.io/zone:  cn-north-4b
       name: pv-evs-example 
       namespace: default 
     spec: 
       accessModes: 
       - ReadWriteOnce
       capacity: 
         storage: 10Gi 
       flexVolume: 
         driver: huawei.com/fuxivol 
         fsType: ext4 
         options: 
           fsType: ext4 
           kubernetes.io/namespace: default 
           volumeID: 0992dbda-6340-470e-a74e-4f0db288ed82 
       persistentVolumeReclaimPolicy: Delete 
       storageClassName: sas
     ```
     表5关键参数说明 
     | 参数                                       | 描述                                                                                                                                                                                                                                          |
     |:---|:---|
     | failure-domain.beta.kubernetes.io/region | 集群所在的region。                                                                                                                                                                                                                                |
     | failure-domain.beta.kubernetes.io/zone   | 创建云硬盘所在的可用区，必须和工作负载规划的可用区保持一致。                                                                                                                                                                                                              |
     | storage                                  | 云硬盘的容量，单位为Gi。                                                                                                                                                                                                                               |
     | storageClassName                         | 云硬盘类型，当前支持高I/O（SAS）、超高I/O（SSD）。                                                                                                                                                                                                             |
     | driver                                   | 挂载依赖的存储驱动。 EVS云硬盘配置为"huawei.com/fuxivol"。                                                                                                                                                                     |
     | volumeID                                 | 云硬盘的volumeID。 **获取方法：**在CCE控制台，单击左侧栏目树中的"资源管理-存储管理"，在"云硬盘存储卷"页签下单击PVC的名称，在PVC详情页中复制"PVC UID"后的内容即可。                                                                                                           |
     | disk-mode                                | 云硬盘磁盘模式，取值可以是VBD和SCSI。 v1.11.7之前的CCE集群，该字段无需填写，默认都是VBD。 v1.11.7+以及v1.13的Linux x86 CCE集群要求该字段值必须存在，且基于PVC触发动态创建的都是EVS SCSI模式的卷，因此这里静态PV形式优先选用SCSI模式的云硬盘；同时支持升级后的老集群中VBD卷能够继续正常使用。 |
        
     
   
   - **PVC yaml文件配置示例如下：**
     ```
     apiVersion: v1  
     kind: PersistentVolumeClaim  
     metadata:  
       annotations:  
         volume.beta.kubernetes.io/storage-class: sas
         volume.beta.kubernetes.io/storage-provisioner: flexvolume-huawei.com/fuxivol 
       labels: 
         failure-domain.beta.kubernetes.io/region: cn-north-4
         failure-domain.beta.kubernetes.io/zone: cn-north-4b
       name: pvc-evs-example 
       namespace: default  
     spec:  
       accessModes:  
       - ReadWriteOnce 
       resources:  
         requests:  
           storage: 10Gi
       volumeName: pv-evs-example
       volumeNamespace: default
     ```
     表6关键参数说明 
     | 参数                                            | 描述                                                                    |
     |:---|:---|
     | volume.beta.kubernetes.io/storage-class       | 存储类型，必须和已有PV保持一致。                                                     |
     | volume.beta.kubernetes.io/storage-provisioner | 必须使用flexvolume-huawei.com/fuxivol。                                    |
     | failure-domain.beta.kubernetes.io/region      | 集群所在的region。                                                          |
     | failure-domain.beta.kubernetes.io/zone        | EVS云硬盘所在可用区，必须和工作负载规划的可用区保持一致。                                        |
     | storage                                       | PVC申请容量，单位为Gi。 必须和已有PV的storage大小保持一致。 |
     | volumeName                                    | PV的名称。                                                                |
        
     
   
   
   
   
4. 创建PV。 
   **kubectl create -f pv-evs-example.yaml**
   
   
5. 创建PVC。 
   **kubectl create -f pvc-evs-example.yaml**
   执行成功后，可以在"资源管理 \> 存储管理"的云硬盘存储中查看创建的PVC，也可以在EVS页面根据名称查看EVS云硬盘。
   
   
6. （可选）增加集群关联的metadata，确保在删除节点或集群时避免删除已挂载的静态PV关联的EVS盘。 
   ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/caution_3.0-zh-cn.png)
   若不执行本步骤或创建静态PV/PVC时没有执行过本步骤，请务必确保删除节点前，提前将静态PV关联的云硬盘从节点上解关联。
   1. 获取租户Token，详情请参见[获取用户Token](https://support.huaweicloud.com/api-cce/cce_02_0102.html) 。
   
   2. 获取EVS访问地址EVS_ENDPOINT，详情请参见[区域和终端节点](https://developer.huaweicloud.com/endpoint?EVS)。
      ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001160756068.png "点击放大")
      
   
   3. 给EVS静态PV关联的EVS盘补充集群关联的metadata。
      ```
      curl -X POST ${EVS_ENDPOINT}/v2/${project_id}/volumes/${volume_id}/metadata --insecure \
          -d '{"metadata":{"cluster_id": "${cluster_id}", "namespace": "${pvc_namespace}"}}' \
          -H 'Accept:application/json' -H 'Content-Type:application/json;charset=utf8' \
          -H 'X-Auth-Token:${TOKEN}'
      ```
      表7关键参数说明 
      | 参数            | 描述                                                                                                                   |
      |:---|:---|
      | EVS_ENDPOINT  | EVS访问地址，配置为[b]中获取的值。                                                                    |
      | project_id    | 项目ID。                                                                                                                |
      | volume_id     | 关联EVS盘的ID，配置为待创建静态PV中的volume_id，也可在EVS控制台，单击待导入的云硬盘名称，在磁盘详情界面的"概览信息"中获取ID的值，如[图1]。 |
      | cluster_id    | 待创建EVS PV的集群ID。在CCE控制台单击"资源管理 \> 集群管理"。单击待关联集群的名称，在集群详情页面，即可获取集群ID，如[图2]。            |
      | pvc_namespace | 待绑定PVC的namespace名称。                                                                                                  |
      | TOKEN         | 用户Token，配置为[a]中获取的值。                                                                  |
         
      图1获取磁盘ID   
      ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001199341320.png "点击放大")
      图2获取cluster_id   
      ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001199181332.png "点击放大")
      例如，执行如下命令：
      ```
      curl -X POST https://evs.cn-north-4.myhuaweicloud.com:443/v2/060576866680d5762f52c0150e726aa7/volumes/69c9619d-174c-4c41-837e-31b892604e14/metadata --insecure \
          -d '{"metadata":{"cluster_id": "71e8277e-80c7-11ea-925c-0255ac100442", "namespace": "default"}}' \
          -H 'Accept:application/json' -H 'Content-Type:application/json;charset=utf8' \
          -H 'X-Auth-Token:MIIPe******IsIm1ldG
      ```
      请求执行完成后，执行如下命令，可查看EVS盘是否已关联集群的metadata。
      ```
      curl -X GET ${EVS_ENDPOINT}/v2/${project_id}/volumes/${volume_id}/metadata --insecure \
          -H 'X-Auth-Token:${TOKEN}'
      ```
      例如，执行如下命令：
      ```
      curl -X GET https://evs.cn-north-4.myhuaweicloud.com/v2/060576866680d5762f52c0150e726aa7/volumes/69c9619d-174c-4c41-837e-31b892604e14/metadata --insecure \
          -H 'X-Auth-Token:MIIPeAYJ***9t1c31ASaQ=='
      ```
      在回显中就可以看到该EVS盘当前的metadata。
      ```
      {
          "metadata": {
              "namespace": "default",
              "cluster_id": "71e8277e-80c7-11ea-925c-0255ac100442",
              "hw:passthrough": "true"
          }
      }
      ```
      
   
   
   
   
 
