华为云用户手册

  • 使用存储卷PV创建PVC 如果已经创建了PV,则可以创建PVC申请PV的资源。 使用控制台创建 登录CCE控制台。 进入集群,在左侧选择“容器存储”,在右侧选择“存储卷声明”页签。 单击右上角“创建存储声明”,在弹出的窗口中填写存储卷“声明”参数。 创建方式:选择“使用已有存储卷”。 PVC名称:指定PVC的名称。 存储卷类型类:选择需要的存储卷类型。 云硬盘 文件存储 对象存储 极速文件存储 关联存储卷:选择要关联的存储卷,即PV。 单击“创建”。 使用YAML创建 云硬盘YAML示例。 failure-domain.beta.kubernetes.io/region:集群所在的region。 Region对应的值请参见地区和终端节点。 failure-domain.beta.kubernetes.io/zone:创建云硬盘所在的可用区,必须和工作负载规划的可用区保持一致。 zone对应的值请参见地区和终端节点。 apiVersion: v1kind: PersistentVolumeClaimmetadata: name: pvc-test namespace: default annotations: everest.io/disk-volume-type: SAS # 云硬盘的类型 everest.io/crypt-key-id: fe0757de-104c-4b32-99c5-ee832b3bcaa3 # 可选字段,密钥的id,使用该密钥加密云硬盘 volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner everest.io/enterprise-project-id: 86bfc701-9d9e-4871-a318-6385aa368183 # 可选字段,如果指定企业项目,需保证与PV中指定的everest.io/enterprise-project-id一致,否则无法绑定 labels: failure-domain.beta.kubernetes.io/region: cn-north-4 failure-domain.beta.kubernetes.io/zone: cn-north-4bspec: accessModes: - ReadWriteOnce # 云硬盘必须为ReadWriteOnce resources: requests: storage: 10Gi storageClassName: csi-disk # StorageClass的名称,云硬盘为csi-disk volumeName: cce-evs-test # PV的名称 文件存储示例: apiVersion: v1kind: PersistentVolumeClaimmetadata: name: pvc-sfs-test namespace: default annotations: volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisionerspec: accessModes: - ReadWriteMany # 文件存储必须为ReadWriteMany resources: requests: storage: 100Gi # PVC申请容量大小 storageClassName: csi-nas # StorageClass的名称,文件存储为csi-nas volumeName: cce-sfs-test # PV的名称 对象存储示例: apiVersion: v1kind: PersistentVolumeClaimmetadata: name: pvc-obs-test namespace: default annotations: everest.io/obs-volume-type: STANDARD # 桶类型,当前支持标准(STANDARD)和低频(WARM)两种桶。 csi.storage.k8s.io/fstype: obsfs # 文件类型,obsfs表示创建并行文件系统,推荐使用;s3fs表示创建对象桶 csi.storage.k8s.io/node-publish-secret-name: test-user csi.storage.k8s.io/node-publish-secret-namespace: default volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner everest.io/enterprise-project-id: 86bfc701-9d9e-4871-a318-6385aa368183 # 可选字段,如果指定企业项目,需保证与PV中指定的everest.io/enterprise-project-id一致,否则无法绑定spec: accessModes: - ReadWriteMany # 对象存储必须为ReadWriteMany resources: requests: storage: 1Gi # PVC申请容量大小,此处仅为校验需要(不能为空和0),设置的大小不起作用,此处设定为固定值1Gi storageClassName: csi-obs # StorageClass的名称,对象存储为csi-obs volumeName: cce-obs-test # PV的名称 极速文件存储示例: apiVersion: v1kind: PersistentVolumeClaimmetadata: name: pvc-test namespace: default annotations: volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisionerspec: accessModes: - ReadWriteMany # 极速文件存储必须为ReadWriteMany resources: requests: storage: 100Gi # PVC申请容量大小 storageClassName: csi-sfsturbo # StorageClass的名称,极速文件存储为csi-sfsturbo volumeName: pv-sfsturbo-test # PV的名称
  • 使用快照创建PVC 通过快照创建云硬盘PVC时,磁盘类型、磁盘模式、加密属性需和快照源云硬盘保持一致。 使用控制台创建 登录CCE控制台。 单击集群名称进入集群,在左侧选择“容器存储”,在右侧选择“快照与备份”页签。 找到需要创建PVC的快照,单击“创建存储卷声明”,并在弹出窗口中指定PVC的名称。 单击“创建”。 使用YAML创建 apiVersion: v1kind: PersistentVolumeClaimmetadata: name: pvc-test namespace: default annotations: everest.io/disk-volume-type: SSD # 云硬盘类型,需要与快照源云硬盘保持一致 labels: failure-domain.beta.kubernetes.io/region: cn-north-4 failure-domain.beta.kubernetes.io/zone: cn-north-4bspec: accessModes: - ReadWriteOnce resources: requests: storage: '10' storageClassName: csi-disk dataSource: name: cce-disksnap-test # 快照的名称 kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io
  • 约束与限制 创建PVC会先匹配集群中是否有配置相同、且状态为可用状态的PV,如果存在,PVC将首先选择可匹配的,且为可用状态的PV进行绑定,在集群中无满足匹配条件的PV时,动态创建新的存储。 字段含义 pvc字段 pv字段 匹配逻辑 region pvc.metadata.labels(failure-domain.beta.kubernetes.io/region或者topology.kubernetes.io/region) pv.metadata.labels(failure-domain.beta.kubernetes.io/region或者topology.kubernetes.io/region) 同时定义/不被定义,若定义需要内容一致 zone pvc.metadata.labels(failure-domain.beta.kubernetes.io/zone或者topology.kubernetes.io/zone) pv.metadata.labels(failure-domain.beta.kubernetes.io/zone或者topology.kubernetes.io/zone) 同时定义/不被定义,若定义需要内容一致 云硬盘类型 pvc.metadata.annotations(everest.io/disk-volume-type) pv.spec.csi.volumeAttributes(everest.io/disk-volume-type) 同时定义/不被定义,若定义需要内容一致 密钥id pvc.metadata.annotations(everest.io/crypt-key-id) pv.spec.csi.volumeAttributes(everest.io/crypt-key-id) 同时定义/不被定义,若定义需要内容一致 企业项目id pvc.metadata.annotations(everest.io/enterprise-project-id) pv.spec.csi.volumeAttributes(everest.io/enterprise-project-id) 同时定义/不被定义,若定义需要内容一致 accessMode accessMode accessMode 内容一致 存储类 storageclass storageclass 内容一致
  • 存储卷访问模式 PV只能以底层存储资源所支持的方式挂载到宿主系统上。例如,文件存储可以支持多个节点读写,云硬盘只能被一个节点读写。 ReadWriteOnce:卷可以被一个节点以读写方式挂载,云硬盘存储卷支持此类型。 ReadWriteMany:卷可以被多个节点以读写方式挂载,文件存储、对象存储、极速文件存储支持此类型。 表1 支持访问模式 存储类型 ReadWriteOnce ReadWriteMany 云硬盘EVS √ × 文件存储SFS × √ 对象存储OBS × √ 极速文件存储SFS Turbo × √ 本地持久卷LocalPV √ ×
  • 企业项目支持说明 该功能需要Everest插件升级到1.2.33及以上版本。 使用存储类创建PVC: CCE支持使用存储类创建云硬盘和对象存储类型PVC时指定企业项目,将创建的存储资源(云硬盘和对象存储)归属于指定的企业项目下,企业项目可选为集群所属的企业项目或default企业项目。 若不指定企业项目,则创建的存储资源默认使用存储类StorageClass中指定的企业项目。 对于自定义的StorageClass,可以在StorageClass中指定企业项目,详见指定StorageClass的企业项目。StorageClass中如不指定的企业项目,则默认为default企业项目。 对于CCE提供的 csi-disk 和 csi-obs 存储类,所创建的存储资源属于default企业项目。 使用存储卷PV创建PVC: 使用PV创建PVC时,因为存储资源在创建时已经指定了企业项目,如果PVC中指定企业项目,则务必确保在PVC和PV中指定的everest.io/enterprise-project-id保持一致,否则两者无法正常绑定。
  • 前提条件 Ingress为后端工作负载提供网络访问,因此集群中需提前部署可用的工作负载。若您无可用工作负载,可参考创建无状态负载(Deployment)、创建有状态负载(StatefulSet)或创建守护进程集(DaemonSet)部署工作负载。 为上述工作负载配置Service,支持的Service类型如表1,可参考集群内访问(ClusterIP)或节点访问(NodePort)配置示例Service。 添加NginxIngress时,需在集群中提前安装nginx-ingress插件,具体操作可参考安装插件。 表1 支持Service类型 Ingress类型 访问类型 集群内访问(ClusterIP) 节点访问(NodePort) ELBIngress 负载均衡路由 不支持 支持 ENI负载均衡路由 支持 不支持 NginxIngress 负载均衡路由 支持 支持 ENI负载均衡路由 支持 不支持
  • AOM 弹性伸缩切换至HPA/CustomedHPA说明 CCE在1.15及以下版本集群支持根据AOM监控数据做工作负载弹性伸缩,该方法在1.17及以上版本集群不再支持。 如果您使用了AOM弹性伸缩方法,当集群升级到1.17后,可以切换至HPA/CustomedHPA弹性伸缩方法,在切换时需要注意如下差异: AOM弹性伸缩的利用率计算基于工作负载的limit,利用率区间为0%~100% HPA/CustomedHPA的利用率基于request计算,其区间能够大于100% 例如某个工作负载的内存request是2G, limit是16G,AOM的弹性伸缩策略是利用率达到limit的50%就扩容(即8G);使用HPA/CustomedHPA按照request计算,同样控制内存使用到8G,需要把利用率调整为16×50%/2=400%。 父主题: 工作负载弹性伸缩
  • 约束与限制 移除节点、删除节点、重置节点和缩容节点会导致与节点关联的本地持久存储卷类型的PVC/PV数据丢失,无法恢复,且PVC/PV无法再正常使用。移除节点、删除节点、重置节点和缩容节点时使用了本地持久存储卷的Pod会从待删除、重置的节点上驱逐,并重新创建Pod,Pod会一直处于pending状态,因为Pod使用的PVC带有节点标签,由于冲突无法调度成功。节点重置完成后,Pod可能调度到重置好的节点上,此时Pod会一直处于creating状态,因为PVC对应的底层逻辑卷已经不存在了。 持久存储卷或临时存储卷创建后,请勿在节点上手动删除对应的存储池或卸载数据盘,否则会导致数据丢失等异常情况。 如果要使用临时存储卷,请确保节点上Pod不要挂载/var/lib/kubelet/pods/目录,否则可能会导致使用了临时存储卷的Pod无法正常删除。
  • 使用持久存储卷 本地持久存储卷支持使用StorageClass动态创建PVC,StorageClass名称为csi-local-topology。csi-local-topology的行为相比csi-disk等他类型StorageClass有较大差异,使用csi-local-topology行为如下。 添加了本地持久存储卷的节点会自动加上node.kubernetes.io/local-storage-persistent的标签。如果Pod使用csi-local-topology类型的PVC,调度器会将Pod调度到拥有node.kubernetes.io/local-storage-persistent标签的节点上,也就是拥有本地持久存储卷的节点上。 单独创建PVC,PVC创建后,状态会一直为Pending,不会立即创建PV。等有Pod使用PVC,调度器将Pod调度到节点后,everest再创建localpv所需的逻辑卷,并返回PV,PVC完成与PV的绑定。待挂载成功后,Pod启动。 创建应用时选择动态创建PVC,此时动态创建PVC后,调度器将Pod调度到节点,everest再创建逻辑卷,并返回PV,PVC完成与PV的绑定。待挂载成功后,Pod启动。 删除应用时,可选择不删除使用的PVC。这样在下一次创建应用时可以使用使用过的PVC,这样Pod会被调度到PVC关联的节点上。 apiVersion: v1kind: PersistentVolumeClaimmetadata: name: pvc-local-example namespace: defaultspec: accessModes: - ReadWriteOnce # 必须为ReadWriteOnce resources: requests: storage: 10Gi # 本地持久存储卷大小 storageClassName: csi-local-topology # StorageClass类型为csi-local-topology
  • 使用临时存储卷 创建工作负载时,EmptyDir的磁盘介质选择为LocalVolume,表示使用临时存储卷。 apiVersion: apps/v1kind: Deploymentmetadata: name: nginx namespace: defaultspec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: container-1 image: nginx:alpine resources: requests: cpu: 250m memory: 512Mi limits: cpu: 250m memory: 512Mi volumeMounts: - name: vol-164284390917275733 mountPath: /tmp imagePullSecrets: - name: default-secret volumes: - name: vol-164284390917275733 emptyDir: medium: LocalVolume # emptyDir磁盘介质选择LocalVolume,表示使用临时存储卷 sizeLimit: 1Gi
  • 持久存储卷和临时存储卷 CCE支持将节点上数据盘设置为持久存储卷和临时存储卷。 持久存储卷通过LVM组成存储池(VolumeGroup),然后划分LV给容器挂载使用。使用持久存储卷作为存储介质的PV的类型可称之为Local PV。 临时存储卷可以作为EmptyDir的存储介质。临时存储卷通过LVM组成存储池(VolumeGroup),然后划分LV给容器挂载使用,相比原生EmptyDir默认的存储介质类型性能更好。 持久存储卷和临时存储卷支持如下两种写入模式。 线性:线性逻辑卷是将一个或多个物理卷整合为一个逻辑卷,实际写入数据时会先往一个基本物理卷上写入,当存储空间占满时再往另一个基本物理卷写入。 条带化:创建逻辑卷时指定条带化,当实际写入数据时会将连续数据分成大小相同的块,然后依次存储在多个物理卷上,实现数据的并发读写从而提高读写性能。多块卷才能选择条带化。
  • 添加持久存储卷或临时存储卷 有两种方法可以添加持久存储卷或临时存储卷。 在创建节点时,可以为节点添加数据盘作为持久存储卷或临时存储卷,如下所示。 如果创建节点时没有添加持久存储卷或临时存储卷,或当前存储卷容量不够,可以去E CS 中为节点添加磁盘,然后在CCE的存储池中导入。 条带化模式的存储池不支持扩容,条带化扩容后可能造成碎片空间,无法使用。 存储池不支持缩容和删除。 如果删除节点上存储池的磁盘,会导致存储池异常。 导入时可以选择写入模式。
  • default-secret default-secret的类型为kubernetes.io/dockerconfigjson,其data内容是登录SWR镜像仓库的凭据,用于从SWR拉取镜像。在CCE中创建工作负载时如果需要从SWR拉取镜像,需要配置imagePullSecrets的取值为default-secret,如下所示。 apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - image: nginx:alpine name: container-0 resources: limits: cpu: 100m memory: 200Mi requests: cpu: 100m memory: 200Mi imagePullSecrets: - name: default-secret default-secret的data数据会定期更新,且当前的data内容会在一定时间后会过期失效。您可以使用describe命令在default-secret的中查看到具体的过期时间,如下所示。 在使用时请直接使用default-secret,而不要拷贝secret内容重新创建,因为secret里面的凭据会过期,从而导致无法拉取镜像。 $ kubectl describe secret default-secretName: default-secretNamespace: defaultLabels: secret-generated-by=cceAnnotations: temporary-ak-sk-expires-at: 2021-11-26 20:55:31.380909 +0000 UTCType: kubernetes.io/dockerconfigjsonData====.dockerconfigjson: 347 bytes
  • 操作步骤 登录OBS控制台,创建对象存储桶,记录桶名称和存储类型。 请参见通过kubectl连接集群,使用kubectl连接集群。 新建两个yaml文件,用于创建PersistentVolume(PV)、PersistentVolumeClaim(PVC),假设文件名为pv-obs-example.yaml、pvc-obs-example.yaml。 touch pv-obs-example.yaml pvc-obs-example.yaml K8S集群版本(K8S version) 说明 yaml示例 1.11 ≤ K8S version ≤ 1.13 1.11以上及1.13版本集群 请参见1.11~1.13 yaml文件配置示例 K8S version = 1.9 1.9版本集群 请参见1.9 yaml文件配置示例 1.11 ≤ K8S version ≤ 1.13(1.11以上及1.13版本集群) PV yaml文件配置示例: apiVersion: v1 kind: PersistentVolume metadata: name: pv-obs-example annotations: pv.kubernetes.io/provisioned-by: flexvolume-huawei.com/fuxiobsspec: accessModes: - ReadWriteMany capacity: storage: 1Gi claimRef: apiVersion: v1 kind: PersistentVolumeClaim name: pvc-obs-example namespace: default flexVolume: driver: huawei.com/fuxiobs fsType: obs options: fsType: obs region: cn-north-4 storage_class: STANDARD volumeID: test-obs persistentVolumeReclaimPolicy: Delete storageClassName: obs-standard 表1 关键参数说明 参数 描述 driver 挂载依赖的存储驱动,对象存储配置为“huawei.com/fuxiobs”。 storage_class 存储类型,包括STANDARD(标准桶)、STANDARD_IA(低频访问桶)。 region Region对应的值请参见地区和终端节点。 volumeID 对象存储的桶名称。 获取方法:在CCE控制台,单击左侧栏目树中的“资源管理-存储管理”,在“对象存储卷”页签下单击PVC的名称,在PVC详情页的“PV详情”页签下复制“PV名称”后的内容即可。 storage 存储容量,单位为Gi。此处配置为固定值1Gi。 storageClassName 对象存储支持的存储类型,包括obs-standard(标准)、obs-standard-ia(低频)。 spec.claimRef.apiVersion 固定值"v1"。 spec.claimRef.kind 固定值"PersistentVolumeClaim"。 spec.claimRef.name 与下一步创建的pvc的name一致。 spec.claimRef.namespace 与下一步创建的pvc的namespace一致。 PVC yaml文件配置示例: apiVersion: v1kind: PersistentVolumeClaimmetadata: annotations: volume.beta.kubernetes.io/storage-class: obs-standard volume.beta.kubernetes.io/storage-provisioner: flexvolume-huawei.com/fuxiobs name: pvc-obs-example namespace: defaultspec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi volumeName: pv-obs-example 表2 关键参数说明 参数 描述 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。 K8S version = 1.9(1.9版本集群) PV 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-4 storage_class: STANDARD volumeID: test-obs persistentVolumeReclaimPolicy: Delete storageClassName: obs-standard 表3 关键参数说明 参数 描述 driver 挂载依赖的存储驱动,对象存储配置为“huawei.com/fuxiobs”。 storage_class 存储类型,包括STANDARD(标准桶)、STANDARD_IA(低频访问桶)。 region Region对应的值请参见地区和终端节点。 volumeID 对象存储的桶名称。 获取方法:在CCE控制台,单击左侧栏目树中的“资源管理-存储管理”,在“对象存储卷”页签下单击PVC的名称,在PVC详情页的“PV详情”页签下复制“PV名称”后的内容即可。 storage 存储容量,单位为Gi。此处配置为固定值1Gi。 storageClassName 对象存储支持的存储类型,包括obs-standard(标准)、obs-standard-ia(低频)。 PVC yaml文件配置示例: apiVersion: v1kind: PersistentVolumeClaimmetadata: annotations: volume.beta.kubernetes.io/storage-class: obs-standard volume.beta.kubernetes.io/storage-provisioner: flexvolume-huawei.com/fuxiobs name: pvc-obs-example namespace: defaultspec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi volumeName: pv-obs-example volumeNamespace: default 表4 关键参数说明 参数 描述 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。 创建PV。 kubectl create -f pv-obs-example.yaml 创建PVC。 kubectl create -f pvc-obs-example.yaml
  • Pod Annotation说明 CCE提供一些使用Pod的高级功能,这些功能使用时可以通过给YAML添加注解Annotation实现。具体的Annotation如下表所示。 表1 Pod Annotation 注解 说明 默认值 kubernetes.AOM.log.stdout 容器标准输出采集参数,不配置默认将全部容器的标准输出上报至AOM,可配置采集指定容器或全部不采集。 示例: 全部不采集 kubernetes.AOM.log.stdout: '[]' 采集container-1和container-2容器。 kubernetes.AOM.log.stdout: '["container-1","container-2"]' - metrics.alpha.kubernetes.io/custom-endpoints AOM监控指标上报参数,可将指定指标上报是AOM服务。 具体使用请参见自定义监控。 - prometheus.io/scrape Prometheus指标上报参数,值为true表示当前负载开启上报。 具体使用请参见使用Prometheus插件监控。 - prometheus.io/path Prometheus采集的url路径。 具体使用请参见使用Prometheus插件监控。 /metrics prometheus.io/port Prometheus采集的endpoint端口号。 具体使用请参见使用Prometheus插件监控。 - prometheus.io/scheme Prometheus采集协议,值可以填写http或https 具体使用请参见使用Prometheus插件监控。 - kubernetes.io/ingress-bandwidth Pod的入口带宽 具体使用请参见Pod Annotation说明。 - kubernetes.io/egress-bandwidth Pod的出口带宽 具体使用请参见Pod Annotation说明。 - 父主题: 工作负载
  • 操作步骤 参照创建对象存储卷中操作创建对象存储卷,并获取PVC名称。 请参见通过kubectl连接集群,使用kubectl连接集群。 新建一个YAML文件,用于创建工作负载。假设文件名为obs-statefulset-example.yaml。 touch obs-statefulset-example.yaml vi obs-statefulset-example.yaml yaml示例如下: apiVersion: apps/v1kind: StatefulSetmetadata: name: obs-statefulset-example namespace: defaultspec: replicas: 1 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: image: nginx:latest imagePullPolicy: Always name: container-0 volumeMounts: - mountPath: /tmp name: pvc-obs-example imagePullSecrets: - name: default-secret volumes: - name: pvc-obs-example persistentVolumeClaim: claimName: cce-obs-demo 表1 关键参数说明 参数 描述 replicas 实例数。 name 新建工作负载的名称。 image 新建工作负载使用的镜像。 mountPath 容器内挂载路径。 serviceName 工作负载对应的服务,服务创建过程请参见创建有状态负载(StatefulSet)。 claimName 已有PVC名称。 创建有状态工作负载。 kubectl create -f obs-statefulset-example.yaml
  • 自定义StorageClass 自定义高I/O类型StorageClass,使用YAML描述如下,这里取名为csi-disk-sas,指定云硬盘类型为SAS,即高I/O。 apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: csi-disk-sas # 高IO StorageClass名字,用户可自定义parameters: csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io csi.storage.k8s.io/fstype: ext4 everest.io/disk-volume-type: SAS # 云硬盘高I/O类型,用户不可自定义 everest.io/passthrough: "true"provisioner: everest-csi-provisionerreclaimPolicy: DeletevolumeBindingMode: ImmediateallowVolumeExpansion: true # true表示允许扩容 超高I/O类型StorageClass,这里取名为csi-disk-ssd,指定云硬盘类型为SSD,即超高I/O。 apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: csi-disk-ssd # 超高I/O StorageClass名字,用户可自定义parameters: csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io csi.storage.k8s.io/fstype: ext4 everest.io/disk-volume-type: SSD # 云硬盘超高I/O类型,用户不可自定义 everest.io/passthrough: "true"provisioner: everest-csi-provisionerreclaimPolicy: DeletevolumeBindingMode: ImmediateallowVolumeExpansion: true reclaimPolicy:底层 云存储 的回收策略,支持Delete、Retain回收策略。 Delete:删除PVC,PV资源与云硬盘均被删除。 Retain:删除PVC,PV资源与底层存储资源均不会被删除,需要手动删除回收。PVC删除后PV资源状态为“已释放(Released)”,不能直接再次被PVC绑定使用。 此处设置的回收策略对SFS Turbo类型的存储无影响,因此删除集群或删除PVC时不会回收包周期的SFS Turbo资源。 如果数据安全性要求较高,建议使用Retain以免误删数据。 定义完之后,使用kubectl create命令创建。 # kubectl create -f sas.yamlstorageclass.storage.k8s.io/csi-disk-sas created# kubectl create -f ssd.yamlstorageclass.storage.k8s.io/csi-disk-ssd created 再次查询StorageClass,回显如下,可以看到多了两个类型的StorageClass。 # kubectl get scNAME PROVISIONER AGEcsi-disk everest-csi-provisioner 17dcsi-disk-sas everest-csi-provisioner 2m28scsi-disk-ssd everest-csi-provisioner 16scsi-disk-topology everest-csi-provisioner 17dcsi-nas everest-csi-provisioner 17dcsi-obs everest-csi-provisioner 17dcsi-sfsturbo everest-csi-provisioner 17d 其他类型存储自定义方法类似,可以使用 kubectl 获取YAML,在YAML基础上根据需要修改。 文件存储 # kubectl get sc csi-nas -oyamlkind: StorageClassapiVersion: storage.k8s.io/v1metadata: name: csi-nasprovisioner: everest-csi-provisionerparameters: csi.storage.k8s.io/csi-driver-name: nas.csi.everest.io csi.storage.k8s.io/fstype: nfs everest.io/share-access-level: rw everest.io/share-access-to: 5e3864c6-e78d-4d00-b6fd-de09d432c632 # 集群所在VPC ID everest.io/share-is-public: 'false' everest.io/zone: xxxxx # 可用区reclaimPolicy: DeleteallowVolumeExpansion: truevolumeBindingMode: Immediate 对象存储 # kubectl get sc csi-obs -oyamlkind: StorageClassapiVersion: storage.k8s.io/v1metadata: name: csi-obsprovisioner: everest-csi-provisionerparameters: csi.storage.k8s.io/csi-driver-name: obs.csi.everest.io csi.storage.k8s.io/fstype: s3fs # 对象存储文件类型,s3fs是对象桶,obsfs是并行文件系统 everest.io/obs-volume-type: STANDARD # OBS桶的存储类别reclaimPolicy: DeletevolumeBindingMode: Immediate
  • 指定默认StorageClass 您还可以指定某个StorageClass作为默认StorageClass,这样在创建PVC时不指定StorageClassName就会使用默认StorageClass创建。 例如将csi-disk-ssd指定为默认StorageClass,则可以按如下方式设置。 apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: csi-disk-ssd annotations: storageclass.kubernetes.io/is-default-class: "true" # 指定集群中默认的StorageClass,一个集群中只能有一个默认的StorageClassparameters: csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io csi.storage.k8s.io/fstype: ext4 everest.io/disk-volume-type: SSD everest.io/passthrough: "true"provisioner: everest-csi-provisionerreclaimPolicy: DeletevolumeBindingMode: ImmediateallowVolumeExpansion: true 先删除之前创建的csi-disk-ssd,再使用kubectl create命令重新创建,然后再查询StorageClass,显示如下。 # kubectl delete sc csi-disk-ssdstorageclass.storage.k8s.io "csi-disk-ssd" deleted# kubectl create -f ssd.yamlstorageclass.storage.k8s.io/csi-disk-ssd created# kubectl get scNAME PROVISIONER AGEcsi-disk everest-csi-provisioner 17dcsi-disk-sas everest-csi-provisioner 114mcsi-disk-ssd (default) everest-csi-provisioner 9scsi-disk-topology everest-csi-provisioner 17dcsi-nas everest-csi-provisioner 17dcsi-obs everest-csi-provisioner 17dcsi-sfsturbo everest-csi-provisioner 17d
  • 应用现状 CCE中使用存储时,最常见的方法是创建PVC时通过指定StorageClassName定义要创建存储的类型,如下所示,使用PVC申请一个SAS(高I/O)类型云硬盘/块存储。 apiVersion: v1kind: PersistentVolumeClaimmetadata: name: pvc-evs-example namespace: default annotations: everest.io/disk-volume-type: SASspec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: csi-disk 可以看到在CCE中如果需要指定云硬盘的类型,是通过everest.io/disk-volume-type: SAS字段指定,这里SAS是云硬盘的类型,代表高I/O,还有SSD(超高I/O)可以指定。 这种写法在如下几种场景下存在问题: 部分用户觉得使用everest.io/disk-volume-type指定云硬盘类型比较繁琐,希望只通过StorageClassName指定。 部分用户是从自建Kubernetes或其他Kubernetes服务切换到CCE,已经写了很多应用的YAML文件,这些YAML文件中通过不同StorageClassName指定不同类型存储,迁移到CCE上时,使用存储就需要修改大量YAML文件或Helm Chart包,这非常繁琐且容易出错。 部分用户希望能够设置默认的StorageClassName,所有应用都使用默认存储类型,在YAML中不用指定StorageClassName也能按创建默认类型存储。
  • 解决方案 本文介绍在CCE中自定义StorageClass的方法,并介绍设置默认StorageClass的方法,通过不同StorageClassName指定不同类型存储。 对于第一个问题:可以将SAS、SSD类型云硬盘分别定义一个StorageClass,比如定义一个名为csi-disk-sas的StorageClass,这个StorageClass创建SAS类型的存储,则前后使用的差异如下图所示,编写YAML时只需要指定StorageClassName,符合特定用户的使用习惯。 对于第二个问题:可以定义与用户现有YAML中相同名称的StorageClass,这样可以省去修改YAML中StorageClassName的工作。 对于第三个问题:可以设置默认的StorageClass,则YAML中无需指定StorageClassName也能创建存储,按如下写法即可。 apiVersion: v1kind: PersistentVolumeClaimmetadata: name: pvc-evs-example namespace: defaultspec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi
  • 配置验证 使用csi-disk-sas创建PVC。 apiVersion: v1kind: PersistentVolumeClaimmetadata: name: sas-diskspec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: csi-disk-sas 创建并查看详情,如下所示,可以发现能够创建,且StorageClass显示为csi-disk-sas # kubectl create -f sas-disk.yaml persistentvolumeclaim/sas-disk created# kubectl get pvcNAME STATUS VOLUME CAPACITY AC CES S MODES STORAGECLASS AGEsas-disk Bound pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO csi-disk-sas 24s# kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO Delete Bound default/sas-disk csi-disk-sas 30s 在CCE控制台界面上查看PVC详情,在“PV详情”页签下可以看到磁盘类型是高I/O。 不指定StorageClassName,使用默认配置,如下所示,并未指定storageClassName。 apiVersion: v1kind: PersistentVolumeClaimmetadata: name: ssd-diskspec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi 创建并查看,可以看到PVC ssd-disk的StorageClass为csi-disk-ssd,说明默认使用了csi-disk-ssd。 # kubectl create -f ssd-disk.yaml persistentvolumeclaim/ssd-disk created# kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEsas-disk Bound pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO csi-disk-sas 16mssd-disk Bound pvc-4d2b059c-0d6c-44af-9994-f74d01c78731 10Gi RWO csi-disk-ssd 10s# kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpvc-4d2b059c-0d6c-44af-9994-f74d01c78731 10Gi RWO Delete Bound default/ssd-disk csi-disk-ssd 15spvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO Delete Bound default/sas-disk csi-disk-sas 17m 在CCE控制台界面上查看PVC详情,在“PV详情”页签下可以看到磁盘类型是超高I/O。
  • 指定StorageClass的企业项目 CCE支持使用存储类创建云硬盘和对象存储类型PVC时指定企业项目,将创建的存储资源(云硬盘和对象存储)归属于指定的企业项目下,企业项目可选为集群所属的企业项目或default企业项目。 若不指定企业项目,则创建的存储资源默认使用存储类StorageClass中指定的企业项目,CCE提供的 csi-disk 和 csi-obs 存储类,所创建的存储资源属于default企业项目。 如果您希望通过StorageClass创建的存储资源能与集群在同一个企业项目,则可以自定义StorageClass,并指定企业项目ID,如下所示。 该功能需要Everest插件升级到1.2.33及以上版本。 kind: StorageClassapiVersion: storage.k8s.io/v1metadata: name: csi-disk-epid # 自定义名称provisioner: everest-csi-provisionerparameters: csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io csi.storage.k8s.io/fstype: ext4 everest.io/disk-volume-type: SAS everest.io/enterprise-project-id: 86bfc701-9d9e-4871-a318-6385aa368183 # 指定企业项目id everest.io/passthrough: 'true'reclaimPolicy: DeleteallowVolumeExpansion: truevolumeBindingMode: Immediate
  • 定时轮转 在插件使用说明,通过使用该插件,用户可完成基本的凭据挂载功能,即能够将存储在凭据管理服务中的凭据写入到Pod内。 若将在SPC对象中声明的凭据版本改为”latest”,如下所示: apiVersion: secrets-store.csi.x-k8s.io/v1kind: SecretProviderClassmetadata: name: spc-testspec: provider: cce parameters: objects: | - objectName: "secret_1" objectVersion: "latest" # change "v1"to "latest" objectType: "csms" 更新该SPC对象后,插件将周期性地向凭据管理服务发起请求,获取凭据secret_1最新版本的值,并将其刷新至引用了该SPC对象的Pod内。
  • 实时感知SPC变化 在插件使用说明、定时轮转的演示中,其实已经使用到了实时感知SPC变化的能力。为了演示说明,在SPC对象中新增一个凭据secret_2,如下所示: apiVersion: secrets-store.csi.x-k8s.io/v1kind: SecretProviderClassmetadata: name: spc-testspec: provider: cce parameters: objects: | - objectName: "secret_1" objectVersion: "latest" objectType: "csms" - objectName: "secret_2" objectVersion: "v1" objectType: "csms" 更新该SPC对象后,新增的secret_2将很快挂载至引用了该SPC对象的Pod内。
  • 卸载插件 插件卸载时,会同时删除相关的CRD资源。即使重装插件,原有的SecretProviderClass对象也不可用,请谨慎操作。插件卸载再重装后,若需使用原有的SecretProviderClass资源,需重新手动创建。 登录CCE控制台,在“集群管理”中选择相应集群,然后单击左侧导航栏的“插件管理”,在“已安装插件”页签下,单击“dew-provider”下的“卸载”。 在弹出的窗口中,单击“是”,可卸载该插件。
  • 升级/编辑插件 登录CCE控制台,在“集群管理”中选择相应集群,然后在左侧导航栏中选择“插件管理”,在“已安装插件”页签下,单击“dew-provider”下的“ 升级”。 如果不存在“升级”按钮,则说明当前插件版本是最新的版本,不需要进行升级操作。可单击“编辑”按钮进行编辑,修改插件的配置参数。 升级或修改“dew-provider”插件时,会替换原先节点上的插件实例,并安装新的“dew-provider”插件。 在新console下升级插件时,默认升级为可用的最新版本。 参考安装插件中的参数说明进行参数配置,单击“确定”即可。
  • 查看组件日志 查看插件的Pod $ kubectl get pod -n kube-systemNAME READY STATUS RESTARTS AGEcsi-secrets-store-76tj2 3/3 Running 0 11hdew-provider-hm5fq 1/1 Running 0 11h 查看dew-provider组件Pod日志 $ kubectl logs dew-provider-hm5fq -n kube-system…日志信息略…… 查看csi-secrets-store组件Pod日志,由于csi-secrets-store组件的Pod包含多个容器,在查看日志信息时,需通过”-c”命令指定某个容器。其中,secrets-store容器作为该插件的主业务容器,其包含了主要的日志信息。 $ kubectl logs csi-secrets-store-76tj2 -c secrets-store -n kube-system…日志信息略……
  • 插件使用说明 创建ServiceAccount。 创建ServiceAccount对象,其中声明了允许业务使用的凭据名称,若用户引用了未在此处声明的凭据,则挂载失败,最终导致Pod无法运行。 根据如下模板创建serviceaccount.yaml,在cce.io/dew-resource字段中声明允许业务使用的凭据名称。这里声明了secret_1和secret_2,表示允许业务引用这两个凭据对象。在后续的操作中,若用户在业务中引用了secret_3,则无法通过校验,从而导致无法正常挂载该凭据,最终业务Pod将无法运行。 apiVersion: v1kind: ServiceAccountmetadata: name: nginx-spc-sa annotations: cce.io/dew-resource: "[\"secret_1\",\"secret_2\"]" #secrets that allow pod to use 这里需要明确,此处声明的凭据应确保在凭据管理服务中是存在的,如下图所示。否则,即使通过了校验,最终向凭据管理服务中获取相应凭据的时候也会出错,从而导致Pod无法正常运行。 执行如下命令创建ServiceAccount对象。 kubectl apply -f serviceaccount.yaml 查看ServiceAccount对象是否已经正常创建,如下所示: $ kubectl get saNAME SECRETS AGEdefault 1 18d # 此为系统默认的ServiceAccount对象nginx-spc-sa 1 19s # 此为刚刚创建的ServiceAccount对象 至此,一个名为“nginx-spc-sa”的ServiceAccount对象已正常创建。该对象将在后续的业务Pod中被引用。 创建SecretProviderClass。 SecretProviderClass对象用于描述用户感兴趣的凭据信息(比如指定凭据的版本、凭据的名称等),由用户创建,并在业务Pod中进行引用。 根据如下模板创建secretproviderclass.yaml。用户主要关注parameters.objects字段,它是一个数组,用于声明用户想要挂载的凭据信息。 apiVersion: secrets-store.csi.x-k8s.io/v1kind: SecretProviderClassmetadata: name: spc-testspec: provider: cce # 固定为cce parameters: objects: | - objectName: "secret_1" objectVersion: "v1" objectType: "csms" 参数 参数类型 是否必选 参数说明 objectName String 是 凭据名称。若同一个SecretProviderClass中定义了多个objectName,不允许重名,否则会挂载失败。 objectAlias String 否 凭据写入到容器内的文件名称。若不指定,则凭据写入到容器内的文件名默认为objectName;若指定,则objectAlias与其他凭据的objectName和objectAlias均不允许重名,与自身的objectName也不允许重名,否则会挂载失败。 objectType String 是 凭据类型。当前仅支持”csms”类型,其他均为非法输入。 objectVersion String 是 凭据的版本。 指定某个具体的版本:v1,v2,… 指定最新版本:latest。当指定objectVersion为” latest”时,若在云凭据管理服务侧对应的凭据发生了更新,更新后的凭据值将在经过一定时间间隔后(即rotation_poll_interval)刷新至Pod内。 执行如下命令创建SecretProviderClass对象。 kubectl apply -f secretproviderclass.yaml 查看SecretProviderClass对象是否已经正常创建,如下所示: $ kubectl get spcNAME AGEspc-test 20h 至此,一个名为“spc-test”的SecretProviderClass对象已正常创建。该对象将在后续的业务Pod中被引用。 创建业务Pod。 这里以创建一个nginx应用为例。 定义业务负载,在serviceAccountName中引用此前创建好的ServiceAccount对象,secretProviderClass中引用此前创建好的SPC对象,并在mountPath中指定容器内的挂载路径(这里需注意,用户不应该指定”/”,” /var/run”等特殊目录,否则可能影响容器的正常启动)。 apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-spc labels: app: nginxspec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: serviceAccountName: nginx-spc-sa # 引用上面创建的ServiceAccount volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "spc-test" # 引用上面创建的SPC containers: - name: nginx-spc image: nginx:alpine imagePullPolicy: IfNotPresent volumeMounts: - name: secrets-store-inline mountPath: "/mnt/secrets-store" # 定义容器内凭据的挂载路径 readOnly: true imagePullSecrets: - name: default-secret 执行 kubectl apply -f deployment.yaml 创建业务Pod。 查看Pod是否已经正常创建,如下所示: $ kubectl get podNAME READY STATUS RESTARTS AGEnginx-spc-67c9d5b594-642np 1/1 Running 0 20s 进入容器,查看指定的凭据是否正常写入。如下所示: $ kubectl exec -ti nginx-spc-67c9d5b594-642np -- /bin/bashroot@nginx-spc-67c9d5b594-642np:/# root@nginx-spc-67c9d5b594-642np:/# cd /mnt/secrets-store/root@nginx-spc-67c9d5b594-642np:/mnt/secrets-store# root@nginx-spc-67c9d5b594-642np:/mnt/secrets-store# lssecret_1 可以看到,用户在SPC对象中声明的secret_1已正常写入Pod。 此外,还可以通过获取spcPodStatus查看Pod与凭据的绑定情况。如下所示: $ kubectl get spcpsNAME AGEnginx-spc-67c9d5b594-642np-default-spc-test 103s$ kubectl get spcps nginx-spc-67c9d5b594-642np-default-spc-test -o yaml......status:mounted: trueobjects: # 挂载的凭据信息- id: secret_1version: v1podName: nginx-spc-67c9d5b594-642np # 引用了SPC对象的PodsecretProviderClassName: spc-test # SPC对象targetPath: /mnt/paas/kubernetes/kubelet/pods/6dd29596-5b78-44fb-9d4c-a5027c420617/volumes/kubernetes.io~csi/secrets-store-inline/mount
  • 安装插件 登录CCE控制台,单击左侧导航栏的“插件市场”,在“插件市场”页签下,单击“dew-provider”下的“安装”按钮。 在安装插件页面,选择安装的集群,在参数配置栏进行参数配置。参数配置说明如下。 参数 参数说明 rotation_poll_interval 轮转时间间隔。单位:分钟,即m(注意不是min)。 轮转时间间隔表示向云凭据管理服务发起请求并获取最新的凭据的周期,合理的时间间隔范围为[1m, 1440m],默认值为2m。 单击“安装”。 待插件安装完成后,选择对应的集群,然后单击左侧导航栏的“插件管理”,可在“已安装插件”页签中查看相应的插件。
  • 约束与限制 数据加密 服务包含密钥管理(Key Management Service, KMS)、云凭据管理(Cloud Secret Management Service,C SMS )和密钥对管理(Key Pair Service, KPS)等服务。当前,该插件仅支持对接其中的云凭据管理服务。 支持的集群版本:v1.19+。 支持的集群类型:CCE集群和 CCE Turbo 集群。 允许创建的SecretProviderClass对象个数上限:500个。
共100000条