华为云用户手册

  • 前提条件 使用CustomedHPA策略必须安装CCE容器弹性引擎,若该插件版本低于1.2.11,则必须安装prometheus插件;若版本大于或等于1.2.11,则需要安装能够提供Metrics API的插件,您可根据集群版本和实际需求选择其中之一: Kubernetes Metrics Server:提供基础资源使用指标,例如容器CPU和内存使用率。所有集群版本均可安装。 云原生监控插件:该插件支持v1.17及以后的集群版本。 根据基础资源指标进行弹性伸缩:需将Prometheus注册为Metrics API的服务,详见通过Metrics API提供资源指标。 根据自定义指标进行弹性伸缩:需要将自定义指标聚合到Kubernetes API Server,详情请参见使用自定义指标创建HPA策略。 Prometheus(停止维护):需将Prometheus注册为Metrics API的服务,详见通过Metrics API提供资源指标。该插件仅支持v1.21及之前的集群版本。
  • 约束与限制 云硬盘不支持跨可用区挂载,且不支持被多个工作负载、同一个工作负载的多个实例或多个任务使用。由于CCE集群各节点之间暂不支持共享盘的数据共享功能,多个节点挂载使用同一个云硬盘可能会出现读写冲突、数据缓存冲突等问题,所以创建无状态工作负载时,若使用了EVS云硬盘,建议工作负载只选择一个实例。 1.19.10以下版本的集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,当新Pod被调度到另一个节点时,会导致之前Pod不能正常读写。 1.19.10及以上版本集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,新Pod会因为无法挂载云硬盘导致无法成功启动。 动态创建云硬盘存储卷时支持添加资源标签,且云硬盘创建完成后无法在CCE侧更新资源标签,需要前往云硬盘控制台更新。如果使用已有的云硬盘创建存储卷,也需要在云硬盘控制台添加或更新资源标签。
  • 验证数据持久化 查看部署的应用及云硬盘文件。 执行以下命令,查看已创建的Pod。 kubectl get pod | grep web-evs-auto 预期输出如下: web-evs-auto-0 1/1 Running 0 38s 执行以下命令,查看云硬盘是否挂载至/data路径。 kubectl exec web-evs-auto-0 -- df | grep data 预期输出如下: /dev/sdc 10255636 36888 10202364 0% /data 执行以下命令,查看/data路径下的文件。 kubectl exec web-evs-auto-0 -- ls /data 预期输出如下: lost+found 执行以下命令,在/data路径下创建static文件。 kubectl exec web-evs-auto-0 -- touch /data/static 执行以下命令,查看/data路径下的文件。 kubectl exec web-evs-auto-0 -- ls /data 预期输出如下: lost+found static 执行以下命令,删除名称为web-evs-auto-0的Pod。 kubectl delete pod web-evs-auto-0 预期输出如下: pod "web-evs-auto-0" deleted 删除后,StatefulSet控制器会自动重新创建一个同名副本。执行以下命令,验证/data路径下的文件是否更改。 kubectl exec web-evs-auto-0 -- ls /data 预期输出如下: lost+found static static文件仍然存在,则说明云硬盘中的数据可持久化保存。
  • 默认kernel.pid_max说明 CCE在2022年1月底将1.17及以上集群的节点公共操作系统EulerOS 2.5、CentOS 7.6、Ubuntu 18.04镜像kernel.pid_max默认值调整为4194304,满足如下两个条件节点的kernel.pid_max值为4194304。 集群版本:1.17.17及以上版本 节点创建时间:2022年1月30日之后 如果不满足如上两个条件,EulerOS 2.5、CentOS 7.6、Ubuntu 18.04上kernel.pid_max默认值32768。 表1 节点kernel.pid_max默认值 操作系统 1.17.9及以下版本集群 1.17.17及以上版本集群 2022年1月30日及之前创建的节点 2022年1月30日之后创建的节点 EulerOS 2.5 32768 32768 4194304 CentOS 7.6 32768 32768 4194304 Ubuntu 18.04 不涉及 32768 4194304 EulerOS 2.3 57344 57344 57344 EulerOS 2.9 不涉及 4194304 4194304 修改建议 EulerOS 2.3:所有节点都涉及,建议您将kernel.pid_max取值修改为4194304,具体方法请参见修改节点kernel.pid_max。且后续创建节点和节点池时配置安装前脚本修改kernel.pid_max,具体方法请参见配置节点池kernel.pid_max和创建节点时配置kernel.pid_max EulerOS 2.5、CentOS 7.6、Ubuntu 18.04: 对于1.17.17及以上版本集群2022年1月30日及之前创建的节点,建议您将kernel.pid_max取值修改为4194304,具体方法请参见修改节点kernel.pid_max。 对于1.17.9及以下版本集群 存量节点建议您将kernel.pid_max取值修改为4194304,具体方法请参见修改节点kernel.pid_max。 如果新创建节点和节点池,建议配置安装前脚本修改kernel.pid_max,具体方法请参见配置节点池kernel.pid_max和创建节点时配置kernel.pid_max。
  • 指标清单 APIServer视图使用的指标清单如下: 表4 APIServer视图指标清单 指标 指标类型 说明 up gauge 组件状态 apiserver_request_total counter apiserver请求数按找返回码等维度的计数 go_goroutines gauge 当前时间goroutines个数 apiserver_current_inflight_requests gauge 最后一个窗口中,正在处理的请求数量 apiserver_request_duration_seconds_bucket histogram APIServer请求延时秒数 workqueue_depth gauge 当前工作队列深度 workqueue_adds_total counter 工作队列增加总数 workqueue_queue_duration_seconds_bucket histogram 请求在工作队列中停留时间 process_resident_memory_bytes gauge 常驻内存大小 process_cpu_seconds_total counter 进程CPU总花费时间
  • 指标说明 APIServer视图暴露的指标包括请求指标、工作队列指标和资源指标,具体说明如下: 图1 请求指标 表1 请求指标说明 指标名称 单位 说明 存活数 个 组件存活实例数 QPS 请求数/秒 每秒不同响应码的请求个数 请求成功率(读) 百分比 每秒读请求中响应码为20x的请求比例 处理中请求数 个数 APIServer在处理中的请求个数 请求速率(读) 请求数/秒 每秒不同响应码的读请求个数 请求错误率(读) 百分比 每秒读请求的错误请求比例 请求时延(读)(P99) 毫秒 P99读请求时延 请求速率(写) 请求数/秒 每秒不同响应码的写请求个数 请求错误率(写) 百分比 每秒写请求的错误请求个数 请求时延(写)(P99) 毫秒 P99写请求时延 图2 工作队列指标 表2 工作队列指标说明 指标名称 单位 说明 工作队列增加速率 操作次数/秒 APIServer每秒工作队列增加的次数 工作队列深度 个 工作队列深度 工作队列时延(P99) 毫秒 APIServer请求P99在工作队列中停留时间 图3 资源指标 表3 资源指标说明 指标名称 单位 说明 内存使用量 字节 APIServer内存使用量 CPU使用量 Cores APIServerCPU使用量 Go routine数 次 Go routine次数
  • 如何选择GPU节点驱动版本 一般情况下,使用GPU资源时您将会使用以下软件包,并且软件包版本需要保持配套: 驱动GPU工作的硬件驱动程序,如Tesla系列驱动。 上层应用程序所需要的库,如CUDA Toolkit工具包。 在容器使用场景下,GPU驱动是安装在节点上的,而CUDA Toolkit一般会在应用程序的容器镜像构建时预安装,或者可直接使用Nvidia官方已预装CUDA Toolkit的基础镜像构建应用容器镜像。GPU驱动和CUDA Toolkit版本需要配套才可以正常使用GPU资源。 您可以使用nvidia-smi命令查看的节点上驱动信息,确定Nvidia驱动与CUDA Toolkit版本的配套关系,如下图,驱动版本为470.141.03, 对应支持的CUDA Toolkit最大版本为11.4。 图1 Nvidia驱动与CUDA Toolkit版本的配套关系
  • 创建工作负载 使用构建的hpa-example镜像创建无状态工作负载,副本数为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 然后再为这个负载创建一个Nodeport类型的Service,以便能从外部访问。 Nodeport类型的Service从外网访问需要为集群某个节点创建EIP,创建完后需要同步节点信息,具体请参见同步节点信息。如果节点已有EIP则无需再次创建。 或者您也可以创建带ELB的Service从外部访问,具体请参见通过kubectl命令行创建-自动创建ELB。 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
  • 应用场景 企业应用的流量大小不是每时每刻都一样,有高峰,有低谷,如果每时每刻都要保持能够扛住高峰流量的机器数目,那么成本会很高。通常解决这个问题的办法就是根据流量大小或资源占用率自动调节机器的数量,也就是弹性伸缩。 当使用Pod/容器部署应用时,通常会设置容器的申请/限制值来确定可使用的资源上限,以避免在流量高峰期无限制地占用节点资源。然而,这种方法可能会存在资源瓶颈,达到资源使用上限后可能会导致应用出现异常。为了解决这个问题,可以通过伸缩Pod的数量来分摊每个应用实例的压力。如果增加Pod数量后,节点资源使用率上升到一定程度,继续扩容出来的Pod无法调度,则可以根据节点资源使用率继续伸缩节点数量。
  • 解决方案 CCE中弹性伸缩最主要的就是使用HPA(Horizontal Pod Autoscaling)和CA(Cluster AutoScaling)两种弹性伸缩策略,HPA负责工作负载弹性伸缩,也就是应用层面的弹性伸缩,CA负责节点弹性伸缩,也就是资源层面的弹性伸缩。 通常情况下,两者需要配合使用,因为HPA需要集群有足够的资源才能扩容成功,当集群资源不够时需要CA扩容节点,使得集群有足够资源;而当HPA缩容后集群会有大量空余资源,这时需要CA缩容节点释放资源,才不至于造成浪费。 如图1所示,HPA根据监控指标进行扩容,当集群资源不够时,新创建的Pod会处于Pending状态,CA会检查所有Pending状态的Pod,根据用户配置的扩缩容策略,选择出一个最合适的节点池,在这个节点池扩容。HPA和CA的工作原理详情请参见工作负载伸缩原理和节点伸缩原理。 图1 HPA + CA工作流程 使用HPA+CA可以很容易做到弹性伸缩,且节点和Pod的伸缩过程可以非常方便的观察到,使用HPA+CA做弹性伸缩能够满足大部分业务场景需求。 本文将通过一个示例介绍HPA+CA两种策略配合使用下弹性伸缩的过程,从而帮助您更好的理解和使用弹性伸缩。
  • 创建节点池和节点伸缩策略 登录CCE控制台,进入已创建的集群,在左侧单击“节点管理”,选择“节点池”页签并单击右上角“创建节点池”。 填写节点池配置。 节点数量:设置为1,表示创建节点池时默认创建的节点数为1。 节点规格:2核 | 4GiB 其余参数设置可使用默认值,详情请参见创建节点池。 节点池创建完成后,在目标节点池所在行右上角单击“弹性伸缩”,设置弹性伸缩配置。关于节点伸缩策略设置的详细说明,请参见创建节点伸缩策略。 若集群中未安装CCE集群弹性引擎插件,请先安装该插件。详情请参见CCE集群弹性引擎。 弹性扩容:开启,表示节点池将根据集群负载情况自动创建节点池内的节点。 自定义弹性策略:单击“添加策略”,在弹出的添加规则窗口中设置参数。例如CPU分配率大于70%时,关联的节点池都增加一个节点。CA策略需要关联节点池,可以关联多个节点池,当需要对节点扩缩容时,在节点池中根据最小浪费规则挑选合适规格的节点扩缩容。 弹性缩容:开启,表示节点池将根据集群负载情况自动删除节点池内的节点。例如节点资源使用率小于50%时进行缩容扫描,启动缩容。 伸缩配置:修改节点数范围,弹性伸缩时节点池下的节点数量会始终介于节点数范围内。 伸缩对象:对节点池中的节点规格单独设置开启弹性伸缩。 设置完成后,单击“确定”。
  • 创建HPA策略 创建HPA策略,如下所示,该策略关联了名为hpa-example的负载,期望CPU使用率为50%。 另外有两条注解annotations,一条是CPU的阈值范围,最低30,最高70,表示CPU使用率在30%到70%之间时,不会扩缩容,防止小幅度波动造成影响。另一条是扩缩容时间窗,表示策略成功触发后,在缩容/扩容冷却时间内,不会再次触发缩容/扩容,以防止短期波动造成影响。 apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: hpa-policy annotations: extendedhpa.metrics: '[{"type":"Resource","name":"cpu","targetType":"Utilization","targetRange":{"low":"30","high":"70"}}]' extendedhpa.option: '{"downscaleWindow":"5m","upscaleWindow":"3m"}' spec: scaleTargetRef: kind: Deployment name: hpa-example apiVersion: apps/v1 minReplicas: 1 maxReplicas: 100 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50 在控制台创建则参数填写如下所示。
  • 验证数据持久化及共享性 查看部署的应用及文件。 执行以下命令,查看已创建的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共享一个存储卷。
  • 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。您可以单击“配置黑名单”,将不需要上报的事件添加至黑名单进行管理,其中“事件名称”可通过CCE事件列表查询。 普通事件上报:开启后,会将普通事件上报至AOM,系统默认配置了部分需要上报的普通事件。如果您需要自定义上报的事件,可以单击“配置白名单”,将需要上报添加至白名单进行管理,其中“事件名称”可通过CCE事件列表查询。 配置修改完成后,单击“确认配置”。 通过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事件,或者删除了对应的日志策略,可通过该方式重新创建默认事件采集策略。 图1 创建日志策略 事件查看:可直接在“日志中心”页面查看,选择日志策略配置的日志流名称,即可查看上报到云日志服务(LTS)的事件。 图2 查看事件
  • 操作符取值说明 您可以使用操作符(operator字段)来设置使用规则的逻辑关系,operator取值如下: 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:亲和/反亲和对象不存在指定标签名。 标签值 设置工作负载亲和/反亲和性时,填写工作负载标签对应的标签值。 调度策略添加完成后,单击“创建工作负载”。
  • 通过控制台配置节点亲和调度策略 在创建工作负载时,在“高级设置”中找到“调度策略”。创建工作负载的步骤详情请参见创建工作负载。 选择节点亲和调度的策略类型。 不配置:不设置节点亲和策略。 指定节点调度:指定工作负载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:仅在节点亲和性中设置,调度节点的标签值小于列表值 (字符串比较)。 标签值 设置节点亲和性时,填写节点标签对应的标签值。 调度策略添加完成后,单击“创建工作负载”。
  • 前提条件 创建GPU类型节点,具体请参见创建节点。 安装gpu-device-plugin(原gpu-beta)插件,安装时注意要选择节点上GPU对应的驱动,具体请参见CCE AI套件(NVIDIA GPU)。 gpu-device-plugin(原gpu-beta)插件会把驱动的目录挂载到/usr/local/nvidia/lib64,在容器中使用GPU资源需要将/usr/local/nvidia/lib64追加到LD_LIBRARY_PATH环境变量中。 通常可以通过如下三种方式追加。 制作镜像的Dockerfile中配置LD_LIBRARY_PATH。(推荐) ENV LD_LIBRARY_PATH /usr/local/nvidia/lib64:$LD_LIBRARY_PATH 镜像的启动命令中配置LD_LIBRARY_PATH。 /bin/bash -c "export LD_LIBRARY_PATH=/usr/local/nvidia/lib64:$LD_LIBRARY_PATH && ..." 创建工作负载时定义LD_LIBRARY_PATH环境变量(需确保容器内未配置该变量,不然会被覆盖)。 ... env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64 ...
  • 使用GPU 创建工作负载申请GPU资源,可按如下方法配置,指定显卡的数量。 apiVersion: apps/v1 kind: Deployment metadata: name: gpu-test namespace: default spec: replicas: 1 selector: matchLabels: app: gpu-test template: metadata: labels: app: gpu-test spec: containers: - image: nginx:perl name: container-0 resources: requests: cpu: 250m memory: 512Mi nvidia.com/gpu: 1 # 申请GPU的数量 limits: cpu: 250m memory: 512Mi nvidia.com/gpu: 1 # GPU数量的使用上限 imagePullSecrets: - name: default-secret 通过nvidia.com/gpu指定申请GPU的数量,支持申请设置为小于1的数量,比如nvidia.com/gpu: 0.5,这样可以多个Pod共享使用GPU。GPU数量小于1时,不支持跨GPU分配,如0.5 GPU只会分配到一张卡上。 使用nvidia.com/gpu参数指定GPU数量时,requests和limits值需要保持一致。 指定nvidia.com/gpu后,在调度时不会将负载调度到没有GPU的节点。如果缺乏GPU资源,会报类似如下的Kubernetes事件。 0/2 nodes are available: 2 Insufficient nvidia.com/gpu. 0/4 nodes are available: 1 InsufficientResourceOnSingleGPU, 3 Insufficient nvidia.com/gpu. 在CCE控制台使用GPU资源,只需在创建工作负载时,选择使用的GPU配额即可。 图1 使用GPU
  • 约束与限制 仅v1.19及以上版本的集群支持修改容器引擎、操作系统、系统盘/数据盘大小、数据盘空间分配、安装前/后执行脚本配置。 修改节点池资源标签、容器引擎、操作系统、安装前/后执行脚本时,修改后的配置仅对新增节点生效,存量节点如需同步配置,需要手动重置存量节点。 修改节点池系统盘/数据盘大小、数据盘空间分配则仅对新增节点生效,即使重置存量节点也无法同步配置。 修改K8s标签和污点数据会根据“存量节点标签及污点”开关状态决定是否自动同步已有节点,无需重置节点。
  • 相关操作 您还可以执行表4中的操作。 表4 其他操作 操作 说明 操作步骤 创建存储卷 通过CCE控制台单独创建PV。 在左侧导航栏选择“存储”,在右侧选择“存储卷”页签。单击右上角“创建存储卷”,在弹出的窗口中填写存储卷声明参数。 存储卷类型:选择“文件存储”。 文件存储:单击“选择文件存储”,在新页面中勾选满足要求的文件存储,并单击“确定”。 PV名称:输入PV名称,同一集群内的PV名称需唯一。 访问模式:仅支持ReadWriteMany,表示存储卷可以被多个节点以读写方式挂载,详情请参见存储卷访问模式。 回收策略:Delete或Retain,详情请参见PV回收策略。 说明: 多个PV使用同一个底层存储时建议使用Retain,避免级联删除底层卷。 挂载参数:输入挂载参数键值对,详情请参见设置文件存储挂载参数。 单击“创建”。 事件 查看PVC或PV的事件名称、事件类型、发生次数、Kubernetes事件、首次和最近发生的时间,便于定位问题。 在左侧导航栏选择“存储”,在右侧选择“存储卷声明”或“存储卷”页签。 单击目标实例操作列的“事件”,即可查看1小时内的事件(事件保存时间为1小时)。 查看YAML 可对PVC或PV的YAML文件进行查看、复制和下载。 在左侧导航栏选择“存储”,在右侧选择“存储卷声明”或“存储卷”页签。 单击目标实例操作列的“查看YAML”,即可查看或下载YAML。
  • 约束与限制 支持多个PV挂载同一个SFS或SFS Turbo,但有如下限制: 多个不同的PVC/PV使用同一个底层SFS或SFS Turbo卷时,如果挂载至同一Pod使用,会因为PV的volumeHandle参数值相同导致无法为Pod挂载所有PVC,出现Pod无法启动的问题,请避免该使用场景。 PV中persistentVolumeReclaimPolicy参数建议设置为Retain,否则可能存在一个PV删除时级联删除底层卷,其他关联这个底层卷的PV会由于底层存储被删除导致使用出现异常。 重复用底层存储时,建议在应用层做好多读多写的隔离保护,防止产生的数据覆盖和丢失。 使用SFS 3.0存储卷时,挂载点不支持修改属组和权限。 使用SFS 3.0存储卷时,创建、删除PVC和PV过程中可能存在时延,实际计费时长请以SFS侧创建、删除时刻为准。 SFS 3.0存储卷在Delete回收策略下暂不支持自动回收文件存储卷。当删除PV/PVC时,需要手动删除所有文件后才可以正常删除PV和PVC。
  • 验证数据持久化及共享性 查看部署的应用及文件。 执行以下命令,查看已创建的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共享一个存储卷。
  • 通过监控中心查看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控制台,单击集群名称进入集群。 在左侧导航栏中选择“服务”,切换至“路由”页签,在右上角单击“创建路由”。 设置Ingress参数。本示例中仅列举必选参数,其余参数可根据需求参考通过控制台创建ELB Ingress进行设置。 名称:自定义服务名称,可与工作负载名称保持一致。 负载均衡器:选择弹性负载均衡的类型、创建方式。 类型:本例中仅支持选择“独享型”。 创建方式:本文中以选择已有ELB为例进行说明,关于自动创建的配置参数请参见负载均衡器。 监听器配置: 前端协议:支持HTTP和HTTPS。本文以HTTP协议为例。 对外端口:开放在负载均衡服务地址的端口,可任意指定。 高级配置: 配置 说明 使用限制 获取监听器端口号 开启后可以将ELB实例的监听端口从报文的HTTP头中带到后端云服务器。 独享型ELB实例支持配置。 获取客户端请求端口号 开启后可以将客户端的源端口从报文的HTTP头中带到后端云服务器。 独享型ELB实例支持配置。 重写X-Forwarded-Host 开启后将以客户端请求头的Host重写X-Forwarded-Host传递到后端云服务器。 独享型ELB实例支持配置。 图1 配置HTTP/HTTPS头字段 转发策略配置:填写域名匹配规则及需要访问的目标Service。请求的访问地址与转发规则匹配时(转发规则由域名、URL组成,例如:10.117.117.117:80/helloworld),此请求将被转发到对应的目标Service处理。 单击“确定”,创建Ingress。
  • 时区同步 创建工作负载时,支持设置容器使用节点相同的时区。您可以在创建工作负载时打开时区同步配置。 时区同步功能依赖容器中挂载的本地磁盘(HostPath),如下所示,开启时区同步后,Pod中会通过HostPath方式,将节点的“/etc/localtime”挂载到容器的“/etc/localtime”,从而使得节点和容器使用相同的时区配置文件。 kind: Deployment apiVersion: apps/v1 metadata: name: test namespace: default spec: replicas: 2 selector: matchLabels: app: test template: metadata: labels: app: test spec: volumes: - name: vol-162979628557461404 hostPath: path: /etc/localtime type: '' containers: - name: container-0 image: 'nginx:alpine' volumeMounts: - name: vol-162979628557461404 readOnly: true mountPath: /etc/localtime imagePullPolicy: IfNotPresent imagePullSecrets: - name: default-secret 父主题: 容器设置
  • VPC内访问 根据集群容器网络模型不同,从容器访问内部网络有不同表现。 容器隧道网络 容器隧道网络在节点网络基础上通过隧道封装网络数据包,容器访问同VPC下其他资源时,只要节点能访问通,容器就能访问通。如果访问不通,需要确认对端资源的安全组配置是否能够允许容器所在节点访问。 云原生网络2.0 云原生网络2.0模型下,容器直接从VPC网段内分配IP地址,容器网段是节点所在VPC的子网,容器与VPC内其他地址天然能够互通。如果访问不通,需要确认对端资源的安全组配置是否能够允许容器网段访问。 VPC网络 VPC网络使用了VPC路由功能来转发容器的流量,容器网段与节点VPC不在同一个网段,容器访问同VPC下其他资源时,需要对端资源的安全组能够允许容器网段访问。 例如集群节点所在网段为192.168.10.0/24,容器网段为172.16.0.0/16。 VPC下(集群外)有一个地址为192.168.10.52的ECS,其安全组规则仅允许集群节点的IP网段访问。 此时如果从容器中ping 192.168.10.52,会发现无法ping通。 kubectl exec test01-6cbbf97b78-krj6h -it -- /bin/sh / # ping 192.168.10.25 PING 192.168.10.25 (192.168.10.25): 56 data bytes ^C --- 192.168.10.25 ping statistics --- 104 packets transmitted, 0 packets received, 100% packet loss 在安全组放通容器网段172.16.0.0/16访问。 此时再从容器中ping 192.168.10.52,会发现可以ping通。 $ kubectl exec test01-6cbbf97b78-krj6h -it -- /bin/sh / # ping 192.168.10.25 PING 192.168.10.25 (192.168.10.25): 56 data bytes 64 bytes from 192.168.10.25: seq=0 ttl=64 time=1.412 ms 64 bytes from 192.168.10.25: seq=1 ttl=64 time=1.400 ms 64 bytes from 192.168.10.25: seq=2 ttl=64 time=1.299 ms 64 bytes from 192.168.10.25: seq=3 ttl=64 time=1.283 ms ^C --- 192.168.10.25 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss
  • 容器访问内网不通的定位方法 如前所述,从容器中访问内部网络不通的情况可以按如下路径排查: 查看要访问的对端服务器安全组规则,确认是否允许容器访问。 容器隧道网络模型需要放通容器所在节点的IP地址 VPC网络模型需要放通容器网段 云原生网络2.0需要放通容器所在子网网段 查看要访问的对端服务器是否设置了白名单,如DCS的Redis实例,需要添加白名单才允许访问。添加容器和节点网段到白名单后可解决问题。 查看要访问的对端服务器上是否安装了容器引擎,是否存在与CCE中容器网段冲突的情况。如果有网络冲突,会导致无法访问。
  • 访问其他云服务 与CCE进行内网通信的与服务常见服务有:RDS、DCS、Kafka、RabbitMQ、ModelArts等。 访问其他云服务除了上面所说的VPC内访问和跨VPC访问的网络配置外,还需要关注所访问的云服务是否允许外部访问,如DCS的Redis实例,需要添加白名单才允许访问。通常这些云服务会允许同VPC下IP访问,但是VPC网络模型下容器网段与VPC网段不同,需要特殊处理,将容器网段加入到白名单中。
共100000条