云服务器内容精选

  • 排查项二:节点资源(CPU、内存等)是否充足 0/2 nodes are available: 2 Insufficient cpu. CPU不足。 0/2 nodes are available: 2 Insufficient memory. 内存不足。 当“实例资源的申请量”超过了“实例所在节点的可分配资源总量”时,节点无法满足实例所需资源要求导致调度失败。 如果节点可分配资源小于Pod的申请量,则节点无法满足实例所需资源要求导致调度失败。 解决方案: 资源不足的情况主要解决办法是扩容,建议在集群中增加节点数量。
  • 排查思路 根据具体事件信息确定具体问题原因,如表1所示。 表1 实例调度失败 事件信息 问题原因与解决方案 no nodes available to schedule pods. 集群中没有可用的节点。 排查项一:集群内是否无可用节点 0/2 nodes are available: 2 Insufficient cpu. 0/2 nodes are available: 2 Insufficient memory. 节点资源(CPU、内存)不足。 排查项二:节点资源(CPU、内存等)是否充足 0/2 nodes are available: 1 node(s) didn't match node selector, 1 node(s) didn't match pod affinity rules, 1 node(s) didn't match pod affinity/anti-affinity. 节点与Pod亲和性配置互斥,没有满足Pod要求的节点。 排查项三:检查工作负载的亲和性配置 0/2 nodes are available: 2 node(s) had volume node affinity conflict. Pod挂载云硬盘存储卷与节点不在同一个可用区。 排查项四:挂载的存储卷与节点是否处于同一可用区 0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate. 节点存在污点Tanits,而Pod不能容忍这些污点,所以不可调度。 排查项五:检查Pod污点容忍情况 0/7 nodes are available: 7 Insufficient ephemeral-storage. 节点临时存储不足。 排查项六:检查临时卷使用量 0/1 nodes are available: 1 everest driver not found at node 节点上everest-csi-driver不在running状态。 排查项七:检查everest插件是否工作正常 Failed to create pod sandbox: ... Create more free space in thin pool or use dm.min_free_space option to change behavior 节点thinpool空间不足。 排查项八:检查节点thinpool空间是否充足 0/1 nodes are available: 1 Too many pods. 该节点调度的Pod超出上限。 检查项九:检查节点上调度的Pod是否过多
  • 排查项五:检查Pod污点容忍情况 0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate. 是因为节点打上了污点,不允许Pod调度到节点上。 查看节点的上污点的情况。如下则说明节点上存在污点。 $ kubectl describe node 192.168.0.37 Name: 192.168.0.37 ... Taints: key1=value1:NoSchedule ... 在某些情况下,系统会自动给节点添加一个污点。当前内置的污点包括: node.kubernetes.io/not-ready:节点未准备好。 node.kubernetes.io/unreachable:节点控制器访问不到节点。 node.kubernetes.io/memory-pressure:节点存在内存压力。 node.kubernetes.io/disk-pressure:节点存在磁盘压力,此情况下您可通过节点磁盘空间不足的方案进行解决。 node.kubernetes.io/pid-pressure:节点的 PID 压力,此情况下您可通过修改节点进程 ID数量上限kernel.pid_max进行解决。 node.kubernetes.io/network-unavailable:节点网络不可用。 node.kubernetes.io/unschedulable:节点不可调度。 node.cloudprovider.kubernetes.io/uninitialized:如果kubelet启动时指定了一个“外部”云平台驱动, 它将给当前节点添加一个污点将其标志为不可用。在cloud-controller-manager初始化这个节点后,kubelet将删除这个污点。 解决方案: 要想把Pod调度到这个节点上,有两种方法: 若该污点为用户自行添加,可考虑删除节点上的污点。若该污点为系统自动添加,解决相应问题后污点会自动删除。 Pod的定义中容忍这个污点,如下所示。详细内容请参见污点和容忍。 apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx:alpine tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoSchedule"
  • 排查项八:检查节点thinpool空间是否充足 节点在创建时会绑定一个供kubelet及容器引擎使用的专用数据盘,详情请参见数据盘空间分配说明。若数据盘空间不足,将导致实例无法正常创建。 方案一:清理镜像 您可以执行以下步骤清理未使用的镜像: 使用containerd容器引擎的节点: 查看节点上的本地镜像。 crictl images -v 确认镜像无需使用,并通过镜像ID删除无需使用的镜像。 crictl rmi {镜像ID} 使用docker容器引擎的节点: 查看节点上的本地镜像。 docker images 确认镜像无需使用,并通过镜像ID删除无需使用的镜像。 docker rmi {镜像ID} 请勿删除cce-pause等系统镜像,否则可能导致无法正常创建容器。 方案二:扩容磁盘 扩容磁盘的操作步骤如下: 在EVS界面扩容数据盘。 登录CCE控制台,进入集群,在左侧选择“节点管理”,单击节点后的“同步云服务器”。 登录目标节点。 使用lsblk命令查看节点块设备信息。 这里存在两种情况,根据容器存储Rootfs而不同。 Overlayfs,没有单独划分thinpool,在dockersys空间下统一存储镜像相关数据。 # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 8:0 0 50G 0 disk └─vda1 8:1 0 50G 0 part / vdb 8:16 0 200G 0 disk ├─vgpaas-dockersys 253:0 0 90G 0 lvm /var/lib/docker # 容器引擎使用的空间 └─vgpaas-kubernetes 253:1 0 10G 0 lvm /mnt/paas/kubernetes/kubelet # kubernetes使用的空间 在节点上执行如下命令, 将新增的磁盘容量加到dockersys盘上。 pvresize /dev/vdb lvextend -l+100%FREE -n vgpaas/dockersys resize2fs /dev/vgpaas/dockersys Devicemapper,单独划分了thinpool存储镜像相关数据。 # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 8:0 0 50G 0 disk └─vda1 8:1 0 50G 0 part / vdb 8:16 0 200G 0 disk ├─vgpaas-dockersys 253:0 0 18G 0 lvm /var/lib/docker ├─vgpaas-thinpool_tmeta 253:1 0 3G 0 lvm │ └─vgpaas-thinpool 253:3 0 67G 0 lvm # thinpool空间 │ ... ├─vgpaas-thinpool_tdata 253:2 0 67G 0 lvm │ └─vgpaas-thinpool 253:3 0 67G 0 lvm │ ... └─vgpaas-kubernetes 253:4 0 10G 0 lvm /mnt/paas/kubernetes/kubelet 在节点上执行如下命令, 将新增的磁盘容量加到thinpool盘上。 pvresize /dev/vdb lvextend -l+100%FREE -n vgpaas/thinpool 在节点上执行如下命令, 将新增的磁盘容量加到dockersys盘上。 pvresize /dev/vdb lvextend -l+100%FREE -n vgpaas/dockersys resize2fs /dev/vgpaas/dockersys
  • 排查项六:检查临时卷使用量 0/7 nodes are available: 7 Insufficient ephemeral-storage. 节点临时存储不足。 检查Pod是否限制了临时卷的大小,如下所示,当应用程序需要使用的量超过节点已有容量时会导致无法调度,修改临时卷限制或扩容节点磁盘可解决此问题。 apiVersion: v1 kind: Pod metadata: name: frontend spec: containers: - name: app image: images.my-company.example/app:v4 resources: requests: ephemeral-storage: "2Gi" limits: ephemeral-storage: "4Gi" volumeMounts: - name: ephemeral mountPath: "/tmp" volumes: - name: ephemeral emptyDir: {}
  • 检查项九:检查节点上调度的Pod是否过多 0/1 nodes are available: 1 Too many pods.表示节点上调度的Pod过多,超出可调度的最大实例数。 创建节点时,在“高级配置”中可选择设置“最大实例数”参数,设置节点上可以正常运行的容器 Pod 的数目上限。该数值的默认值随节点规格浮动,您也可以手动设置。 图1 最大实例数 您可以在“节点管理”页面,查看节点的“容器组(已分配/总额度)”参数列,检查节点已调度的容器是否达到上限。若已达到上限,可通过添加节点或修改最大实例数的方式解决。 您可通过以下方式修改“最大实例数”参数: 默认节点池中的节点:通过重置节点时修改“最大实例数”。 自定义节点池中的节点:可修改节点池配置参数中的max-pods参数。详情请参见节点池配置管理。 图2 查看容器数
  • 排查项三:检查工作负载的亲和性配置 当亲和性配置出现如下互斥情况时,也会导致实例调度失败: 例如: workload1、workload2设置了工作负载间的反亲和,如workload1部署在Node1,workload2部署在Node2。 workload3部署上线时,既希望与workload2亲和,又希望可以部署在不同节点如Node1上,这就造成了工作负载亲和与节点亲和间的互斥,导致最终工作负载部署失败。 0/2 nodes are available: 1 node(s) didn't match node selector, 1 node(s) didn't match pod affinity rules, 1 node(s) didn't match pod affinity/anti-affinity. node selector 表示节点亲和不满足。 pod affinity rules 表示Pod亲和不满足。 pod affinity/anti-affinity 表示Pod亲和/反亲和不满足。 解决方案: 在设置“工作负载间的亲和性”和“工作负载和节点的亲和性”时,需确保不要出现互斥情况,否则工作负载会部署失败。 若工作负载配置了节点亲和性,需确保亲和的节点标签中supportContainer设置为true,否则会导致pod无法调动到节点上,查看事件提示如下错误信息: No nodes are available that match all of the following predicates: MatchNode Selector, NodeNotSupportsContainer 节点标签为false时将会调度失败。
  • 排查项四:挂载的存储卷与节点是否处于同一可用区 0/2 nodes are available: 2 node(s) had volume node affinity conflict. 存储卷与节点之间存在亲和性冲突,导致无法调度。 这是因为云硬盘不能跨可用区挂载到节点。例如云硬盘存储卷在可用区1,节点在可用区2,则会导致无法调度。 CCE中创建云硬盘存储卷,默认带有亲和性设置,如下所示: kind: PersistentVolume apiVersion: v1 metadata: name: pvc-c29bfac7-efa3-40e6-b8d6-229d8a5372ac spec: ... nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: failure-domain.beta.kubernetes.io/zone operator: In values: - cn-east-3a 解决方案: 重新创建存储卷,可用区选择与节点同一分区,或重新创建工作负载,存储卷选择自动分配。
  • 排查项七:检查everest插件是否工作正常 0/1 nodes are available: 1 everest driver not found at node。集群everest插件的everest-csi-driver 在节点上未正常启动。 检查kube-system命名空间下名为everest-csi-driver的守护进程,查看对应Pod是否正常启动,若未正常启动,删除该Pod,守护进程会重新拉起该Pod。
  • 前提条件 使用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及之前的集群版本。
  • 约束与限制 CustomedHPA策略仅支持1.15及以上版本的集群。 1.19.10以下版本的集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,当新Pod被调度到另一个节点时,会导致之前Pod不能正常读写。 1.19.10及以上版本集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,新Pod会因为无法挂载云硬盘导致无法成功启动。 CCE容器弹性引擎插件的资源使用量主要受集群中总容器数量和伸缩策略数量影响,通常场景下建议每5000容器配置CPU 500m, 内存1000Mi资源,每1000伸缩策略CPU 100m,内存500Mi。 若cce-hpa-controller插件版本低于1.2.11,不支持使用云原生监控插件插件提供Metrics API来实现工作负载弹性伸缩。 创建CustomedHPA策略后,不支持将已关联的工作负载修改为其他工作负载。
  • 工作负载事件中出现Cluster pod max limit exceeded如何解决? 创建工作负载时,事件中出现以下错误: Cluster pod max limit exceeded(x) 该事件信息表示集群中的Pod数量达到上限值,无法再新建Pod,其中x为集群Pod数量上限,默认为500。 解决方案 请合理规划集群中的Pod数量,避免达到上限值。 集群中安装的插件实例会占用Pod配额,请合理规划。
  • 创建工作负载时无法拉取SWR镜像如何解决? 在Autopilot集群中创建工作负载时,出现以下错误: Failed to pull image "swr.cn-north-**.myhuaweicloud.com/**/nginx:latest": rpc error: code = Unknown desc = failed to pull and unpack image "swr.cn-north-7.myhuaweicloud.com/**/nginx:latest": failed to resolve reference "swr.cn-north-7.myhuaweicloud.com/**/nginx/latest": failed to do request: Head "https://swr.cn-north-**.myhuaweicloud.com/v2/**/nginx/manifests/latest": dial tcp 100.79.**.**:443: i/o timeout 报错信息中说明创建工作负载时无法拉取SWR镜像,请检查OBS和SWR终端节点是否正常。 解决方案 如果未创建OBS和SWR终端节点,请参考配置访问SWR和OBS服务的VPC终端节点进行配置。
  • 创建无状态负载 登录UCS控制台,在左侧导航栏中选择“容器舰队”。 在“容器舰队”页签下找到已开通集群联邦的舰队,单击名称进入详情页。 在左侧导航栏中选择“工作负载”,在“无状态负载”页签中单击右上角“镜像创建”。 若使用已有的YAML创建工作负载,请单击右上角“YAML创建”。 设置工作负载基本信息。 负载类型:选择“无状态负载”。 负载名称:新增工作负载的名称,命名必须唯一。 命名空间:选择工作负载所在命名空间。如需新建命名空间,请参见创建命名空间。 描述:工作负载的描述信息。 实例数量:设置多集群的工作负载中各集群的实例数。用户可以设置具体实例个数,默认为2。每个工作负载实例都由相同的容器部署而成。在UCS中可以通过设置弹性扩缩容策略,根据工作负载资源使用情况,动态调整工作负载实例数。 设置工作负载容器配置。 Pod中可以配置多个容器,您可以单击右侧“添加容器”为Pod配置多个容器并分别进行设置。 基本信息: 表1 基本信息参数说明 参数 说明 容器名称 为容器命名。 镜像名称 单击后方“选择镜像”,选择容器使用的镜像。 我的镜像:当前区域下华为云镜像仓库中的镜像。若无可用的镜像,可单击“上传镜像”进行上传。 镜像中心:开源镜像仓库中的官方镜像。 共享镜像:由他人账号共享的私有镜像,详情请参见共享私有镜像。 镜像版本 选择需要部署的镜像版本。 更新策略 镜像更新/拉取策略。勾选“总是拉取镜像”表示每次都从镜像仓库拉取镜像;如不勾选则优先使用节点已有的镜像,如果没有这个镜像再从镜像仓库拉取。 CPU配额 申请:容器需要使用的最小CPU值,默认0.25Core。 限制:允许容器使用的CPU最大值。建议设容器配额的最高限额,避免容器资源超额导致系统故障。 内存配额 申请:容器需要使用的内存最小值,默认512MiB。 限制:允许容器使用的内存最大值。如果超过,容器会被终止。 关于CPU/内存配额申请和限制的具体说明请参见设置容器规格。 初始化容器 选择容器是否作为初始化容器。 Init 容器是一种特殊容器,在 Pod 内的应用容器启动之前运行。详细说明请参见Init 容器。 生命周期:设置生命周期回调函数可在容器的特定阶段执行调用,比如容器在停止前希望执行某项操作,就可以设置相应的函数。目前提供的生命周期回调函数有启动命令、启动后处理、停止前处理,详情请参见设置容器生命周期。 健康检查:设置健康检查可以在容器运行过程中定时检查容器的健康状况,详情请参见设置容器健康检查。 环境变量:容器运行环境中设定的一个变量,通过环境变量设置的配置项不会随着Pod生命周期结束而变化,详情请参见设置环境变量。 数据存储:配置容器存储,可以使用本地存储和存储卷声明(PVC)。建议使用PVC将工作负载Pod数据存储在云存储上。若存储在本地磁盘上,节点异常无法恢复时,本地磁盘中的数据也将无法恢复。容器存储相关内容请参见容器存储。 安全设置:对容器权限进行设置,保护系统和其他容器不受其影响。请输入用户ID,容器将以当前用户权限运行。 镜像访问凭证:用于访问镜像仓库的凭证。该凭证仅访问私有镜像仓库时使用,如所选镜像为公开镜像,则无需选择密钥。密钥的创建方法请参见创建密钥。 (可选)单击服务配置栏的,进行工作负载服务配置。 若工作负载需要和其它服务互访,或需要被公网访问,您需要添加服务(Service),设置访问方式。工作负载访问的方式决定了这个工作负载的网络属性,不同访问方式的工作负载可以提供不同网络能力,操作详情请参见服务与路由。 您也可以在创建完工作负载之后再创建Service,参见集群内访问(ClusterIP)和节点访问(NodePort)。 Service名称:新增服务名称,用户可自定义,服务名称必须唯一。 访问类型: 集群内访问(ClusterIP):只能集群内访问服务。 节点访问(NodePort):可以通过集群内任意节点访问到服务。 服务亲和(仅节点访问设置): 集群级别:集群下所有节点的IP+访问端口均可以访问到此服务关联的负载,服务访问会因路由跳转导致一定性能损失,且无法获取到客户端源IP。 节点级别:只有通过负载所在节点的IP+访问端口才可以访问此服务关联的负载,服务访问没有因路由跳转导致的性能损失,且可以获取到客户端源IP。 端口配置: 协议:TCP或UDP,请根据业务的协议类型选择。 服务端口:容器端口映射到集群虚拟IP上的端口,用虚拟IP访问应用时使用,端口范围为1-65535,可任意指定。 容器端口:容器镜像中应用程序实际监听的端口,需用户确定。例如:nginx程序实际监听的端口为80。 节点端口(仅节点访问设置):容器端口映射到节点私有IP上的端口,用私有IP访问应用时使用,端口范围为30000-32767,建议选择“自动生成”。 自动生成:系统会自动分配端口号。 指定端口:指定固定的节点端口,默认取值范围为30000-32767。若指定端口时,请确保同个集群内的端口唯一性。 (可选)单击“展开高级配置”,设置工作负载高级配置。 升级策略:指定无状态负载的升级方式,包括整体替换升级和逐步滚动升级,详细参数说明请参见配置工作负载升级策略。 滚动升级:滚动升级将逐步用新版本的实例替换旧版本的实例,升级的过程中,业务流量会同时负载均衡分布到新的和旧的实例上,因此业务不会中断。 替换升级:先删除旧实例,再创建新实例。升级过程中业务会中断。 调度策略:您可设置亲和(affinity)与反亲和(anti-affinity)实现Pod的计划性调度,详细信息请参见配置调度策略(亲和与反亲和)。 标签与注解:您可以单击“添加”为Pod增加标签或注解,新增标签或注解的键不能与已有的重复。 容忍策略:当工作负载实例所在的节点不可用时,系统将实例重新调度到其它可用节点的时间窗,默认为300秒。 单击“下一步:调度与差异化”,对选择的集群进行调度与差异化配置。在选择可调度集群后,可对容器进行“差异化配置”。 集群调度策略: 调度方式: 集群权重:手动设置各集群的权重,工作负载在各集群的实例数将根据设置的权重比例进行分配。 自动均衡:工作负载将根据资源余量在可调度的集群中自动选择集群进行部署。 部署集群:选择工作负载可调度的集群,集群个数请您根据自身业务进行确定。 “集群权重”模式下,需手动设置各集群权重值,权重非0的集群将自动勾选为可调度集群,权重为0则表示该集群不可调度。状态非正常的集群无法设置权重。 “自动均衡”模式下,单击集群即可将其勾选为可调度集群。 差异化配置: 工作负载在不同的集群中部署可进行差异化的配置。在选择可调度集群后单击对应集群右上角,即可对每个集群进行差异化配置,差异化后的容器配置只对该集群生效。 具体参数说明请参见容器配置。 设置完成后,单击“创建工作负载”,完成创建后,可单击“返回工作负载列表”查看所创建的工作负载。
  • 工作负载基本概念 无状态工作负载(即Kubernetes中的Deployment):实例之间完全独立、功能相同,具有弹性伸缩、滚动升级等特性。如:nginx、wordpress,创建无状态工作负载请参见创建无状态工作负载。 有状态工作负载(即Kubernetes中的StatefulSet):实例之间不完全独立,具有稳定的持久化存储和网络标示,以及有序的部署、收缩和删除等特性。如:mysql-HA、etcd,创建有状态工作负载请参见创建有状态工作负载。 守护进程集(即Kubernetes中的DeamonSet):在集群的每个节点上运行一个Pod,且保证只有一个Pod,适合一些系统层面的应用,如日志收集、资源监控等,创建守护进程集请参见创建守护进程集。