华为云用户手册

  • 在StorageClass中设置挂载参数 在StorageClass中设置挂载参数同样可以通过mountOptions字段实现,如下所示,mountOptions支持挂载的字段请参见文件存储挂载参数和对象存储挂载参数。 apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: csi-obs-mount-optionmountOptions:- umask=0027- uid=10000- gid=10000parameters: csi.storage.k8s.io/csi-driver-name: obs.csi.everest.io csi.storage.k8s.io/fstype: s3fs everest.io/obs-volume-type: STANDARDprovisioner: everest-csi-provisionerreclaimPolicy: DeletevolumeBindingMode: Immediate StorageClass设置好后,就可以使用这个StorageClass创建PVC,从而动态创建出的PV会默认带有StorageClass中设置挂载参数。
  • 对象存储挂载参数 CCE的存储插件Everest在挂载文件存储时默认设置了表2和表3的参数,其中表2中的参数不可取消。除了这些参数外,您还可以设置其他的对象存储挂载参数,具体请参见挂载并行文件系统。 表2 默认使用且不可取消的挂载参数 参数 描述 use_ino 使用该选项,由obsfs分配inode编号。读写模式下自动开启。 big_writes 配置后可更改写缓存最大值大小 nonempty 允许挂载目录非空 allow_other 允许其他用户访问并行文件系统 no_check_certificate 不校验服务端证书 enable_noobj_cache 为不存在的对象启用缓存条目,可提高性能。对象桶读写模式下自动使用。 从Everest 1.2.40版本开始不再默认设置enable_noobj_cache参数。 sigv2 签名版本。对象桶自动使用。 表3 默认使用且可取消的挂载参数 参数 描述 max_write=131072 使用该选项,由obsfs分配inode编号。读写模式下自动开启。 ssl_verify_hostname=0 不根据主机名验证SSL证书。 max_background=100 可配置后台最大等待请求数。并行文件系统自动使用。 public_bucket=1 设置为1时匿名挂载公共桶。对象桶读写模式下自动使用。 对象存储卷挂载时使用的所有参数,可以登录到运行挂载对象存储卷的Pod所在节点上通过进程详情观察: 对象桶:ps -ef | grep s3fs root 22142 1 0 Jun03 ? 00:00:00 /usr/bin/s3fs pvc-82fe2cbe-3838-43a2-8afb-f994e402fb9d /mnt/paas/kubernetes/kubelet/pods/0b13ff68-4c8e-4a1c-b15c-724fd4d64389/volumes/kubernetes.io~csi/pvc-82fe2cbe-3838-43a2-8afb-f994e402fb9d/mount -o url=https://{{endpoint}}:443 -o endpoint=xxxxxx -o passwd_file=/opt/everest-host-connector/1622707954357702943_obstmpcred/pvc-82fe2cbe-3838-43a2-8afb-f994e402fb9d -o nonempty -o big_writes -o enable_noobj_cache -o sigv2 -o allow_other -o no_check_certificate -o ssl_verify_hostname=0 -o max_write=131072 -o multipart_size=20 -o umask=0 并行文件系统:ps -ef | grep obsfs root 1355 1 0 Jun03 ? 00:03:16 /usr/bin/obsfs pvc-86720bb9-5aa8-4cde-9231-5253994f8468 /mnt/paas/kubernetes/kubelet/pods/c959a91d-eced-4b41-91c6-96cbd65324f9/volumes/kubernetes.io~csi/pvc-86720bb9-5aa8-4cde-9231-5253994f8468/mount -o url=https://{{endpoint}}:443 -o endpoint=xxxxxx -o passwd_file=/opt/everest-host-connector/1622714415305160399_obstmpcred/pvc-86720bb9-5aa8-4cde-9231-5253994f8468 -o allow_other -o nonempty -o big_writes -o use_ino -o no_check_certificate -o ssl_verify_hostname=0 -o umask=0027 -o max_write=131072 -o max_background=100 -o uid=10000 -o gid=10000
  • 背景信息 容器使用云存储的时候是将云存储挂载到容器上,挂载完成后就可以像使用本地目录一样使用云存储。 本章节主要介绍在挂载云存储的时候如何设置挂载参数,包括文件系统存储卷和对象存储卷的挂载参数设置。您可以在PV中设置挂载参数,然后通过PVC绑定PV;也可以在StorageClass中设置挂载参数,然后使用StorageClass创建PVC,从而动态创建出的PV会默认带有StorageClass中设置挂载参数。
  • 文件存储挂载参数 CCE的存储插件Everest在挂载文件存储时默认设置了如表1所示的参数。除了这些参数外,您还可以设置其他的文件存储挂载参数,具体请参见挂载NFS文件系统到云服务器(Linux)。 表1 文件存储默认挂载参数 参数 描述 vers=3 文件系统版本,目前只支持NFSv3。取值:3 nolock 选择是否使用NLM协议在服务器上锁文件。当选择nolock选项时,锁对于同一主机的应用有效,对不同主机不受锁的影响。 timeo=600 NFS客户端重传请求前的等待时间(单位为0.1秒)。建议值:600。 hard/soft 挂载方式类型。 取值为hard,即使用硬连接方式,若NFS请求超时,则客户端一直重新请求直至成功。 取值为soft,即软挂载方式挂载系统,若NFS请求超时,则客户端向调用程序返回错误。 默认为hard。
  • 在PV中设置挂载参数 在PV中设置挂载参数可以通过mountOptions字段实现,如下所示,mountOptions支持挂载的字段请参见文件存储挂载参数和对象存储挂载参数。 apiVersion: v1kind: PersistentVolumemetadata: name: pv-obs-example annotations: pv.kubernetes.io/provisioned-by: everest-csi-provisionerspec: mountOptions: - umask=0027 - uid=10000 - gid=10000 accessModes: - ReadWriteMany capacity: storage: 1Gi claimRef: apiVersion: v1 kind: PersistentVolumeClaim name: pvc-obs-example namespace: default csi: driver: obs.csi.everest.io fsType: obsfs volumeAttributes: everest.io/obs-volume-type: STANDARD everest.io/region: cn-north-4 storage.kubernetes.io/csiProvisionerIdentity: everest-csi-provisioner volumeHandle: obs-normal-static-pv persistentVolumeReclaimPolicy: Delete storageClassName: csi-obs PV创建后,可以创建PVC关联PV,然后在工作负载的容器中挂载。
  • 镜像回收策略说明 当Docker空间不足时,会触发镜像垃圾回收。 镜像垃圾回收策略只考虑两个因素:HighThresholdPercent 和 LowThresholdPercent。 磁盘使用率超过上限阈值(HighThresholdPercent,默认值为85%)将触发垃圾回收。 垃圾回收将删除最近最少使用的镜像,直到磁盘使用率满足下限阈值(LowThresholdPercent,默认值为80%)。
  • Docker空间大小说明 数据盘根据容器存储Rootfs不同,默认划分如下(以100G大小为例)。 Device Mapper类型存储Rootfs 其中/var/lib/docker用于Docker工作目录,默认占Docker空间的20%,其空间大小 = 数据盘空间 * 90% * 20% thinpool用于存储Docker镜像数据、镜像元数据以及容器使用的磁盘空间,默认占Docker空间的80%,其空间大小 = 数据盘空间 * 90% * 80% thinpool是动态挂载,在节点上使用df -h命令无法查看到,使用lsblk命令可以查看到。 OverlayFS类型存储Rootfs:相比Device Mapper存储引擎,没有单独划分thinpool,Docker空间都在/var/lib/docker目录下。 容器存储Rootfs情况如下: CCE集群:EulerOS 2.5操作系统使用Device Mapper,Ubuntu 18.04和EulerOS 2.9使用OverlayFS。CentOS 7.6 1.21之前版本使用Device Mapper,1.21之后使用OverlayFS。 CCE Turbo集群:BMS节点使用Device Mapper,ECS节点(CentOS 7.6和Ubuntu 18.04)使用OverlayFS。 您可以登录到节点通过docker info命令查看存储引擎类型,如下所示。 # docker infoContainers: 20 Running: 17 Paused: 0 Stopped: 3Images: 16Server Version: 18.09.0Storage Driver: devicemapper
  • 约束限制 当且仅当CCE集群状态为运行中(Available)或不可用(Unavailable)时允许移除节点。 当且仅当CCE节点状态为运行中(Active)、不可用(Abnormal)或错误(Error)时允许被移除。 为使CCE节点正常移除,且移除后能正常重装操作系统清理CCE组件,请确保服务器处于正常运行中(ACTIVE)状态。 若节点在CCE集群移除后重装操作系统失败,请手动完成失败节点的操作系统重装,并在重装后登录节点执行清理脚本完成CCE组件清理,具体步骤参见重装操作系统失败如何处理。
  • 添加极速文件存储卷 参照创建无状态负载(Deployment)、创建有状态负载(StatefulSet)、创建守护进程集(DaemonSet)或创建普通任务(Job)创建工作负载或普通任务,在添加容器后,展开“数据存储”,在“云存储”页签,单击“添加云存储”。 选择存储类型为“极速文件存储”。 表1 极速文件存储参数说明 参数 参数说明 云存储类型 极速文件存储:适用于多种使用场景,主要面向DevOps、容器微服务、企业办公等场景。 分配方式 使用已有存储 云存储名称:选择已创建的存储,您需要提前导入存储,导入存储步骤请参见导入极速文件存储卷。 添加容器挂载 配置如下参数: 子路径:输入文件存储的子路径,如:tmp。 Kubernetes中数据卷挂载的subpath,指引用卷内的子路径而不是其根,不填写时默认为根。现只支持文件存储,必须是相对路径,且不能以“/”或“../”开头。 挂载路径:输入挂载路径,如:/tmp。 数据存储挂载到容器上的路径,请不要挂载在系统目录下,如“/”、“/var/run”等,会导致容器异常。建议挂载在空目录下,若目录不为空,请确保目录下无影响容器启动的文件,否则文件会被替换,导致容器启动异常,工作负载创建失败。 须知: 挂载高危目录的情况下 ,建议使用低权限帐号启动,否则可能会造成宿主机高危文件被破坏。 设置权限。 只读:只能读容器路径中的数据卷。 读写:可修改容器路径中的数据卷,容器迁移时新写入的数据不会随之迁移,会造成数据丢失。 单击“添加容器挂载”可增加多条设置,单击“确定”完成配置。 单击“确定”。
  • 操作步骤 参照创建文件存储卷中操作创建极速文件存储卷,记录极速文件存储卷名称。 请参见通过kubectl连接集群,使用kubectl连接集群。 新建一个文件,用于创建工作负载。假设文件名为efs-statefulset-example.yaml。 touch efs-statefulset-example.yaml vi efs-statefulset-example.yaml yaml示例如下: apiVersion: apps/v1kind: StatefulSetmetadata: name: efs-statefulset-example namespace: defaultspec: replicas: 1 selector: matchLabels: app: efs-statefulset-example template: metadata: annotations: metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]' pod.alpha.kubernetes.io/initialized: 'true' labels: app: efs-statefulset-example spec: containers: - image: 'nginx:1.0.0' name: container-0 resources: requests: {} limits: {} env: - name: PAAS_APP_NAME value: efs-statefulset-example - name: PAAS_NAMESPACE value: default - name: PAAS_PROJECT_ID value: b18296881cc34f929baa8b9e95abf88b volumeMounts: - name: efs-statefulset-example mountPath: /tmp readOnly: false subPath: '' imagePullSecrets: - name: default-secret terminationGracePeriodSeconds: 30 volumes: - persistentVolumeClaim: claimName: cce-efs-import-jnr481gm-3y5o name: efs-statefulset-example affinity: {} tolerations: - key: node.kubernetes.io/not-ready operator: Exists effect: NoExecute tolerationSeconds: 300 - key: node.kubernetes.io/unreachable operator: Exists effect: NoExecute tolerationSeconds: 300 podManagementPolicy: OrderedReady serviceName: test updateStrategy: type: RollingUpdate 表1 关键参数说明 参数 描述 replicas 实例数。 name 新建工作负载的名称。 image 新建工作负载使用的镜像。 mountPath 容器内挂载路径。 serviceName 工作负载对应的服务,服务创建过程请参见创建有状态负载(StatefulSet)。 claimName 已有PVC名称。 spec.template.spec.containers.volumeMounts.name和spec.template.spec.volumes.name有映射关系,必须保持一致。 创建有状态工作负载。 kubectl create -f efs-statefulset-example.yaml
  • 使用说明 符合标准文件协议:用户可以将文件系统挂载给服务器,像使用本地文件目录一样。 数据共享:多台服务器可挂载相同的文件系统,数据可以共享操作和访问。 私有网络:数据访问必须在数据中心内部网络中。 安全隔离:直接使用云上现有IAAS服务构建独享的云文件存储,为租户提供数据隔离保护和IOPS性能保障。 应用场景:适用于多读多写(ReadWriteMany)场景下的各种工作负载(Deployment/StatefulSet)、守护进程集(DaemonSet)和普通任务(Job)使用,主要面向高性能网站、日志存储、DevOps、企业办公等场景。
  • 添加对象存储卷 参照创建无状态负载(Deployment)、创建有状态负载(StatefulSet)、创建守护进程集(DaemonSet)或创建普通任务(Job)创建工作负载或普通任务,在添加容器后,展开“数据存储”,选择“云存储”页签下,单击“添加云存储”。 选择存储类型为“对象存储”。 表2 对象存储参数设置 参数 参数说明 云存储类型 选择“对象存储”。 对象存储有标准存储和低频访问存储两个存储类型,主要适用于大数据分析、原生云应用程序数据、静态网站托管、备份/活跃归档等场景。 分配方式 使用已有存储 云存储名称:选择已创建的存储,您需要提前创建对象存储。 子类型:选择的云存储的存储类别,仅为显示用,如标准存储、低频访问存储。 自动分配存储 在对象存储服务OBS侧对应创建的存储实例类别,可选择如下两种类型: 并行文件系统:集群版本低于1.15或everest插件低于1.0.2时,不支持并行文件系统。详情请参见什么是并行文件系统和OBS并行文件系统使用指导。 对象桶:桶(Bucket)是对象存储服务OBS中存储对象的容器。详情请参见什么是桶。 子类型:可选择“标准存储”或“低频访问存储”。 添加容器挂载 配置如下参数: 挂载路径:输入挂载路径,如:/tmp。 数据存储挂载到容器上的路径,请不要挂载在系统目录下,如“/”、“/var/run”等,会导致容器异常。建议挂载在空目录下,若目录不为空,请确保目录下无影响容器启动的文件,否则文件会被替换,导致容器启动异常,工作负载创建失败。 须知: 挂载高危目录的情况下 ,建议使用低权限帐号启动,否则可能会造成宿主机高危文件被破坏。 设置权限。 只读:只能读容器路径中的数据卷。 读写:可修改容器路径中的数据卷,容器迁移时新写入的数据不会随之迁移,会造成数据丢失。 单击“添加容器挂载”可增加多条设置,单击“确定”完成配置。 单击“确定”。
  • 操作步骤 参照创建文件存储卷中操作创建文件存储卷,记录文件存储卷名称。 请参见通过kubectl连接集群,使用kubectl连接集群。 新建一个YAML文件,用于创建工作负载。假设文件名为sfs-statefulset-example.yaml。 touch sfs-statefulset-example.yaml vi sfs-statefulset-example.yaml yaml示例如下: apiVersion: apps/v1kind: StatefulSetmetadata: name: sfs-statefulset-example namespace: defaultspec: replicas: 2 selector: matchLabels: app: sfs-statefulset-example serviceName: qwqq template: metadata: annotations: metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]' pod.alpha.kubernetes.io/initialized: "true" labels: app: sfs-statefulset-example spec: affinity: {} containers: - image: nginx:latest name: container-0 volumeMounts: - mountPath: /tmp name: pvc-sfs-example imagePullSecrets: - name: default-secret volumes: - name: pvc-sfs-example persistentVolumeClaim: claimName: cce-sfs-demo 表1 关键参数说明 前置路径 参数 描述 spec replicas 实例数。 metadata name 新建工作负载的名称。 spec.template.spec.containers image 新建工作负载使用的镜像。 spec.template.spec.containers.volumeMounts mountPath 容器内挂载路径。 spec serviceName 工作负载对应的服务,服务创建过程请参见创建有状态负载(StatefulSet)。 spec.template.spec.volumes.persistentVolumeClaim claimName 已有PVC名称。 spec.template.spec.containers.volumeMounts.name和spec.template.spec.volumes.name有映射关系,必须保持一致。 创建有状态工作负载。 kubectl create -f sfs-statefulset-example .yaml
  • 存储类别 对象存储提供了三种存储类别:标准存储、低频访问存储、归档存储,从而满足客户业务对存储性能、成本的不同诉求。 标准存储:访问时延低和吞吐量高,因而适用于有大量热点文件(平均一个月多次)或小文件(小于1MB),且需要频繁访问数据的业务场景,例如:大数据、移动应用、热点视频、社交图片等场景。 低频访问存储:适用于不频繁访问(平均一年少于12次)但在需要时也要求快速访问数据的业务场景,例如:文件同步/共享、企业备份等场景。与标准存储相比,低频访问存储有相同的数据持久性、吞吐量以及访问时延,且成本较低,但是可用性略低于标准存储。 归档存储:适用于很少访问(平均一年访问一次)数据的业务场景,例如:数据归档、长期备份等场景。归档存储安全、持久且成本极低,可以用来替代磁带库。为了保持成本低廉,数据取回时间可能长达数分钟到数小时不等。
  • 使用说明 标准接口:具备标准Http Restful API接口,用户必须通过编程或第三方工具访问对象存储。 数据共享:服务器、嵌入式设备、IOT设备等所有调用相同路径,均可访问共享的对象存储数据。 公共/私有网络:对象存储数据允许在公网访问,满足互联网应用需求。 容量与性能:容量无限制,性能较高(IO读写时延10ms级)。 应用场景:适用于(基于OBS界面、OBS工具、OBS SDK等)的一次上传共享多读(ReadOnlyMany)的各种工作负载(Deployment/StatefulSet)和普通任务(Job)使用,主要面向大数据分析、静态网站托管、在线视频点播、基因测序、智能视频监控、备份归档、企业云盘(网盘)等场景。
  • CSI和Flexvolume存储插件的区别 表2 CSI与Flexvolume Kubernetes插件方案 CCE插件名称 插件特性 使用推荐 CSI Everest CSI插件是kubernetes社区推荐的存储插件机制。CCE发布的kubernetes1.15版本及以上版本默认安装CSI插件Everest,并用于对接块存储、文件存储、对象存储、极速文件存储等Iaas存储服务。 Everest插件包含两部分: Everest-csi-controller:提供存储卷的创建、删除、扩容、云盘快照等功能; Everest-csi-driver:提供存储卷在node上的挂载、卸载、格式化等功能。 详情请参见Everest 针对1.15及以上版本的集群,在创建时将默认安装CSI插件(Everest)。CCE会跟随社区持续更新CSI插件的各种能力。 Flexvolume storage-driver Flexvolume插件是kubernetes社区早期实现的存储卷插件机制。自CCE上线伊始,提供的就是Flexvolume数据卷服务。CCE发布的kubernetes 1.13及以下版本安装的插件是“storage-driver”,并用于对接块存储、文件存储、对象存储、极速文件存储等Iaas存储服务。 详情请参见storage-driver 针对已经创建的1.13及以下版本的集群,仍然使用已经安装的Flexvolume存储插件(storage-driver),CCE已停止更新该插件,您可以升级集群版本。 不支持CSI和Flexvolume插件在同一个集群中使用。 不支持将v1.13及以下版本集群的Flexvolume插件转变到CSI插件,v1.13版本的集群可以通过升级集群版本切换为CSI插件。
  • CCE容器存储概览 CCE支持工作负载Pod绑定存储卷类型说明中的多种本地磁盘存储和云存储,每种存储卷的主要特点及应用场景如下表: 图2 CCE支持的存储类型 表1 网络存储对比 对比维度 云硬盘EVS 弹性文件服务SFS 对象存储OBS 极速文件存储SFS Turbo 概念 云硬盘(Elastic Volume Service)可以为云服务器提供高可靠、高性能、规格丰富并且可弹性扩展的块存储服务,可满足不同场景的业务需求,适用于分布式文件系统、开发测试、数据仓库以及高性能计算等场景。 SFS为用户提供一个完全托管的共享文件存储,能够弹性伸缩至PB规模,具备高可用性和持久性,为海量数据、高带宽型应用提供有力支持。适用于多种应用场景,包括HPC、媒体处理、文件共享、内容管理和Web服务等。 对象存储服务(Object Storage Service,OBS)提供海量、安全、高可靠、低成本的数据存储能力,可供用户存储任意类型和大小的数据。适合企业备份/归档、视频点播、视频监控等多种数据存储场景。 SFS Turbo为用户提供一个完全托管的共享文件存储,能够弹性伸缩至320TB规模,具备高可用性和持久性,为海量的小文件、低延迟高IOPS型应用提供有力支持。适用于多种应用场景,包括高性能网站、日志存储、压缩解压、DevOps、企业办公、容器应用等。 存储数据的逻辑 存放的是二进制数据,无法直接存放文件,如果需要存放文件,需要先格式化文件系统后使用。 存放的是文件,会以文件和文件夹的层次结构来整理和呈现数据。 存放的是对象,可以直接存放文件,文件会自动产生对应的系统元数据,用户也可以自定义文件的元数据。 存放的是文件,会以文件和文件夹的层次结构来整理和呈现数据。 访问方式 只能在ECS/BMS中挂载使用,不能被操作系统应用直接访问,需要格式化成文件系统进行访问。 在ECS/BMS中通过网络协议挂载使用。需要指定网络地址进行访问,也可以将网络地址映射为本地目录后进行访问。 可以通过互联网或专线访问。需要指定桶地址进行访问,使用的是HTTP和HTTPS等传输协议。 提供标准的文件访问协议NFS(仅支持NFSv3),用户可以将现有应用和工具与SFS Turbo无缝集成。 静态数据卷 支持 支持 支持 支持 动态数据卷 支持 支持 支持 不支持 主要特点 非共享存储,每个云盘只能在单个节点挂载。 共享存储,可提供高性能、高吞吐存储服务。 共享存储,用户态文件系统。 高性能、高带宽、共享存储。 应用场景 HPC高性能计算、企业核心集群应用、企业应用系统和开发测试等。 说明: 高性能计算:主要是高速率、高IOPS的需求,用于作为高性能存储,比如工业设计、能源勘探等。 HPC高性能计算、媒体处理、内容管理和Web服务、大数据和分析应用程序等。 说明: 高性能计算:主要是高带宽的需求,用于共享文件存储,比如基因测序、图片渲染等。 大数据分析、静态网站托管、在线视频点播、基因测序、智能视频监控、备份归档、企业云盘(网盘)等。 高性能网站、日志存储、DevOps、企业办公等。 容量 TB级别 PB级别 EB级别 TB级别 时延 1~2ms 3~10ms 10ms 1~2ms IOPS/TPS 单盘 33K 单文件系统 10K 千万级 100K 带宽 MB/s级别 GB/s级别 TB/s级别 GB/s级别
  • Volume(存储卷) 容器中的文件在磁盘上是临时存放的,当容器重建时,容器中的文件将会丢失,另外当在一个Pod中同时运行多个容器时,常常需要在这些容器之间共享文件,这也是容器不好解决的问题。 Kubernetes抽象出了Volume来解决这两个问题,也就是存储卷,Kubernetes的Volume是Pod的一部分,Volume不是单独的对象,不能独立创建,只能在Pod中定义。 Pod中的所有容器都可以访问Volume,但必须要挂载,且可以挂载到容器中任何目录。 实际中使用容器存储如下图所示,将容器的内容挂载到Volume中,通过Volume两个容器间实现了存储共享。 Volume的生命周期与挂载它的Pod相同,但是Volume里面的文件可能在Volume消失后仍然存在,这取决于Volume的类型。
  • 存储卷类型说明 Volume可分为本地磁盘存储和云存储两大类。 本地磁盘存储 本地磁盘存储可以使用如下几种类型,具体使用请参见本地磁盘存储。 emptyDir:一种简单的空目录,主要用于临时存储。 hostPath:将主机(节点)某个目录挂载到容器中,适用于读取主机上的数据。 ConfigMap:特殊类型,将Kubernetes特定的对象类型挂载到容器。 Secret:特殊类型,将Kubernetes特定的对象类型挂载到容器。 LocalPV:本地持久卷,直接使用节点的本地磁盘,持久化存储容器数据。 云存储: CCE支持使用云存储有如下几种。 云硬盘EVS 极速文件存储SFS Turbo 对象存储OBS
  • 插件使用推荐 使用CSI插件(Everest)要求Kubernetes版本需为1.15及以上,v1.15及以上版本的集群在创建时将默认安装本插件,v1.13及以下版本集群创建时默认安装Flexvolume插件(storage-driver)。 集群版本由v1.13升级到v1.15后,v1.13版本集群中的Flexvolume容器存储插件(storage-driver)能力将由v1.15的CSI插件(Everest,插件版本v1.1.6及以上)接管,接管后原有功能保持不变。 插件版本为1.2.0的Everest优化了使用OBS存储时的密钥认证功能,低于该版本的Everest插件在升级完成后,需要重启集群中使用OBS存储的全部工作负载,否则工作负载使用存储的能力将受影响!
  • StorageClass StorageClass描述了集群中的存储类型“分类”,在创建PVC/PV均需要指定StorageClass。目前CCE默认提供csi-disk、csi-nas、csi-obs等StorageClass,在声明PVC时使用对应StorageClassName,就可以创建对应类型PV,并自动创建底层的存储资源。 执行如下命令即可查询CCE提供的默认StorageClass。您可以使用CCE提供的CSI插件自定义创建StorageClass,但从功能角度与CCE提供的默认StorageClass并无区别,这里不做过多描述。 # kubectl get scNAME PROVISIONER AGEcsi-disk everest-csi-provisioner 17d # 云硬盘 StorageClasscsi-disk-topology everest-csi-provisioner 17d # 延迟绑定的云硬盘 StorageClasscsi-nas everest-csi-provisioner 17d # 文件存储 StorageClasscsi-obs everest-csi-provisioner 17d # 对象存储 StorageClasscsi-sfsturbo everest-csi-provisioner 17d # 极速文件存储 StorageClasscsi-local-topology everest-csi-provisioner 17d # 本地持久卷 定义了StorageClass后,就可以减少创建并维护PV的工作,PV变成了自动创建,作为使用者,只需要在声明PVC时指定StorageClassName即可,这就大大减少工作量。 当前SFS文件存储处于售罄状态,暂时无法使用存储类csi-nas自动创建。
  • PV与PVC Kubernetes抽象了PV(PersistentVolume)和PVC(PersistentVolumeClaim)来定义和使用存储,从而让使用者不用关心具体的基础设施,当需要存储资源的时候,只要像CPU和内存一样,声明要多少即可。 PV:PV描述的是一个集群里的持久化存储卷,和节点一样,属于集群级别资源。在新版控制台(需要将集群升级到1.19.10并且everest存储插件升级到1.2.10)PV资源已经正式开放给用户管理;旧版控制台仍保持导入使用或者是通过动态创建方式进行创建,用户无法通过控制台对PV资源进行生命周期管理。 PVC:PVC描述的是负载对存储的申领,PVC的申领会消耗集群中存量的PV资源,若集群中无存量PV资源,会动态创建底层存储及PV资源;创建PVC时,需描述请求的持久化存储的属性,比如,Volume存储的大小、可读写权限等等。 在Pod中可以使用Volume关联PVC,即可让Pod使用到存储资源,它们之间的关系如下图所示。 图1 PVC绑定PV 通常在使用时,可以使用PV描述已有的存储资源,然后创建PVC使用存储。具体使用可参见后续各章节中使用kubectl对接存储资源的内容。 而新创建存储资源时,可以使用一种更为方便的方法,可以跳过PV直接使用PVC,这就是StorageClass。
  • 约束与限制 安全容器不支持使用对象存储卷。 OBS限制单用户创建100个桶,但是CCE使用OBS桶为单个工作负载挂载一个桶,当工作负载数量较多时,容易导致桶数量超过限制,OBS桶无法创建。建议此种场景下直接通过OBS的API或SDK使用OBS,不在工作负载中挂载OBS桶。 1.19.10以下版本的集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,当新Pod被调度到另一个节点时,会导致之前Pod不能正常读写。 1.19.10及以上版本集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,新Pod会因为无法挂载云硬盘导致无法成功启动。 1.19及以下版本的集群在卸载subpath时会遍历subpath下所有文件夹,若文件夹数量较多的情况下,遍历时间较长,卸卷时间对应较长。建议在subpath下不要建立太多文件夹,否则可能会出现Pod删除卸卷时间较长的情况。 CCE集群下挂载的OBS中单个文件大小限制远小于obsfs限制。
  • 添加云硬盘存储卷 参照创建无状态负载(Deployment)、创建有状态负载(StatefulSet)或创建普通任务(Job)创建工作负载或普通任务,在添加容器后,展开“数据存储”。在“云存储”页签,单击“添加云存储”。 选择存储类型为“云硬盘”。 表2 挂载云硬盘参数配置 参数 参数说明 云存储类型 云硬盘:云硬盘的使用方式与传统服务器硬盘完全一致。同时,云硬盘具有更高的数据可靠性,更高的I/O吞吐能力和更加简单易用等特点,适用于文件系统、数据库或者其他需要块存储设备的系统软件或工作负载。 注意: 如需挂载云硬盘,创建工作负载时的实例数量必须选择为1个实例,即单实例,选择多实例后挂载云硬盘的选项将置灰,无法挂载。 创建有状态工作负载并添加云存储时,云硬盘暂不支持使用已有存储。 云硬盘不支持跨可用区挂载,且暂时不支持被多个工作负载、同一个工作负载的多个实例或多个任务使用。 分配方式 使用已有存储 选择已创建的存储,您需要提前创建好存储。 针对同一集群和命名空间,创建无状态工作负载时可以选择“使用已有存储”。 创建有状态工作负载时暂不支持选择“使用已有存储”,只能使用“自动分配存储”。 自动分配存储 选择自动分配存储后,需要配置如下选项: 访问模式:是用来对PV进行访问模式的设置,用于描述用户应用对存储资源的访问权限。 ReadWriteOnce (RWO):基于EVS非共享卷提供容器负载单Pod单独单写块存储的功能,但是该卷只能被单个节点挂载。v1.13.10-r1开始支持RWO模式的EVS卷。 可用区:存储所在的可用区,自动分配存储仅支持Node节点所在可用区。 子类型:选择存储的子类型。 高I/O:是指由SAS存储提供资源的磁盘类型。 超高I/O:是指由SSD存储提供资源的磁盘类型。 存储容量:输入存储容量,单位为GB。请不要超过存储容量配额,否则会创建失败。 加密:勾选“KMS加密”后,将为云硬盘提供易用、高安全性的密钥管理服务(Key Management Service,KMS),该功能仅在部分Region的1.13.10及以上版本的集群中支持。若未创建委托请单击“创建委托”,并配置如下参数: 委托名称:委托表示委托方通过创建信任关系,给被委托方授予访问其资源的权限。当“委托名称”为“EVSAccessKMS”时,表示已经成功授权EVS访问KMS,授权成功后,EVS可以获取KMS密钥用来加解密云硬盘系统。 密钥名称:密钥资源创建完成后,可在容器应用中加载使用。如何创建密钥请参见创建密钥。 密钥ID:默认生成。 添加容器挂载 单击“添加容器挂载”。 挂载路径:输入数据卷挂载到容器上的路径。 须知: 请不要挂载在系统目录下,如“/”、“/var/run”等,会导致容器异常。建议挂载在空目录下,若目录不为空,请确保目录下无影响容器启动的文件,否则文件会被替换,导致容器启动异常,工作负载创建失败。 挂载高危目录的情况下 ,建议使用低权限帐号启动,否则可能会造成宿主机高危文件被破坏。 设置权限。 只读:只能读容器路径中的数据卷。 读写:可修改容器路径中的数据卷,容器迁移时新写入的数据不会随之迁移,会造成数据丢失。 图1 添加云存储 单击“确定”。
  • 约束与限制 CCE默认创建计费模式为“按需计费”的云硬盘。如需使用包周期的云硬盘,请参考云硬盘包周期。 云硬盘不支持跨可用区挂载,且暂时不支持被多个工作负载、同一个工作负载的多个实例或多个任务使用。 由于CCE集群各节点之间暂不支持共享盘的数据共享功能,多个节点挂载使用同一个云硬盘可能会出现读写冲突、数据缓存冲突等问题,所以创建无状态工作负载时,若使用了EVS云硬盘,建议工作负载只选择一个实例。 创建有状态工作负载并添加云存储时,云硬盘暂不支持使用已有存储。 不支持导入分区过或者具有非ext4文件系统的云硬盘。 CCE集群中的容器存储目前已支持加密(Kubernetes 1.13版本及以上),当前仅在部分区域(Region)提供端到端支持。 存储不支持选择企业项目,新创建的存储卷默认创建到default企业项目下。 如下操作适用于Kubernetes 1.13及以下版本的集群。
  • 添加文件存储卷 参照创建无状态负载(Deployment)、创建有状态负载(StatefulSet)、创建守护进程集(DaemonSet)或创建普通任务(Job)创建工作负载或普通任务,在添加容器后,展开“数据存储”。在“云存储”页签,单击“添加云存储”。 选择存储类型为“文件存储”。 表2 挂载文件存储参数配置 参数 参数说明 云存储类型 文件存储:文件存储适用于多种使用场景,包括媒体处理、内容管理、大数据和分析应用程序等。 分配方式 使用已有存储 云存储名称:选择已创建的存储,您需要提前创建存储,创建存储步骤请参见创建文件存储卷。 子类型:已创建的文件存储子类型。 存储容量:该容量值为PVC的属性值,若在IaaS侧实施过存储扩容后,容量值不一致是正常的。CCE1.13集群开始支持端到端容器存储扩容功能后,PVC容量才会和存储实体容量一致 自动分配存储 自动创建存储,需要输入存储的容量。 子类型:文件存储子类型为NFS。 存储容量:单位为GB。请不要超过存储容量配额,否则会创建失败。 加密:勾选“KMS加密”后,将为文件存储提供易用、高安全性的密钥管理服务(Key Management Service,KMS),该功能仅在部分Region的1.13.10及以上版本的集群中支持。若未创建委托请单击“创建委托”,并配置如下参数: 委托名称:委托表示委托方通过创建信任关系,给被委托方授予访问其资源的权限。当“委托名称”为“SFSAccessKMS”时,表示已经成功授权SFS访问KMS,授权成功后,SFS可以获取KMS密钥用来加解密文件系统。 密钥名称:密钥资源创建完成后,可在容器应用中加载使用。如何创建密钥请参见创建密钥。 密钥ID:默认生成。 添加容器挂载 配置如下参数: 子路径:输入文件存储的子路径,如:tmp。 Kubernetes中数据卷挂载的subpath,指引用卷内的子路径而不是其根,不填写时默认为根。现只支持文件存储,必须是相对路径,且不能以“/”或“../”开头。 挂载路径:输入挂载路径,如:/tmp。 数据存储挂载到容器上的路径,请不要挂载在系统目录下,如“/”、“/var/run”等,会导致容器异常。建议挂载在空目录下,若目录不为空,请确保目录下无影响容器启动的文件,否则文件会被替换,导致容器启动异常,工作负载创建失败。 须知: 挂载高危目录的情况下 ,建议使用低权限帐号启动,否则可能会造成宿主机高危文件被破坏。 设置权限。 只读:只能读容器路径中的数据卷。 读写:可修改容器路径中的数据卷,容器迁移时新写入的数据不会随之迁移,会造成数据丢失。 单击“添加容器挂载”可增加多条设置,单击“确定”完成配置。 单击“确定”。
  • 应用场景 企业应用的流量大小不是每时每刻都一样,有高峰,有低谷,如果每时每刻都要保持能够扛住高峰流量的机器数目,那么成本会很高。通常解决这个问题的办法就是根据流量大小或资源占用率自动调节机器的数量,也就是弹性伸缩。 在CCE中,由于是使用Pod/容器部署应用,容器可使用的资源是在部署时就固定下了,不会无限制使用CCE节点中的资源,所以在CCE中弹性伸缩需要先对Pod数量进行伸缩,Pod数量增加后节点资源使用率才会增加,进而根据节点资源使用率去伸缩节点数量。
  • 解决方案 CCE中弹性伸缩最主要的就是使用HPA(Horizontal Pod Autoscaling)和CA(Cluster AutoScaling)两种弹性伸缩策略,HPA负责工作负载弹性伸缩,也就是应用层面的弹性伸缩,CA负责节点弹性伸缩,也就是资源层面的弹性伸缩。 通常情况下,两者需要配合使用,因为HPA需要集群有足够的资源才能扩容成功,当集群资源不够时需要CA扩容节点,使得集群有足够资源;而当HPA缩容后集群会有大量空余资源,这时需要CA缩容节点释放资源,才不至于造成浪费。 如图1所示,HPA根据监控指标进行扩容,当集群资源不够时,新创建的Pod会处于Pending状态,CA会检查所有Pending状态的Pod,根据用户配置的扩缩容策略,选择出一个最合适的节点池,在这个节点池扩容。HPA和CA的工作原理详情请参见工作负载伸缩原理和节点伸缩原理。 图1 HPA + CA工作流程 使用HPA+CA可以很容易做到弹性伸缩,且节点和Pod的伸缩过程可以非常方便的观察到,使用HPA+CA做弹性伸缩能够满足大部分业务场景需求。 本文将通过一个示例介绍HPA+CA两种策略配合使用下弹性伸缩的过程,从而帮助您更好的理解和使用弹性伸缩。
  • 创建节点池和节点伸缩策略 登录CCE控制台,进入已创建的集群,在左侧单击“节点管理”,选择“节点池”页签并单击右上角“创建节点池”。 填写节点池配置,添加2U4G的节点,并打开弹性扩缩容开关。 节点数量:设置为1,表示创建节点池时默认创建的节点数为1。 弹性伸缩:开启,表示节点池将根据集群负载情况自动创建或删除节点池内的节点。 节点数上限:设置为5,表示节点池中节点数的最大值。 节点规格:2核 | 4GiB 其余参数设置可使用默认值,详情请参见创建节点池。 在集群控制台左侧单击“插件管理”,单击autoscaler插件下的“编辑”按钮,修改autoscaler插件配置,将自动缩容开关打开,并配置缩容相关参数。例如节点资源使用率小于50%时进行缩容扫描,启动缩容。 上面配置的节点池弹性伸缩,会根据Pod的Pending状态进行扩容,根据节点的资源使用率进行缩容。 在集群控制台左侧单击“节点伸缩”,单击页面右上角的“创建节点伸缩策略”。这里的节点伸缩策略可以根据CPU/内存分配率扩容、还可以按照时间定期扩容节点数量。 节点伸缩示例如下,这里配置当集群CPU分配率大于70%时,增加一个节点。CA策略需要关联节点池,可以关联多个节点池,当需要对节点扩缩容时,在节点池中根据最小浪费规则挑选合适规格的节点扩缩容。关于节点伸缩策略设置的详细说明,请参见创建节点伸缩策略。
  • 创建工作负载 使用构建的hpa-example镜像创建无状态工作负载,副本数为1,镜像地址与上传到SWR仓库的组织有关,需要替换为实际取值。 kind: DeploymentapiVersion: apps/v1metadata: name: hpa-examplespec: replicas: 1 selector: matchLabels: app: hpa-example template: metadata: labels: app: hpa-example spec: containers: - name: container-1 image: 'hpa-example:latest' # 替换为您上传到SWR的镜像地址 resources: limits: # limits与requests建议取值保持一致,避免扩缩容过程中出现震荡 cpu: 500m memory: 200Mi requests: cpu: 500m memory: 200Mi imagePullSecrets: - name: default-secret 然后再为这个负载创建一个Nodeport类型的Service,以便能从外部访问。 Nodeport类型的Service从外网访问需要为集群某个节点创建EIP,创建完后需要同步节点信息,具体请参见同步节点信息。如果节点已有EIP则无需再次创建。 或者您也可以创建带ELB的Service从外部访问,具体请参见通过kubectl命令行创建-自动创建ELB。 kind: ServiceapiVersion: v1metadata: name: hpa-examplespec: ports: - name: cce-service-0 protocol: TCP port: 80 targetPort: 80 nodePort: 31144 selector: app: hpa-example type: NodePort
共100000条