华为云用户手册

  • Prometheus指标采集 NPD 守护进程POD通过端口19901暴露Prometheus metrics指标,NPD Pod默认被注释metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"prometheus","path":"/metrics","port":"19901","names":""}]'。您可以自建Prometheus采集器识别并通过http://{{NpdPodIP}}:{{NpdPodPort}}/metrics路径获取NPD指标。 NPD插件为1.16.5版本以下时,Prometheus指标的暴露端口为20257。 目前指标信息包含异常状态计数problem_counter与异常状态problem_gauge,如下所示 # HELP problem_counter Number of times a specific type of problem have occurred. # TYPE problem_counter counter problem_counter{reason="DockerHung"} 0 problem_counter{reason="DockerStart"} 0 problem_counter{reason="EmptyDirVolumeGroupStatusError"} 0 ... # HELP problem_gauge Whether a specific type of problem is affecting the node or not. # TYPE problem_gauge gauge problem_gauge{reason="CNIIsDown",type="CNIProblem"} 0 problem_gauge{reason="CNIIsUp",type="CNIProblem"} 0 problem_gauge{reason="CRIIsDown",type="CRIProblem"} 0 problem_gauge{reason="CRIIsUp",type="CRIProblem"} 0 ..
  • 版本记录 表12 CCE节点故障检测插件版本记录 插件版本 支持的集群版本 更新特性 社区版本 1.19.1 v1.21 v1.23 v1.25 v1.27 v1.28 v1.29 修复部分问题 0.8.10 1.19.0 v1.21 v1.23 v1.25 v1.27 v1.28 修复部分问题 0.8.10 1.18.48 v1.21 v1.23 v1.25 v1.27 v1.28 修复部分问题 0.8.10 1.18.46 v1.21 v1.23 v1.25 v1.27 v1.28 适配CCE v1.28版本 0.8.10 1.18.24 v1.19 v1.21 v1.23 v1.25 v1.27 修复部分问题 0.8.10 1.18.23 v1.19 v1.21 v1.23 v1.25 v1.27 修复部分问题 0.8.10 1.18.22 v1.19 v1.21 v1.23 v1.25 v1.27 - 0.8.10 1.18.21 v1.19 v1.21 v1.23 v1.25 v1.27 - 0.8.10 1.18.18 v1.19 v1.21 v1.23 v1.25 v1.27 适配CCE v1.27集群 0.8.10 1.18.14 v1.19 v1.21 v1.23 v1.25 支持插件实例AZ反亲和配置 支持在竞价实例被释放前给节点加污点,驱逐节点上的pod 插件挂载节点时区 0.8.10 1.18.10 v1.19 v1.21 v1.23 v1.25 配置界面优化 优化DiskSlow检查项,支持阈值配置 优化NTPProblem检查项,支持阈值配置 支持插件实例AZ反亲和配置 支持竞价实例中断检测,中断前驱逐节点上的pod 0.8.10 1.17.4 v1.17 v1.19 v1.21 v1.23 v1.25 优化DiskHung检查项 0.8.10 1.17.3 v1.17 v1.19 v1.21 v1.23 v1.25 NPC最大可打污点节点数支持百分比配置 新增进程Z状态检查项ProcessZ 优化NTPProblem检查项,支持检测时间偏差 修复BMS节点场景存在常驻D状态进程,干扰ProcessD检查项 0.8.10 1.17.2 v1.17 v1.19 v1.21 v1.23 v1.25 新增磁盘卡IO检查项DiskHung 新增磁盘慢IO检查项DiskSlow 新增进程D状态检查项ProcessD 新增挂载点健康检查MountPointProblem 避免与Service端口范围冲突,默认健康检查监听端口修改为19900,默认Prometheus指标暴露端口修改为19901。 新增支持1.25集群版本 0.8.10 1.16.4 v1.17 v1.19 v1.21 v1.23 新增beta检查项ScheduledEvent,支持通过metadata接口检测宿主机异常导致虚拟机进行冷热迁移事件。该检查项默认不开启。 0.8.10 1.16.3 v1.17 v1.19 v1.21 v1.23 新增ResolvConf配置文件检查。 0.8.10 1.16.1 v1.17 v1.19 v1.21 v1.23 新增node-problem-controller。支持基本故障隔离能力。 新增PID、FD、磁盘、内存、临时卷存储池、持久卷存储池检查项。 0.8.10 1.15.0 v1.17 v1.19 v1.21 v1.23 检测项全面加固,避免误报。 支持内核巡检。支持OOMKilling事件,TaskHung事件上报。 0.8.10 1.14.11 v1.17 v1.19 v1.21 适配CCE v1.21集群 0.7.1 1.14.5 v1.17 v1.19 修复监控指标无法被获取的问题 0.7.1 1.14.4 v1.17 v1.19 适配ARM64节点部署 适配containerd运行时节点 0.7.1 1.14.2 v1.17 v1.19 适配CCE v1.19集群 新增支持Ubuntu操作系统和安全容器场景 0.7.1 1.13.8 v1.15.11 v1.17 修复容器隧道网络下CNI健康检查问题 调整资源配额 0.7.1 1.13.6 v1.15.11 v1.17 修复僵尸进程未被回收的问题 0.7.1 1.13.5 v1.15.11 v1.17 增加污点容忍配置 0.7.1 1.13.2 v1.15.11 v1.17 增加资源限制,增强cni插件的检测能力 0.7.1
  • 插件简介 CCE节点故障检测插件(node-problem-detector,简称NPD)是一款监控集群节点异常事件的插件,以及对接第三方监控平台功能的组件。它是一个在每个节点上运行的守护程序,可从不同的守护进程中搜集节点问题并将其报告给apiserver。node-problem-detector可以作为DaemonSet运行, 也可以独立运行。 有关社区开源项目node-problem-detector的详细信息,请参见node-problem-detector。
  • 安装插件 登录CCE控制台,单击集群名称进入集群,单击左侧导航栏的“插件中心”,在右侧找到CCE节点故障检测插件,单击“安装”。 在安装插件页面,设置“规格配置”。 表1 npd插件规格配置 参数 参数说明 插件规格 该插件可配置“自定义”规格。 实例数 选择“自定义”规格时,您可根据需求调整插件实例数。 实例数为1时插件不具备高可用能力,当插件实例所在节点异常时可能导致插件功能无法正常使用,请谨慎选择。 容器 选择“自定义”规格时,您可根据需求调整插件实例的容器规格。 设置插件支持的“参数配置”。 仅v1.16.0及以上版本支持配置。 表2 npd插件参数配置 参数 参数说明 common.image.pullPolicy 镜像拉取策略,默认为IfNotPresent。 feature_gates 特性门控。 npc.maxTaintedNode 单个故障在多个节点间发生时,至多多少节点允许被npc添加污点,避免雪崩效应。 支持int格式和百分比格式。 npc.nodeAffinity Controller的节点亲和性配置。 设置插件实例的“调度策略”。 调度策略对于DaemonSet类型的插件实例不会生效。 设置多可用区部署或节点亲和策略时,需保证集群中存在满足调度策略的节点且拥有足够的资源,否则插件实例将无法运行。 表3 插件调度配置 参数 参数说明 多可用区部署 优先模式:优先将插件的Deployment实例调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将调度到单可用区。 均分模式:插件Deployment实例均匀调度到当前集群下各可用区,增加新的可用区后建议扩容插件实例以实现跨可用区高可用部署;均分模式限制不同可用区间插件实例数相差不超过1,单个可用区资源不足会导致后续其他实例无法调度。 强制模式:插件Deployment实例强制调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将无法全部运行。 节点亲和 不配置:插件实例不指定节点亲和调度。 指定节点调度:指定插件实例部署的节点。若不指定,将根据集群默认调度策略进行随机调度。 指定节点池调度:指定插件实例部署的节点池。若不指定,将根据集群默认调度策略进行随机调度。 自定义亲和策略:填写期望插件部署的节点标签实现更灵活的调度策略,若不填写将根据集群默认调度策略进行随机调度。 同时设置多条自定义亲和策略时,需要保证集群中存在同时满足所有亲和策略的节点,否则插件实例将无法运行。 容忍策略 容忍策略与节点的污点能力配合使用,允许(不强制)插件的 Deployment 实例调度到带有与之匹配的污点的节点上,也可用于控制插件的 Deployment 实例所在的节点被标记污点后插件的 Deployment 实例的驱逐策略。 插件会对实例添加针对node.kubernetes.io/not-ready和node.kubernetes.io/unreachable污点的默认容忍策略,容忍时间窗为60s。 详情请参见容忍策略。 单击“安装”。
  • 验证数据持久化 查看部署的应用及云硬盘文件。 执行以下命令,查看已创建的Pod。 kubectl get pod | grep web-evs 预期输出如下: web-evs-0 1/1 Running 0 38s 执行以下命令,查看云硬盘是否挂载至/data路径。 kubectl exec web-evs-0 -- df | grep data 预期输出如下: /dev/sdc 10255636 36888 10202364 0% /data 执行以下命令,查看/data路径下的文件。 kubectl exec web-evs-0 -- ls /data 预期输出如下: lost+found 执行以下命令,在/data路径下创建static文件。 kubectl exec web-evs-0 -- touch /data/static 执行以下命令,查看/data路径下的文件。 kubectl exec web-evs-0 -- ls /data 预期输出如下: lost+found static 执行以下命令,删除名称为web-evs-0的Pod。 kubectl delete pod web-evs-0 预期输出如下: pod "web-evs-0" deleted 删除后,StatefulSet控制器会自动重新创建一个同名副本。执行以下命令,验证/data路径下的文件是否更改。 kubectl exec web-evs-0 -- ls /data 预期输出如下: lost+found static static文件仍然存在,则说明云硬盘中的数据可持久化保存。
  • 前提条件 您已经创建好一个集群,并且在该集群中安装CCE容器存储(Everest)。 您已经创建好一块云硬盘,并且云硬盘满足以下条件: 已有的云硬盘不可以是系统盘、专属盘或共享盘。 云硬盘模式需选择S CS I(购买云硬盘时默认为VBD模式)。 云硬盘的状态可用,且未被其他资源使用。 云硬盘的可用区需要与集群节点的可用区相同,否则无法挂载将导致实例启动失败。 若云硬盘加密,所使用的密钥状态需可用。 仅支持选择集群所属企业项目和default企业项目下的云硬盘。 不支持使用已进行分区的云硬盘。 仅支持使用ext4类型的云硬盘。 如果您需要通过命令行创建,需要使用kubectl连接到集群,详情请参见通过kubectl连接集群。
  • 约束与限制 云硬盘不支持跨可用区挂载,且不支持被多个工作负载、同一个工作负载的多个实例或多个任务使用。由于CCE集群各节点之间暂不支持共享盘的数据共享功能,多个节点挂载使用同一个云硬盘可能会出现读写冲突、数据缓存冲突等问题,所以创建无状态工作负载时,若使用了EVS云硬盘,建议工作负载只选择一个实例。 1.19.10以下版本的集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,当新Pod被调度到另一个节点时,会导致之前Pod不能正常读写。 1.19.10及以上版本集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,新Pod会因为无法挂载云硬盘导致无法成功启动。
  • 解决方案 解决方案一:删除关联无IPv4私网地址ELB的负载均衡型Service。 解决方案二:为无IPv4私网IP地址的ELB绑定一个私网IP。步骤如下: 查找负载均衡类型的Service所关联的ELB。 方法一:通过升级前检查的日志信息中,获取对应的ELB ID。然后前往ELB控制台通过ELB ID进行筛选。 elbs (ids: [*****]) without ipv4 private ip, please bind private ip tothese elbs and try again 方法二:登录CCE控制台,前往“服务”页面查看服务,单击ELB名称,跳转到ELB界面。 确认ELB实例是否包含IPv4私网IP。 为无IPv4私网IP地址的ELB绑定一个私网IP。 登录CCE控制台,单击目标ELB名称。 在基本信息页面,单击“IPv4私有IP”旁的“绑定”。 设置子网及IPv4地址,并单击“确定”。
  • 部署应用并转换指标 如上所述的nginx:exporter提供的监控数据,其数据格式并不满足Prometheus的要求,需要将其转换成Prometheus需要的格式,可以使用nginx-prometheus-exporter来转换Nginx的指标,如下所示。 图2 使用exporter转换数据格式 使用nginx:exporter和nginx-prometheus-exporter部署到同一个Pod,如下所示。 kind: Deployment apiVersion: apps/v1 metadata: name: nginx-exporter namespace: default spec: replicas: 1 selector: matchLabels: app: nginx-exporter template: metadata: labels: app: nginx-exporter annotations: metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"prometheus","path":"/metrics","port":"9113","names":""}]' spec: containers: - name: container-0 image: 'nginx:exporter' # 替换为您上传到SWR的镜像地址 resources: limits: cpu: 250m memory: 512Mi requests: cpu: 250m memory: 512Mi - name: container-1 image: 'nginx/nginx-prometheus-exporter:0.9.0' command: - nginx-prometheus-exporter args: - '-nginx.scrape-uri=http://127.0.0.1:8080/stub_status' imagePullSecrets: - name: default-secret nginx/nginx-prometheus-exporter:0.9.0需要从公网拉取,需要集群节点绑定公网IP。 nginx-prometheus-exporter需要一个启动命令,nginx-prometheus-exporter -nginx.scrape-uri=http://127.0.0.1:8080/stub_status,用于获取nginx的监控数据。 另外Pod需要添加一个annotations,metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"prometheus","path":"/metrics","port":"9113","names":""}]'。
  • Prometheus监控数据采集说明 Prometheus通过周期性的调用应用程序的监控指标接口(默认为“/metrics”)获取监控数据,应用程序需要提供监控指标接口供Prometheus调用,且监控数据需要满足Prometheus的规范,如下所示。 # TYPE nginx_connections_active gauge nginx_connections_active 2 # TYPE nginx_connections_reading gauge nginx_connections_reading 0 Prometheus提供了各种语言的客户端,客户端具体请参见Prometheus CLIENT LIBRARIES,开发Exporter具体方法请参见WRITING EXPORTERS。Prometheus社区提供丰富的第三方exporter可以直接使用,具体请参见EXPORTERS AND INTEGRATIONS。
  • 负载均衡 表3 Service ELB 高危操作 导致后果 误操作后解决方案 禁止通过ELB的控制台删除已绑定CCE集群的ELB实例 导致Service/Ingress访问不通。 不建议删除。 通过ELB的控制台停用已绑定CCE集群的ELB实例 导致Service/Ingress访问不通。 不建议停用,请自行恢复。 通过ELB的控制台修改ELB的IPv4私有IP 基于IPv4私有IP进行私网流量转发功能会出现中断 Service/Ingress的YAML中status字段下的IP变化 不建议修改,请自行恢复。 通过ELB的控制台解绑ELB的IPv4公网IP 解绑公网IP后,该弹性负载均衡器变更为私网类型,无法进行公网流量转发。 请自行恢复。 通过ELB的控制台在CCE管理的ELB创建自定义的监听器 若ELB是创建Service/Ingress时自动创建的,在Service/Ingress删除时无法删除ELB的自定义监听器,会导致无法自动删除ELB。 通过Service/Ingress自动创建监听器,否则需要手动删除ELB。 通过ELB的控制台删除CCE自动创建的监听器 导致Service/Ingress访问不通。 在集群升级等需要重启控制节点的场景,所做修改会被CCE侧重置。 重新创建或更新Service/Ingress。 通过ELB的控制台修改CCE创建的监听器名称、访问控制、超时时间、描述等基本配置 如果监听器被删除,在集群升级等需要重启控制节点的场景,所做修改会被CCE侧重置。 不建议修改,请自行恢复。 通过ELB的控制台修改CCE创建的监听器后端服务器组,添加、删除后端服务器 导致Service/Ingress访问不通。 在集群升级等需要重启控制节点的场景,所做修改会被CCE侧重置: 用户删除的后端服务器会恢复 用户添加的后端服务器会被移除 重新创建或更新Service/Ingress。 通过ELB的控制台更换CCE创建的监听器后端服务器组 导致Service/Ingress访问不通。 在集群升级等需要重启控制节点的场景,后端服务器组中的后端服务器会被CCE侧重置。 重新创建或更新Service/Ingress。 通过ELB的控制台修改CCE创建的监听器转发策略,添加、删除转发规则 导致Service/Ingress访问不通。 如果该转发规则由Ingress添加,在集群升级等需要重启控制节点的场景,所做修改会被CCE侧重置。 不建议修改,请自行恢复。 通过ELB的控制台修改CCE管理的ELB证书 在集群升级等需要重启控制节点的场景,后端服务器组中的后端服务器会被CCE侧重置。 通过Ingress的YAML来自动管理证书。
  • 网络 表2 网络 高危操作 导致后果 误操作后解决方案 修改内核参数net.ipv4.ip_forward=0 网络不通 修改内核参数为 net.ipv4.ip_forward=1 修改内核参数net.ipv4.tcp_tw_recycle=1 导致nat异常 修改内核参数 net.ipv4.tcp_tw_recycle=0 修改内核参数net.ipv4.tcp_tw_reuse=1 导致网络异常 修改内核参数 net.ipv4.tcp_tw_reuse=0 节点安全组配置未放通容器CIDR的53端口udp 集群内DNS无法正常工作 参照新建集群的安全组进行修复,放通安全组。 删除default-network的network-attachment-definitions的crd资源 容器网络不通,集群删除失败等 误删除该资源需要使用正确的配置重新创建default-network资源。 启动iptables防火墙 CCE默认不开启iptables防火墙,开启后可能造成网络不通 说明: 不建议开启iptables防火墙。如必须启动iptables防火墙,请在测试环境中确认/etc/sysconfig/iptables和/etc/sysconfig/ip6tables中配置的规则是否会对网络连通性造成影响。 关闭iptables防火墙,并检查/etc/sysconfig/iptables和/etc/sysconfig/ip6tables中配置的规则。
  • 集群/节点 表1 集群及节点高危操作 分类 高危操作 导致后果 误操作后解决方案 Master节点 修改集群内节点安全组 说明: 安全组命名规则:集群名称-cce-control-随机数 可能导致Master节点无法使用 参照新建集群的安全组进行修复,放通安全组。详情请参见集群安全组规则配置。 节点到期或被销毁 该Master节点不可用 不可恢复。 重装操作系统 Master组件被删除 不可恢复。 自行升级Master或者etcd组件版本 可能导致集群无法使用 回退到原始版本。 删除或格式化节点/etc/kubernetes等核心目录数据 该Master节点不可用 不可恢复。 更改节点IP 该Master节点不可用 改回原IP。 自行修改核心组件(etcd、kube-apiserver、docker等)参数 可能导致Master节点不可用 按照推荐配置参数恢复,详情请参见集群配置管理。 自行更换Master或etcd证书 可能导致集群不可用 不可恢复。 Node节点 修改集群内节点安全组 说明: 安全组命名规则:集群名称-cce-node-随机数 可能导致节点无法使用 参照新建集群的安全组进行修复,放通安全组。详情请参见集群安全组规则配置。 修改节点DNS配置(/etc/resolv.conf) 导致内部 域名 无法正常访问,可能出现插件异常、节点重置升级等基本功能异常 说明: 如果业务需要使用自建DNS,可以在工作负载中配置DNS,请勿修改节点本身的 DNS地址 ,详情请参见工作负载DNS配置说明。 参考新建节点中的DNS配置还原。 节点被删除 该节点不可用 不可恢复。 重装操作系统 节点组件被删除,节点不可用 重置节点,具体请参见重置节点。 升级内核或容器平台依赖组件(如openvswitch/ipvlan/docker/containerd) 可能导致节点无法使用或网络异常 说明: 节点运行依赖系统内核版本,如非必要,请不要使用yum update命令更新或重装节点的操作系统内核(使用原镜像或其它镜像重装均属高危操作) EulerOS 2.2恢复方式请参见如何解决yum update升级操作系统导致容器网络不可用问题? 非EulerOS 2.2您可以重置节点,具体请参见重置节点。 更改节点IP 节点不可用 改回原IP。 自行修改核心组件(kubelet、kube-proxy等)参数 可能导致节点不可用、修改安全相关配置导致组件不安全等 按照推荐配置参数恢复,详情请参见节点池配置管理。 修改操作系统配置 可能导致节点不可用 尝试还原配置项或重置节点,具体请参见重置节点。 删除或修改/opt/cloud/cce、/var/paas目录,删除数据盘 节点不可用 重置节点,具体请参见重置节点。 修改节点内目录权限、容器目录权限等 权限异常 不建议修改,请自行恢复。 对节点进行磁盘格式化或分区,包括系统盘、Docker盘和kubelet盘 可能导致节点不可用 重置节点,具体请参见重置节点。 在节点上安装自己的其他软件 导致安装在节点上的Kubernetes组件异常,节点状态变成不可用,无法部署工作负载到此节点 卸载已安装软件,尝试恢复或重置节点,具体请参见重置节点。 修改NetworkManager的配置 节点不可用 重置节点,具体请参见重置节点。 删除节点上的cce-pause等系统镜像 导致无法正常创建容器,且无法拉取系统镜像 请从其他正常节点复制该镜像恢复 在ECS侧对节点池下的节点进行规格变更 节点的规格与节点池定义的规格不一致,导致在弹性扩缩容时出现非预期现象(多扩或者少扩) 重新将节点规格变更为节点池下定义的规格,或者删除该节点重新扩容。
  • 使用NodeLocal DNSCache 默认情况下,应用的请求会通过CoreDNS代理,如果需要使用node-local-dns进行DNS缓存代理,您有以下几种方式可以选择: 自动注入:创建Pod时自动配置Pod的dnsConfig字段。(kube-system等系统命名空间下的Pod不支持自动注入) 手动配置:手动配置Pod的dnsConfig字段,从而使用NodeLocal DNSCache。 自动注入 自动注入需要满足如下条件: 在安装插件时,开启DNSConfig自动注入。 命名空间添加node-local-dns-injection=enabled标签。例如,为default命名空间添加该标签的命令如下: kubectl label namespace default node-local-dns-injection=enabled 新建Pod不位于kube-system和kube-public等系统命名空间。 新建Pod没有被打上禁用DNS注入的标签node-local-dns-injection=disabled。 新建Pod的DNSPolicy为ClusterFirstWithHostNet,或Pod为非hostNetwork且DNSPolicy为ClusterFirst。 开启自动注入后,创建的Pod会自动添加如下dnsConfig字段,nameservers中除了NodeLocal DNSCache的地址(169.254.20.10)外,还添加了CoreDNS的地址(10.247.3.10),保障了业务DNS请求高可用。 ... dnsConfig: nameservers: - 169.254.20.10 - 10.247.3.10 searches: - default.svc.cluster.local - svc.cluster.local - cluster.local options: - name: timeout value: '' - name: ndots value: '5' - name: single-request-reopen ... 手动配置 手动配置即自行给Pod加上dnsConfig配置。 创建一个Pod,并在dnsConfig中的nameservers配置中添加NodeLocal DNSCache的地址(169.254.20.10)。 不同集群类型的NodeLocal DNSCache地址如下: CCE Standard集群:169.254.20.10 CCE Turbo 集群:169.254.1.1 apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - image: nginx:alpine name: container-0 dnsConfig: nameservers: - 169.254.20.10 - 10.247.3.10 searches: - default.svc.cluster.local - svc.cluster.local - cluster.local options: - name: ndots value: '2' imagePullSecrets: - name: default-secret
  • 常见问题 如何避免DNSConfig自动注入? 解决方案: 如果某个工作负载需要避免DNSConfig自动注入,可在Pod模板的labels字段中添加node-local-dns-injection: disabled的标签。示例如下: apiVersion: apps/v1 kind: Deployment metadata: name: test namespace: default spec: replicas: 2 selector: matchLabels: app: test template: metadata: labels: app: test node-local-dns-injection: disabled # 避免DNSConfig自动注入 spec: containers: - name: container-1 image: nginx:latest imagePullPolicy: IfNotPresent imagePullSecrets: - name: default-secret
  • 解决方案 为了避免DNS延迟的影响,可以在集群中部署NodeLocal DNSCache来提升服务发现的稳定性和性能。NodeLocal DNSCache会在集群节点上运行DNS缓存代理,所有注入DNS配置的Pod都会使用节点上运行的DNS缓存代理进行域名解析,而不是使用CoreDNS服务,以此来减少CoreDNS服务的压力,提高集群DNS性能。 启用NodeLocal DNSCache之后,DNS查询所遵循的路径如下图所示。 图1 NodeLocal DNSCache查询路径 其中解析线路说明如下: ①:已注入DNS本地缓存的Pod,默认会通过NodeLocal DNSCache解析请求域名。 ②:NodeLocal DNSCache本地缓存如果无法解析请求,则会请求集群CoreDNS进行解析。 ③:对于非集群内的域名,CoreDNS会通过VPC的DNS服务器进行解析。 ④:已注入DNS本地缓存的Pod,如果无法连通NodeLocal DNSCache,则会直接通过CoreDNS解析域名。 ⑤:未注入DNS本地缓存的Pod,默认会通过CoreDNS解析域名。
  • 约束与限制 节点本地域名解析加速插件仅支持1.19及以上版本集群。 CCI上不支持NodeLocal DNSCache。当负载动态弹性伸缩到CCI时,CCI上Pod会因为无法联通NodeLocal DNSCache导致域名解析超时。因此创建弹性到CCI的负载时,需为Pod添加node-local-dns-injection: disabled的标签,避免DNSConfig自动注入,详情请参见常见问题。 node-local-dns-injection标签为NodeLocal DNSCache使用的系统标签,除避免DNSConfig自动注入的场景外,应避免使用该标签。
  • 插件安装 CCE提供了节点本地域名解析加速插件,可以方便的安装NodeLocal DNSCache。 NodeLocal DNSCache不提供Hosts、Rewrite等插件能力,仅作为CoreDNS的透明缓存代理。如有需要,可在CoreDNS配置中修改。 (可选)修改CoreDNS配置,让CoreDNS优先采用UDP协议与上游DNS服务器通信。 NodeLocal DNSCache采用TCP协议与CoreDNS进行通信,CoreDNS会根据请求来源使用的协议与上游DNS服务器进行通信。当使用了NodeLocal DNSCache时,访问上游DNS服务器时会使用TCP协议,而云上DNS服务器对TCP协议支持有限,如果您使用了NodeLocal DNSCache,您需要修改CoreDNS配置,让其总是优先采用UDP协议与上游DNS服务器进行通信,避免解析异常。 执行如下步骤,在forward插件中指定请求上游的协议为perfer_udp,修改之后CoreDNS会优先使用UDP协议与上游通信。 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“插件中心”,在CoreDNS下单击“编辑”,进入插件详情页。 在“参数配置”下编辑高级配置,在plugins字段修改以下内容。 { "configBlock": "prefer_udp", "name": "forward", "parameters": ". /etc/resolv.conf" } 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“插件中心”,在右侧找到节点本地域名解析加速插件,单击“安装”。 在安装插件页面,选择插件规格,并配置相关参数。 DNSConfig自动注入:启用后,会创建DNSConfig动态注入控制器,该控制器基于Admission Webhook机制拦截目标命名空间(即命名空间包含标签node-localdns-injection=enabled)下Pod的创建请求,自动为Pod配置DNSConfig。未开启DNSConfig自动注入或Pod属于非目标命名空间,则需要手动给Pod配置DNSConfig。 目标命名空间:启用DNSConfig自动注入时支持设置。仅1.3.0及以上版本的插件支持。 全部开启:CCE会为已创建的命名空间添加标签(node-local-dns-injection=enabled),同时会识别命名空间的创建请求并自动添加标签,这些操作的目标不包含系统内置的命名空间(如kube-system)。 手动配置:手动为需要注入DNSConfig的命名空间添加标签(node-local-dns-injection=enabled),操作步骤请参见管理命名空间标签。 完成以上配置后,单击“安装”。
  • 集群升级路径 Autopilot集群基于社区Kubernetes版本迭代演进,版本号由社区Kubernetes版本和补丁版本两部分构成,因此提供两类集群升级路径。 Kubernetes版本升级: Kubernetes版本号 支持升级到的Kubernetes版本号 v1.27 v1.28 v1.28 / 补丁版本需要升级至最新补丁后方可进行Kubernetes版本升级,控制台将根据当前集群版本自动为您生成最佳升级路径。 补丁版本升级 Autopilot集群采取了补丁版本管理策略,旨在不进行大版本升级的情况下,为在维集群提供新的特性、Bugfix和漏洞修复。 新的补丁版本发布以后您可在任意补丁版本一次直升到最新补丁版本。
  • 集群升级流程 集群升级流程包括升级前检查、备份、升级和升级后验证几个步骤,下面介绍集群升级过程中的相关流程。 图1 集群升级流程 在确定集群的目标版本后,请您仔细阅读升级注意事项,避免升级时出现功能不兼容的问题。 升级前检查 升级集群前,CCE会对您的集群进行必要的检查,包括集群状态、插件状态、节点状态、工作负载兼容性等多方面进行检查,确保集群满足升级的条件,检查项目请参考升级前检查异常问题排查。如过出现检查异常项,请参考控制台中的提示进行修复。 备份 通过硬盘快照的方式帮您备份集群控制节点,以保存CCE组件镜像、组件配置、Etcd数据等关键数据。建议您在升级前进行备份。如果在升级过程中出现不可预期的情况,可以基于备份为您快速恢复集群。 备份方式 备份对象 备份方式 备份时间 回滚时间 说明 etcd数据备份 etcd数据 升级流程中自动备份 1-5min 2h 必选备份,升级过程中自动进行,用户无需关注 CBR整机备份 Master节点磁盘,包括组件镜像、配置、日志以及etcd数据 通过页面一键备份(手动触发) 20min-2h(受当前区域云备份任务排队情况影响) 20min 该功能逐步由EVS快照备份替代 EVS快照备份 Master节点磁盘,包括组件镜像、配置、日志以及etcd数据 通过页面一键备份(手动触发) 1-5min 20min 该功能上线中 对于已上线的区域,EVS快照备份将替代CBR整机备份 配置与升级 执行升级前,需要对升级参数进行配置,我们已为您提供了默认配置,您也可以根据需要进行配置,升级参数配置完成后,将进入正式升级流程,对插件、控制节点、托管节点依次进行升级。 插件升级配置:此处列出了您的集群中已安装的插件。在集群升级过程中系统会自动升级已选择的插件,以兼容升级后的集群版本,您可以单击插件右侧的“配置”重新定义插件参数。 插件右侧如有标记,表示当前插件不能同时兼容集群升级起始和目标版本,在集群版本升级完成后将为您升级该插件 ,该插件在集群升级过程中可能无法正常使用。 升级后验证 升级完成后,会自动为集群执行集群状态检查、节点状态检查等,您需要手动进行业务验证、新建Pod验证等,确保升级后集群功能正常。
  • 通过控制台使用 登录CCE控制台,单击集群名称进入集群。 动态创建存储卷声明和存储卷。 在左侧导航栏选择“存储”,在右侧选择“存储卷声明”页签。单击右上角“创建存储卷声明 PVC”,在弹出的窗口中填写存储卷声明参数。 “存储卷声明类型”选择“云硬盘”,并开启加密,并选择密钥。其余参数可根据情况按需填写,详情请参见通过动态存储卷使用云硬盘。 图1 加密存储卷 单击“创建”。 前往“存储卷声明”页面,查看加密云硬盘存储卷声明是否创建成功,并查看存储配置项是否显示已加密。 图2 PVC加密 在应用中使用加密PVC时,和使用普通PVC的方法一致。
  • 版本记录 表7 CoreDNS域名解析插件版本记录 插件版本 支持的集群版本 更新特性 社区版本 1.29.4 v1.21 v1.23 v1.25 v1.27 v1.28 v1.29 适配CCE v1.29集群 1.10.1 1.28.7 v1.21 v1.23 v1.25 v1.27 v1.28 支持插件热更新配置,无需滚动升级 1.10.1 1.28.5 v1.21 v1.23 v1.25 v1.27 v1.28 修复部分问题 1.10.1 1.28.4 v1.21 v1.23 v1.25 v1.27 v1.28 适配CCE v1.28集群 1.10.1 1.27.4 v1.19 v1.21 v1.23 v1.25 v1.27 - 1.10.1 1.27.1 v1.19 v1.21 v1.23 v1.25 v1.27 适配CCE v1.27集群 1.10.1 1.25.1 v1.19 v1.21 v1.23 v1.25 适配CCE v1.25集群 1.8.4 1.23.3 v1.15 v1.17 v1.19 v1.21 v1.23 插件依赖例行升级 1.8.4 1.23.2 v1.15 v1.17 v1.19 v1.21 v1.23 插件依赖例行升级 1.8.4 1.23.1 v1.15 v1.17 v1.19 v1.21 v1.23 适配CCE v1.23集群 1.8.4 1.17.15 v1.15 v1.17 v1.19 v1.21 适配CCE v1.21集群 1.8.4 1.17.9 v1.15 v1.17 v1.19 插件依赖例行升级 1.8.4 1.17.7 v1.15 v1.17 v1.19 同步至社区v1.8.4版本 1.8.4 1.17.4 v1.17 v1.19 适配CCE v1.19集群 1.6.5 1.17.3 v1.17 支持v1.17集群,修复存根域配置问题 1.6.5 1.17.1 v1.17 支持v1.17集群 1.6.5
  • 插件简介 CoreDNS域名解析插件是一款通过链式插件的方式为Kubernetes提供域名解析服务的DNS服务器。 CoreDNS是由CNCF孵化的开源软件,用于Cloud-Native环境下的DNS服务器和服务发现解决方案。CoreDNS实现了插件链式架构,能够按需组合插件,运行效率高、配置灵活。在Kubernetes集群中使用CoreDNS能够自动发现集群内的服务,并为这些服务提供域名解析。同时,通过级联云上DNS服务器,还能够为集群内的工作负载提供外部域名的解析服务。 该插件为系统资源插件,在创建集群时默认安装。 目前CoreDNS已经成为社区Kubernetes集群推荐的DNS服务器解决方案。 CoreDNS官网:https://coredns.io/ 开源社区地址:https://github.com/coredns/coredns DNS详细使用方法请参见DNS。
  • 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。 图1 路由请求流程
  • 可观测性(监控中心、日志中心、告警中心)如何收费? 免费场景 监控中心自身免费使用,监控中心所使用的指标都上报并存储在 AOM 服务,其中在AOM范畴内的基础指标不收费,存储时长15天(暂不支持修改)。详情请参见基础指标。 日志中心自身免费使用,集群内产生的日志都上报并存储在LTS服务, 云日志 服务的计费项由日志读写流量、日志索引流量、日志存储量的费用组成(有500MB/月的免费额度)。 告警中心自身免费使用,集群内产生的告警由 SMN 消息通知服务进行推送,在短信数量小于100/条/月、邮件数量小于1000/封/月的,推送免费。其中短信条数计算规则请参见短信内容长度计算规则。 收费场景 监控中心:集群内配置的除基础指标以外的自定义指标(基础指标不收费)会根据AOM的收费规则进行收费。详情请参见计费项。 日志中心:对超出每月免费限额(500MB/月)的日志读写、日志索引流量、日志存储量进行收费。详情请参见LTS服务的收费标准。 告警中心:告警中心依赖SMN 消息通知 服务对告警进行推送,联系组当前只支持短信和邮件,超过SMN免费范围(短信数量小于100/条/月、邮件数量小于1000/封/月的,推送免费)的将会收费。详情请参见SMN计费说明。
  • 通过配置项设置工作负载环境变量 使用控制台方式 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏选择“工作负载”,单击右上角“创建工作负载”。 在创建工作负载时,在“容器配置”中找到“环境变量”,单击“新增变量”。 配置项导入:选择一个配置项,将配置项中所有键值都导入为环境变量。 配置项键值导入:将配置项中某个键的值导入作为某个环境变量的值。 变量名称:工作负载中的环境变量名称,可自定义,默认为配置项中选择的键名。 变量/变量引用:选择一个配置项及需要导入的键名,将其对应的值导入为工作负载环境变量。 例如将cce-configmap这个配置项中“SPECIAL_LEVEL”的值“Hello”导入,作为工作负载环境变量“SPECIAL_LEVEL”的值,导入后容器中有一个名为“SPECIAL_LEVEL”的环境变量,其值为“Hello”。 配置其他工作负载参数后,单击“创建工作负载”。 等待工作负载正常运行后,您可登录容器执行以下语句,查看该配置项是否已被设置为工作负载的环境变量。 printenv SPECIAL_LEVEL 示例输出如下: Hello 使用kubectl方式 请参见通过kubectl连接集群配置kubectl命令。 创建并编辑nginx-configmap.yaml文件。 vi nginx-configmap.yaml YAML文件内容如下: 配置项导入:如果要将一个配置项中所有数据都添加到环境变量中,可以使用envFrom参数,配置项中的Key会成为工作负载中的环境变量名称。 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-configmap spec: replicas: 1 selector: matchLabels: app: nginx-configmap template: metadata: labels: app: nginx-configmap spec: containers: - name: container-1 image: nginx:latest envFrom: # 使用envFrom来指定环境变量引用的配置项 - configMapRef: name: cce-configmap # 引用的配置项名称 imagePullSecrets: - name: default-secret 配置项键值导入:您可以在创建工作负载时将配置项设置为环境变量,使用valueFrom参数单独引用ConfigMap中的Key/Value。 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-configmap spec: replicas: 1 selector: matchLabels: app: nginx-configmap template: metadata: labels: app: nginx-configmap spec: containers: - name: container-1 image: nginx:latest env: # 设置工作负载中的环境变量 - name: SPECIAL_LEVEL # 工作负载中的环境变量名称 valueFrom: # 使用valueFrom来指定环境变量引用配置项 configMapKeyRef: name: cce-configmap # 引用的配置项名称 key: SPECIAL_LEVEL # 引用的配置项中的key - name: SPECIAL_TYPE # 添加多个环境变量参数,可同时导入多个环境变量 valueFrom: configMapKeyRef: name: cce-configmap key: SPECIAL_TYPE imagePullSecrets: - name: default-secret 创建工作负载。 kubectl apply -f nginx-configmap.yaml 创建完成后,查看Pod中的环境变量。 执行以下命令,查看已创建的Pod。 kubectl get pod | grep nginx-configmap 预期输出如下: nginx-configmap-*** 1/1 Running 0 2m18s 执行以下命令,查看该Pod中的环境变量。 kubectl exec nginx-configmap-*** -- printenv SPECIAL_LEVEL SPECIAL_TYPE 预期输出如下: Hello CCE 说明该配置项已被设置为工作负载的环境变量。
  • 指标清单 XGPU视图使用的指标清单如下: 表2 XGPU指标说明 指标名称 类型 说明 xgpu_memory_total Gauge XGPU显存总量 xgpu_memory_used Gauge XGPU显存使用量 xgpu_core_percentage_total Gauge XGPU算力总量 xgpu_core_percentage_used Gauge XGPU算力使用率 gpu_schedule_policy Gauge GPU模式分成0、1、2三种,具体说明如下: 0为显存隔离算力共享模式 1为显存算力隔离模式 2为默认模式表示当前卡还没被用于XGPU设备分配 xgpu_device_health Gauge XGPU设备的健康情况。当前虚拟化域侧并没有提供特定的接口来检查XGPU的健康情况,所以根据XGPU设备所在物理GPU设备的健康情况反推。0表示XGPU设备为健康状态,1表示为非健康状态。
  • 指标说明 图1 XGPU资源指标 表1 XGPU视图图表说明 图表名称 单位 说明 集群-XGPU设备显存使用率 百分比 集群的GPU虚拟化设备显存使用率 计算公式:集群中所有XGPU设备的显存使用量之和 / 集群显存总量 集群-XGPU设备算力使用率 百分比 集群的GPU虚拟化设备算力使用率 计算公式:集群中所有XGPU设备的算力使用量之和 / 集群算力总量 节点-XGPU设备显存使用率 百分比 每个节点的GPU虚拟化设备显存使用率 计算公式:节点上所有XGPU设备的显存使用量之和 / 节点显存总量 节点-XGPU设备算力使用率 百分比 每个节点的GPU虚拟化设备算力使用率 计算公式:节点上所有XGPU设备的算力使用量之和 / 节点算力总量 节点-XGPU设备数量 个 每个节点的GPU虚拟化设备数量 节点-XGPU设备显存分配量 字节 每个节点上的GPU虚拟化设备显存总量 GPU卡-XGPU设备显存使用率 百分比 每张GPU卡上的GPU虚拟化设备显存使用率 计算公式:显卡上所有XGPU设备的显存使用量之和 / 显卡显存总量 GPU卡-XGPU设备显存分配量 字节 每张GPU卡上的GPU虚拟化设备的显存总量 GPU卡-XGPU设备显存分配率 百分比 每张GPU卡上的GPU虚拟化设备的显存总量占这张GPU卡显存总量的比例 计算公式:显卡上所有XGPU设备能使用的显存上限之和 / 显卡显存总量 GPU卡-XGPU设备算力使用率 百分比 每张GPU卡的GPU虚拟化设备的算力使用率 计算公式:显卡上所有XGPU设备当前所使用的算力之和 / 显卡算力总量 GPU卡-XGPU设备数量 个 每张GPU卡的GPU虚拟涉笔的数量 GPU卡-调度策略 数字 0为显存隔离算力共享模式 1为显存算力隔离模式 2为默认模式表示当前卡还没被用于XGPU设备分配 GPU卡-不健康的XGPU设备数量 个 每张GPU卡的不健康的GPU虚拟化设备的数量 容器显存分配量 字节 容器所能使用的显存上限 容器算力使用率 百分比 每个容器的算力使用率 计算公式:XGPU设备上容器算力使用量 / XGPU设备算力总量 容器显存使用量 字节 每个容器的显存使用量 容器显存使用率 百分比 每个容器的显存使用率 计算公式:XGPU设备上容器显存使用量 / XGPU设备显存总量
  • 获取驱动链接-公网地址 登录CCE控制台。 创建节点,在节点规格处选择要创建的GPU节点,选中后下方显示的信息中可以看到节点的GPU显卡型号。 图3 查看显卡型号 登录到https://www.nvidia.com/Download/Find.aspx?lang=cn网站。 如图4所示,在“NVIDIA驱动程序下载”框内选择对应的驱动信息。其中“操作系统”必须选Linux 64-bit。 图4 参数选择 驱动信息确认完毕,单击“搜索”按钮,会跳转到驱动信息展示页面,该页面会显示驱动的版本信息如图5,单击“下载”到下载页面。 图5 驱动信息 获取驱动软件链接方式分两种: 方式一:如图6,在浏览器的链接中找到路径为url=/tesla/470.103.01/NVIDIA-Linux-x86_64-470.103.01.run的路径,补齐全路径https://us.download.nvidia.com/tesla/470.103.01/NVIDIA-Linux-x86_64-470.103.01.run该方式节点需要绑定EIP 。 方式二:如图6,单击“下载”按钮下载驱动,然后上传到OBS,获取软件的链接,该方式节点不需要绑定EIP。 图6 获取链接
  • GPU驱动支持列表 当前GPU驱动支持列表仅针对1.2.28及以上版本的GPU插件。 如果您需要安装最新版本的GPU驱动,请将您的GPU插件升级到最新版本。 表1 GPU驱动支持列表 GPU型号 支持集群类型 机型规格 操作系统 Huawei Cloud EulerOS 2.0(支持GPU虚拟化) Ubuntu 22.04 CentOS Linux release 7.6 EulerOS release 2.9 EulerOS release 2.5 Ubuntu 18.04(停止维护) EulerOS release 2.3(停止维护) Tesla T4 CCE Standard集群 g6 pi2 535.54.03 510.47.03 470.57.02 535.54.03 470.141.03 535.54.03 470.141.03 535.54.03 470.141.03 535.54.03 470.141.03 470.141.03 470.141.03 Volta V100 CCE Standard集群 p2s p2vs p2v 535.54.03 510.47.03 470.57.02 535.54.03 470.141.03 535.54.03 470.141.03 535.54.03 470.141.03 535.54.03 470.141.03 470.141.03 470.141.03
共100000条