华为云用户手册

  • 服务网络配置 表2 服务网络配置参数说明 参数名称 参数说明 服务转发模式 显示集群的转发模式,集群创建完成后,服务转发模式不可修改。当前支持IPVS和iptables两种转发模式,具体请参见iptables与IPVS如何选择。 服务网段 集群中的每个Service都有自己的地址,在CCE上创建集群时,可以指定Service的地址段(即服务网段)。服务网段不能和子网网段重合,而且服务网段也不能和容器网段重叠。服务网段只在集群内使用,不能在集群外使用。 服务端口范围配置 NodePort端口范围,默认范围为30000-32767,支持的修改范围为20106-32767。修改后需前往安全组页面同步修改节点安全组30000-32767的TCP/UDP端口范围,否则除默认端口外的其他端口将无法被外部访问。 说明: 端口号小于20106会和系统组件的健康检查端口冲突,引发集群不可用;端口号高于32767会和操作系统的随机端口冲突,影响性能。
  • 企业项目支持说明 该功能需要everest插件升级到1.2.33及以上版本。 自动创建存储: CCE支持使用存储类创建云硬盘和对象存储类型PVC时指定企业项目,将创建的存储资源(云硬盘和对象存储)归属于指定的企业项目下,企业项目可选为集群所属的企业项目或default企业项目。 若不指定企业项目,则创建的存储资源默认使用存储类StorageClass中指定的企业项目。 对于自定义的StorageClass,可以在StorageClass中指定企业项目,详见指定StorageClass的企业项目。StorageClass中如不指定的企业项目,则默认为default企业项目。 对于CCE提供的 csi-disk 和 csi-obs 存储类,所创建的存储资源属于default企业项目。 使用已有存储: 使用PV创建PVC时,因为存储资源在创建时已经指定了企业项目,如果PVC中指定企业项目,则务必确保在PVC和PV中指定的everest.io/enterprise-project-id保持一致,否则两者无法正常绑定。
  • 云存储 对比 对比维度 云硬盘EVS 文件存储SFS 极速文件存储SFS Turbo 对象存储OBS 概念 云硬盘(Elastic Volume Service)可以为云服务器提供高可靠、高性能、规格丰富并且可弹性扩展的块存储服务,可满足不同场景的业务需求,适用于分布式文件系统、开发测试、 数据仓库 以及高性能计算等场景。 SFS为用户提供一个完全托管的共享文件存储,能够弹性伸缩至PB规模,具备高可用性和持久性,为海量数据、高带宽型应用提供有力支持。适用于多种应用场景,包括HPC、 媒体处理 、文件共享、内容管理和Web服务等。 SFS Turbo为用户提供一个完全托管的共享文件存储,能够弹性伸缩至320TB规模,具备高可用性和持久性,为海量的小文件、低延迟高IOPS型应用提供有力支持。适用于多种应用场景,包括高性能网站、日志存储、压缩解压、DevOps、企业办公、容器应用等。 对象存储服务 (Object Storage Service,OBS)提供海量、安全、高可靠、低成本的数据存储能力,可供用户存储任意类型和大小的数据。适合企业备份/归档、 视频点播 、视频监控等多种数据存储场景。 存储数据的逻辑 存放的是二进制数据,无法直接存放文件,如果需要存放文件,需要先格式化文件系统后使用。 存放的是文件,会以文件和文件夹的层次结构来整理和呈现数据。 存放的是文件,会以文件和文件夹的层次结构来整理和呈现数据。 存放的是对象,可以直接存放文件,文件会自动产生对应的系统元数据,用户也可以自定义文件的元数据。 访问方式 只能在E CS /BMS中挂载使用,不能被操作系统应用直接访问,需要格式化成文件系统进行访问。 在ECS/BMS中通过网络协议挂载使用。需要指定网络地址进行访问,也可以将网络地址映射为本地目录后进行访问。 提供标准的文件访问协议NFS(仅支持NFSv3),用户可以将现有应用和工具与SFS Turbo无缝集成。 可以通过互联网或专线访问。需要指定桶地址进行访问,使用的是HTTP和HTTPS等传输协议。 静态存储卷 支持,请参见通过静态存储卷使用已有云硬盘。 支持,请参见通过静态存储卷使用已有文件存储。 支持,请参见通过静态存储卷使用已有极速文件存储。 支持,请参见通过静态存储卷使用已有对象存储。 动态存储卷 支持,请参见通过动态存储卷使用云硬盘。 支持,请参见通过动态存储卷使用文件存储。 不支持 支持,请参见通过动态存储卷使用对象存储。 主要特点 非共享存储,每个云盘只能在单个节点挂载。 共享存储,可提供高性能、高吞吐存储服务。 高性能、高带宽、共享存储。 共享存储,用户态文件系统。 应用场景 HPC高性能计算、企业核心集群应用、企业应用系统和开发测试等。 说明: 高性能计算:主要是高速率、高IOPS的需求,用于作为高性能存储,比如工业设计、能源勘探等。 HPC高性能计算、媒体处理、内容管理和Web服务、大数据和分析应用程序等。 说明: 高性能计算:主要是高带宽的需求,用于共享文件存储,比如基因测序、图片渲染等。 高性能网站、日志存储、DevOps、企业办公等。 大数据分析、静态网站托管、在线视频点播、基因测序、智能视频监控、备份归档、企业云盘(网盘)等。 容量 TB级别 SFS 1.0:PB级别 SFS 3.0:EB级别 通用型:TB级别 EB级别 时延 1~2ms SFS 1.0:3~20ms SFS 3.0:10ms 通用型:1~5ms 10ms 最大IOPS 因规格而异,范围为2.2K~256K SFS 1.0:2K SFS 3.0:百万级 通用型:最大达100K 千万级 带宽 MB/s级别 SFS 1.0:GB/s级别 SFS 3.0:TB/s级别 通用型:最大为GB/s级别 TB/s级别
  • 本地存储对比 对比维度 本地持久卷(Local PV) 本地临时卷(Local Ephemeral Volume) 临时路径(EmptyDir) 主机路径(HostPath) 概念 将节点的本地数据盘通过LVM组成存储池(VolumeGroup),然后划分LV给容器挂载使用。 基于Kubernetes原生的EmptyDir类型,将节点的本地数据盘通过LVM组成存储池(VolumeGroup),然后划分LV作为EmptyDir的存储介质给容器挂载使用,相比原生EmptyDir默认的存储介质类型性能更好。 Kubernetes原生的EmptyDir类型,生命周期与容器实例相同,并支持指定内存作为存储介质。容器实例消亡时,EmptyDir会被删除,数据会永久丢失。 将容器所在宿主机的文件目录挂载到容器指定的挂载点中。 主要特点 低延迟、高IO,非高可用的持久卷。 存储卷通过Label绑定节点,且为非共享存储,只能在单个Pod中挂载。 本地临时卷,存储空间来自本地LV。 本地临时卷,存储空间来自本地的kubelet根目录或内存。 挂载主机节点文件系统上的文件或目录,支持自动创建主机目录,Pod可迁移(不绑定节点)。 存储卷挂载方式 不支持静态存储卷 支持通过动态存储卷使用本地持久卷 详情请参见使用本地临时卷。 详情请参见使用临时路径。 详情请参见主机路径(HostPath)。 应用场景 IO要求高、应用自带高可用方案的场景,例如:高可用部署MySQL。 缓存空间,例如基于磁盘的归并排序。 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。 在Web服务器容器服务数据时,保存内容管理器容器获取的文件。 缓存空间,例如基于磁盘的归并排序。 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。 在Web服务器容器服务数据时,保存内容管理器容器获取的文件。 运行一个需要使用节点文件。例如容器中需使用Docker,可使用HostPath挂载节点的/var/lib/docker路径。 须知: HostPath卷存在许多安全风险,最佳做法是尽可能避免使用HostPath。 当必须使用HostPath卷时,它的范围应仅限于所需的文件或目录,并以只读方式挂载。
  • 域名双向认证 CCE当前支持域名双向认证。 集群API Server绑定EIP后,使用kubectl连接集群时域名双向认证默认不开启,可通过 kubectl config use-context externalTLSVerify 命令切换到externalTLSVerify这个context开启使用。 集群绑定或解绑弹性IP、配置或更新自定义域名时,集群服务端证书将同步签入最新的集群访问地址(包括集群绑定的弹性IP、集群配置的所有自定义域名)。 异步同步集群通常耗时约5-10min,同步结果可以在操作记录中查看“同步证书”。 对于已绑定EIP的集群,如果在使用双向认证时出现认证不通过的情况(x509: certificate is valid),需要重新绑定EIP并重新下载kubeconfig.yaml。 早期未支持域名双向认证时,kubeconfig.yaml中包含"insecure-skip-tls-verify": true字段,如图3所示。如果需要使用双向认证,您可以重新下载kubeconfig.yaml文件并配置开启域名双向认证。 图3 未开启域名双向认证
  • 常见问题 Error from server Forbidden 使用kubectl在创建或查询Kubernetes资源时,显示如下内容: # kubectl get deploy Error from server (Forbidden): deployments.apps is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "deployments" in API group "apps" in the namespace "default" 原因是用户没有操作该Kubernetes资源的权限,请参见命名空间权限(Kubernetes RBAC授权)为用户授权。 The connection to the server localhost:8080 was refused 使用kubectl在创建或查询Kubernetes资源时,显示如下内容: The connection to the server localhost:8080 was refused - did you specify the right host or port? 原因是由于该kubectl客户端未配置集群认证,请参见3进行配置。
  • 使用kubectl连接集群 若您需要从客户端计算机连接到Kubernetes集群,可使用Kubernetes命令行客户端kubectl,您可登录CCE控制台,单击待连接集群名称,在集群总览页面查看访问地址以及kubectl的连接步骤,如图1所示。 CCE支持“内网访问”和“公网访问”两种方式访问集群。 内网访问:访问集群的客户端机器需要位于集群所在的同一VPC内。 公网访问:访问集群的客户端机器需要具备访问公网的能力,并为集群绑定公网地址。 通过“公网访问”方式访问集群,您需要在总览页中的“连接信息”版块为集群绑定公网地址,如图1所示。绑定公网集群的kube-apiserver将会暴露到互联网,存在被攻击的风险,建议对kube-apiserver所在节点的EIP配置 DDoS高防服务 或设置安全组规则。 图1 集群连接信息 您需要先下载kubectl以及配置文件,复制到您的客户端机器,完成配置后,即可以访问Kubernetes集群。使用kubectl连接集群的步骤如下: 下载kubectl 您需要准备一台可访问公网的客户端计算机,并通过命令行方式安装kubectl。如果已经安装kubectl,则跳过此步骤,您可执行kubectl version命令判断是否已安装kubectl。 本文以Linux环境为例安装和配置kubectl,详情请参考安装kubectl。 登录到您的客户端机器,下载kubectl。 cd /home curl -LO https://dl.k8s.io/release/{v1.25.0}/bin/linux/amd64/kubectl 其中{v1.25.0}为指定的版本号,请根据集群版本进行替换。 安装kubectl。 chmod +x kubectl mv -f kubectl /usr/local/bin 获取kubectl配置文件 在集群总览页中的“连接信息”版块,单击kubectl后的“配置”按钮,查看kubectl的连接信息,并在弹出页面中下载配置文件。 图2 下载配置文件 kubectl配置文件(kubeconfig)用于对接认证集群,请您妥善保存该认证凭据,防止文件泄露后,集群有被攻击的风险。 IAM 用户下载的配置文件所拥有的Kubernetes权限与CCE控制台上IAM用户所拥有的权限一致。 如果Linux系统里面配置了KUBECONFIG环境变量,kubectl会优先加载KUBECONFIG环境变量,而不是$home/.kube/config,使用时请注意。 配置kubectl 以Linux环境为例配置kubectl。 登录到您的客户端机器,复制2中下载的配置文件(kubeconfig.yaml)到您客户端机器的/home目录下。 配置kubectl认证文件。 cd /home mkdir -p $HOME/.kube mv -f kubeconfig.yaml $HOME/.kube/config 根据使用场景,切换kubectl的访问模式。 VPC内网接入访问请执行: kubectl config use-context internal 互联网接入访问请执行(集群需绑定公网地址): kubectl config use-context external 互联网接入访问如需开启双向认证请执行(集群需绑定公网地址): kubectl config use-context externalTLSVerify 关于集群双向认证的说明请参见域名双向认证。
  • 权限说明 kubectl访问CCE集群是通过集群上生成的配置文件(kubeconfig)进行认证,kubeconfig文件内包含用户信息,CCE根据用户信息的权限判断kubectl有权限访问哪些Kubernetes资源。即哪个用户获取的kubeconfig文件,kubeconfig就拥有哪个用户的信息,这样使用kubectl访问时就拥有这个用户的权限。 用户拥有的权限请参见集群权限(IAM授权)与命名空间权限(Kubernetes RBAC授权)的关系。
  • 免费场景 监控中心自身免费使用,监控中心所使用的指标都上报并存储在 AOM 服务,其中在AOM范畴内的基础指标不收费,存储时长15天(暂不支持修改)。详情请参见基础指标。 日志中心自身免费使用,集群内产生的日志都上报并存储在LTS服务, 云日志 服务的计费项由日志读写流量、日志索引流量、日志存储量的费用组成(有500MB/月的免费额度)。 告警中心自身免费使用,集群内产生的告警由 SMN 消息通知服务进行推送,在短信数量小于100/条/月、邮件数量小于1000/封/月的,推送免费。其中短信条数计算规则请参见短信内容长度计算规则。
  • 收费场景 监控中心:集群内配置的除基础指标以外的自定义指标(基础指标不收费)会根据AOM的收费规则进行收费。详情请参见计费项。 日志中心:对超出每月免费限额(500MB/月)的日志读写、日志索引流量、日志存储量进行收费。详情请参见LTS服务的收费标准。 告警中心:告警中心依赖SMN 消息通知 服务对告警进行推送,联系组当前只支持短信和邮件,超过SMN免费范围(短信数量小于100/条/月、邮件数量小于1000/封/月的,推送免费)的将会收费。详情请参见SMN计费说明。
  • Kubernetes事件上报 应用运维管理 (AOM) 自1.3.2版本起,云原生日志采集插件默认会将上报所有Warning级别事件以及部分Normal级别事件到应用运维管理(AOM),上报的事件可用于配置告警。当集群版本为1.19.16、1.21.11、1.23.9或1.25.4及以上时,安装云原生日志采集插件后,事件上报AOM将不再由控制面组件上报,改为由云原生日志采集插件上报,卸载插件后将不再上报事件到AOM。 自定义事件上报 若已上报的事件不能满足需求,可通过修改配置,修改需要上报到应用运维管理(AOM)的事件。 通过控制台配置 登录云容器引擎(CCE)控制台,单击集群名称进入集群,选择左侧导航栏的“配置中心”。 选择“监控运维配置”页签,在“日志配置”中修改Kubernetes事件上报至AOM的策略。 异常事件上报:默认开启,会将所有异常事件上报至AOM。您可以单击“配置黑名单”,将不需要上报的事件添加至黑名单进行管理。 普通事件上报:开启后,会将普通事件上报至AOM,系统默认配置了部分需要上报的普通事件。如果您需要自定义上报的事件,可以单击“配置白名单”,将需要上报添加至白名单进行管理。 配置修改完成后,单击“确认配置”。 通过kubectl配置 在集群上执行以下命令,编辑当前的事件采集配置。 kubectl edit logconfig -n kube-system default-event-aom 根据需要修改事件采集配置。 apiVersion: logging.openvessel.io/v1 kind: LogConfig metadata: annotations: helm.sh/resource-policy: keep name: default-event-aom namespace: kube-system spec: inputDetail: #采集端配置 type: event #采集端类型,请勿修改 event: normalEvents: #Normal级别事件采集配置 enable: true #是否开启Normal级别事件采集 includeNames: #需要采集的事件名,不指定则采集所有事件 - NotTriggerScaleUp excludeNames: #不采集的事件名,不指定则采集所有事件 - ScaleDown warningEvents: #Warning级别事件采集配置 enable: true #是否开启Warning级别事件采集 includeNames: #需要采集的事件名,不指定则采集所有事件 - NotTriggerScaleUp excludeNames: #不采集的事件名,不指定则采集所有事件 - ScaleDown outputDetail: type: AOM #输出端类型,请勿修改 AOM: events: - name: DeleteNodeWithNoServer #事件名,必选 nameCn: 废弃节点清理 #事件对应的中文名,不填则上报的事件直接显示英文 resourceType: Namespace #事件对应的资源类型 severity: Major #事件上报到AOM后的事件级别,默认Major。可选值:Critical:紧急;Major:重要;Minor:次要;Info:提示
  • Kubernetes事件上报云日志服务(LTS) 集群未安装CCE 云原生日志采集插件 安装CCE 云原生日志采集插件时,可通过勾选采集Kubernetes事件,创建默认日志采集策略,采集所有事件上报到LTS。安装方法见:通过云原生日志采集插件采集容器日志。 集群已安装CCE 云原生日志采集插件 登录云容器引擎(CCE)控制台,单击集群名称进入集群,选择左侧导航栏的“日志中心”。 右上角单击“日志采集策略”,将显示当前集群所有上报LTS的日志策略。 单击上方“创建日志策略”,输入要采集的配置信息。 策略模板:若安装插件时未勾选采集Kubernetes事件,或者删除了对应的日志策略,可通过该方式重新创建默认事件采集策略。 事件查看:可直接在“日志中心”页面查看,选择日志策略配置的日志流名称,即可查看上报到云日志服务(LTS)的事件。
  • 操作符取值说明 您可以使用操作符(operator字段)来设置使用规则的逻辑关系,operator取值如下: In:亲和/反亲和对象的标签在标签值列表(values字段)中。 NotIn:亲和/反亲和对象的标签不在标签值列表(values字段)中。 Exists:亲和/反亲和对象存在指定标签名。 DoesNotExist:亲和/反亲和对象不存在指定标签名。 Gt:仅在节点亲和性中设置,调度节点的标签值大于列表值 (字符串比较)。 Lt:仅在节点亲和性中设置,调度节点的标签值小于列表值 (字符串比较)。
  • 通过控制台配置节点亲和调度策略 在创建工作负载时,在“高级设置”中找到“调度策略”。创建工作负载的步骤详情请参见创建工作负载。 选择节点亲和调度的策略类型。 不配置:不设置节点亲和策略。 指定节点调度:指定工作负载Pod部署的节点。若不指定,将根据集群默认调度策略随机调度。 指定节点池调度:指定工作负载Pod部署的节点池。若不指定,将根据集群默认调度策略随机调度。 自定义亲和策略:根据节点标签实现灵活的调度策略,支持的调度策略类型请参见表3。选择合适的策略类型后,单击添加调度策略,参数详情请参见表4。您也可以单击“指定节点”或“指定可用区”通过控制台快速选择需要调度的节点或可用区。 “指定节点”和“指定可用区”本质也是通过标签实现,只是通过控制台提供了更为便捷的操作,无需手动填写节点标签和标签值。指定节点使用的是 kubernetes.io/hostname 标签,指定可用区使用的是 failure-domain.beta.kubernetes.io/zone 标签。 表3 节点亲和性设置 参数名 参数描述 必须满足 即硬约束,设置必须要满足的条件,对应requiredDuringSchedulingIgnoredDuringExecution。 添加多条“必须满足”规则时,只需要满足一条规则就会进行调度。 尽量满足 即软约束,设置尽量满足的条件,对应preferredDuringSchedulingIgnoredDuringExecution。 添加多条“尽量满足”规则时,满足其中一条或者都不满足也会进行调度。 表4 节点亲和性调度策略设置参数说明 参数名 参数描述 标签名 设置节点亲和性时,填写需要匹配的节点标签。 该标签可以使用系统默认的标签,也可以使用自定义标签。 操作符 可以设置六种匹配关系(In、NotIn、Exists、DoesNotExist、Gt、Lt)。 In:亲和/反亲和对象的标签在标签值列表(values字段)中。 NotIn:亲和/反亲和对象的标签不在标签值列表(values字段)中。 Exists:亲和/反亲和对象存在指定标签名。 DoesNotExist:亲和/反亲和对象不存在指定标签名。 Gt:仅在节点亲和性中设置,调度节点的标签值大于列表值 (字符串比较)。 Lt:仅在节点亲和性中设置,调度节点的标签值小于列表值 (字符串比较)。 标签值 设置节点亲和性时,填写节点标签对应的标签值。 调度策略添加完成后,单击“创建工作负载”。
  • 通过控制台配置负载亲和调度策略 在创建工作负载时,在“高级设置”中找到“调度策略”。创建工作负载的步骤详情请参见创建工作负载。 选择负载亲和调度的策略类型。 不配置:不设置负载亲和策略。 优先多可用区部署:该策略通过Pod自身反亲和实现,优先将工作负载的Pod调度到不同可用区的节点上。 强制多可用区部署:该策略通过Pod自身反亲和实现,强制将工作负载的Pod调度到不同可用区,并且强制调度到不同节点上。使用该调度策略时,如果节点数小于实例数或节点资源不足,Pod将无法全部运行。 自定义亲和策略:根据Pod标签实现灵活的调度策略,支持的调度策略类型请参见表1。选择合适的策略类型后,单击添加调度策略,参数详情请参见表2。 表1 负载亲和策略类型 策略 规则类型 说明 工作负载亲和性 必须满足 即硬约束,设置必须满足的条件,对应YAML定义中的requiredDuringSchedulingIgnoredDuringExecution字段。 通过标签筛选需要亲和的Pod,如果满足筛选条件的Pod已经运行在拓扑域中的某个节点上,调度器会将本次创建的Pod强制调度到该拓扑域。 说明: 添加多条亲和性规则时,即设置多个标签筛选需要亲和的Pod,则本次创建的Pod必须要同时亲和所有满足标签筛选的Pod,即所有满足标签筛选的Pod要处于同一拓扑域中才可以调度。 尽量满足 即软约束,设置尽量满足的条件,对应YAML定义中的preferredDuringSchedulingIgnoredDuringExecution字段。 通过标签筛选需要亲和的Pod,如果满足筛选条件的Pod已经运行在拓扑域中的某个节点上,调度器会将本次创建的Pod优先调度到该拓扑域。 说明: 添加多条亲和性规则时,即设置多个标签筛选需要亲和的Pod,则本次创建的Pod会尽量同时亲和多个满足标签筛选的Pod。但即使所有Pod都不满足标签筛选条件,也会选择一个拓扑域进行调度。 工作负载反亲和性 必须满足 即硬约束,设置必须满足的条件,对应YAML定义中的requiredDuringSchedulingIgnoredDuringExecution字段。 通过标签筛选需要反亲和的一个或多个Pod,如果满足筛选条件的Pod已经运行在拓扑域中的某个节点上,调度器不会将本次创建的Pod调度到该拓扑域。 说明: 添加多条反亲和性规则时,即设置多个标签筛选需要反亲和的Pod,则本次创建的Pod必须要同时反亲和所有满足标签筛选的Pod,即所有满足标签筛选的Pod所处的拓扑域都不会被调度。 尽量满足 即软约束,设置尽量满足的条件,对应YAML定义中的preferredDuringSchedulingIgnoredDuringExecution字段。 通过标签筛选需要反亲和的一个或多个Pod,如果满足筛选条件的Pod已经运行在拓扑域中的某个节点上,调度器会将本次创建的Pod优先调度到其他拓扑域。 说明: 添加多条反亲和性规则时,即设置多个标签筛选需要反亲和的Pod,则本次创建的Pod会尽量同时反亲和多个满足标签筛选的Pod。但即使每个拓扑域都存在需要反亲和的Pod,也会选择一个拓扑域进行调度。 表2 负载亲和/反亲和调度策略设置参数说明 参数名 参数描述 权重 仅支持在“尽量满足”策略中添加。权重的取值范围为1-100,调度器在进行调度时会将该权重加到其他优先级函数的评分上,最终将Pod调度到总分最大的节点上。 命名空间 指定调度策略生效的命名空间。 拓扑域 拓扑域(topologyKey)通过节点的标签先圈定调度的节点范围,例如标签指定为kubernetes.io/hostname,则根据标签值不同(标签值为节点名称)区分范围,不同名称的节点为不同的拓扑域,此时一个拓扑域中仅包含一个节点;如果指定标签为kubernetes.io/os,则根据标签值不同(标签值为节点的操作系统类型)来区分,不同操作系统的节点为不同的拓扑域,此时一个拓扑域中可能包含多个节点。 根据拓扑域确定节点范围后,然后再选择策略定义的内容(通过标签名、操作符、标签值确定)进行调度,调度时最小单位为拓扑域。例如,某个拓扑域中的一个节点满足负载亲和性规则,则该拓扑域中的节点均可以被调度。 标签名 设置工作负载亲和/反亲和性时,填写需要匹配的工作负载标签。 该标签可以使用系统默认的标签,也可以使用自定义标签。 操作符 可以设置四种匹配关系(In、NotIn、Exists、DoesNotExist)。 In:亲和/反亲和对象的标签在标签值列表(values字段)中。 NotIn:亲和/反亲和对象的标签不在标签值列表(values字段)中。 Exists:亲和/反亲和对象存在指定标签名。 DoesNotExist:亲和/反亲和对象不存在指定标签名。 标签值 设置工作负载亲和/反亲和性时,填写工作负载标签对应的标签值。 调度策略添加完成后,单击“创建工作负载”。
  • 通过监控中心查看Master节点组件指标 云原生监控中心已支持对Master节点的kube-apiserver组件进行监控,您在集群中开通云原生监控中心后(安装云原生监控插件版本为3.5.0及以上),可以查看仪表盘中的APIServer视图,监控API指标。 如需对kube-controller、kube-scheduler、etcd-server组件进行监控,请参考以下步骤。 此3个组件监控指标不在容器基础指标范围,监控中心将该类指标上报至AOM后会进行收费,因此监控中心会默认屏蔽采集该类指标。 登录CCE控制台,单击集群名称进入集群详情页。 在左侧导航栏中选择“配置与密钥”,并切换至“monitoring”命名空间,找到名为“persistent-user-config”的配置项。 单击“更新”,对配置数据进行编辑,并在serviceMonitorDisable字段下删除以下配置。 serviceMonitorDisable: - monitoring/kube-controller - monitoring/kube-scheduler - monitoring/etcd-server - monitoring/log-operator 图1 删除配置 单击“确定”。 等待5分钟后,您可前往AOM控制台,在“指标浏览”中找到集群上报的AOM实例,查看上述组件的指标。 图2 查看指标
  • 上传模板 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“应用模板”,在右上角单击“上传模板”。 单击“添加文件”,选中待上传的工作负载包后,单击“上传”。 图1 上传模板包 由于上传模板时创建OBS桶的命名规则由cce-charts-{region}-{domain_name}变为cce-charts-{region}-{domain_id},其中旧命名规则中的domain_name系统会做base64转化并取前63位,如果您在现有命名规则的OBS桶中找不到模板,请在旧命名规则的桶中进行查找。
  • 创建模板实例 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“应用模板”。 在“我的模板”页签中,单击目标模板下的“安装”。 参照表2设置安装工作负载参数。 表2 安装工作负载参数说明 参数 参数说明 实例名称 新建模板实例名称,命名必须唯一。 命名空间 指定部署的命名空间。 选择版本 选择模板的版本。 配置文件 用户可以导入values.yaml文件,导入后可替换模板包中的values.yaml文件;也可直接在配置框中在线编辑模板参数。 说明: 此处导入的values.yaml文件需符合yaml规范,即KEY:VALUE格式。对于文件中的字段不做任何限制。 导入的value.yaml的key值必须与所选的模板包的values.yaml保持一致,否则不会生效。即key不能修改。 单击“添加文件”。 选择对应的values.yaml文件,单击“打开”。 配置完成后,单击“安装”。 在“模板实例”页签下可以查看模板实例的安装情况。
  • 文件存储挂载参数 CCE的存储插件everest在挂载文件存储时默认设置了如表1所示的参数。 表1 文件存储挂载参数 参数 参数值 描述 keep-original-ownership 无需填写 表示是否保留文件挂载点的ownership,使用该参数时,要求everest插件版本为1.2.63或2.1.2以上。 默认为不添加该参数,此时挂载文件存储时将会默认把挂载点的ownership修改为root:root。 如添加该参数,挂载文件存储时将保持文件系统原有的ownership。 vers 3 文件系统版本,目前只支持NFSv3。取值:3 nolock 无需填写 选择是否使用NLM协议在服务器上锁文件。当选择nolock选项时,锁对于同一主机的应用有效,对不同主机不受锁的影响。 timeo 600 NFS客户端重传请求前的等待时间(单位为0.1秒)。建议值:600。 hard/soft 无需填写 挂载方式类型。 取值为hard,即使用硬连接方式,若NFS请求超时,则客户端一直重新请求直至成功。 取值为soft,即软挂载方式挂载系统,若NFS请求超时,则客户端向调用程序返回错误。 默认为hard。 sharecache/nosharecache 无需填写 设置客户端并发挂载同一文件系统时数据缓存和属性缓存的共享方式。设置为sharecache时,多个挂载共享共享同一缓存。设为nosharecache时,每个挂载各有一个缓存。默认为sharecache。 说明: 设置nosharecache禁用共享缓存会对性能产生一定影响。每次挂载都会重新获取挂载信息,会增加与NFS服务器的通信开销和NFS客户端的内存消耗,同时同客户端设置nosharecache存在cache不一致的风险。因此,应该根据具体情况进行权衡,以确定是否需要使用nosharecache选项。 除了以上参数外,您还可以设置其他的文件存储挂载参数,具体请参见挂载NFS文件系统到云服务器(Linux)。
  • 步骤一:安装插件 集群中需要同时安装CCE AI套件(NVIDIA GPU)插件和Volcano调度器插件。 登录CCE控制台,单击集群名称进入集群,在左侧选择“插件中心”。 在右侧找到CCE AI套件(NVIDIA GPU)插件,单击“安装”。 在安装插件页面,填写插件配置。 插件规格:可配置“默认”或“自定义”规格,请根据实际情况选择。 容器:选择“自定义”规格时支持设置。 Nvidia驱动:您需要填写Nvidia驱动的下载链接,集群下全部GPU节点将使用相同的驱动。 如果下载链接为公网地址,如nvidia官网地址(https://us.download.nvidia.com/tesla/470.57.02/NVIDIA-Linux-x86_64-470.57.02.run),各GPU节点均需要绑定EIP。获取驱动链接方法请参考获取驱动链接-公网地址。 若下载链接为OBS上的链接,无需绑定EIP 。获取驱动链接方法请参考获取驱动链接-OBS地址。 请确保Nvidia驱动版本与GPU节点适配。 更改驱动版本后,需要重启节点才能生效。 驱动选择:若您不希望集群中的所有GPU节点使用相同的驱动,CCE支持以节点池为单位安装不同的GPU驱动。 插件将根据节点池指定的驱动版本进行安装,仅对节点池新建节点生效。 更新驱动版本后,节点池中新建节点可直接生效,存量节点需重启节点生效。 GPU虚拟化(2.0.5及以上版本支持):选择开启GPU虚拟化,支持GPU单卡的算力、显存分割与隔离。 图1 开启GPU虚拟化 若集群中未安装Volcano插件,将不支持开启GPU虚拟化,您可单击“一键安装”进行安装。如需配置Volcano插件参数,请单击“自定义安装”,详情请参见Volcano调度器。 若集群中已安装Volcano插件,但插件版本不支持使用GPU虚拟化,您可单击“一键升级”进行升级。如需配置Volcano插件参数,请单击“自定义升级”,详情请参见Volcano调度器。 开启GPU虚拟化后,可选择“虚拟化节点兼容GPU共享模式”选项,即兼容Kubernetes默认GPU调度能力。该能力需要配套gpu-device-plugin插件版本为2.0.10及以上、Volcano插件版本为1.10.5及以上。 开启该兼容能力后,在工作负载中声明nvidia.com/gpu配额(即配置nvidia.com/gpu为小数,例如0.5)时将通过虚拟化GPU提供,实现GPU显存隔离,按照设定值的百分比为容器分配GPU显存(例如分配0.5×16GiB=8GiB的GPU显存,该数值需为128MiB的整数倍否则会自动向下取整)。如果在开启兼容能力前工作负载中已经使用nvidia.com/gpu资源,则不会转成虚拟化GPU,依然使用整卡资源。 开启该兼容能力后,使用nvidia.com/gpu配额时等价于开启虚拟化GPU显存隔离,可以和显存隔离模式的工作负载共用一张GPU卡,但不支持和算显隔离模式负载共用一张GPU卡。同时,还需遵循GPU虚拟化的其他约束与限制。 未开启该兼容能力时,在工作负载中声明nvidia.com/gpu配额仅影响调度结果,并不会有显存隔离的限制。即虽然配置nvidia.com/gpu为0.5,依然可以在容器中看到完整的GPU显存资源。且使用nvidia.com/gpu资源的工作负载无法和使用虚拟化显存的工作负载共同调度到同一节点。 编辑插件配置时,修改“虚拟化节点兼容GPU共享模式”选项,不会影响已运行的工作负载。修改该配置可能工作负载导致调度失败。例如,兼容能力从开启到关闭,已使用nvidia.com/gpu资源的工作负载仍存在虚拟化GPU显存隔离,会导致该GPU卡无法调度算显隔离模式的工作负载,您需要将使用nvidia.com/gpu资源的工作负载删除才可重新调度。 单击“安装”。
  • 步骤三(可选):修改Volcano调度策略 Volcano针对GPU节点的调度策略默认为Spread,即如果节点配置相同,会选择一个正在运行的容器数量最少的节点,可以尽量将容器平均分配到各个节点。而Binpack调度策略与之相反,它会尽可能的把所有的容器调度到一台节点上运行,尽量少用节点,避免资源碎片化。 如果在使用GPU虚拟化特性时需要使用Binpack调度策略,可以在Volcano插件的高级配置中进行修改,具体操作步骤如下。 登录CCE控制台,单击集群名称进入集群,在左侧选择“插件中心”。 在右侧找到Volcano调度器插件,单击“编辑”。 在编辑插件页面,修改插件的“高级配置”。 在nodeorder插件中,添加arguments参数,配置leastrequested.weight为0,即资源分配最少的节点优先级设置为0。 新增binpack插件,并指定xGPU自定义资源(volcano.sh/gpu-core.percentage和volcano.sh/gpu-mem.128Mi)的权重。 完整示例如下: { "colocation_enable": "", "default_scheduler_conf": { "actions": "allocate, backfill, preempt", "tiers": [ { "plugins": [ { "name": "priority" }, { "enablePreemptable": false, "name": "gang" }, { "name": "conformance" } ] }, { "plugins": [ { "enablePreemptable": false, "name": "drf" }, { "name": "predicates" }, { "name": "nodeorder", //将资源分配最少的节点优先级设置为0 "arguments": { "leastrequested.weight": 0 } } ] }, { "plugins": [ { "name": "cce-gpu-topology-predicate" }, { "name": "cce-gpu-topology-priority" }, { "name": "xgpu" }, //添加binpack插件,指定xGPU资源的权重。 { "name": "binpack", "arguments": { "binpack.resources": "volcano.sh/gpu-core.percentage,volcano.sh/gpu-mem.128Mi", "binpack.resources.volcano.sh/gpu-mem.128Mi": 10, "binpack.resources.volcano.sh/gpu-core.percentage": 10 } } ] }, { "plugins": [ { "name": "nodelocalvolume" }, { "name": "nodeemptydirvolume" }, { "name": "nodeCSIscheduling" }, { "name": "networkresource" } ] } ] }, "tolerations": [ { "effect": "NoExecute", "key": "node.kubernetes.io/not-ready", "operator": "Exists", "tolerationSeconds": 60 }, { "effect": "NoExecute", "key": "node.kubernetes.io/unreachable", "operator": "Exists", "tolerationSeconds": 60 } ] }
  • 前提条件 配置 支持版本 集群版本 v1.23.8-r0、v1.25.3-r0及以上 操作系统 Huawei Cloud EulerOS 2.0操作系统 GPU类型 支持T4、V100类型的GPU 驱动版本 GPU虚拟化功能仅支持470.57.02、510.47.03、535.54.03版本的GPU驱动。 运行时 仅支持containerd 插件 集群中需要同时安装以下插件: Volcano调度器插件:1.10.5及以上版本 CCE AI套件(NVIDIA GPU)插件:2.0.5及以上版本
  • 容器引擎版本说明 Docker EulerOS/CentOS:docker-engine 18.9.0,CCE定制的Docker版本,会及时修复安全漏洞。 Ubuntu:docker-ce: 18.9.9,开源社区版本。Ubuntu节点建议使用containerd引擎。 Ubuntu下开源docker-ce在并发exec(如配置了多个exec探针时)可能触发社区bug,建议使用http/tcp的探针。 Containerd:1.6.14
  • 节点操作系统与容器引擎对应关系 v1.23及以上的VPC网络集群都支持Containerd,容器隧道网络集群从v1.23.2-r0开始支持Containerd。 表2 CCE集群节点操作系统与容器引擎对应关系 操作系统 内核版本 容器引擎 容器存储Rootfs 容器运行时 CentOS 7.6 3.x Docker 1.23起支持Containerd 1.19.16以下版本集群使用Device Mapper 1.19.16及以上版本集群使用OverlayFS runC EulerOS 2.3 3.x Docker Device Mapper runC EulerOS 2.5 3.x Docker Device Mapper runC EulerOS 2.9 4.x Docker 1.23起支持Containerd OverlayFS runC Ubuntu 18.04 4.x Docker 1.23起支持Containerd OverlayFS runC Ubuntu 22.04 4.x Docker 1.23起支持Containerd OverlayFS runC Huawei Cloud EulerOS 1.1 3.x Docker Containerd OverlayFS runC Huawei Cloud EulerOS 2.0 5.x Docker Containerd OverlayFS runC 表3 CCE Turbo 集群节点操作系统与容器引擎对应关系 节点类型 操作系统 内核版本 容器引擎 容器存储Rootfs 容器运行时 弹性云服务器-虚拟机 CentOS 7.6 3.x Docker Containerd OverlayFS runC Ubuntu 18.04 4.x EulerOS 2.9 4.x Huawei Cloud EulerOS 1.1 3.x Huawei Cloud EulerOS 2.0 5.x 弹性云服务器-物理机 EulerOS 2.9 4.x Containerd Device Mapper Kata 表4 鲲鹏节点操作系统与容器引擎对应关系 操作系统 内核版本 容器引擎 容器存储Rootfs 容器运行时 Huawei Cloud EulerOS 2.0 5.x Docker Containerd OverlayFS runC EulerOS 2.9 4.x Docker Containerd OverlayFS runC EulerOS 2.8 4.x Docker OverlayFS runC
  • Containerd和Docker组件常用命令对比 Containerd不支持dockerAPI和dockerCLI,但是可以通过cri-tool命令实现类似的功能。 表5 镜像相关功能 操作 Docker命令 Containerd命令 docker crictl ctr 列出本地镜像列表 docker images crictl images ctr -n k8s.io i ls 拉取镜像 docker pull crictl pull ctr -n k8s.io i pull 上传镜像 docker push 无 ctr -n k8s.io i push 删除本地镜像 docker rmi crictl rmi ctr -n k8s.io i rm 检查镜像 docker inspect crictl inspecti 无 表6 容器相关功能 操作 Docker命令 Containerd命令 docker crictl ctr 列出容器列表 docker ps crictl ps ctr -n k8s.io c ls 创建容器 docker create crictl create ctr -n k8s.io c create 启动容器 docker start crictl start ctr -n k8s.io run 停止容器 docker stop crictl stop 无 删除容器 docker rm crictl rm ctr -n k8s.io c del 连接容器 docker attach crictl attach 无 进入容器 docker exec crictl exec 无 查看容器详情 docker inspect crictl inspect ctr -n k8s.io c info 查看容器日志 docker logs crictl logs 无 查看容器的资源使用情况 docker stats crictl stats 无 更新容器资源限制 docker update crictl update 无 表7 Pod相关功能 操作 Docker命令 Containerd命令 docker crictl ctr 列出Pod列表 无 crictl pods 无 查看Pod详情 无 crictl inspectp 无 启动Pod 无 crictl start 无 运行Pod 无 crictl runp 无 停止Pod 无 crictl stopp 无 删除Pod 无 crictl rmp 无 Containerd创建并启动的容器会被kubelet立即删除,不支持暂停、恢复、重启、重命名、等待容器,Containerd不具备docker构建、导入、导出、比较、推送、查找、打标签镜像的能力,Containerd不支持复制文件,可通过修改containerd的配置文件实现登录镜像仓库。
  • 停止前处理 登录CCE控制台,在创建工作负载时,配置容器信息,选择“生命周期”。 在“停止前处理”页签,设置停止前处理的命令。 表4 停止前处理 参数 说明 命令行脚本方式 在容器中执行指定的命令,配置为需要执行的命令。命令的格式为Command Args[1] Args[2]…(Command为系统命令或者用户自定义可执行程序,如果未指定路径则在默认路径下寻找可执行程序),如果需要执行多条命令,建议采用将命令写入脚本执行的方式。 如需要执行的命令如下: exec: command: - /uninstall.sh - uninstall_agent 请在执行脚本中填写: /uninstall uninstall_agent。这条命令表示容器结束前将执行uninstall.sh。
  • YAML样例 本节以nginx为例,说明kubectl命令设置容器生命周期的方法。 在以下配置文件中,您可以看到postStart命令在容器目录/bin/bash下写了个install.sh命令。 preStop执行uninstall.sh命令。 apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx command: - sleep 3600 #启动命令 imagePullPolicy: Always lifecycle: postStart: exec: command: - /bin/bash - install.sh #启动后命令 preStop: exec: command: - /bin/bash - uninstall.sh #停止前命令 name: nginx imagePullSecrets: - name: default-secret
  • 启动后处理 登录CCE控制台,在创建工作负载时,配置容器信息,选择“生命周期”。 在“启动后处理”页签,设置启动后处理的参数。 表3 启动后处理-参数说明 参数 说明 命令行脚本方式 在容器中执行指定的命令,配置为需要执行的命令。命令的格式为Command Args[1] Args[2]…(Command为系统命令或者用户自定义可执行程序,如果未指定路径则在默认路径下寻找可执行程序),如果需要执行多条命令,建议采用将命令写入脚本执行的方式。不支持后台执行和异步执行的命令。 如需要执行的命令如下: exec: command: - /install.sh - install_agent 请在执行脚本中填写: /install install_agent。这条命令表示容器创建成功后将执行install.sh。
  • 启动命令 在默认情况下,镜像启动时会运行默认命令,如果想运行特定命令或重写镜像默认值,需要进行相应设置。 Docker的镜像拥有存储镜像信息的相关元数据,如果不设置生命周期命令和参数,容器运行时将运行镜像制作时提供的默认的命令和参数,Docker将这两个字段定义为ENTRYPOINT和 CMD。 如果在创建工作负载时填写了容器的运行命令和参数,将会覆盖镜像构建时的默认命令ENTRYPOINT、CMD,规则如下: 表1 容器如何执行命令和参数 镜像 ENTRYPOINT 镜像CMD 容器运行命令 容器运行参数 最终执行 [touch] [/root/test] 未设置 未设置 [touch /root/test] [touch] [/root/test] [mkdir] 未设置 [mkdir] [touch] [/root/test] 未设置 [/opt/test] [touch /opt/test] [touch] [/root/test] [mkdir] [/opt/test] [mkdir /opt/test] 登录CCE控制台,在创建工作负载时,配置容器信息,选择“生命周期”。 在“启动命令”页签,输入运行命令和运行参数。 表2 容器启动命令 命令方式 操作步骤 运行命令 输入可执行的命令,例如“/run/server”。 若运行命令有多个,需分行书写。 说明: 多命令时,运行命令建议用/bin/sh或其他的shell,其他全部命令作为参数来传入。 运行参数 输入控制容器运行命令参数,例如--port=8080。 若参数有多个,多个参数以换行分隔。
  • 验证 以8U32G节点为例,并提前在集群中部署一个CPU request为1,limit为2的工作负载。 登录到节点池中的一个节点,查看/var/lib/kubelet/cpu_manager_state输出内容。 cat /var/lib/kubelet/cpu_manager_state 回显如下: {"policyName":"enhanced-static","defaultCpuSet":"0,2-7","entries":{"6739f6f2-ebe5-48ae-945a-986d5d8919b9":{"container-1":"0-7,10001"}},"checksum":1638128523} policyName字段值为enhanced-static代表策略设置成功。 优先使用CPU号将10000作为基数,本例中10001即代表容器使用的亲和CPU号为1,0-7代表该Pod中容器可以使用的CPU集合。 查看容器的cpuset.preferred_cpus的cgroup设置,输出内容即为优先使用的CPU号。 cat /sys/fs/cgroup/cpuset/kubepods/burstable/pod{pod uid}/{容器id}/cpuset.preferred_cpus {pod uid}为Pod UID,可在已通过kubectl连接集群的机器上使用以下命令获取: kubectl get po {pod name} -n {namespace} -ojsonpath='{.metadata.uid}{"\n"}' 命令中的{pod name}和{namespace}是Pod名称及其所在的命名空间。 {容器id}需要是完整的容器ID,可在容器运行的节点上通过以下命令获取: docker节点池:命令中的{pod name}是Pod名称。 docker ps --no-trunc | grep {pod name} | grep -v cce-pause | awk '{print $1}' containerd节点池:命令中的{pod name}是Pod名称,{pod id}是Pod的ID,{container name}是容器名称。 # 获取Pod ID crictl pods | grep {pod name} | awk '{print $1}' # 获取完整容器ID crictl ps --no-trunc | grep {pod id} | grep {container name} | awk '{print $1}' 完整示例如下: cat /sys/fs/cgroup/cpuset/kubepods/burstable/pod6739f6f2-ebe5-48ae-945a-986d5d8919b9/5ba5603434b95fd22d36fba6a5f1c44eba83c18c2e1de9b52ac9b52e93547a13/cpuset.preferred_cpus 回显如下,表示优先使用1号CPU。 1
共100000条