云服务器内容精选

  • job的pod已经执行完成的情况下,为什么依然有实例在挂卷等事件,并且事件信息是失败的? 问题现象: job的Pod已经执行完成的情况下,依然有实例在挂卷等事件,并且事件信息是失败的。 图1 问题截图 问题原因: 各种类型的Pod(Deployment/StatefulSet/Job/CronJob)在Node上启动时: 由kubelet针对该Pod创建podWorker(独立协程)负责检测Pod与关联volume的挂载情况:每隔0.3s检测当前Pod所需挂载的volume都已经挂载成功,检测超时为2min3s;如果检测周期中以及最终超时到达时Pod关联volume都没有检测到挂载成功,则上报事件“Unable to mount volumes for pod …”。 由kubelet中VolumeManager(独立协程)负责具体实施Pod关联volume的挂载操作。 对于long running的Pod(Deployment/StatefulSet),除了类似镜像拉取失败、存储挂载失败、容器网络分配失败、当前节点CPU/Mem不满足Pod的实际使用要求等异常场景外,Pod容器如果最终都会启动成功时,上述podWorker在几次周期后都会判定挂载成功。 而对于短时运行的Pod(Job/CronJob),由于容器中业务存在正常退出(如问题场景的G CS Demo job只执行一些echo和ls命令,总体耗时1s不到),就存在短时Pod运行退出时如果刚好在两次podwork检测volume挂载周期中,那么就会出现本问题单所述的误报,但是不影响业务使用,且实际的Job业务还是会运行超过上述时间的。 当前kubelet上述能力属于社区挂载框架既有能力。 解决方法: 针对短时运行的Pod(Job/CronJob),可能存在由于运行时间过短而误报卷挂载超时的情况,如果这类短时运行任务属于正常退出,则该误报对业务没有影响可以忽略。 父主题: 存储管理类
  • 使用限制 待挂载的云硬盘必须是按需付费,更多信息,请参见云硬盘计费。 云容器实例无法导入以下条件的磁盘:非当前可用区、状态非可用、系统盘、被CCE关联、非SCSI盘、共享盘、专属存储、冻结盘、HANA服务器专属类型盘(高IO性能优化型/超高IO时延优化型)。 云硬盘存储卷只能当一个新盘来用。对于云容器实例没有挂载过的云硬盘存储卷,云硬盘存储卷中的内容对容器不可见。 对于已导入的云硬盘,如果在云硬盘控制台中删除该硬盘,云容器实例无法感知,建议您确定没有负载使用时再删除云硬盘。 一个云硬盘存储卷只能挂载到一个实例下,否则会存在数据丢失的情况。 云容器实例场景下不感知云硬盘扩容,如果需要扩容,请先在云容器实例控制台的“云硬盘存储卷”页面解关联对应的云硬盘,待云硬盘扩容完成后重新导入。
  • URI GET /v1/{project_id}/persistent-storages/actions/list-share-folders 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 项目ID。 表2 Query参数 参数 是否必选 参数类型 描述 offset 否 Integer 查询的偏移量。 limit 否 Integer 单次查询的大小[1-100]。 storage_id 是 String WKS存储ID。 storage_claim_id 否 String WKS存储目录声明ID。 path 否 String 查询名称需满足如下规则: 可见字符+空格。 长度0~128个字符。
  • 响应示例 状态码: 200 成功响应。 { "count" : 1, "items" : [ { "storage_claim_id" : "a0890780-7ef2-4aaf-b56d-b25fb53b717e", "folder_path" : "shares/video/", "delimiter" : "/", "claim_mode" : "SHARE", "count" : { "USER" : 0, "USER_GROUP" : 1 } } ] }
  • 创建CCE节点时可以不添加数据盘吗? 不可以,数据盘是必须要的。 新建节点会给节点绑定一个供kubelet及容器引擎使用的专用数据盘,详情请参见数据盘空间分配说明。CCE数据盘默认使用LVM(Logical Volume Manager)进行磁盘管理,开启后您可以通过空间分配调整数据盘中不同资源的空间占比,具体请参见LVM简介。 若数据盘卸载或损坏,会导致容器引擎服务异常,最终导致节点不可用。 父主题: 存储管理
  • 约束与限制 在CCE所创的集群中,Kubernetes v1.15.11版本是Flexvolume插件(storage-driver)被CSI插件(everest)兼容接管的过渡版本,v1.17及之后版本的集群中将彻底去除对Flexvolume插件(storage-driver)的支持,请您将Flexvolume插件的使用切换到CSI插件上。 CSI插件(everest)兼容接管Flexvolume插件(storage-driver)后,原有功能保持不变,但请注意不要新建Flexvolume插件(storage-driver)的存储,否则将导致部分存储功能异常。
  • CSI和Flexvolume存储插件的区别 表1 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所创的集群中,Kubernetes v1.15.11版本是Flexvolume插件(storage-driver)被CSI插件(Everest)兼容接管的过渡版本,v1.17及之后版本的集群中将彻底去除对Flexvolume插件(storage-driver)的支持,请您将Flexvolume插件的使用切换到CSI插件上。CSI和Flexvolume能力对比请参见CSI和Flexvolume存储插件的区别。 CSI插件(Everest)兼容接管Flexvolume插件(storage-driver)后,原有功能保持不变,但请注意不要新建Flexvolume插件(storage-driver)的存储,否则将导致部分存储功能异常。
  • CSI和Flexvolume存储插件的区别 表1 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插件。
  • 插件使用推荐 使用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存储的全部工作负载,否则工作负载使用存储的能力将受影响!
  • 使用kubectl挂载主机路径 CCE支持使用kubectl将容器所在宿主机的文件目录挂载到容器指定的挂载点中。 请参见通过kubectl连接集群,使用kubectl连接集群。 执行如下命令,配置名为“hostPath-pod-example.yaml”的创建Pod的yaml文件。 touch hostPath-pod-example.yaml vi hostPath-pod-example.yaml 在无状态工作负载中挂载主机路径,示例如下: apiVersion: apps/v1 kind: Deployment metadata: name: hostpath-pod-example namespace: default spec: replicas: 1 selector: matchLabels: app: hostpath-pod-example template: metadata: labels: app: hostpath-pod-example spec: containers: - image: nginx name: container-0 volumeMounts: - mountPath: /tmp name: hostpath-example imagePullSecrets: - name: default-secret restartPolicy: Always volumes: - name: hostpath-example hostPath: path: /tmp/test 表5 本地磁盘储存依赖参数说明 参数 描述 mountPath 容器内挂载路径,示例中挂载到“/tmp”路径。 hostPath 主机路径,示例中主机路径为“/tmp/test”。 “spec.template.spec.containers.volumeMounts.name ”和 “spec.template.spec.volumes.name”有映射关系,必须保持一致。 执行如下命令创建Pod。 kubectl create -f hostPath-pod-example.yaml 验证主机路径挂载 查询工作负载(以hostpath-pod-example为例)的实例名称 kubectl get po|grep hostpath-pod-example 期望输出: hostpath-pod-example-55c8d4dc59-md5d9 1/1 Running 0 35s 在容器挂载路径/tmp下创建文件test1 kubectl exec hostpath-pod-example-55c8d4dc59-md5d9 -- touch /tmp/test1 在主机路径/tmp/test/上可以见到该文件被创建 ll /tmp/test/ 预期输出: -rw-r--r-- 1 root root 0 Jun 1 16:12 test1 在主机挂载路径/tmp/test/上创建文件test2 touch /tmp/test/test2 在容器挂载路径内可以见到该文件被新建 kubectl exec hostpath-pod-example-55c8d4dc59-md5d9 -- ls -l /tmp 预期输出: -rw-r--r-- 1 root root 0 Jun 1 08:12 test1-rw-r--r-- 1 root root 0 Jun 1 08:14 test2
  • 响应示例 状态码: 200 OK { "data_stores" : [ { "data_store_id" : "47fc262a-5cce-4a47-a17d-392498d36948", "name" : "SmokeDetector_Storage", "group_id" : "0fba303d-687f-447c-9c54-999156867cf9", "tags" : [ [ { "name" : "device_id" }, { "name" : "category" } ] ], "properties" : [ { "name" : "temperature", "type" : "double" } ], "created_time" : "2020-08-14T23:21:49Z", "modified_time" : "2020-08-14T23:21:49Z" } ], "count" : 1}
  • 响应参数 状态码: 200 表4 响应Body参数 参数 参数类型 描述 data_stores Array of GetDataStore objects 数据结构列表 count Integer 返回的 data-store 数量 最小值:0 最大值:200 表5 GetDataStore 参数 参数类型 描述 data_store_id String 存储 ID 最小长度:0 最大长度:64 name String 存储名称 最小长度:0 最大长度:64 group_id String 存储 ID 最小长度:0 最大长度:64 tags Array of Tag objects 标签 metrics Array of Metric objects 指标 properties Array of Property objects 属性 created_time String 创建时间 最小长度:0 最大长度:64 modified_time String 更新时间 最小长度:0 最大长度:64 表6 Tag 参数 参数类型 描述 name String 标签名称 最小长度:0 最大长度:64 description String 标签描述 最小长度:0 最大长度:64 表7 Metric 参数 参数类型 描述 name String 指标名称 最小长度:0 最大长度:64 type String 指标值类型 最小长度:0 最大长度:64 description String 指标描述 最小长度:0 最大长度:64 unit String 指标单位 最小长度:0 最大长度:64 表8 Property 参数 参数类型 描述 name String 属性名称 最小长度:0 最大长度:64 type String 属性值类型 最小长度:0 最大长度:64 description String 属性描述 最小长度:0 最大长度:64 unit String 属性单位 最小长度:0 最大长度:64 状态码: 400 表9 响应Body参数 参数 参数类型 描述 error_code String 错误编码 最小长度:0 最大长度:100 error_msg String 错误消息 最小长度:0 最大长度:1024 状态码: 401 表10 响应Body参数 参数 参数类型 描述 error_code String 错误编码 最小长度:0 最大长度:100 error_msg String 错误消息 最小长度:0 最大长度:1024 状态码: 403 表11 响应Body参数 参数 参数类型 描述 error_code String 错误编码 最小长度:0 最大长度:100 error_msg String 错误消息 最小长度:0 最大长度:1024 状态码: 500 表12 响应Body参数 参数 参数类型 描述 error_code String 错误编码 最小长度:0 最大长度:100 error_msg String 错误消息 最小长度:0 最大长度:1024
  • URI GET /v1/{project_id}/data-stores 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 项目 ID 最小长度:1 最大长度:128 表2 Query参数 参数 是否必选 参数类型 描述 group_id 否 String 存储组 ID 最小长度:0 最大长度:64 data_store_id 否 String 存储 ID 最小长度:0 最大长度:64 name 否 String 存储名称 最小长度:0 最大长度:64 offset 否 Integer 偏移量,表示从此偏移量开始查询,offset 大于等于 0 最小值:0 最大值:0 limit 否 Integer 返回条数限制 最小值:200 最大值:200