华为云用户手册

  • 符合策略实例的资源定义 CPU和内存的Request小于配置的最大值,符合策略实例。 apiVersion: v1 kind: Pod metadata: name: opa-allowed labels: owner: me.agilebank.demo spec: containers: - name: opa image: openpolicyagent/opa:0.9.2 args: - "run" - "--server" - "--addr=localhost:8080" resources: requests: cpu: "100m" memory: "1Gi"
  • 不符合策略实例的资源定义 内存的Request大于约束的最大值,不符合策略实例。 apiVersion: v1 kind: Pod metadata: name: opa-disallowed labels: owner: me.agilebank.demo spec: containers: - name: opa image: openpolicyagent/opa:0.9.2 args: - "run" - "--server" - "--addr=localhost:8080" resources: requests: cpu: "100m" memory: "2Gi"
  • 策略实例示例 示例配置了CPU和内存的最大Request。 apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sContainerRequests metadata: name: container-must-have-requests spec: match: kinds: - apiGroups: [""] kinds: ["Pod"] parameters: cpu: "200m" memory: "1Gi"
  • 事件 事件搜索 事件页面的主要功能是展示按照一定条件搜索出的指定资源的事件信息,包括Normal/Warning事件趋势和详情。这样,用户可以更加方便地查看与该资源相关的事件信息。 您可以按照如下几种方式进行事件搜索。 在输入框里输入要搜索的事件名称,选择命名空间或者事件类型,单击“搜索”按钮进行搜索。 单击“高级搜索”,按照工作负载、节点、容器组、事件内容、资源类型或者资源名称进行搜索。 也可以在左上角选择事件发生的时间范围,包括近1小时、近1天、近1周和自定义。 图4 搜索事件 事件列表 您可以在列表中查看满足搜索条件的事件详情,包括最近发生时间、事件名称、资源类型、资源名称、事件内容、事件类型和发生次数。单击操作列的“历史事件”,在弹出的对话框中将展示当前资源类型和资源名称下的所有事件。 图5 事件列表
  • 创建权限 登录U CS 控制台,在左侧导航栏中选择“权限管理”。 单击右上角的“创建权限”按钮。 在弹出页面中填写权限参数。 图2 创建权限 权限名称:自定义权限的名称,需以小写字母开头,由小写字母、数字、中划线(-)组成,且不能以中划线(-)结尾。 用户:在下拉列表中勾选新创建的用户名。支持选择多个用户,假设一个企业中的开发团队有多名员工,他们对资源的操作权限一样,就可以在创建权限时选择多个用户以达到批量授权的目的。 本文以添加一个“readonly_user”用户为例。 权限类型:支持管理员权限、只读权限、开发权限和自定义权限。 表1 权限类型说明 权限类型 说明 管理员权限 对所有集群资源对象的读写权限 只读权限 对所有集群资源对象的只读权限 开发权限 对大多数集群资源对象的读写权限,对命名空间、资源配额等集群资源对象的只读权限 自定义权限 权限由您选择的操作类型和资源对象决定 权限内容:表示对哪些资源可以执行哪些操作。管理员权限、只读权限、开发权限的权限内容已经模板化,您可以单击按钮查看权限的详细内容。当权限类型选择“自定义权限”时,需要设置操作类型和资源对象。 操作类型:包含如下类型,也支持新增操作类型(如deletecollection,表示删除多个资源)。 get:按名称检索特定的资源对象。 list:检索命名空间中特定类型的所有资源对象。 watch:响应资源变化。 create:创建资源。 update:更新资源。 patch:局部更新资源。 delete:删除资源。 对于全部操作推荐选择:全部。 对于只读操作推荐选择:get + list + watch。 对于读写操作推荐选择:get + list + watch + create + update + patch + delete。 资源对象:您可以选择“全部资源”或“指定资源”。全部资源对象包括当前已有的资源对象和后续新增的自定义资源对象;“指定资源”即表示您自己选择资源对象的范围,为了便于查找,UCS服务将资源对象按照工作负载、服务、配置和存储、身份验证、授权、权限、扩展、集群维度划分。 若系统资源中没有您需要的资源对象,也可以新增自定义资源对象。 如果针对不同资源对象,操作类型不同(例如:对deployments具有create、delete操作权限,对secrets具有get、list、watch操作权限),可以单击按钮添加多组内容。 若您想了解更多资源对象和操作类型的知识,请参阅Kubernetes API。 描述:添加权限的描述信息。 单击“确定”。权限创建完成后,需要继续关联舰队或未加入舰队的集群,才可正常操作Kubernetes资源。
  • 授权流程 图1 给用户授予Kubernetes资源权限流程 创建用户。 管理员帐号在 IAM 控制台创建一个用户。 为用户授予UCS系统策略。 授予Kubernetes资源权限之前,必须先为用户授予UCS系统策略的权限,本例中应该授予UCS ReadOnlyAccess策略(UCS服务只读权限)。 创建权限。 管理员帐号在UCS控制台创建权限,选择“只读权限”的权限类型,表示对所有Kubernetes资源对象的只读权限。 关联权限至舰队或未加入舰队的集群。 将权限关联至舰队,关联时需要选择权限作用的命名空间。也可以关联权限至未加入舰队的集群。 验证权限是否生效。 新创建的用户登录控制台,验证只读权限是否生效。
  • 关联权限至舰队或未加入舰队的集群 舰队是多个集群的集合,舰队可以实现多集群的权限统一管理。因此建议您将集群加入舰队后,为舰队关联权限,这样舰队中的集群将具有相同的权限。 登录UCS控制台,在左侧导航栏中选择“容器舰队”。 在目标舰队栏中,单击右上角的按钮。 图3 为舰队关联权限 在弹出的页面单击“关联权限”,打开“修改权限”页面,将已创建好的权限和舰队的命名空间关联起来。 图4 修改权限 命名空间:支持“全部命名空间”和“指定命名空间”。全部命名空间包括当前舰队已有的命名空间和舰队后续新增的命名空间;“指定命名空间”即表示您自己选择命名空间的范围,UCS服务提供了几个常见的命名空间供您选择(如default、kube-system、kube-public),您也可以新增命名空间,但要自行确保新增的命名空间在集群中存在。 请注意,选择的命名空间仅对权限中命名空间级资源生效,不影响权限中的集群资源。关于命名空间级和集群级资源的介绍,请参见Kubernetes资源对象章节。 关联权限:从下拉列表中选择权限,支持一次性选择多个权限,以达到批量授权的目的。 本示例中,选择“default”命名空间,选择“readonly”权限。 如果针对不同命名空间,关联的权限不同(例如:为default命名空间关联readonly权限,为development命名空间关联develop权限),可以单击按钮添加多组授权关系。 单击“确定”,完成权限的关联。 如果后续需要修改舰队的权限,采用同样的方法,重新选择命名空间和权限即可。
  • 在控制台中修改volcano-scheduler配置 Volcano允许用户在安装,升级,编辑时,编写Volcano调度器配置信息,并将配置内容同步到volcano-scheduler-configmap里。 当前小节介绍如何使用自定义配置,以便用户让volcano-scheduler能更适合自己的场景。 仅Volcano 1.7.1及以上版本支持该功能。在新版插件界面上合并了原plugins.eas_service和resource_exporter_enable等选项,以新选项default_scheduler_conf代替。 您可登录CCE控制台,单击集群名称进入集群,单击左侧导航栏的“插件管理”,在右侧找到Volcano,单击“安装”或“升级”,并在“参数配置”中设置Volcano调度器配置参数。 使用resource_exporter配置,示例如下: { "ca_cert": "", "default_scheduler_conf": { "actions": "allocate, backfill", "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": "numa-aware" # add this also enable resource_exporter } ] }, { "plugins": [ { "name": "nodelocalvolume" }, { "name": "nodeemptydirvolume" }, { "name": "nodeCSIscheduling" }, { "name": "networkresource" } ] } ] }, "server_cert": "", "server_key": "" } 开启后可以同时使用volcano-scheduler的numa-aware插件功能和resource_exporter功能。 使用eas_service配置,示例如下: { "ca_cert": "", "default_scheduler_conf": { "actions": "allocate, backfill", "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": "eas", "custom": { "availability_zone_id": "", "driver_id": "", "endpoint": "", "flavor_id": "", "network_type": "", "network_virtual_subnet_id": "", "pool_id": "", "project_id": "", "secret_name": "eas-service-secret" } } ] }, { "plugins": [ { "name": "nodelocalvolume" }, { "name": "nodeemptydirvolume" }, { "name": "nodeCSIscheduling" }, { "name": "networkresource" } ] } ] }, "server_cert": "", "server_key": "" } 使用ief配置,示例如下: { "ca_cert": "", "default_scheduler_conf": { "actions": "allocate, backfill", "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": "ief", "enableBestNode": true } ] }, { "plugins": [ { "name": "nodelocalvolume" }, { "name": "nodeemptydirvolume" }, { "name": "nodeCSIscheduling" }, { "name": "networkresource" } ] } ] }, "server_cert": "", "server_key": "" }
  • Prometheus指标采集 volcano-scheduler通过端口8080暴露Prometheus metrics指标。您可以自建Prometheus采集器识别并通过http://{{volcano-schedulerPodIP}}:{{volcano-schedulerPodPort}}/metrics路径获取volcano-scheduler调度相关指标。 Prometheus指标暴露仅支持volcano插件1.8.5及以上版本。 表3 关键指标说明 指标名称 指标类型 描述 Labels e2e_scheduling_latency_milliseconds Histogram 端到端调度时延毫秒(调度算法+绑定) - e2e_job_scheduling_latency_milliseconds Histogram 端到端作业调度时延(毫秒) - e2e_job_scheduling_duration Gauge 端到端作业调度时长 labels=["job_name", "queue", "job_namespace"] plugin_scheduling_latency_microseconds Histogram 插件调度延迟(微秒) labels=["plugin", "OnSession"] action_scheduling_latency_microseconds Histogram 动作调度时延(微秒) labels=["action"] task_scheduling_latency_milliseconds Histogram 任务调度时延(毫秒) - schedule_attempts_total Counter 尝试调度Pod的次数。“unschedulable”表示无法调度Pod,而“error”表示内部调度器问题 labels=["result"] pod_preemption_victims Gauge 选定的抢占受害者数量 - total_preemption_attempts Counter 集群中的抢占尝试总数 - unschedule_task_count Gauge 无法调度的任务数 labels=["job_id"] unschedule_job_count Gauge 无法调度的作业数 - job_retry_counts Counter 作业的重试次数 labels=["job_id"]
  • Volcano 1.0.0版本升级说明 Volcano 1.0.0版本与后续版本不兼容,不支持在控制台升级。如想使用新版本Volcano插件,需要先卸载1.0.0版本,然后再在控制台安装新版本。 执行如下命令可以卸载Volcano。 kubectl delete crd jobs.batch.volcano.sh kubectl delete crd commands.bus.volcano.sh
  • 版本记录 建议升级到跟集群配套的最新volcano版本。 表4 集群版本配套关系 集群版本 支持的插件版本 v1.25 1.7.1、1.7.2 v1.23 1.7.1、1.7.2 v1.21 1.7.1、1.7.2 v1.19.16 1.3.7、1.3.10、1.4.5、1.7.1、1.7.2 v1.19 1.3.7、1.3.10、1.4.5 v1.17(停止维护) 1.3.7、1.3.10、1.4.5 v1.15(停止维护) 1.3.7、1.3.10、1.4.5 表5 CCE插件版本记录 插件版本 支持的集群版本 更新特性 1.9.1 /v1.19.16.*|v1.21.*|v1.23.*|v1.25.*/ 修复networkresource插件计数pipeline pod占用subeni问题 修复binpack插件对资源不足节点打分问题 修复对结束状态未知的pod的资源的处理 优化事件输出 默认高可用部署 1.7.2 /v1.19.16.*|v1.21.*|v1.23.*|v1.25.*/ Volcano 支持 Kubernetes 1.25版本 提升Volcano调度性能。 1.7.1 /v1.19.16.*|v1.21.*|v1.23.*|v1.25.*/ Volcano 支持 Kubernetes 1.25版本 1.6.5 /v1.19.*|v1.21.*|v1.23.*/ 支持作为CCE的默认调度器 支持混部场景下统一调度 1.4.5 /v1.17.*|v1.19.*|v1.21.*/ volcano-scheduler的部署方式由statefulset调整为deployment,修复节点异常时Pod无法自动迁移的问题 1.4.2 /v1.15.*|v1.17.*|v1.19.*|v1.21.*/ 修复跨GPU分配失败问题 适配更新后的EAS API 1.3.3 /v1.15.*|v1.17.*|v1.19.*|v1.21.*/ 修复GPU异常导致的调度器崩溃问题;修复特权Init容器准入失败问题 1.3.1 /v1.15.*|v1.17.*|v1.19.*/ 升级Volcano框架到最新版本 支持Kubernetes 1.19版本 添加numa-aware插件 修复多队列场景下Deployment扩缩容的问题 调整默认开启的算法插件 1.2.5 /v1.15.*|v1.17.*|v1.19.*/ 修复某些场景下OutOfcpu的问题 修复queue设置部分capability情况下Pod无法调度问题 支持volcano组件日志时间与系统时间保持一致 修复队列间多抢占问题 修复ioaware插件在某些极端场景下结果不符合预期的问题 支持混合集群 1.2.3 /v1.15.*|v1.17.*|v1.19.*/ 修复因为精度不够引发的训练任务OOM的问题 修复CCE1.15以上版本GPU调度的问题,暂不支持任务分发时的CCE版本滚动升级 修复特定场景下队列状态不明的问题 修复特定场景下作业挂载PVC panic的问题 修复GPU作业无法配置小数的问题 添加ioaware插件 添加ring controller
  • 保留原volcano-scheduler-configmap配置 假如在某场景下希望插件升级后时沿用原配置,可参考以下步骤: 查看原volcano-scheduler-configmap配置,并备份。 示例如下: # kubectl edit cm volcano-scheduler-configmap -n kube-system apiVersion: v1 data: default-scheduler.conf: |- actions: "enqueue, allocate, backfill" tiers: - plugins: - name: priority - name: gang - name: conformance - plugins: - name: drf - name: predicates - name: nodeorder - name: binpack arguments: binpack.cpu: 100 binpack.weight: 10 binpack.resources: nvidia.com/gpu binpack.resources.nvidia.com/gpu: 10000 - plugins: - name: cce-gpu-topology-predicate - name: cce-gpu-topology-priority - name: cce-gpu - plugins: - name: nodelocalvolume - name: nodeemptydirvolume - name: nodeCSIscheduling - name: networkresource 在控制台“参数配置”中填写自定义修改的内容: { "ca_cert": "", "default_scheduler_conf": { "actions": "enqueue, allocate, backfill", "tiers": [ { "plugins": [ { "name": "priority" }, { "name": "gang" }, { "name": "conformance" } ] }, { "plugins": [ { "name": "drf" }, { "name": "predicates" }, { "name": "nodeorder" }, { "name": "binpack", "arguments": { "binpack.cpu": 100, "binpack.weight": 10, "binpack.resources": "nvidia.com/gpu", "binpack.resources.nvidia.com/gpu": 10000 } } ] }, { "plugins": [ { "name": "cce-gpu-topology-predicate" }, { "name": "cce-gpu-topology-priority" }, { "name": "cce-gpu" } ] }, { "plugins": [ { "name": "nodelocalvolume" }, { "name": "nodeemptydirvolume" }, { "name": "nodeCSIscheduling" }, { "name": "networkresource" } ] } ] }, "server_cert": "", "server_key": "" } 使用该功能时会覆盖原volcano-scheduler-configmap中内容,所以升级时务必检查是否在volcano-scheduler-configmap做过修改。如果是,需要把修改内容同步到升级界面里。
  • 安装插件 登录UCS控制台,单击集群名称进入集群,单击左侧导航栏的“插件管理”,找到Volcano,单击“安装”。 该插件可配置“单实例”、“高可用”或自定义规格。 选择自定义时,volcano-controller和volcano-scheduler的建议值如下: 小于100个节点,可使用默认配置,即CPU的申请值为500m,限制值为2000m;内存的申请值为500Mi,限制值为2000Mi。 高于100个节点,每增加100个节点(10000个Pod),建议CPU的申请值增加500m,内存的申请值增加1000Mi;CPU的限制值建议比申请值多1500m,内存的限制值建议比申请值多1000Mi。 申请值推荐计算公式: CPU申请值:计算“目标节点数 * 目标Pod规模”的值,并在表1中根据“集群节点数 * Pod规模”的计算值进行插值查找,向上取最接近规格的申请值及限制值。 例如2000节点和2w个Pod的场景下,“目标节点数 * 目标Pod规模”等于4000w,向上取最接近的规格为700/7w(“集群节点数 * Pod规模”等于4900w),因此建议CPU申请值为4000m,限制值为5500m。 内存申请值:建议每1000个节点分配2.4G内存,每1w个Pod分配1G内存,二者叠加进行计算。(该计算方法相比表1中的建议值会存在一定的误差,通过查表或计算均可) 即:内存申请值 = 目标节点数/1000 * 2.4G + 目标Pod规模/1w * 1G。 例如2000节点和2w个Pod的场景下,内存申请值 = 2 * 2.4G + 2 * 1G = 6.8G 表1 volcano-controller和volcano-scheduler的建议值 集群节点数/Pod规模 CPU Request(m) CPU Limit(m) Memory Request(Mi) Memory Limit(Mi) 50/5k 500 2000 500 2000 100/1w 1000 2500 1500 2500 200/2w 1500 3000 2500 3500 300/3w 2000 3500 3500 4500 400/4w 2500 4000 4500 5500 500/5w 3000 4500 5500 6500 600/6w 3500 5000 6500 7500 700/7w 4000 5500 7500 8500 选择插件实例是否多可用区部署。 优先模式:优先将插件的Deployment实例调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将调度到单可用区。 强制模式:插件Deployment实例强制调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将无法全部运行。 配置插件实例节点亲和策略。 指定节点调度:指定插件实例部署的节点 ,若不指定,将根据集群默认调度策略进行随机调度。 自定义亲和策略:填写期望插件部署的节点标签实现更灵活的调度策略,若不填写将根据集群默认调度策略进行随机调度。自定义亲和策略详情请参见调度策略(亲和与反亲和) 配置volcano默认调度器配置参数,详情请参见表2。 colocation_enable: '' default_scheduler_conf: actions: 'allocate, backfill' tiers: - plugins: - name: 'priority' - name: 'gang' - name: 'conformance' - name: 'lifecycle' arguments: lifecycle.MaxGrade: 10 lifecycle.MaxScore: 200.0 lifecycle.SaturatedTresh: 1.0 lifecycle.WindowSize: 10 - plugins: - name: 'drf' - name: 'predicates' - name: 'nodeorder' - plugins: - name: 'cce-gpu-topology-predicate' - name: 'cce-gpu-topology-priority' - name: 'cce-gpu' - plugins: - name: 'nodelocalvolume' - name: 'nodeemptydirvolume' - name: 'nodeCSIscheduling' - name: 'networkresource' 表2 Volcano插件配置参数说明 插件 功能 参数说明 用法演示 colocation_enable 是否开启混部能力。 参数值: true:表示开启混部。 false:不是不开启混部。 - binpack 将Pod调度到资源使用较高的节点以减少资源碎片 binpack.weight:binpack插件本身在所有插件打分中的权重 binpack.cpu:CPU资源在资源比重的比例,默认是1 binpack.memory:memory资源在所有资源中的比例,默认是1 binpack.resources:资源类型。 - plugins: - name: binpack arguments: binpack.weight: 10 binpack.cpu: 1 binpack.memory: 1 binpack.resources: nvidia.com/gpu, example.com/foo binpack.resources.nvidia.com/gpu: 2 binpack.resources.example.com/foo: 3 conformance 跳过关键Pod,比如在kube-system命名空间的Pod,防止这些Pod被驱逐 - - lifecycle 通过统计业务伸缩的规律,将有相近生命周期的Pod优先调度到同一节点,配合autoscaler的水平扩缩容能力,快速缩容释放资源,节约成本并提高资源利用率。 1. 统计业务负载中Pod的生命周期,将有相近生命周期的Pod调度到同一节点 2. 对配置了自动扩缩容策略的集群,通过调整节点的缩容注解,优先缩容使用率低的节点 arguments参数: lifecycle.WindowSize:为int型整数,不小于1,默认为10。 记录副本数变更的次数,负载变化规律、周期性明显时可适当调低;变化不规律,副本数频繁变化需要调大。若过大会导致学习周期变长,记录事件过多。 lifecycle.MaxGrade:为int型整数,不小于3,默认为3。 副本分档数,如设为3,代表分为高中低档。负载变化规律、周期性明显时可适当调低;变化不规律,需要调大。若过小会导致预测的生命周期不够准确。 lifecycle.MaxScore:为float64浮点数,不小于50.0,默认为200.0。 lifecycle插件的最大得分,等效于插件权重。 lifecycle.SaturatedTresh:为float64浮点数,小于0.5时取值为0.5;大于1时取值为1,默认为0.8。 用于判断节点利用率是否过高的阈值,当超过该阈值,调度器会优先调度作业至其他节点。 - plugins: - name: priority - name: gang enablePreemptable: false - name: conformance - name: lifecycle arguments: lifecycle.MaxGrade: 10 lifecycle.MaxScore: 200.0 lifecycle.SaturatedTresh: 1.0 lifecycle.WindowSize: 10 说明: 对不希望被缩容的节点,需要手动标记长周期节点,为节点添加volcano.sh/long-lifecycle-node: true的annotation。对未标记节点,lifecycle插件将根据节点上负载的生命周期自动标记。 MaxScore默认值200.0相当于其他插件权重的两倍,当lifecycle插件效果不明显或与其他插件冲突时,需要关闭其他插件,或将MaxScore调大。 调度器重启后,lifecycle插件需要重新记录负载的变化状况,需要统计数个周期后才能达到最优调度效果。 gang 将一组Pod看做一个整体去分配资源 - - priority 使用用户自定义负载的优先级进行调度 - - overcommit 将集群的资源放到一定倍数后调度,提高负载入队效率。负载都是deployment的时候,建议去掉此插件或者设置扩大因子为2.0。 overcommit-factor: 扩大因子,默认是1.2 - plugins: - name: overcommit arguments: overcommit-factor: 2.0 drf 根据作业使用的主导资源份额进行调度,用的越少的优先 - - predicates 预选节点的常用算法,包括节点亲和,Pod亲和,污点容忍,node ports重复,volume limits,volume zone匹配等一系列基础算法 - - nodeorder 优选节点的常用算法 nodeaffinity.weight:节点亲和性优先调度,默认值是1 podaffinity.weight:Pod亲和性优先调度,默认值是1 leastrequested.weight:资源分配最少的的节点优先,默认值是1 balancedresource.weight:node上面的不同资源分配平衡的优先,默认值是1 mostrequested.weight:资源分配最多的的节点优先,默认值是0 tainttoleration.weight:污点容忍高的优先调度,默认值是1 imagelocality.weight:node上面有Pod需要镜像的优先调度,默认值是1 selectorspread.weight: 把Pod均匀调度到不同的节点上,默认值是0 volumebinding.weight: local pv延迟绑定调度,默认值是1 podtopologyspread.weight: Pod拓扑调度,默认值是2 - plugins: - name: nodeorder arguments: leastrequested.weight: 1 mostrequested.weight: 0 nodeaffinity.weight: 1 podaffinity.weight: 1 balancedresource.weight: 1 tainttoleration.weight: 1 imagelocality.weight: 1 volumebinding.weight: 1 podtopologyspread.weight: 2 cce-gpu-topology-predicate GPU拓扑调度预选算法 - - cce-gpu-topology-priority GPU拓扑调度优选算法 - - cce-gpu 结合UCS的GPU插件支持GPU资源分配,支持小数GPU配置 说明: 小数GPU配置的前提条件为UCS集群GPU节点为共享模式,检查集群是否关闭GPU共享,请参见集群配置管理中的enable-gpu-share参数。 - - numaaware numa拓扑调度 weight: 插件的权重 - networkresource 支持预选过滤ENI需求节点,参数由CCE传递,不需要手动配置 NetworkType: 网络类型(eni或者vpc-router类型) - nodelocalvolume 支持预选过滤不符合local volume需求节点 - - nodeemptydirvolume 支持预选过滤不符合emptydir需求节点 - - nodeCSIscheduling 支持预选过滤everest组件异常节点 - - 单击“安装”。
  • 插件简介 Volcano是一个基于Kubernetes的批处理平台,提供了机器学习、深度学习、生物信息学、基因组学及其他大数据应用所需要而Kubernetes当前缺失的一系列特性。 Volcano提供了高性能任务调度引擎、高性能异构芯片管理、高性能任务运行管理等通用计算能力,通过接入AI、大数据、基因、渲染等诸多行业计算框架服务终端用户。(目前Volcano项目已经在Github开源) Volcano针对计算型应用提供了作业调度、作业管理、队列管理等多项功能,主要特性包括: 丰富的计算框架支持:通过CRD提供了批量计算任务的通用API,通过提供丰富的插件及作业生命周期高级管理,支持TensorFlow,MPI,Spark等计算框架容器化运行在Kubernetes上。 高级调度:面向批量计算、高性能计算场景提供丰富的高级调度能力,包括成组调度,优先级抢占、装箱、资源预留、任务拓扑关系等。 队列管理:支持分队列调度,提供队列优先级、多级队列等复杂任务调度能力。 项目开源地址:https://github.com/volcano-sh/volcano
  • 接入网络模式 对于附着集群,各集群提供商或本地数据中心对于网络入方向的端口规则有差异,防止特定端口外的入站通信。因此UCS使用集群网络代理的连接方式,如图2所示,无需在防火墙上启用任何入方向端口,仅通过集群代理程序的方式在出方向与UCS服务建立会话。 附着集群接入网络的方法有两种,具有不同的优点: 公网接入:具有弹性灵活、成本低、易接入的优点。 私网接入:可获得更加高速、低时延、稳定安全的体验。 图2 集群接入原理
  • 监控 在此处,您可以方便地查看实例在近1小时、近8小时、近24小时以及自定义时间段内各维度资源的使用情况。如需查看更多监控信息,请单击“查看全部仪表盘”,跳转至“仪表盘”页面,相应指导请参见仪表盘。 CPU 单位时间内Pod CPU平均使用情况。 图5 CPU 内存 单位时间内Pod内存平均使用情况。 图6 内存 网络速率 容器网络流量,用于监控容器的网络负载情况,以及容器之间的网络通信情况。 图7 网络速率 Pod历史状态 Pod的生命周期。 图8 Pod历史状态 容器CPU 单位时间内容器CPU平均使用情况的统计。 图9 容器CPU 容器内存 单位时间内容器内存平均使用情况的统计。 图10 容器内存 容器CPU受限 容器的生命周期中度过的受限的CPU周期总数与总周期数的比率。 图11 容器CPU受限 容器网络丢包率 容器数据包丢失部分与所传数据包总数的比值。 图12 容器网络丢包率 容器历史状态 容器的生命周期。 图13 容器历史状态
  • 本地IDC集群迁移上云流程 UCS容器迁移支持将本地IDC自建的Kubernetes集群应用迁移到UCS华为云集群或本地集群,实现应用程序的云端部署和运维管理。迁移流程如图1所示。 图1 迁移流程 主要包含四个步骤: 集群评估 在这个阶段,您将根据源集群的现状来评估适合迁移的目标集群类型。UCS的kspider工具能够自动收集源集群的信息,包括Kubernetes版本、规模、工作负载、存储等数据,并根据收集到的数据为您提供推荐的目标集群信息。具体请参见集群评估。 数据迁移 在这个阶段,您将把镜像和相关依赖服务的数据迁移到云端。UCS的image-migrator是一个自动化镜像迁移工具,可以将基于Docker Registry v2搭建的Docker镜像仓库中的镜像迁移到SWR中;对于依赖服务的数据迁移,您可以使用华为云的其他云产品来配套实现。具体请参见镜像迁移和依赖服务迁移。 应用备份 在这个阶段,您将对本地IDC集群中的应用进行备份。UCS的k8clone工具可以自动收集Kubernetes元数据,并将其以压缩包的形式保存到本地,从而实现集群中应用的备份。具体请参见应用备份。 应用迁移 在这个阶段,您将利用备份数据恢复的方法,将本地IDC集群中的应用迁移到UCS华为云集群或本地集群。具体请参见应用迁移。 父主题: 本地IDC集群迁移上云
  • 创建负载伸缩策略 为工作负载创建FederatedHPA策略。 vi hpa-example-hpa.yaml YAML文件内容如下。该策略作用于名称为hpa-example的负载,稳定窗口时长为扩容0秒、缩容100秒,最大Pod数为100、最小Pod数为2,包含一条系统指标规则,期望的CPU利用率为50%。 apiVersion: autoscaling.karmada.io/v1alpha1 kind: FederatedHPA metadata: name: hpa-example-hpa # FederatedHPA策略名称 namespace: default # 工作负载所在命名空间名称 spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: hpa-example # 工作负载名称 behavior: scaleDown: stabilizationWindowSeconds: 100 # 缩容的稳定窗口时长为100秒 scaleUp: stabilizationWindowSeconds: 0 # 扩容的稳定窗口时长为0秒 minReplicas: 2 # 最小Pod数为2 maxReplicas: 100 # 最大Pod数为100 metrics: - type: Resource resource: name: cpu # 扩缩指标基于CPU数据 target: type: Utilization # 指标类型为利用率 averageUtilization: 50 # 期望的平均利用率 创建CronFederatedHPA策略。 vi cron-federated-hpa.yaml YAML文件内容如下。该策略作用于名称为hpa-example-hpa的FederatedHPA策略,期望每天8:30扩容工作负载至10个Pod,每天10:00缩容工作负载至2个Pod。 apiVersion: autoscaling.karmada.io/v1alpha1 kind: CronFederatedHPA metadata: name: cron-federated-hpa # CronFederatedHPA策略名称 spec: scaleTargetRef: apiVersion: apps/v1 kind: FederatedHPA # 作用于FederatedHPA策略 name: hpa-example-hpa # FederatedHPA的名称 rules: - name: "Scale-Up" # 规则名称 schedule: 30 08 * * * # 触发时间 targetReplicas: 10 # 目标Pod数,非负整数 timeZone: Asia/Shanghai # 时区 - name: "Scale-Down" # 规则名称 schedule: 0 10 * * * # 触发时间 targetReplicas: 2 # 目标Pod数,非负整数 timeZone: Asia/Shanghai # 时区
  • 观察负载伸缩过程 查看FederatedHPA策略,结果显示工作负载的CPU使用率为0%。 kubectl get FederatedHPA hpa-example-hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 1 6m 通过如下命令访问工作负载,其中{ip:port}为负载的访问地址,可以在工作负载的详情页中查询。 while true;do wget -q -O- http://{ip:port}; done 观察工作负载自动扩容过程。 查看FederatedHPA策略,可以看到6m23s时负载的CPU使用率为200%,超过了目标值,此时触发了FederatedHPA策略,将工作负载扩容为4个Pod,随后的几分钟内,CPU使用并未下降,直到到8m16s时CPU使用率才开始下降,这是因为新创建的Pod并不一定创建成功,可能是因为资源不足Pod处于Pending状态,这段时间内在扩容节点。 到8m16s时CPU使用率开始下降,说明Pod创建成功,开始分担请求流量,到8分钟时下降到81%,还是高于目标值,在容忍度范围外,说明还会再次扩容,到9m31s时再次扩容到7个Pod,这时CPU使用率降为51%,在容忍度范围内,不会再次扩缩,因此此后Pod数量一直稳定在7个。 kubectl get federatedhpa hpa-example-hpa --watch NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 1 6m hpa-example-hpa Deployment/hpa-example 200%/50% 1 100 1 6m23s hpa-example-hpa Deployment/hpa-example 200%/50% 1 100 4 6m31s hpa-example-hpa Deployment/hpa-example 210%/50% 1 100 4 7m16s hpa-example-hpa Deployment/hpa-example 210%/50% 1 100 4 7m16s hpa-example-hpa Deployment/hpa-example 90%/50% 1 100 4 8m16s hpa-example-hpa Deployment/hpa-example 85%/50% 1 100 4 9m16s hpa-example-hpa Deployment/hpa-example 51%/50% 1 100 7 9m31s hpa-example-hpa Deployment/hpa-example 51%/50% 1 100 7 10m16s hpa-example-hpa Deployment/hpa-example 51%/50% 1 100 7 11m 查看FederatedHPA策略事件,可以看到策略的生效时间。 kubectl describe federatedhpa hpa-example-hpa 停止访问负载,观察工作负载自动缩容过程。 查看FederatedHPA策略,可以看到从13m开始CPU使用率为21%,18m时Pod数量缩为3个,到23m时Pod数量缩为1个。 kubectl get federatedhpa hpa-example-hpa --watch NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE hpa-example-hpa Deployment/hpa-example 50%/50% 1 100 7 12m hpa-example-hpa Deployment/hpa-example 21%/50% 1 100 7 13m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 7 14m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 7 18m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 3 18m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 3 19m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 3 19m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 3 19m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 3 19m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 3 23m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 3 23m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 1 23m 查看FederatedHPA策略事件,可以看到策略的生效时间。 kubectl describe federatedhpa hpa-example-hpa 达到CronFederatedHPA策略的触发时间后,观察工作负载的自动扩缩容过程。 可以看到118m时Pod数量扩为4个,到123m时Pod数量扩为10个。 kubectl get cronfederatedhpa cron-federated-hpa --watch NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE cron-federated-hpa Deployment/hpa-example 50%/50% 1 100 1 112m cron-federated-hpa Deployment/hpa-example 21%/50% 1 100 1 113m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 4 114m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 4 118m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 4 118m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 4 119m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 7 119m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 7 119m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 7 119m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 7 123m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 10 123m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 10 123m 查看CronFederatedHPA策略事件,可以看到策略的生效时间。 kubectl describe cronfederatedhpa cron-federated-hpa
  • 复杂场景下负载伸缩策略使用流程 使用负载伸缩策略的流程如图1,具体流程如下: 准备工作。在创建负载伸缩策略前,您需要准备两个已注册至UCS的华为云集群,并为其安装Kubernetes Metrics Server插件,并构建一个名称为hpa-example的镜像。 创建工作负载。基于准备工作中的镜像创建无状态工作负载与服务,并为其创建与部署调度策略。 创建负载伸缩策略。使用命令行工具创建FederatedHPA策略与CronFederatedHPA策略。 观察负载伸缩过程。查看工作负载中的Pod的数量变动,观察所创建的负载伸缩策略效果。 图1 复杂场景下负载伸缩策略使用流程
  • 创建工作负载 使用构建的hpa-example镜像创建无状态工作负载,Pod数为1。镜像地址与上传到的SWR仓库有关,需要替换为实际取值。 kind: Deployment apiVersion: apps/v1 metadata: name: hpa-example spec: 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 创建一个端口号为80的服务。 kind: Service apiVersion: v1 metadata: name: hpa-example spec: ports: - name: cce-service-0 protocol: TCP port: 80 targetPort: 80 nodePort: 31144 selector: app: hpa-example type: NodePort 为工作负载和服务创建一个调度策略,并将其部署到cluster01和cluster02两个集群,使用权重拆分的方式部署,每个集群的权重为1,以保证两个集群的相同优先级。 apiVersion: policy.karmada.io/v1alpha1 kind: PropagationPolicy metadata: name: hpa-example-pp namespace: default spec: placement: clusterAffinity: clusterNames: - cluster01 - cluster02 replicaScheduling: replicaDivisionPreference: Weighted replicaSchedulingType: Divided weightPreference: staticWeightList: - targetCluster: clusterNames: - cluster01 weight: 1 - targetCluster: clusterNames: - cluster02 weight: 1 preemption: Never propagateDeps: true resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: hpa-example namespace: default - apiVersion: v1 kind: Service name: hpa-example namespace: default
  • 策略实例示例 以下策略实例展示了策略定义生效的资源类型,parameters的allowedProfiles字段定义了允许的值列表。 apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sPSPAppArmor metadata: name: psp-apparmor spec: match: kinds: - apiGroups: [""] kinds: ["Pod"] parameters: allowedProfiles: - runtime/default
  • 不符合策略实例的资源定义 示例中apparmor的值不在上述定义的允许范围内,不符合策略实例。 apiVersion: v1 kind: Pod metadata: name: nginx-apparmor-disallowed annotations: # apparmor.security.beta.kubernetes.io/pod: unconfined # runtime/default container.apparmor.security.beta.kubernetes.io/nginx: unconfined labels: app: nginx-apparmor spec: containers: - name: nginx image: nginx
  • 符合策略实例的资源定义 示例中apparmor的值在上述定义的允许范围内,符合策略实例。 apiVersion: v1 kind: Pod metadata: name: nginx-apparmor-allowed annotations: # apparmor.security.beta.kubernetes.io/pod: unconfined # runtime/default container.apparmor.security.beta.kubernetes.io/nginx: runtime/default labels: app: nginx-apparmor spec: containers: - name: nginx image: nginx
  • 本地存储 通过本地磁盘存储将容器所在宿主机的文件目录挂载到容器的指定路径中(对应Kubernetes的HostPath),也可以不填写源路径(对应Kubernetes的EmptyDir),不填写时将分配主机的临时目录挂载到容器的挂载点,指定源路径的本地硬盘数据卷适用于将数据持久化存储到容器所在宿主机,EmptyDir(不填写源路径)适用于容器的临时存储。配置项(ConfigMap)是一种用于存储工作负载所需配置信息的资源类型,内容由用户决定。密钥(Secret)是一种用于存储工作负载所需要认证信息、密钥的敏感信息等的资源类型,内容由用户决定。详情请参见挂载本地存储。
  • 存储卷声明 UCS支持创建持久化存储并挂载到容器的某一路径下,当容器迁移时, 云存储 会在新容器中重新被挂载,从而保证数据的可靠性,详情请参见挂载存储卷。因此建议在创建工作负载时选择挂载存储卷声明,将Pod数据存储在对应的云存储上。若存储在本地磁盘上,当节点异常无法恢复时,本地磁盘中的数据也将无法恢复。 华为云集群:UCS支持自动创建云硬盘(EVS)、对象存储(OBS)、文件存储(SFS)三种不同类型的云存储并挂载到华为云集群的容器路径下。 云硬盘(EVS):云硬盘可以为容器提供高可靠、高性能、规格丰富并且可弹性扩展的块存储服务,这种存储方式存放的是二进制数据,无法直接存放文件,适用于需要永久化保存的数据。 文件存储(SFS):提供按需扩展的高性能文件存储(NAS),可为容器提供文件共享访问,用于需要多读多写的文件持久化存储,适用于多种工作负载场景,包括 媒体处理 、内容管理和Web服务、大数据和分析应用程序等场景。 对象存储(OBS):对象存储没有总数据容量和对象/文件数量的限制,为用户提供了超大存储容量的能力,适合存放任意类型的文件,可用于海量数据存储分析、历史数据明细查询、海量行为 日志分析 和公共事务分析统计等场景。 非华为云集群:非华为云集群在使用存储卷声明挂载云存储时,需要集群提供商支持存储类功能,详情请参见存储类。
  • k8clone备份使用方法 k8clone工具支持在Linux(x86、arm)和Windows环境中运行,使用方法相似。本文将以Linux(x86)环境为例进行介绍。 若使用Linux(arm)或Windows环境,请将下述命令中的k8clone-linux-amd64分别替换为k8clone-linux-arm64或k8clone-windows-amd64.exe。 在k8clone工具所在目录下执行./k8clone-linux-amd64 backup -h,可以查看k8clone工具备份的使用方法。 -k, --kubeconfig:指定kubectl的KubeConfig位置,默认是$HOME/.kube/config。kubeConfig文件:用于配置对Kubernetes集群的访问,KubeConfig文件中包含访问注册kubernetes集群所需要的认证凭据以及Endpoint(访问地址),详细介绍可参见Kubernetes文档。 -s, --api-server:Kubernetes API Server URL,默认是""。 -q, --context:Kubernetes Configuration Context,默认是""。 -n, --namespace:备份指定命名空间的云原生应用,多个命名空间用逗号分隔(如:ns1,ns2,ns3),默认是"",表示备份整个集群。 -e, --exclude-namespaces:排除指定命名空间对象的备份,不能和--namespace一起使用。 -x, --exclude-kind:排除指定资源类型的备份。 -y, --exclude-object:排除指定资源对象的备份。 -w, --exclude-having-owner-ref:排除拥有ownerReferences资源对象的备份,默认是false。 -d, --local-dir:备份数据放置的路径,默认是当前目录下k8clone-dump文件夹。 $ ./k8clone-linux-amd64 backup -h Backup Workload Data as yaml files Usage: k8clone backup [flags] Flags: -s, --api-server string Kubernetes api-server url -q, --context string Kubernetes configuration context -w, --exclude-having-owner-ref Exclude all objects having an Owner Reference -x, --exclude-kind strings Ressource kind to exclude. Eg. 'deployment' -e, --exclude-namespaces strings Namespaces to exclude. Eg. 'temp.*' as regexes. This collects all namespaces and then filters them. Don't use it with the namespace flag. -y, --exclude-object strings Object to exclude. Eg. 'configmap:kube-system/kube-dns' -h, --help help for backup -k, --kubeconfig string The kubeconfig of k8s cluster's. Default is the $HOME/.kube/config. -d, --local-dir string Where to dump yaml files (default "./k8clone-dump") -n, --namespace string Only dump objects from this namespace 示例如下: 整个集群对象的备份,默认路径为当前目录下“k8clone-dump”文件夹 ./k8clone-linux-amd64 backup 整个集群对象的备份,并指定备份数据路径 ./k8clone-linux-amd64 backup -d ./xxxx 指定命名空间对象的备份 ./k8clone-linux-amd64 backup -n default 排除命名空间对象的备份 ./k8clone-linux-amd64 backup -e kube-system,kube-public,kube-node-lease 排除指定资源类型的备份 ./k8clone-linux-amd64 backup -x endpoints,endpointslice 排除指定资源对象的备份 ./k8clone-linux-amd64 backup -y configmap:kube-system/kube-dns 排除拥有ownerReferences资源对象的备份 ./k8clone-linux-amd64 backup -w true
  • 配置域名 为应用添加域名访问时,必须确保您配置的域名已在域名服务商完成注册并备案,否则域名可能无法访问。 若您已有经过注册和备案的域名,请直接至3创建公网域名解析。 若您尚未注册域名,请先购买公网域名,并按照页面提示流程完成域名的备案、解析和相关配置。域名注册、备案流程如下。 购买公网域名。以ucsclub.cn为例。 若您尚未购买公网域名,请先购买公网域名。 若已购买,请执行2。 公网域名备案。 若您的公网域名尚未备案,请前往华为云备案中心处备案。 若您已经备案,请执行3。 公网域名解析。 若您尚未创建公网域名解析,请创建公网域名解析。 若您已经创建,请执行4。 配置域名。 选择已完成以上步骤的域名,单击“配置”。
  • GitOps优势 简单易学:Git易于被开发者接受,易于集成,无需额外学习成本。 安全性高:开发者使用GitOps无需任何Kubernetes集群权限,仅需要Git仓库权限,保证集群安全可靠。 可靠性强:提供原生Kubernetes资源、Helm Chart资源、Kustomize等资源交付清单的版本管理,方便用户进行部署应用、增量变化和应用配置的回滚。 应用持续部署:Kubernetes集群和Git仓库中的应用状态自动同步,保持一致,实现应用持续部署。
  • GitOps概述 GitOps是使用Git仓库来管理应用的部署模板,将Git仓库作为Kubernetes集群中部署应用的唯一来源,实现应用的持续部署,实现多集群的GitOps持续交付,满足应用的高可用部署、系统组件多集群分发等需求。GitOps假设每一个基础设施都被表示为一个具有版本控制功能的存储系统中的文件,并且有一个自动化的过程可以无缝地将更改的应用同步到应用程序运行环境。 而结合Kubernetes生态中的声明式API、Controller Loop可以更好得实现这一思想,该系统从一开始就遵循声明性规范以及最终一致性和收敛性的原则。
共100000条