华为云用户手册

  • 指标说明 主机视图暴露的指标具体说明如下: 图1 主机资源指标 表1 视图说明 图表名称 单位 说明 CPU使用率 百分比 每个CPU核的使用率 平均负载 / 平均负载反映了CPU资源的竞争情况 值小于1时,说明部分CPU资源在处理请求。 值等于1时,说明所有的CPU资源都在处理请求。 值大于1时,说明有部分线程在等待处理。 内存使用量 字节 不同模式的内存使用情况 内存使用率 百分比 主机内存使用率 磁盘写入速率 字节/秒 不同的磁盘的写入速率 磁盘读取速率 字节/秒 不同的磁盘的读取速率 磁盘空间使用 字节 磁盘可用量和已使用量 磁盘空间使用率 百分比 不同设备的磁盘使用率 磁盘IO延迟(秒) 秒 磁盘IO延迟 TCP连接 个 TCP连接数 alloc:已分配(已建立、已申请到sk_buff)的TCP套接字数量。 inuse:正在使用(侦听)的TCP套接字数量。 orphan:已分配(已建立、已申请到sk_buff)的TCP套接字数量。 tw:等待关闭的TCP连接数。 UDP使用情况 个 UDP使用情况 liteInuse:正在使用的UDP-Lite套接字数量。 inuse:正在使用的UDP套接字数量。 useMemory:UPD缓冲区使用量。 最大文件描述符 EB:10的18次方 最大文件描述符数 已使用文件描述符 个 当前已分配使用的文件描述符数量 Socket使用情况 个 Socket使用情况 socketsUsed:使用的所有协议套接字总量。 fragInuse:正在使用的Frag套接字数量。 fragMemroy:Frag缓冲区使用量。 rawInuse:正在使用的Raw套接字数量。 文件系统异常 / 文件系统状态 readonly:文件系统只读 deviceError:文件系统错误 磁盘读写速率 次/秒 磁盘每秒进行的读写次数 磁盘读和写延迟(秒) 秒 磁盘读写时延 IO队列数 / 磁盘设备平均IO队列长度,节点磁盘IO时间加权值。该值越大,表示节点的磁盘性能越好。 进程状态 个 处于不同状态的进程数量 连接跟踪表条目数 个 已分配:连接跟踪表当前已分配的条目数 总容量:连接跟踪表的最大条目数
  • 创建ClusterIP类型Service 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“服务”,在右上角单击“创建服务”。 设置集群内访问参数。 Service名称:自定义服务名称,可与工作负载名称保持一致。 访问类型:选择“集群内访问”。 命名空间:工作负载所在命名空间。 选择器:添加标签,Service根据标签选择Pod,填写后单击“确认添加”。也可以引用已有工作负载的标签,单击“引用负载标签”,在弹出的窗口中选择负载,然后单击“确定”。 端口配置: 协议:请根据业务的协议类型选择。 服务端口:Service使用的端口,端口范围为1-65535。 容器端口:工作负载程序实际监听的端口,需用户确定。例如nginx默认使用80端口。 单击“确定”,创建Service。
  • 使用限制 单账号跟踪的事件可以通过 云审计 控制台查询。多账号的事件只能在账号自己的事件列表页面去查看,或者到组织追踪器配置的OBS桶中查看,也可以到组织追踪器配置的 CTS /system日志流下面去查看。 用户通过云审计控制台只能查询最近7天的操作记录。如果需要查询超过7天的操作记录,您必须配置转储到 对象存储服务 (OBS),才可在OBS桶里面查看历史文件。否则,您将无法追溯7天以前的操作记录。 云上操作后,1分钟内可以通过云审计控制台查询管理类事件操作记录,5分钟后才可通过云审计控制台查询数据类事件操作记录。
  • 导入存储池 创建节点时导入 在创建节点时,在存储配置中可以为节点添加数据盘,选择“作为持久存储卷”导入存储池,详情请参见创建节点。 手动导入 如果创建节点时没有导入持久存储卷,或当前存储卷容量不够,可以进行手动导入。 前往E CS 控制台为节点添加SCSI类型的磁盘。操作步骤详情请参见新增磁盘。 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“存储”,并切换至“存储池”页签。 查看已添加磁盘的节点,选择“导入持久卷”,导入时可以选择写入模式。 如存储池列表中未找到手动挂载的磁盘,请耐心等待1分钟后刷新列表。 线性:线性逻辑卷是将一个或多个物理卷整合为一个逻辑卷,实际写入数据时会先往一个基本物理卷上写入,当存储空间占满时再往另一个基本物理卷写入。 条带化:创建逻辑卷时指定条带化,当实际写入数据时会将连续数据分成大小相同的块,然后依次存储在多个物理卷上,实现数据的并发读写从而提高读写性能。多块卷才能选择条带化。
  • 注意事项 删除集群时,纳管以及包周期节点将会从集群中移除并重装系统,节点原有的登录密码将会失效,请重新设置节点密码。 删除集群不会删除集群下包周期的资源,相关资源在集群删除后将会继续计费,请妥善处理。 删除集群会删除集群下的节点(纳管节点不会被删除)、节点挂载的数据盘、工作负载与服务,相关业务将无法恢复。在执行操作前,请确保相关数据已完成备份或者迁移,删除完成后数据无法找回,请谨慎操作。 部分不是在CCE中创建的资源不会删除: 纳管的节点(仅删除在CCE中创建的节点) Service和Ingress关联的ELB实例(仅删除自动创建的ELB实例) 手动创建PV关联的 云存储 /导入的云存储(仅删除PVC自动创建的云存储) 在集群非运行状态(例如冻结、不可用状态)时删除集群,会残留存储、网络等关联资源,请妥善处理。 集群版本为v1.13.10及之前版本时,请勿在ELB服务手动修改监听器名称和后端服务器名称,否则删除集群时将会有资源残留。
  • 删除集群 处于休眠状态的集群无法直接删除,请将集群唤醒后重试。 登录CCE控制台,在左侧导航栏中选择“集群管理”。 找到需要删除的集群,查看集群的更多操作,并单击“删除集群”。 图1 删除集群 在弹出的“删除集群”窗口中,根据系统提示,勾选删除集群时需要释放的资源。 删除集群节点,可支持以下操作选项: 保留:保留服务器、系统盘和数据盘数据。 删除:删除服务器(包周期节点不支持此选项,请进行手动退订)。 重置:保留并重置服务器,系统盘和数据盘数据不保留。 删除集群下工作负载挂载的云存储。 选择删除集群中存储卷绑定的底层云存储资源时,存在如下约束: 底层存储依据存储卷指定的回收策略进行删除。例如,存储卷指定回收策略为Retain,则在删除集群后底层存储会保留。 对象存储桶下存在大量文件(超过1000)时,请先手动清理桶内文件后再执行集群删除操作。 删除集群下负载均衡ELB等网络资源(仅删除自动创建的ELB资源)。 删除 云日志 服务下的Master节点日志的日志流(仅删除自动创建的日志流) 如未勾选删除日志流,已有的日志将不会被删除,因此可能会产生LTS日志费用,详情请参考价格计算器。 请输入“DELETE”,单击“是”,开始执行删除集群操作。 删除集群需要花费1~3分钟,请耐心等候。
  • 退订/释放集群 退订/释放集群仅退订订单关联的资源,非关联资源不会处理,相关资源会继续计费,请妥善处理。 对于包周期集群,如果过保留期会自动释放,集群下的节点如果同时到期会一并释放,节点如果未到期CCE不会对其做任何操作,相关数据会继续保留,相关资源会继续计费。请关注您账号下到期未续费集群,及时续费,防止节点被重装导致数据丢失。 若订单中存在主从关系的资源,需分别进行退订。 资源退订,相关注意事项请参见退订规则说明。 如果您正在退订使用中的资源,请仔细确认资源信息和退款信息,资源退订后将无法恢复。若您要保留资源,仅退订未使用的续费周期,请退订续费周期。 如果您退订的资源与其他包年/包月资源关联,退订操作可能会影响关联资源的正常使用,请谨慎操作。 如果已与其他按需资源关联,退订操作完成后,关联的按需资源可以正常使用并计费。 如果您本次退订属于非五天无理由退订,需收取手续费和已消费金额,已使用的代金券和折扣券不退还。 登录CCE控制台,在左侧导航栏中选择“集群管理”。 找到需要退订的集群,查看集群的更多操作,并单击“退订”或“释放”。 图2 集群退订 在弹出的“退订”或“释放”页面中,勾选要释放的资源。 删除集群节点,可支持以下操作选项: 保留:保留服务器、系统盘和数据盘数据。 删除:删除服务器(包周期节点不支持此选项,请进行手动退订)。 重置:保留并重置服务器,系统盘和数据盘数据不保留。 删除集群下工作负载挂载的云存储。 选择删除集群中存储卷绑定的底层云存储资源时,存在如下约束: 底层存储依据存储卷指定的回收策略进行删除。例如,存储卷指定回收策略为Retain,则在删除集群后底层存储会保留。 对象存储桶下存在大量文件(超过1000)时,请先手动清理桶内文件后再执行集群删除操作。 删除集群下负载均衡ELB等网络资源(仅删除自动创建的ELB资源)。 删除云日志服务下的Master节点日志的日志流(仅删除自动创建的日志流) 如未勾选删除日志流,已有的日志将不会被删除,因此可能会产生LTS日志费用,详情请参考价格计算器。 单击“是”,开始退订/释放集群。退订/释放集群需要花费1~3分钟,请耐心等候。
  • 公共参数说明 表1 公共参数说明 参数 参数说明 检测周期(periodSeconds) 探针检测周期,单位为秒。 例如,设置为30,表示每30秒检测一次。 延迟时间(initialDelaySeconds) 延迟检查时间,单位为秒,此设置与业务程序正常启动时间相关。 例如,设置为30,表明容器启动后30秒才开始健康检查,该时间是预留给业务程序启动的时间。 超时时间(timeoutSeconds) 超时时间,单位为秒。 例如,设置为10,表明执行健康检查的超时等待时间为10秒,如果超过这个时间,本次健康检查就被视为失败。若设置为0或不设置,默认超时等待时间为1秒。 成功阈值(successThreshold) 探测失败后,将状态转变为成功所需要的最小连续成功次数。例如,设置为1时,表明健康检查失败后,健康检查需要连续成功1次,才认为工作负载状态正常。 默认值是 1,最小值是 1。 存活和启动探测的这个值必须是 1。 最大失败次数(failureThreshold) 当探测失败时重试的次数。 存活探测情况下的放弃就意味着重新启动容器。就绪探测情况下的放弃 Pod 会被打上未就绪的标签。 默认值是 3,最小值是 1。
  • 检查方式 HTTP 请求检查 HTTP 请求方式针对的是提供HTTP/HTTPS服务的容器,集群周期性地对该容器发起HTTP/HTTPS GET请求,如果HTTP/HTTPS response返回码属于200~399范围,则证明探测成功,否则探测失败。使用HTTP请求探测必须指定容器监听的端口和HTTP/HTTPS的请求路径。 例如:提供HTTP服务的容器,HTTP检查路径为:/health-check;端口为:80;主机地址可不填,默认为容器实例IP,此处以172.16.0.186为例。那么集群会周期性地对容器发起如下请求:GET http://172.16.0.186:80/health-check。您也可以为HTTP请求添加一个或多个请求头部,例如设置请求头名称为Custom-Header,对应的值为example。 图1 HTTP请求检查 TCP 端口检查 对于提供TCP通信服务的容器,集群周期性地对该容器建立TCP连接,如果连接成功,则证明探测成功,否则探测失败。选择TCP端口探测方式,必须指定容器监听的端口。 例如:有一个nginx容器,它的服务端口是80,对该容器配置了TCP端口探测,指定探测端口为80,那么集群会周期性地对该容器的80端口发起TCP连接,如果连接成功则证明检查成功,否则检查失败。 图2 TCP 端口检查 执行命令检查 命令检查是一种强大的检查方式,该方式要求用户指定一个容器内的可执行命令,集群会周期性地在容器内执行该命令,如果命令的返回结果是0则检查成功,否则检查失败。 对于上面提到的TCP端口检查和HTTP请求检查,都可以通过执行命令检查的方式来替代: 对于TCP端口探测,可以使用程序对容器的端口尝试connect,如果connect成功,脚本返回0,否则返回-1。 对于HTTP请求探测,可以使用脚本命令来对容器尝试使用wget命令进行探测。 wget http://127.0.0.1:80/health-check 并检查response 的返回码,如果返回码在200~399 的范围,脚本返回0,否则返回-1。如下图: 图3 执行命令检查 必须把要执行的程序放在容器的镜像里面,否则会因找不到程序而执行失败。 如果执行的命令是一个shell脚本,由于集群在执行容器里的程序时,不在终端环境下,因此不能直接指定脚本为执行命令,需要加上脚本解析器。比如脚本是/data/scripts/health_check.sh,那么使用执行命令检查时,指定的程序应该是sh /data/scripts/health_check.sh。 GRPC检查 GRPC检查可以为GRPC应用程序配置启动、活动和就绪探针,而无需暴露任何HTTP端点,也不需要可执行文件。Kubernetes可以通过GRPC 连接到工作负载并查询其状态。 GRPC检查仅在CCE v1.25及以上版本集群中支持。 使用GRPC检查时,您的应用需支持GRPC健康检查协议。 与HTTP和TCP探针类似,如果配置错误,都会被认作是探测失败,例如错误的端口、应用未实现健康检查协议等。 图4 GRPC检查
  • 操作场景 健康检查是指容器运行过程中,根据用户需要,定时检查容器健康状况。若不配置健康检查,如果容器内应用程序异常,Pod将无法感知,也不会自动重启去恢复。最终导致虽然Pod状态显示正常,但Pod中的应用程序异常的情况。 Kubernetes提供了三种健康检查的探针: 存活探针:livenessProbe,用于检测容器是否正常,类似于执行ps命令检查进程是否存在。如果容器的存活检查失败,集群会对该容器执行重启操作;若容器的存活检查成功则不执行任何操作。 就绪探针:readinessProbe,用于检查用户业务是否就绪,如果未就绪,则不转发流量到当前实例。一些程序的启动时间可能很长,比如要加载磁盘数据或者要依赖外部的某个模块启动完成才能提供服务。这时候程序进程已启动,但是并不能对外提供服务。这种场景下该检查方式就非常有用。如果容器的就绪检查失败,集群会屏蔽请求访问该容器;若检查成功,则会开放对该容器的访问。 启动探针:startupProbe,用于探测应用程序容器什么时候启动了。 如果配置了这类探测器,就可以控制容器在启动成功后再进行存活性和就绪检查, 确保这些存活、就绪探针不会影响应用程序的启动。 这可以用于对启动慢的容器进行存活性检测,避免它们在启动运行之前就被终止。
  • 注意事项 该操作会通过重置节点的方式升级操作系统,节点上已运行的工作负载业务可能会由于单实例部署、可调度资源不足等原因产生中断,请您合理评估升级风险,并挑选业务低峰期进行,或对关键业务应用设置PDB策略(Pod Disruption Budget,即干扰预算),升级过程中将严格根据PDB规则保障关键业务的可用性。 节点的系统盘和数据盘将会被清空,重置前请事先备份重要数据。 节点重置会清除用户单独添加的K8S标签和K8S污点,可能导致与节点有绑定关系的资源(本地存储,指定调度节点的负载等)无法正常使用。请谨慎操作,避免对运行中的业务造成影响。 升级操作完成后,节点将会自动开机。 为确保节点稳定性,系统会预留部分CPU和内存资源,用于运行必须的系统组件。
  • 默认节点池 登录CCE控制台。 单击集群名称进入集群,在左侧选择“节点管理”,在右侧选择“节点池”页签。 单击默认节点池名称后的“升级”。 在弹出的“升级操作系统”窗口中,设置升级参数。 目标操作系统:该项无需设置,用于展示目标版本的镜像信息。 升级方式:当前支持节点重置方式进行升级。 每批最大升级节点数:节点升级时,允许节点不可用的最大数量。节点重置方式进行同步时节点将不可用,请合理设置该参数,尽量避免出现集群节点不可用数量过多导致Pod无法调度的情况。 节点列表:选择需要升级的节点。 登录方式: 密码 用户名默认为“root”,请输入登录节点的密码,并确认密码。 登录节点时需要使用该密码,请妥善管理密码,系统无法获取您设置的密码内容。 密钥对 选择用于登录本节点的密钥对,支持选择共享密钥。 密钥对用于远程登录节点时的身份认证。若没有密钥对,可单击选项框右侧的“创建密钥对”来新建,创建密钥对操作步骤请参见创建密钥对。 安装前执行脚本: 请输入脚本命令,命令中不能包含中文字符。脚本命令会进行Base64转码。安装前/后执行脚本统一计算字符,转码后的字符总数不能超过10240。 脚本将在Kubernetes软件安装前执行,可能导致Kubernetes软件无法正常安装,需谨慎使用。 安装后执行脚本: 请输入脚本命令,命令中不能包含中文字符。脚本命令会进行Base64转码。安装前/后执行脚本统一计算字符,转码后的字符总数不能超过10240。 脚本将在Kubernetes软件安装后执行,不影响Kubernetes软件安装。 单击“确定”,即可开始操作系统滚动升级。
  • 解决方案 问题场景一:插件状态异常 请登录CCE控制台,单击集群名称进入集群控制台,前往“插件中心”处查看并处理处于异常状态的插件。 图1 查看插件状态 问题场景二:目标集群版本不支持当前插件版本 检查到该插件由于兼容性等问题无法随集群自动升级。请您登录CCE控制台,在“插件中心”处进行手动升级。 图2 升级插件 问题场景三:插件升级到最新版本后,仍不支持目标集群版本 请您登录CCE控制台,单击集群名称进入集群控制台,在“插件中心”处进行手动卸载,具体插件支持版本以及替换方案可查看帮助文档。 图3 卸载插件 问题场景四:插件配置不满足在升级条件,请在插件升级页面升级插件之后重试 升级前检查出现以下报错: please upgrade addon [ ] in the page of addon managecheck and try again 请您登录CCE控制台,在“插件中心”处手动升级插件。
  • 操作场景 主题备用名称(Subject Alternative Name,缩写SAN)允许将多种值(包括IP地址、 域名 等)与证书关联。SAN通常在TLS握手阶段被用于客户端校验服务端的合法性:服务端证书是否被客户端信任的CA所签发,且证书中的SAN是否与客户端实际访问的IP地址或DNS域名匹配。 当客户端无法直接访问集群内网私有IP地址或者公网弹性IP地址时,您可以将客户端可直接访问的IP地址或者DNS域名通过SAN的方式签入集群服务端证书,以支持客户端开启双向认证,提高安全性。典型场景例如DNAT访问、域名访问等特殊场景。 如果您有特殊的代理访问或跨域访问需求,可以通过自定义SAN实现。域名访问场景的典型使用方式如下: 客户端配置Host域名指定DNS域名地址,或者客户端主机配置/etc/hosts,添加响应域名映射。 云上内网使用, 云解析服务DNS 支持配置集群弹性IP与自定义域名的映射关系。后续更新弹性IP可以继续使用双向认证+自定义域名访问集群,无需重新下载kubeconfig.json配置文件。 自建DNS服务器,自行添加A记录。
  • 使用SAN连接集群 通过kubectl连接集群 修改SAN后,需重新下载kubeconfig.json配置文件。 登录CCE控制台,单击集群名称进入集群。 在集群总览页中的“连接信息”版块,单击kubectl后的“配置”按钮,查看kubectl的连接信息,并在弹出页面中下载配置文件。 配置kubectl。 登录到您的客户端机器,复制1.b中下载的配置文件(kubeconfig.json)到您客户端机器的/home目录下。 配置kubectl认证文件。 cd /home mkdir -p $HOME/.kube mv -f kubeconfig.json $HOME/.kube/config 切换kubectl的访问模式,使用SAN连接集群。 kubectl config use-context customSAN-0 其中customSAN-0为自定义SAN对应的配置名称。如同时设置了多个SAN,每个SAN对应配置名称中的数字从0开始依次增大,例如customSAN-0、customSAN-1,以此类推。 通过X509证书连接集群 修改SAN后,需重新下载X509证书。 登录CCE控制台,单击集群名称进入集群。 查看集群总览页,在右边“连接信息”下证书认证一栏,单击“下载”。 在弹出的“证书获取”窗口中,根据系统提示选择证书的过期时间并下载集群X509证书。 使用集群证书调用Kubernetes原生API。 例如使用curl命令调用接口查看Pod信息,如下所示,其中example.com:5443为自定义SAN。 curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://example.com:5443/api/v1/namespaces/default/pods/ 更多集群接口请参见Kubernetes API。
  • 添加自定义SAN 登录CCE控制台。 在集群列表中单击集群,进入集群详情页。 在连接信息的自定义SAN处单击,在弹出的窗口中添加IP地址或域名,然后单击“保存”。 图1 自定义SAN 1. 当前操作将会短暂重启kube-apiserver并更新kubeconfig.json文件,请避免在此期间操作集群。 2. 请输入域名或IP,以英文逗号(,)分隔,最多128个。 3. 自定义域名如需绑定弹性公网,请确保已配置公网地址。
  • 配置Volcano节点池软亲和调度策略 在节点池上配置用于亲和调度的标签。 登录CCE控制台。 单击集群名称进入集群,在左侧选择“节点管理”,在右侧选择“节点池”页签。 单击节点池名称后的“更新”,在弹出的“更新节点池”页面中配置参数,在“K8s标签”中配置对应的标签。 示例如下: 单击左侧导航栏的“插件中心”,在右侧找到Volcano调度器,单击“安装”或“编辑”,并在“参数配置”中设置Volcano调度器配置参数。 { "ca_cert": "", "default_scheduler_conf": { "actions": "allocate, backfill, preempt", "tiers": [ { "plugins": [ { "name": "priority" }, { "name": "gang" }, { "name": "conformance" } ] }, { "plugins": [ { "name": "drf" }, { "name": "predicates" }, { "name": "nodeorder" } ] }, { "plugins": [ { "name": "cce-gpu-topology-predicate" }, { "name": "cce-gpu-topology-priority" }, { "name": "cce-gpu" }, { // 开启节点池亲和性调度 "name": "nodepoolaffinity", // 节点池亲和性调度权重及标签设置 "arguments": { "nodepoolaffinity.weight": 10000, "nodepoolaffinity.label": "nodepool1=nodepool1" } } ] }, { "plugins": [ { "name": "nodelocalvolume" }, { "name": "nodeemptydirvolume" }, { "name": "nodeCSIscheduling" }, { "name": "networkresource" } ] } ] }, "server_cert": "", "server_key": "" } 完成以上配置后,单击“确定”。
  • 调度优先级介绍 节点池软亲和调度,是通过节点池上的标签(Label)进行软亲和,具体是通过给每一个节点进行打分的机制来排序筛选最优节点。 原则:尽可能把Pod调度到带有相关标签的节点上。 打分公式如下: score = weight * MaxNodeScore * haveLabel 参数说明: weight:节点池软亲和plugin的权重。 MaxNodeScore:节点最大得分,值为100。 haveLabel:节点上是否存在插件中配置的label,如果有,值为1,如果节点上没有,值为0。
  • 验证数据持久化及共享性 查看部署的应用及文件。 执行以下命令,查看已创建的Pod。 kubectl get pod | grep web-demo 预期输出如下: web-demo-846b489584-mjhm9 1/1 Running 0 46s web-demo-846b489584-wvv5s 1/1 Running 0 46s 依次执行以下命令,查看Pod的/data路径下的文件。 kubectl exec web-demo-846b489584-mjhm9 -- ls /data kubectl exec web-demo-846b489584-wvv5s -- ls /data 两个Pod均无返回结果,说明/data路径下无文件。 执行以下命令,在/data路径下创建static文件。 kubectl exec web-demo-846b489584-mjhm9 -- touch /data/static 执行以下命令,查看/data路径下的文件。 kubectl exec web-demo-846b489584-mjhm9 -- ls /data 预期输出如下: static 验证数据持久化 执行以下命令,删除名称为web-demo-846b489584-mjhm9的Pod。 kubectl delete pod web-demo-846b489584-mjhm9 预期输出如下: pod "web-demo-846b489584-mjhm9" deleted 删除后,Deployment控制器会自动重新创建一个副本。 执行以下命令,查看已创建的Pod。 kubectl get pod | grep web-demo 预期输出如下,web-demo-846b489584-d4d4j为新建的Pod: web-demo-846b489584-d4d4j 1/1 Running 0 110s web-demo-846b489584-wvv5s 1/1 Running 0 7m50s 执行以下命令,验证新建的Pod中/data路径下的文件是否更改。 kubectl exec web-demo-846b489584-d4d4j -- ls /data 预期输出如下: static static文件仍然存在,则说明数据可持久化保存。 验证数据共享性 执行以下命令,查看已创建的Pod。 kubectl get pod | grep web-demo 预期输出如下: web-demo-846b489584-d4d4j 1/1 Running 0 7m web-demo-846b489584-wvv5s 1/1 Running 0 13m 执行以下命令,在任意一个Pod的/data路径下创建share文件。本例中选择名为web-demo-846b489584-d4d4j的Pod。 kubectl exec web-demo-846b489584-d4d4j -- touch /data/share 并查看该Pod中/data路径下的文件。 kubectl exec web-demo-846b489584-d4d4j -- ls /data 预期输出如下: share static 由于写入share文件的操作未在名为web-demo-846b489584-wvv5s的Pod中执行,在该Pod中查看/data路径下是否存在文件以验证数据共享性。 kubectl exec web-demo-846b489584-wvv5s -- ls /data 预期输出如下: share static 如果在任意一个Pod中的/data路径下创建文件,其他Pod下的/data路径下均存在此文件,则说明两个Pod共享一个存储卷。
  • 约束与限制 支持多个PV挂载同一个SFS或SFS Turbo,但有如下限制: 多个不同的PVC/PV使用同一个底层SFS或SFS Turbo卷时,如果挂载至同一Pod使用,会因为PV的volumeHandle参数值相同导致无法为Pod挂载所有PVC,出现Pod无法启动的问题,请避免该使用场景。 PV中persistentVolumeReclaimPolicy参数建议设置为Retain,否则可能存在一个PV删除时级联删除底层卷,其他关联这个底层卷的PV会由于底层存储被删除导致使用出现异常。 重复用底层存储时,建议在应用层做好多读多写的隔离保护,防止产生的数据覆盖和丢失。 对SFS Turbo类型的存储来说,删除集群或删除PVC时不会回收包周期的SFS Turbo资源,您需要在SFS Turbo控制台中自行回收。
  • 通过ELB健康检查设置Pod就绪状态 使用Pod readiness Gates方式如下: 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“工作负载”,在右上角单击“YAML创建”。 YAML内容如下: kind: Deployment apiVersion: apps/v1 metadata: name: nginx namespace: default labels: version: v1 spec: replicas: 1 selector: matchLabels: app: nginx version: v1 template: metadata: labels: app: nginx version: v1 spec: containers: - name: container-1 image: nginx:latest imagePullSecrets: - name: default-secret readinessGates: - conditionType: target-health.elb.k8s.cce/specific-service-name # 指定ServiceName。 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 25% # 配合以下两个参数,可以控制ELB后端个数,实现优雅滚动升级。 maxSurge: 25% 单击“确定”创建工作负载后,查看工作负载状态,Pod处于未就绪状态。 事件提示如下: 实例未就绪:correspondingcondition of pod readinessgate "target-health.elb.k8s.cce/specific-service-name" does not exist. 在左侧导航栏中选择“服务”,在右上角单击“创建服务”,并进行以下配置。 Service名称:需要与Pod中readinessGates字段设置的名称一致。 访问类型:选择负载均衡型Service。 选择器:单击“引用负载标签”,选择上一步中创建的工作负载并单击“确定”。 负载均衡器:必须使用独享型ELB,您可以选择已有的ELB或自动创建新的ELB。 健康检查:开启健康检查(不开启则默认为健康检查成功)。 图1 负载均衡配置 前往ELB控制台,查看对应的后端服务器组,健康检查状态正常。 在CCE控制台中查看工作负载状态处于“运行中”。
  • 约束与限制 该特性从以下版本开始支持: v1.19集群:v1.19.16-r5及以上版本 v1.21集群:v1.21.8-r0及以上版本 v1.23集群:v1.23.6-r0及以上版本 v1.25集群:v1.25.2-r0及以上版本 v1.25以上版本集群 该功能只支持直通场景,即 CCE Turbo 集群中使用独享型ELB的场景。 该功能需在Pod中配置特定的readinessGates字段,指定标签target-health.elb.k8s.cce/{serviceName},其中{serviceName}为服务名称。 Pod就绪状态只在最初对接ELB后端时生效,后续健康检查状态不再影响Pod就绪状态。
  • 修改容器单进程最大文件句柄数 登录节点,查看/usr/lib/systemd/system/docker.service文件。 CentOS/EulerOS系统: docker节点: cat /usr/lib/systemd/system/docker.service containerd节点: cat /usr/lib/systemd/system/containerd.service Ubuntu系统: docker节点: cat /lib/systemd/system/docker.service containerd节点: cat /lib/systemd/system/containerd.service LimitNOFILE或LimitNPROC参数设置为infinity时,表示容器单进程最大文件句柄数为1048576。 容器单进程最大文件句柄数通过以下参数设置: ... LimitNOFILE=1048576 LimitNPROC=1048576 ... 执行如下命令修改两个参数,其中1048576为最大文件句柄数的建议取值。 修改容器最大文件句柄数将会重启docker/containerd进程,请知悉。 CentOS/EulerOS系统: docker节点: sed -i "s/LimitNOFILE=[0-9a-Z]*$/LimitNOFILE=1048576/g" /usr/lib/systemd/system/docker.service;sed -i "s/LimitNPROC=[0-9a-Z]*$/LimitNPROC=1048576/g" /usr/lib/systemd/system/docker.service && systemctl daemon-reload && systemctl restart docker containerd节点: sed -i "s/LimitNOFILE=[0-9a-Z]*$/LimitNOFILE=1048576/g" /usr/lib/systemd/system/containerd.service;sed -i "s/LimitNPROC=[0-9a-Z]*$/LimitNPROC=1048576/g" /usr/lib/systemd/system/containerd.service && systemctl daemon-reload && systemctl restart containerd Ubuntu系统: docker节点: sed -i "s/LimitNOFILE=[0-9a-Z]*$/LimitNOFILE=1048576/g" /lib/systemd/system/docker.service;sed -i "s/LimitNPROC=[0-9a-Z]*$/LimitNPROC=1048576/g" /lib/systemd/system/docker.service && systemctl daemon-reload && systemctl restart docker containerd节点: sed -i "s/LimitNOFILE=[0-9a-Z]*$/LimitNOFILE=1048576/g" /usr/lib/systemd/system/containerd.service;sed -i "s/LimitNPROC=[0-9a-Z]*$/LimitNPROC=1048576/g" /usr/lib/systemd/system/containerd.service && systemctl daemon-reload && systemctl restart containerd 查看容器单进程最大文件句柄数,当返回与修改值一致时说明修改正确。 docker节点: # cat /proc/`pidof dockerd`/limits | grep files Max open files 1048576 1048576 files containerd节点: # cat /proc/`pidof containerd`/limits | grep files Max open files 1048576 1048576 files
  • 修改节点单进程最大文件句柄数 登录节点,查看/etc/security/limits.conf文件。 cat /etc/security/limits.conf 节点单进程最大文件句柄数通过以下参数设置: ... root soft nofile 65535 root hard nofile 65535 * soft nofile 65535 * hard nofile 65535 通过sed命令修改最大文件句柄数,其中65535为最大文件句柄数的建议取值。EulerOS 2.3节点/etc/security/limits.conf中没有nofile相关的默认配置,因此不能通过sed命令进行修改。 sed -i "s/nofile.[0-9]*$/nofile 65535/g" /etc/security/limits.conf 重新登录节点,执行以下命令检查是否修改成功,当返回与修改值一致时说明修改正确。 # ulimit -n 65535
  • 配置验证 使用csi-disk-sas创建PVC。 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: sas-disk spec: 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 pvc NAME STATUS VOLUME CAPACITY AC CES S MODES STORAGECLASS AGE sas-disk Bound pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO csi-disk-sas 24s # kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO Delete Bound default/sas-disk csi-disk-sas 30s 在CCE控制台界面上查看PVC详情,在“PV详情”页签下可以看到磁盘类型是高I/O。 不指定StorageClassName,使用默认配置,如下所示,并未指定storageClassName。 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ssd-disk spec: 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 pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE sas-disk Bound pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO csi-disk-sas 16m ssd-disk Bound pvc-4d2b059c-0d6c-44af-9994-f74d01c78731 10Gi RWO csi-disk-ssd 10s # kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-4d2b059c-0d6c-44af-9994-f74d01c78731 10Gi RWO Delete Bound default/ssd-disk csi-disk-ssd 15s pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO Delete Bound default/sas-disk csi-disk-sas 17m 在CCE控制台界面上查看PVC详情,在“PV详情”页签下可以看到磁盘类型是超高I/O。
  • 自定义存储类应用场景 在CCE中使用存储时,最常见的方法是创建PVC时通过指定StorageClassName定义要创建存储的类型,如下所示,使用PVC申请一个SAS(高I/O)类型云硬盘/块存储。 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-evs-example namespace: default annotations: everest.io/disk-volume-type: SAS spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: csi-disk 可以看到在CCE中如果需要指定云硬盘的类型,是通过everest.io/disk-volume-type字段指定,这里SAS是云硬盘的类型。 以上是较为基础的StorageClass使用方法,在实际应用中,也可以使用StorageClass进行更为简便的操作: 应用场景 解决方案 操作步骤 在使用annotations指定存储配置时,配置较为繁琐。例如此处使用everest.io/disk-volume-type字段指定云硬盘的类型。 在StorageClass的parameters字段中定义PVC的annotations,编写YAML时只需要指定StorageClassName。 例如,将SAS、SSD类型云硬盘分别定义一个StorageClass,比如定义一个名为csi-disk-sas的StorageClass,这个StorageClass创建SAS类型的存储, 自定义StorageClass 当用户从自建Kubernetes或其他Kubernetes服务迁移到CCE,原先的应用YAML中使用的StorageClass与CCE中使用的不同,导致使用存储时需要修改大量YAML文件或Helm Chart包,非常繁琐且容易出错。 在CCE集群中创建与原有应用YAML中相同名称的StorageClass,迁移后无需再修改应用YAML中的StorageClassName。 例如,迁移前使用的云硬盘存储类为disk-standard,在迁移CCE集群后,可以复制CCE集群中csi-disk存储类的YAML,将其名称修改为disk-standard后重新创建。 在YAML中必须指定StorageClassName才能使用存储,不指定StorageClass时无法正常创建。 在集群中设置默认的StorageClass,则YAML中无需指定StorageClassName也能创建存储。 指定默认StorageClass
  • 自定义StorageClass 本文以自定义云硬盘类型的StorageClass为例,将SAS、SSD类型云硬盘分别定义一个StorageClass,比如定义一个名为csi-disk-sas的StorageClass,这个StorageClass创建SAS类型的存储,则前后使用的差异如下图所示,编写YAML时只需要指定StorageClassName。 自定义高I/O类型StorageClass,使用YAML描述如下,这里取名为csi-disk-sas,指定云硬盘类型为SAS,即高I/O。 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: 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-provisioner reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true # true表示允许扩容 超高I/O类型StorageClass,这里取名为csi-disk-ssd,指定云硬盘类型为SSD,即超高I/O。 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: 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-provisioner reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true reclaimPolicy:底层云存储的回收策略,支持Delete、Retain回收策略。 Delete:删除PVC,PV资源与云硬盘均被删除。 Retain:删除PVC,PV资源与底层存储资源均不会被删除,需要手动删除回收。PVC删除后PV资源状态为“已释放(Released)”,不能直接再次被PVC绑定使用。 如果数据安全性要求较高,建议使用Retain以免误删数据。 定义完之后,使用kubectl create命令创建。 # kubectl create -f sas.yaml storageclass.storage.k8s.io/csi-disk-sas created # kubectl create -f ssd.yaml storageclass.storage.k8s.io/csi-disk-ssd created 再次查询StorageClass,回显如下: # kubectl get sc NAME PROVISIONER AGE csi-disk everest-csi-provisioner 17d csi-disk-sas everest-csi-provisioner 2m28s csi-disk-ssd everest-csi-provisioner 16s csi-disk-topology everest-csi-provisioner 17d csi-nas everest-csi-provisioner 17d csi-obs everest-csi-provisioner 17d csi-sfsturbo everest-csi-provisioner 17d
  • 指定StorageClass的企业项目 CCE支持使用存储类创建云硬盘和对象存储类型PVC时指定企业项目,将创建的存储资源(云硬盘和对象存储)归属于指定的企业项目下,企业项目可选为集群所属的企业项目或default企业项目。 若不指定企业项目,则创建的存储资源默认使用存储类StorageClass中指定的企业项目,CCE提供的 csi-disk 和 csi-obs 存储类,所创建的存储资源属于default企业项目。 如果您希望通过StorageClass创建的存储资源能与集群在同一个企业项目,则可以自定义StorageClass,并指定企业项目ID,如下所示。 该功能需要everest插件升级到1.2.33及以上版本。 kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: csi-disk-epid # 自定义名称 provisioner: everest-csi-provisioner parameters: 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: Delete allowVolumeExpansion: true volumeBindingMode: Immediate
  • 指定默认StorageClass 您还可以指定某个StorageClass作为默认StorageClass,这样在创建PVC时不指定StorageClassName就会使用默认StorageClass创建。 例如将csi-disk-ssd指定为默认StorageClass,则可以按如下方式设置。 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-disk-ssd annotations: storageclass.kubernetes.io/is-default-class: "true" # 指定集群中默认的StorageClass,一个集群中只能有一个默认的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 everest.io/passthrough: "true" provisioner: everest-csi-provisioner reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true 先删除之前创建的csi-disk-ssd,再使用kubectl create命令重新创建,然后再查询StorageClass,显示如下。 # kubectl delete sc csi-disk-ssd storageclass.storage.k8s.io "csi-disk-ssd" deleted # kubectl create -f ssd.yaml storageclass.storage.k8s.io/csi-disk-ssd created # kubectl get sc NAME PROVISIONER AGE csi-disk everest-csi-provisioner 17d csi-disk-sas everest-csi-provisioner 114m csi-disk-ssd (default) everest-csi-provisioner 9s csi-disk-topology everest-csi-provisioner 17d csi-nas everest-csi-provisioner 17d csi-obs everest-csi-provisioner 17d csi-sfsturbo everest-csi-provisioner 17d
  • 存储类介绍 StorageClass可译为存储类,描述了集群中的存储类型“分类”,可以表示为一个创建PV存储卷的配置模板。在创建PVC/PV均需要指定StorageClass。 作为使用者,只需要在声明PVC时指定StorageClassName即可自动创建PV及底层存储,大大减少了创建并维护PV的工作量。 除了使用CCE提供的默认存储类外,您也可以根据需求自定义存储类。 自定义存储类应用场景 自定义StorageClass 指定默认StorageClass 指定StorageClass的企业项目
共100000条