华为云用户手册

  • 前提条件 配置 支持版本 集群版本 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及以上版本
  • 版本记录 建议升级到跟集群配套的最新Volcano版本。 表9 Volcano调度器版本记录 插件版本 支持的集群版本 更新特性 1.13.1 v1.21 v1.23 v1.25 v1.27 v1.28 v1.29 调度器内存使用优化 1.12.18 v1.21 v1.23 v1.25 v1.27 v1.28 v1.29 适配CCE v1.29集群 默认开启抢占功能 1.12.1 v1.19.16 v1.21 v1.23 v1.25 v1.27 v1.28 应用弹性扩缩容性能优化 1.11.21 v1.19.16 v1.21 v1.23 v1.25 v1.27 v1.28 支持Kubernetes v1.28 支持负载感知调度 镜像OS更新为HCE 2.0 优化 CS I资源抢占能力 优化负载感知重调度能力 优化混部场景抢占能力 1.11.9 v1.19.16 v1.21 v1.23 v1.25 v1.27 优化昇腾芯片rank table排序能力 支持应用弹性伸缩场景下的优先级调度 1.11.6 v1.19.16 v1.21 v1.23 v1.25 v1.27 支持Kubernetes v1.27 支持重调度功能 支持节点池亲和调度能力 优化调度性能 1.10.14 v1.19.16 v1.21 v1.23 v1.25 支持GPU资源抢占 优化混部弹性限流功能 增强可用区拓扑分布能力 优化昇腾芯片rank table排序能力 优化GPU虚拟化功能 提升与CA联动扩容效率 提升调度稳定性 优化持久卷调度逻辑 优化日志信息 1.10.7 v1.19.16 v1.21 v1.23 v1.25 修复本地持久卷插件未计算预绑定到节点的pod的问题 1.10.5 v1.19.16 v1.21 v1.23 v1.25 volcano agent支持资源超卖。 添加针对GPU资源字段的校验admission:nvidia.com/gpu应小于1或者为正整数,volcano.sh/gpu-core.percentage应小于100并为5的倍数。 修复存在PVC绑定失败的场景下,后续提交Pod调度慢的问题。 修复节点上存在长时间Teminating Pod场景下,新提交Pod无法运行的问题。 修复并发创建挂载PVC的Pod的场景下,volcano重启的问题。 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支持v1.25集群 提升Volcano调度性能 1.7.1 v1.19.16 v1.21 v1.23 v1.25 Volcano支持v1.25集群 1.4.7 v1.15 v1.17 v1.19 v1.21 删除Pod状态Undetermined,以适配集群Autoscaler的弹性能力。 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.7 v1.15 v1.17 v1.19 v1.21 支持在/离线作业混合部署及资源超卖功能 优化集群调度吞吐性能 修复特定场景下调度器panic的问题 修复CCE v1.15集群中volcano作业volumes.secret校验失败的问题 修复挂载volume,作业调度不成功的问题 1.3.3 v1.15 v1.17 v1.19 v1.21 修复GPU异常导致的调度器崩溃问题;修复特权Init容器准入失败问题 1.3.1 v1.15 v1.17 v1.19 升级Volcano框架到最新版本 支持Kubernetes v1.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的问题 修复CCE v1.15以上版本GPU调度的问题,暂不支持任务分发时的CCE版本滚动升级 修复特定场景下队列状态不明的问题 修复特定场景下作业挂载PVC panic的问题 修复GPU作业无法配置小数的问题 添加ioaware插件 添加ring controller
  • Prometheus指标采集 volcano-scheduler通过端口8080暴露Prometheus metrics指标。您可以自建Prometheus采集器识别并通过http://{{volcano-schedulerPodIP}}:{{volcano-schedulerPodPort}}/metrics路径获取volcano-scheduler调度相关指标。 Prometheus指标暴露仅支持Volcano插件1.8.5及以上版本。 表7 关键指标说明 指标名称 指标类型 描述 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插件卸载说明 卸载插件时,会将Volcano的自定义资源(表8)全部清理,已创建的相关资源也将同步删除,重新安装插件不会继承和恢复卸载之前的任务信息。如集群中还存在正在使用的Volcano自定义资源,请谨慎卸载插件。 表8 Volcano自定义资源 名称 API组 API版本 资源级别 Command bus.volcano.sh v1alpha1 Namespaced Job batch.volcano.sh v1alpha1 Namespaced Numatopology nodeinfo.volcano.sh v1alpha1 Cluster PodGroup scheduling.volcano.sh v1beta1 Namespaced Queue scheduling.volcano.sh v1beta1 Cluster
  • 在控制台中修改volcano-scheduler配置 volcano-scheduler是负责Pod调度的组件,它由一系列action和plugin组成。action定义了调度各环节中需要执行的动作;plugin根据不同场景提供了action 中算法的具体实现细节。volcano-scheduler具有高度的可扩展性,您可以根据需要实现自己的action和plugin。 Volcano允许用户在安装,升级,编辑时,编写Volcano调度器配置信息,并将配置内容同步到volcano-scheduler-configmap里。 当前小节介绍如何使用自定义配置,以便用户让volcano-scheduler能更适合自己的场景。 仅Volcano 1.7.1及以上版本支持该功能。在新版插件界面上合并了原resource_exporter_enable等选项,以新选项default_scheduler_conf代替。 您可登录CCE控制台,单击集群名称进入集群,单击左侧导航栏的“插件中心”,在右侧找到Volcano调度器,单击“安装”或“升级”,并在“参数配置”中设置Volcano调度器配置参数。 使用resource_exporter配置,示例如下: { "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": "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功能。
  • 保留原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做过修改。如果是,需要把修改内容同步到升级界面里。
  • 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
  • 组件说明 表6 Volcano组件 容器组件 说明 资源类型 volcano-scheduler 负责Pod调度。 Deployment volcano-controller 负责CRD资源的同步。 Deployment volcano-admission Webhook server端,负责Pod、Job等资源的校验和更改。 Deployment volcano-agent 云原生混部agent,负责节点QoS保障、CPU Burst和动态资源超卖等。 DaemonSet resource-exporter 负责上报节点的NUMA拓扑信息。 DaemonSet
  • 插件简介 Volcano是一个基于Kubernetes的批处理平台,提供了机器学习、深度学习、生物信息学、基因组学及其他大数据应用所需要而Kubernetes当前缺失的一系列特性。 Volcano提供了高性能任务调度引擎、高性能异构芯片管理、高性能任务运行管理等通用计算能力,通过接入AI、大数据、基因、渲染等诸多行业计算框架服务终端用户,最大支持1000Pod/s的调度并发数,轻松应对各种规模的工作负载,大大提高调度效率和资源利用率。 Volcano针对计算型应用提供了作业调度、作业管理、队列管理等多项功能,主要特性包括: 丰富的计算框架支持:通过CRD提供了批量计算任务的通用API,通过提供丰富的插件及作业生命周期高级管理,支持TensorFlow,MPI,Spark等计算框架容器化运行在Kubernetes上。 高级调度:面向批量计算、高性能计算场景提供丰富的高级调度能力,包括成组调度,优先级抢占、装箱、资源预留、任务拓扑关系等。 队列管理:支持分队列调度,提供队列优先级、多级队列等复杂任务调度能力。 目前Volcano项目已经在Github开源,项目开源地址:https://github.com/volcano-sh/volcano 本文介绍如何在CCE集群中安装及配置Volcano插件,具体使用方法请参见Volcano调度。 在使用Volcano作为调度器时,建议将集群中所有工作负载都使用Volcano进行调度,以避免多调度器同时工作导致的一些调度资源冲突问题。
  • Kubernetes中的 域名 解析逻辑 DNS策略可以在每个pod基础上进行设置,目前,Kubernetes支持Default、ClusterFirst、ClusterFirstWithHostNet和None四种DNS策略,具体请参见Service与Pod的DNS。这些策略在pod-specific的dnsPolicy字段中指定。 “Default”:如果dnsPolicy被设置为“Default”,则名称解析配置将从pod运行的节点继承。 自定义上游域名服务器和存根域不能够与这个策略一起使用。 “ClusterFirst”:如果dnsPolicy被设置为“ClusterFirst”,任何与配置的集群域后缀不匹配的DNS查询(例如,www.kubernetes.io)将转发到从该节点继承的上游名称服务器。集群管理员可能配置了额外的存根域和上游DNS服务器。 “ClusterFirstWithHostNet”:对于使用hostNetwork运行的Pod,您应该明确设置其DNS策略“ClusterFirstWithHostNet”。 “None”:它允许Pod忽略Kubernetes环境中的DNS设置。应使用dnsConfigPod规范中的字段提供所有DNS设置 。 Kubernetes 1.10及以上版本,支持Default、ClusterFirst、ClusterFirstWithHostNet和None四种策略;低于Kubernetes 1.10版本,仅支持default、ClusterFirst和ClusterFirstWithHostNet三种。 “Default”不是默认的DNS策略。如果dnsPolicy的Flag没有特别指明,则默认使用“ClusterFirst”。 路由请求流程: 未配置存根域:没有匹配上配置的集群域名后缀的任何请求,例如 “www.kubernetes.io”,将会被转发到继承自节点的上游域名服务器。 已配置存根域:如果配置了存根域和上游DNS服务器,DNS查询将基于下面的流程对请求进行路由: 查询首先被发送到coredns中的DNS缓存层。 从缓存层,检查请求的后缀,并根据下面的情况转发到对应的DNS上: 具有集群后缀的名字(例如“.cluster.local”):请求被发送到coredns。 具有存根域后缀的名字(例如“.acme.local”):请求被发送到配置的自定义DNS解析器(例如:监听在 1.2.3.4)。 未能匹配上后缀的名字(例如“widget.com”):请求被转发到上游DNS。 图2 路由请求流程
  • 解决方案 CCE服务支持pass-through能力,通过Loadbalance类型Service配置kubernetes.io/elb.pass-through的annotation实现集群内部访问Service的ELB地址时绕出集群,并通过ELB的转发最终转发到后端的Pod。 图1 pass-through访问示例 对于CCE集群: 集群内部客户端访问LB类型Service时,访问请求默认是通过集群服务转发规则(iptables或IPVS)转发到后端的容器实例。 当LB类型Service配置elb.pass-through后,集群内部客户端访问Service地址时会先访问到ELB,再通过ELB的负载均衡能力先访问到节点,然后通过集群服务转发规则(iptables或IPVS)转发到后端的容器实例。 对于 CCE Turbo 集群: 集群内部客户端访问LB类型Service时,默认使用pass-through方式,此时客户端会直接访问ELB私网地址,然后通过ELB直接连接容器实例。
  • 应用现状 Kubernetes集群可以将运行在一组Pod上的应用程序发布为服务,提供统一的四层访问入口。对于Loadbalancer类型的service,kube-proxy默认会将Service的status中LoadbalanceIP地址配置到节点本地的转发规则中,集群内部访问ELB的地址,流量就会在集群内部转发,而不会经过ELB转发。 集群内部转发功能是kube-proxy组件负责,kube-proxy有iptables和IPVS两种转发模式,iptables是一种简单的轮询转发,IPVS虽有多种转发模式,但也需要修改kube-proxy的启动参数,不能像ELB那样灵活配置转发策略,且无法利用ELB的健康检查能力。
  • 约束限制 独享型负载均衡配置pass-through后,CCE Standard集群在工作负载同节点和同节点容器内无法通过Service访问。 1.15及以下老版本集群暂不支持该能力。 IPVS网络模式下,对接同一个ELB的Service需保持pass-through设置情况一致。 使用节点级别(Local)的服务亲和的场景下,会自动设置kubernetes.io/elb.pass-through为onlyLocal,开启pass-through能力。
  • 操作步骤 下文以nginx镜像创建无状态工作负载,并创建一个具有pass-through的Service。 使用nginx镜像创建无状态负载。 apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx:latest name: container-0 resources: limits: cpu: 100m memory: 200Mi requests: cpu: 100m memory: 200Mi imagePullSecrets: - name: default-secret Loadbalance类型的Service,并设置kubernetes.io/elb.pass-through为true。本示例中自动创建了一个名为james的共享型ELB实例。 Loadbalance类型的Service具体创建方法请参见自动创建负载均衡类型Service。 apiVersion: v1 kind: Service metadata: annotations: kubernetes.io/elb.pass-through: "true" kubernetes.io/elb.class: union kubernetes.io/elb.autocreate: '{"type":"public","bandwidth_name":"cce-bandwidth","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}' labels: app: nginx name: nginx spec: externalTrafficPolicy: Local ports: - name: service0 port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer
  • 通过控制台配置GRPC协议的后端服务 登录CCE控制台,单击集群名称进入集群。 选择左侧导航栏的“服务”,在右侧选择“路由”页签,单击右上角“创建路由”。 设置Ingress参数。 名称:自定义Ingress名称,例如ingress-demo。 负载均衡器:选择对接的ELB实例或自动创建ELB实例,仅支持使用独享型ELB。 监听器配置:选择“对外协议”为“HTTPS”,“后端协议”可选择“GRPC”。其余配置参数可根据实际需求进行填写,详细说明请参见通过控制台创建ELB Ingress。 仅独享型ELB支持选择GRPC协议,且需开启HTTP/2,系统将自动为您添加kubernetes.io/elb.http2-enable:true注解。当前GRPC功能仅在部分区域开放,请以控制台呈现为准。 转发策略配置:选择一个目标服务,将请求转发到对应的目标Service处理。 (可选)设置健康检查协议为GRPC:单击“更改配置”,启用健康检查,并选择GRPC协议。 配置完成后,单击“确定”。
  • 导入存储池 创建节点时导入 在创建节点时,在存储配置中可以为节点添加数据盘,选择“作为临时存储卷”导入存储池,详情请参见创建节点。 图1 导入临时卷 手动导入 如果创建节点时没有导入临时存储卷,或当前存储卷容量不够,可以进行手动导入。 前往ECS控制台为节点添加SCSI类型的磁盘。操作步骤详情请参见新增磁盘。 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“存储”,并切换至“存储池”页签。 查看已添加磁盘的节点,选择“导入临时卷”,导入时可以选择写入模式。 如存储池列表中未找到手动挂载的磁盘,请耐心等待1分钟后刷新列表。 线性:线性逻辑卷是将一个或多个物理卷整合为一个逻辑卷,实际写入数据时会先往一个基本物理卷上写入,当存储空间占满时再往另一个基本物理卷写入。 条带化:创建逻辑卷时指定条带化,当实际写入数据时会将连续数据分成大小相同的块,然后依次存储在多个物理卷上,实现数据的并发读写从而提高读写性能。多块卷才能选择条带化。
  • 常见问题 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客户端未配置集群认证,请参见4进行配置。
  • 使用kubectl连接集群 若您需要从客户端计算机连接到Kubernetes集群,可使用Kubernetes命令行客户端kubectl,您可登录CCE控制台,单击待连接集群名称,在集群“总览”页面查看访问地址以及kubectl的连接步骤。 图1 集群连接信息 您需要先下载kubectl以及配置文件,复制到您的客户端机器,完成配置后,即可以访问Kubernetes集群。使用kubectl连接集群的步骤如下: 准备环境 您需要准备一台与集群同VPC的虚拟机,并绑定弹性公网IP用于下载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.json)用于对接认证集群,请您妥善保存该认证凭据,防止文件泄露后,集群有被攻击的风险。 IAM 用户下载的配置文件所拥有的Kubernetes权限与CCE控制台上IAM用户所拥有的权限一致。 如果Linux系统里面配置了KUBECONFIG环境变量,kubectl会优先加载KUBECONFIG环境变量,而不是$home/.kube/config,使用时请注意。 配置kubectl 以Linux环境为例配置kubectl。 登录到您的客户端机器,复制3中下载的配置文件(kubeconfig.json)到您客户端机器的/home目录下。 配置kubectl认证文件。 cd /home mkdir -p $HOME/.kube mv -f kubeconfig.json $HOME/.kube/config 切换kubectl的访问模式。 kubectl config use-context internal
  • 权限说明 kubectl访问CCE集群是通过集群上生成的配置文件(kubeconfig.json)进行认证,kubeconfig.json文件内包含用户信息,CCE根据用户信息的权限判断kubectl有权限访问哪些Kubernetes资源。即哪个用户获取的kubeconfig.json文件,kubeconfig.json就拥有哪个用户的信息,这样使用kubectl访问时就拥有这个用户的权限。 用户拥有的权限请参见集群权限(IAM授权)与命名空间权限(Kubernetes RBAC授权)的关系。
  • 约束与限制 节点:分布式集群当前仅支持普通x86虚拟机。暂不支持节点迁移功能。 节点池:节点池随机调度功能仅限于分区内。 存储:当前仅支持在边缘区域创建云硬盘(EVS),其他种类存储方式不推荐使用。 服务与路由:仅支持独享型ELB;仅支持在智能边缘云类型的分区创建4层ELB,其他类型需要将ELB实例创建在中心分区。 插件:分布式集群支持如下插件,且优先将插件部署在云上节点。 everest coredns node-local-dns autoscaler metrics-server npd dashboard huawei-npu gpu-device-plugin(原gpu-beta)
  • 核心概念 为了区分云上资源和分布在不同边缘区域的资源,也为了方便用户使用和管理处于不同区域的资源,引入了分区概念,定义如下: 计算角度:一个分区是一组“风火水电”相互隔离、但网络位置靠近(通常互访时延小于2ms)的数据中心可用区(available zone)的集合。将应用分散在一个分区内不同可用区可以实现应用高可用性。 网络角度:一个分区内节点和容器需要使用创建在该分区内可用区下的虚拟私有云(VPC)子网。为方便配置和管理,分区创建时需设定默认子网,当创建节点不指定子网时,会填入分区默认子网。 其他属性:分区包含资源类别,即中心云、智能边缘云或智能边缘小站。该属性的配置方便后续负载的调度。
  • 使用kubectl创建第三方镜像仓库的密钥 请参见通过kubectl连接集群,使用kubectl连接集群。 通过kubectl创建认证密钥 ,该密钥类型为kubernetes.io/dockerconfigjson类型。 kubectl create secret docker-registry myregistrykey -n default --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL 其中,myregistrykey为密钥名称,default为密钥所在的命名空间,其余参数如下所示。 DOCKER_REGISTRY_SERVER:第三方镜像仓库的地址,如“www.3rdregistry.com”或“10.10.10.10:443”。 DOCKER_USER:第三方镜像仓库的账号。 DOCKER_PASSWORD:第三方镜像仓库的密码。 DOCKER_EMAIL:第三方镜像仓库的邮箱。 创建工作负载时使用第三方镜像,具体步骤请参见如下。 kubernetes.io/dockerconfigjson类型的密钥作为私有镜像获取的认证方式,以Pod为例,创建的myregistrykey作为镜像的认证方式。 apiVersion: v1 kind: Pod metadata: name: foo namespace: default spec: containers: - name: foo image: www.3rdregistry.com/janedoe/awesomeapp:v1 imagePullSecrets: - name: myregistrykey #使用上面创建的密钥
  • 通过界面操作 创建第三方镜像仓库的密钥。 单击集群名称进入集群,在左侧导航栏选择“配置与密钥”,在右侧选择“密钥”页签,单击右上角“创建密钥”,密钥类型必须选择为kubernetes.io/dockerconfigjson。详细操作请参见创建密钥。 此处的“用户名”和“密码”请填写第三方镜像仓库的账号密码。 图1 添加密钥 创建工作负载时,可以在“镜像名称”中直接填写私有镜像地址,填写的格式为domainname/namespace/imagename:tag,并选择1中创建的密钥。 图2 填写私有镜像地址 填写其他参数后,单击“创建工作负载”。
  • 指标说明 节点池视图暴露的指标如下: 图1 节点池资源指标 表1 视图说明 图表名称 单位 说明 节点池CPU分配率 百分比 节点池里的所有节点的Pod CPU Request总量占所有节点CPU总量的比例 节点池CPU使用率 百分比 节点池里的所有节点CPU使用量占总量的比例 节点池内存分配率 百分比 节点池里的所有节点的Pod 内存Request总量占所有节点内存总量的比例 节点池内存使用率 百分比 节点池里的所有节点内存使用量占总量的比例 节点数量趋势 个 节点池里的节点数量
  • 指标清单 节点池视图使用的指标清单如下: 表2 指标说明 指标名称 单位 说明 kube_node_labels Gauge 节点标签,其中label_cce_cloud_com_cce_nodepool为CCE节点池名称,若无该标签值则为Default Pool。 node_cpu_seconds_total Counter 节点不同模式下花费的CPU秒 node_memory_MemAvailable_bytes Gauge 节点的可用内存量 node_memory_MemTotal_bytes Gauge 节点的内存总量 kube_pod_container_resource_requests Gauge Pod 容器的资源申请量
  • 指标说明 集群视图暴露的指标包括基础资源指标、网络指标和磁盘指标,具体说明如下: 图1 基础资源图表 表1 基础资源图表说明 指标名称 单位 说明 Pod数 个 集群中处在不同运行状态下的Pod个数(状态包含:Failed、Pending、Running、Succeeded、Unknown等) 容器数 个 集群中处在不同运行状态下的容器个数(状态包含:Containers Running、Containers Waiting、Containers Terminated等) CPU使用量 Cores 以命名空间为粒度统计各个命名空间内的所有容器的CPU使用量之和。 内存使用量 字节 以命名空间为粒度统计各个命名空间内的所有容器的内存使用量之和。 图2 网络图表 表2 网络图表说明 指标名称 单位 说明 网络接收速率 字节/秒 以命名空间为粒度统计各个命名空间内的所有容器每秒接收的字节数之和。 网络发送速率 字节/秒 以命名空间为粒度统计各个命名空间内的所有容器每秒传输的字节数之和。 网络平均接收速率 字节/秒 以命名空间为粒度统计各个命名空间内的容器每秒平均接收的字节数。 网络平均发送速率 字节/秒 以命名空间为粒度统计各个命名空间内的容器每秒平均传输的字节数。 接收数据包速率 个/秒 以命名空间为粒度统计各个命名空间内的所有容器每秒接收的数据包数之和。 集群发送数据包速率 个/秒 以命名空间为粒度统计各个命名空间内所有容器每秒发送的数据包数之和。 丢包速率(接收) 个/秒 以命名空间为粒度统计各个命名空间内所有容器每秒接收的数据丢包数之和。 丢包速率(发送) 个/秒 以命名空间为粒度统计各个命名空间内所有容器每秒发送的数据丢包数之和。 图3 磁盘图表 表3 磁盘图表说明 指标说明 单位 说明 磁盘读写IO速率(读+写) 次数/秒 以命名空间为粒度统计各个命名空间内所有容器每秒的磁盘读写IO的次数之和。 磁盘读写吞吐量(读+写) 字节/秒 以命名空间为粒度统计各个命名空间内所有容器每秒的磁盘读写字节量之和。
  • 指标清单 集群视图使用的指标清单如下: 表4 集群视图指标清单 指标 指标类型 说明 kube_pod_container_resource_requests gauge 容器请求的请求资源数 kube_pod_container_resource_limits gauge 容器请求的限制资源数 kube_pod_status_phase gauge Pod当前阶段 kube_pod_container_status_waiting gauge 容器是否处在waiting状态 kube_pod_container_status_terminated gauge 容器是否处在终止状态 container_cpu_usage_seconds_total counter 容器CPU累计使用时间 container_memory_rss gauge RSS内存,即常驻内存集。是分配给进程使用的实际物理内存字节数,不是磁盘上缓存的虚机内存。 container_network_receive_bytes_total counter 容器网络累积接收字节数 container_network_transmit_bytes_total counter 容器网络累积传输字节数 container_network_receive_packets_total counter 容器网络收到的累计数据包数 container_network_transmit_packets_total counter 容器网络传输的累计数据包数 container_network_receive_packets_dropped_total counter 容器网络接收时丢失的数据包数 container_network_transmit_packets_dropped_total counter 容器网络传输时丢失的数据包数 container_fs_reads_total counter 容器磁盘读取次数 container_fs_reads_bytes_total counter 容器磁盘读取的总字节数
  • 检查方式 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检查时,您的应用需支持GRPC健康检查协议。 与HTTP和TCP探针类似,如果配置错误,都会被认作是探测失败,例如错误的端口、应用未实现健康检查协议等。 图4 GRPC检查
  • 公共参数说明 表1 公共参数说明 参数 参数说明 检测周期(periodSeconds) 探针检测周期,单位为秒。 例如,设置为30,表示每30秒检测一次。 延迟时间(initialDelaySeconds) 延迟检查时间,单位为秒,此设置与业务程序正常启动时间相关。 例如,设置为30,表明容器启动后30秒才开始健康检查,该时间是预留给业务程序启动的时间。 超时时间(timeoutSeconds) 超时时间,单位为秒。 例如,设置为10,表明执行健康检查的超时等待时间为10秒,如果超过这个时间,本次健康检查就被视为失败。若设置为0或不设置,默认超时等待时间为1秒。 成功阈值(successThreshold) 探测失败后,将状态转变为成功所需要的最小连续成功次数。例如,设置为1时,表明健康检查失败后,健康检查需要连续成功1次,才认为工作负载状态正常。 默认值是 1,最小值是 1。 存活和启动探测的这个值必须是 1。 最大失败次数(failureThreshold) 当探测失败时重试的次数。 存活探测情况下的放弃就意味着重新启动容器。就绪探测情况下的放弃 Pod 会被打上未就绪的标签。 默认值是 3。最小值是 1。
  • 操作场景 健康检查是指容器运行过程中,根据用户需要,定时检查容器健康状况。若不配置健康检查,如果容器内应用程序异常,Pod将无法感知,也不会自动重启去恢复。最终导致虽然Pod状态显示正常,但Pod中的应用程序异常的情况。 Kubernetes提供了三种健康检查的探针: 存活探针:livenessProbe,用于检测容器是否正常,类似于执行ps命令检查进程是否存在。如果容器的存活检查失败,集群会对该容器执行重启操作;若容器的存活检查成功则不执行任何操作。 就绪探针:readinessProbe,用于检查用户业务是否就绪,如果未就绪,则不转发流量到当前实例。一些程序的启动时间可能很长,比如要加载磁盘数据或者要依赖外部的某个模块启动完成才能提供服务。这时候程序进程在,但是并不能对外提供服务。这种场景下该检查方式就非常有用。如果容器的就绪检查失败,集群会屏蔽请求访问该容器;若检查成功,则会开放对该容器的访问。 启动探针:startupProbe,用于探测应用程序容器什么时候启动了。 如果配置了这类探测器,就可以控制容器在启动成功后再进行存活性和就绪检查, 确保这些存活、就绪探针不会影响应用程序的启动。 这可以用于对启动慢的容器进行存活性检测,避免它们在启动运行之前就被终止。
共100000条