文档首页 > > 用户指南> 存储管理> 使用对象存储卷

使用对象存储卷

分享
更新时间: 2019/10/21 GMT+08:00

CCE支持创建OBS对象存储卷并挂载到容器的某一路径下,对象存储适用于云工作负载数据分析内容分析热点对象等场景。

对象存储适用场景如下:

  • 标准存储

    适用于有大量热点文件或小文件,且需要频繁访问(平均一个月多次)并快速获取数据的业务场景。例如云应用、数据分析、内容分析、热点对象等。

  • 低频访问存储

    适用于不频繁访问(平均一年少于12次),但需要快速获取数据的业务场景。例如静态网站托管、备份/活跃归档、作为华为云服务的存储资源池或者备份存储等。

准备工作

为了确保挂载方式使用对象存储桶的可靠性和稳定性,请在创建对象存储前先配置密钥。详情请参见如何管理访问密钥

使用约束

  • CCE v1.7.3-r8及以下版本集群不支持创建对象存储服务,请参照界面要求创建新版本集群,再使用对象存储服务。
  • CCE中的裸金属集群不支持创建对象存储服务。
  • CCE支持容器挂载OBS对象存储,基于s3fs将OBS存储桶作为共享存储挂载到节点上。此方式适用于针对不同大小文件对象的一次保存和多次读取场景,不适用于对已保存文件经常做随机修改的场景。若希望访问性能更高,建议直接使用OBS SDK方式。详细请参考s3fs官网描述,基于s3fs挂载的对象存储桶不能提供与本地文件系统相同的性能或语义,相关限制主要有:
    • 随机写入或添加到文件需要重写整个文件
    • 元数据操作如列出目录会因为网络延迟导致性能较差
    • 最终一致性设计可能临时产生过期数据
    • 没有对文件或目录的原子重命名功能
    • 挂载相同存储桶的多个客户端之间没有相互协调机制
    • 不支持硬链接

创建对象存储卷

  1. 登录CCE控制台,单击左侧导航栏的“资源管理 > 存储管理”
  2. 选择“对象存储页签,单击“创建对象存储
  3. 配置如表1基本信息。

    表1 创建对象存储基本信息配置

    参数

    参数说明

    *PVC名称

    新建PVC的名称,该PVC名称不同于卷名称,实际的卷名称在PVC创建时自动生成。

    集群名称

    选择所属集群。

    命名空间

    选择所属命名空间,默认为default。

    存储类别

    对象存储支持的类别

    • 标准存储:适用于有大量热点文件或小文件,且需要频繁访问(平均一个月多次)并快速获取数据的业务场景。
    • 低频访问存储:适用于不频繁访问(平均一年少于12次),但需要快速获取数据的业务场景。
    须知:

    低频访问存储有额外数据读取费用。 了解对象存储服务计费详情

    存储策略

    对象存储有如下策略:

    私有:桶的所有者拥有完全控制权限,其他用户在未经授权的情况下均无访问权限。

    访问模式

    ReadWriteMany,该卷能够以读写模式被多个节点同时加载。

  4. 单击“立即创建”,等待创建成功。

    创建成功后,存储管理列表中会出现已创建的存储。单击PVC名称,进入对象存储服务详情页,可查看到对象存储的基本信息。

使用对象存储卷

  1. 参照创建无状态工作负载(Deployment)创建有状态工作负载(StatefulSet)创建工作负载,在添加容器后,展开“数据存储”,选择“云存储”页签中,单击“添加云存储”
  2. 选择存储类型为“对象存储”

    表2 对象存储参数设置

    参数

    参数说明

    存储类型

    对象存储:对象存储有标准存储和低频访问存储两个存储类型,主要适用于大数据分析、原生云应用程序数据、静态网站托管、备份/活跃归档等场景。

    分配方式

    使用已有存储

    云存储名称:选择已创建的存储,您需要提前创建对象存储。

    自动分配存储

    选择存储子类型。

    对象存储子类型为:标准存储、低频访问存储。

    添加容器挂载

    1. 单击“添加容器挂载”
    2. 挂载路径:输入数据卷挂载到容器上的路径。
      须知:
      • 请不要挂载在系统目录下,如“/”、“/var/run”等,会导致容器异常。建议挂载在空目录下,若目录不为空,请确保目录下无影响容器启动的文件,否则文件会被替换,导致容器启动异常,工作负载创建失败。
      • 挂载高危目录的情况下 ,建议使用低权限帐号启动,否则可能会造成宿主机高危文件被破坏。
    3. 设置权限。
      • 只读:只能读容器路径中的数据卷。
      • 读写:可修改容器路径中的数据卷,容器迁移时新写入的数据不会随之迁移,会造成数据丢失。

  3. 单击“确定”

导入对象存储卷

CCE支持导入已有的对象存储。

  1. 登录CCE控制台,单击左侧导航栏的“资源管理 > 存储管理”,在“对象存储卷”页签下,单击“导入”
  2. 从列表里选择要导入的对象存储。
  3. 选择需要导入对象存储的集群名称和命名空间名称。
  4. 单击“确定”

解关联对象存储卷

创建对象存储卷成功后,存储卷会自动和当前集群绑定,其它服务也可以使用该存储。解关联后,将和此集群解绑,其它服务仍然可以使用该存储。

若该存储已被工作负载挂载,将无法和集群解关联。

  1. 登录CCE控制台,单击左侧导航栏的“资源管理 > 存储管理”,在对象存储卷存储卷列表中,单击对象存储卷后的“解关联”
  2. 查看系统提示,单击“确定”

使用已有对象存储创建PVC

CCE支持使用已有的对象存储来创建PersistentVolume,并通过创建对应PersistentVolumeClaim绑定当前PersistentVolume使用。

  1. 登录OBS控制台,创建对象存储桶,记录桶名称和存储类型。
  2. 请参见通过kubectl连接集群配置kubectl命令。
  3. 新建一个文件,用于创建PV,假设文件名为pv-obs-example.yaml。

    touch pv-obs-example.yaml

    vi pv-obs-example.yaml

    1.9版本集群的yaml文件配置示例:
    apiVersion: v1 
    kind: PersistentVolume 
    metadata: 
      name: pv-obs-example 
      namespace: default  
    spec: 
      accessModes: 
      - ReadWriteMany 
      capacity: 
        storage: 1Gi 
      flexVolume: 
        driver: huawei.com/fuxiobs 
        fsType: obs 
        options: 
          fsType: obs 
          kubernetes.io/namespace: default 
          region: cn-north-1 
          storage_class: STANDARD 
          volumeID: test-obs 
      persistentVolumeReclaimPolicy: Delete 
      storageClassName: obs-standard
    1.11及以上版本集群的yaml文件配置示例:
    apiVersion: v1 
    kind: PersistentVolume 
    metadata: 
      name: pv-obs-example 
    spec: 
      accessModes: 
      - ReadWriteMany 
      capacity: 
        storage: 1Gi 
      flexVolume: 
        driver: huawei.com/fuxiobs 
        fsType: obs 
        options: 
          fsType: obs 
          region: cn-north-1 
          storage_class: STANDARD 
          volumeID: test-obs 
      persistentVolumeReclaimPolicy: Delete 
      storageClassName: obs-standard

    其中:

    • driver:挂载依赖的存储驱动,对象存储配置为“huawei.com/fuxiobs”。
    • storage_class:存储类型,包括STANDARD(标准桶)、STANDARD_IA(低频访问桶)。
    • region:对象存储所在的region。详情请参见地区和终端节点
    • volumeID:对象存储的桶名称。
    • storage:存储容量,单位为Gi。此处配置为固定值1Gi。
    • storageClassName:对象存储支持的存储类型,包括obs-standard(标准)、obs-standard-ia(低频)。

  4. 创建PV。

    kubectl create -f pv-obs-example.yaml

  5. 创建一个yaml文件,用于创建PVC。假设文件名为pvc-obs-example.yaml

    touch pvc-obs-example.yaml

    vi pvc-obs-example.yaml

    1.9版本集群的yaml文件配置示例:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      annotations:
        volume.beta.kubernetes.io/storage-class: obs-standard
        volume.beta.kubernetes.io/storage-provisioner: flexvolume-huawei.com/fuxiobs
      name: pvc-obs-example
      namespace: default
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 1Gi
      volumeName: pv-obs-example
      volumeNamespace: default
    1.11及以上版本集群的yaml文件配置示例:
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      annotations:
        volume.beta.kubernetes.io/storage-class: obs-standard
        volume.beta.kubernetes.io/storage-provisioner: flexvolume-huawei.com/fuxiobs
      name: pvc-obs-example
      namespace: default
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 1Gi
      volumeName: pv-obs-example

    其中:

    • volume.beta.kubernetes.io/storage-class:对象存储支持的存储类型,包括obs-standard、obs-standard-ia。
    • volume.beta.kubernetes.io/storage-provisioner:必须使用flexvolume-huawei.com/fuxiobs。
    • volumeName:PV的名称。
    • storage:存储容量,单位为Gi。此处配置为固定值1Gi。

  6. 创建PVC。

    kubectl create -f pvc-obs-example.yaml

使用已有PVC创建有状态工作负载

CCE支持使用已有的对象存储卷(PersistentVolumeClaim),创建有状态工作负载(StatefulSet)

  1. 参照创建对象存储卷中操作创建对象存储卷,并获取PVC名称。
  2. 请参见通过kubectl连接集群配置kubectl命令。
  3. 新建一个PVC文件,用于创建工作负载。假设文件名为obs-statefulset-example.yaml

    touch obs-statefulset-example.yaml

    vi obs-statefulset-example.yaml

    配置示例:

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: obs-statefulset-example
      namespace: default
    spec:
      podManagementPolicy: OrderedReady
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: obs-statefulset-example
      serviceName: qwqq
      template:
        metadata:
          annotations:
            metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]'
            pod.alpha.kubernetes.io/initialized: "true"
          creationTimestamp: null
          labels:
            app: obs-statefulset-example
        spec:
          affinity: {}
          containers:	
          - env:
            - name: PAAS_APP_NAME
              value: obs-statefulset-example
            - name: PAAS_NAMESPACE
              value: default
            - name: PAAS_PROJECT_ID
              value: b7bb7d77a2974a8fa8985cbfb63f23c0
            image: nginx:latest
            imagePullPolicy: Always
            name: container-0
            resources: {}
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
            volumeMounts:
            - mountPath: /tmp
              name: pvc-obs-example
          dnsPolicy: ClusterFirst
          imagePullSecrets:
          - name: default-secret
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
          volumes:
            - name: pvc-obs-example
              persistentVolumeClaim:
                claimName: cce-obs-demo
          tolerations:
          - effect: NoExecute
            key: node.kubernetes.io/not-ready
            operator: Exists
            tolerationSeconds: 300
          - effect: NoExecute
            key: node.kubernetes.io/unreachable
            operator: Exists
            tolerationSeconds: 300
      updateStrategy:
        type: RollingUpdate
    其中:
    • spec.template.spec.containers.volumeMounts.name和spec.template.spec.volumes.name有映射关系,必须保持一致。
    • replicas:实例数。
    • name:新建工作负载的名称。
    • image:新建工作负载使用的镜像。
    • mountPath:容器内挂载路径。
    • serviceName:工作负载对应的服务,服务创建过程请参见创建有状态工作负载(StatefulSet)
    • claimName:已有PVC名称。

  4. 创建有状态工作负载。

    kubectl create -f obs-statefulset-example.yaml

相关操作

对象存储创建完成后,您还可以执行 表3中的操作。
表3 其他操作

操作

说明

删除对象存储

  1. 选择需要删除的桶名称,单击操作列的“删除”。
  2. 根据界面提示完成删除操作。

使用kubectl创建对象存储

动态使用OBS云硬盘可以自动创建并挂载所期望的OBS对象存储,目前支持标准、低频两种类型的桶,分别对应obs-standard、obs-standard-ia。

  1. 请参见通过kubectl连接集群连接集群配置kubectl命令。
  2. 执行如下命令,配置名为“pvc-obs-auto-example.yaml”的创建PVC的yaml文件。

    touch pvc-obs-auto-example.yaml

    vi pvc-obs-auto-example.yaml

    示例如下:

    apiVersion: v1 
    kind: PersistentVolumeClaim 
    metadata: 
      annotations: 
        volume.beta.kubernetes.io/storage-class: obs-standard                         # 对象存储桶类型,当前支持标准(obs-standard)和低频(obs-standard-ia)
    
      name: pvc-obs-auto-example                                                      # PVC名称
      namespace: default 
    spec: 
      accessModes: 
      - ReadWriteMany 
      resources: 
        requests: 
          storage: 1Gi              # 存储容量,单位为Gi,对OBS桶来说,此处仅为校验需要(不能为空和0),设置的大小不起作用,此处设定为固定值1Gi

    其中:

    • volume.beta.kubernetes.io/storage-class:桶类型,当前支持标准(obs-standard)和低频(obs-standard-ia)两种桶。
    • name:创建的PVC名称。
    • storage:存储容量,单位为Gi,对OBS桶来说,此处仅为校验需要(不能为空和0),设置的大小不起作用,此处设定为固定值1Gi。

  3. 执行如下命令创建PVC。

    kubectl create -f pvc-obs-auto-example.yaml

    命令执行完成后会在集群所在VPC内创建一个对象存储桶,您可以在存储管理 > 中单击桶名称查看该桶,也可以在OBS的控制台中查看该桶。

使用kubectl部署使用对象存储卷的工作负载

  1. 执行如下命令,配置名为“obs-pod-example.yaml”的创建Pod的yaml文件。

    touch obs-pod-example.yaml

    vi obs-pod-example.yaml

    在无状态工作负载中基于pvc共享式使用对象存储示例:
    apiVersion: extensions/v1beta1 
    kind: Deployment 
    metadata: 
      name: obs-pod-example                        # 工作负载名称
      namespace: default 
    spec: 
      replicas: 1 
      selector: 
        matchLabels: 
          app: obs-pod-example 
      template: 
        metadata: 
          labels: 
            app: obs-pod-example 
        spec: 
          containers: 
          - image: nginx 
            name: container-0 
            volumeMounts: 
            - mountPath: /tmp                       # 挂载路径
              name: pvc-obs-example 
          restartPolicy: Always 
          volumes: 
          - name: pvc-obs-example  
            persistentVolumeClaim: 
              claimName: pvc-obs-auto-example       # PVC名称

    其中:

    • name:创建的Pod名称。
    • app:Pod工作负载名称。
    • mountPath:容器内挂载路径。
    • “spec.template.spec.containers.volumeMounts.name”和 “spec.template.spec.volumes.name”有映射关系,必须保持一致。
    在有状态工作负载中基于PVCTemplate独占式使用对象存储示例
    apiVersion: apps/v1
    kind: StatefulSet
    
    metadata:
      name: deploy-obs-standard-in
      namespace: default
      generation: 1
      labels:
        appgroup: ''
      annotations:
        container.io/container-0: https://console.huaweicloud.com/swr/dockerimage/nginx.png
        description: ''
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: deploy-obs-standard-in
      template:
        metadata:
          labels:
            app: deploy-obs-standard-in
          annotations:
            metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]'
            pod.alpha.kubernetes.io/initialized: 'true'
        spec:
          containers:
            - name: container-0
              image: 'nginx:1.12-alpine-perl'
              env:
                - name: PAAS_APP_NAME
                  value: deploy-obs-standard-in
                - name: PAAS_NAMESPACE
                  value: default
                - name: PAAS_PROJECT_ID
                  value: a2cd8e998dca42e98a41f596c636dbda
              resources: {}
              volumeMounts:
                - name: obs-bs-standard-mountoptionpvc
                  mountPath: /tmp
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
              imagePullPolicy: IfNotPresent
          restartPolicy: Always
          terminationGracePeriodSeconds: 30
          dnsPolicy: ClusterFirst
          securityContext: {}
          imagePullSecrets:
            - name: default-secret
          affinity: {}
          schedulerName: default-scheduler
      volumeClaimTemplates:
        - metadata:
            name: obs-bs-standard-mountoptionpvc
            annotations:
              volume.beta.kubernetes.io/storage-class: obs-standard
              volume.beta.kubernetes.io/storage-provisioner: flexvolume-huawei.com/fuxiobs
    
          spec:
            accessModes:
              - ReadWriteMany
            resources:
              requests:
                storage: 1Gi
      serviceName: wwww
      podManagementPolicy: OrderedReady
      updateStrategy:
        type: RollingUpdate
      revisionHistoryLimit: 10

    其中:

    • name:创建的工作负载名称。
    • image:工作负载的镜像。
    • mountPath:容器内挂载路径,示例中挂载到“/tmp”路径。
    • serviceName:工作负载对应的服务,服务创建过程请参见创建有状态工作负载(StatefulSet)
    • “spec.template.spec.containers.volumeMounts.name ”和 “spec.volumeClaimTemplates.metadata.name”有映射关系,必须保持一致。

  2. 执行如下命令创建Pod。

    kubectl create -f obs-pod-example.yaml

    创建完成后,在CCE界面“存储管理 > 对象存储卷”中单击PVC名称,在PVC详情页面可查看对象存储服务和PVC的绑定关系。

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区