组件异常问题排查

在组件安装、升级、更改配置等过程中出现异常问题时,控制台通常会提示相应的操作异常码。您可以根据操作异常码查找对应的问题,查看问题原因和解决方案。本文介绍操作异常码及其问题原因和解决方案。

AddonOperationFailed.ResourceExists

问题原因

该组件包含的部分资源已经存在于集群中,组件无法直接安装。该现象可能由以下原因造成。

  • 已经通过其他途径在集群中安装了该组件的其他版本,例如社区版本等。

  • 此前使用Helm v2安装过该组件,在升级Helm v3之前没有迁移或卸载组件。

  • 集群中的已创建的某些资源与该组件包含的资源同名。

解决方案

不同原因的解决方案相同,您需要清理集群中存在冲突的资源。具体的资源信息可以从错误信息中获取,以下列错误消息为例。

Addon status not match, failed upgrade helm addon arms-cmonitor for cluster c3cf94b952cd34b54b71b10b7********, err: rendered manifests contain a resource that already exists. Unable to continue with update: ConfigMap "otel-collector-config" in namespace "arms-prom" exists and cannot be imported into the current release

该信息表示您需要先删除arms-prom命名空间下名称为otel-collector-config的ConfigMap。

针对部分特定组件,可以参考下列说明解决资源冲突问题。

  • arms-prometheus

    如果在安装或升级arms-prometheus时遇到资源冲突问题,请您删除之前安装arms-prometheus的命名空间(一般为arms-prom),然后执行如下命令,手动清理以下资源后再试。

    kubectl delete ClusterRole arms-kube-state-metrics
    kubectl delete ClusterRole arms-node-exporter
    kubectl delete ClusterRole arms-prom-ack-arms-prometheus-role
    kubectl delete ClusterRole arms-prometheus-oper3
    kubectl delete ClusterRole arms-prometheus-ack-arms-prometheus-role
    kubectl delete ClusterRole arms-pilot-prom-k8s
    kubectl delete ClusterRoleBinding arms-node-exporter
    kubectl delete ClusterRoleBinding arms-prom-ack-arms-prometheus-role-binding
    kubectl delete ClusterRoleBinding arms-prometheus-oper-bind2
    kubectl delete ClusterRoleBinding kube-state-metrics
    kubectl delete ClusterRoleBinding arms-pilot-prom-k8s
    kubectl delete ClusterRoleBinding arms-prometheus-ack-arms-prometheus-role-binding
    kubectl delete Role arms-pilot-prom-spec-ns-k8s
    kubectl delete Role arms-pilot-prom-spec-ns-k8s -n kube-system
    kubectl delete RoleBinding arms-pilot-prom-spec-ns-k8s
    kubectl delete RoleBinding arms-pilot-prom-spec-ns-k8s -n kube-system
  • ack-node-local-dns

    如果在升级ack-node-local-dns时遇到资源冲突问题,请执行如下命令,手动清理以下资源后再试。

    重要

    删除这些资源不会对您的业务产生影响,但在删除资源之后到再次升级成功的这段时间内,请尽量避免新增容器Pod。如果在这期间有新增容器Pod,建议在组件升级完成后对新增Pod进行删除重建,以重新注入DNS缓存。

    kubectl delete MutatingWebhookConfiguration ack-node-local-dns-admission-controller
  • arms-cmonitor

    如果在安装或升级arms-cmonitor时遇到资源冲突问题,请执行如下命令,手动清理以下资源后再试。

    kubectl delete ConfigMap otel-collector-config -n arms-prom
    kubectl delete ClusterRoleBinding arms-prom-cmonitor-role-binding
    kubectl delete ClusterRoleBinding arms-prom-cmonitor-install-init-role-binding
    kubectl delete ClusterRole arms-prom-cmonitor-role
    kubectl delete ClusterRole arms-prom-cmonitor-install-init-role
    kubectl delete ServiceAccount cmonitor-sa-install-init -n kube-system

AddonOperationFailed.ReleaseNameInUse

问题原因

该组件使用Helm安装,集群中已存在同名的Helm Release实例,无法直接安装或升级组件。该现象可能由以下原因造成。

  • 已经通过其他途径在集群中安装了该组件的其他版本,例如社区版本等。

  • 此前安装的Helm Release删除后未完全清理。

解决方案

不同原因的解决方案相同,请先清理集群中已存在的实例,操作步骤如下。

  1. 登录容器服务管理控制台,在左侧导航栏单击集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm

  3. 在Helm应用列表中查找同名的Helm Release,Helm Release名称与组件名称相同。然后单击操作列的删除,选中清除发布记录,将同名Release删除。

  4. 确认删除完成后,重新安装或升级组件。

AddonOperationFailed.WaitForAddonReadyTimeout

问题原因

组件变更已下发,但组件Pod没有到达就绪状态,导致组件变更无法完成。

排查方法

通过查看集群事件判断组件Pod无法就绪的原因,操作步骤如下。

  1. 登录容器服务管理控制台,在左侧导航栏单击集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 事件中心

  3. 事件列表页签中,选择组件所在的命名空间,类型选择Pod级别选择Warning,查看对应的事件。

    在查询到的事件列表中查看组件Pod相关的异常事件,根据事件内容和详细描述初步判断Pod未就绪的原因。一些常见异常事件类型、原因和解决方案,请参见下文常见异常原因和解决方案

常见异常原因和解决方案

原因一:Pod无法被调度

对应事件内容:FailedScheduling

原因详述:集群中的节点无法满足Pod的调度要求,可能由以下一种或多种原因导致。可以通过事件的详细描述确定具体原因。

  • 集群节点可用的CPU、内存资源不足,无法满足组件Pod的资源需求,对应事件描述中存在Insufficient memoryInsufficient cpu等字样;

  • 节点存在组件Pod未容忍的污点,对应事件描述中存在the pod didn't tolerate等字样;

  • 节点数量过少,无法满足组件Pod的反亲和性要求,对应事件描述中存在didn't match pod anti-affinity rules等字样。

解决方案:可以参考以下方法满足组件Pod的调度要求,处理完成之后再次尝试组件变更操作。

原因二:Pod创建失败

对应事件内容:FailedCreatePodSandBox

原因详述:Pod sandbox创建失败,常见原因是网络插件无法为Pod分配IP地址。

解决方案:

  • 如果事件描述中包含vSwitch have insufficient IP等字样,请扩容Terway场景下的Pod虚拟交换机。具体操作,请参见扩容Terway场景下的Pod虚拟交换机

  • 如果事件描述中包含transport: Error while dialing等字样,请检查集群网络插件是否工作正常。检查方法,请参见Pod异常问题排查

AddonOperationFailed.APIServerUnreachable

问题原因

ACK无法访问集群APIServer,可能由集群APIServer SLB等资源异常或配置错误导致。

解决方案

请参见当前集群APIServer请求异常进行排查。

AddonOperationFailed.ResourceNotFound

问题原因

组件相关资源查询异常,无法直接升级,可能由于相关资源被手工修改或删除导致。

解决方案

请先卸载该组件,然后重新安装最新版本。

AddonOperationFailed.TillerUnreachable

问题原因

安装组件时使用Helm v2且依赖集群中的tiller,或者升级组件时依赖集群中的tiller,而tiller出现异常,无法访问,导致组件相关操作无法执行。

解决方案

可以尝试重启集群中的tiller解决异常问题,操作步骤如下。

  1. 登录容器服务管理控制台,在左侧导航栏单击集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 容器组

  3. 切换到kube-system命名空间,在列表中查找名为tiller的容器组,将其删除,等待重新拉起。

  4. 等待tiller pod到达就绪状态后,再次尝试组件操作。

AddonOperationFailed.FailedCallingWebhook

问题原因

集群中配置了针对某些资源的Mutating Webhook,并且Webhook服务无法正常调用,导致组件包含的资源无法正常变更。

解决方案

排查相关Webhook服务存在的异常,待Webhook恢复正常后再尝试组件变更操作。存在异常的Webhook服务可以从错误消息中获取。以下列错误消息为例。

failed to create: Internal error occurred: failed calling webhook "rancher.cattle.io": failed to call webhook: Post "https://rancher-webhook.cattle-system.svc:443/v1/webhook/mutation?timeout=10s": no endpoints available for service "rancher-webhook"

该信息表明rancher-webhook存在异常。

AddonOperationFailed.UserForbidden

问题原因

集群使用了Helm v2,并且没有为tiller配置正确的RBAC权限,tiller无法正常查询和更新资源,导致组件无法安装或升级。

解决方案

为tiller配置RBAC权限。详细信息,请参见Role-based Access Control

AddonOperationFailed.TillerNotFound

问题原因

集群使用了Helm v2,但集群中没有处于正常状态的tiller pod,导致组件操作无法通过Helm发起。

解决方案

可以检查kube-system命名空间下名称前缀为tiller-deploy的Pod,将该Pod恢复正常状态后再次尝试组件操作。Pod异常问题排查,请参见Pod异常问题排查

AddonOperationFailed.ErrPatchingClusterRoleBinding

问题原因

集群中已存在该组件依赖的同名ClusterRoleBinding,但定义存在差异,无法直接升级。一般是由于集群内已经安装该组件的社区版本导致。

解决方案

如果希望安装或升级该组件,请先清理集群中已存在的版本,操作步骤如下。

  1. 登录容器服务管理控制台,在左侧导航栏单击集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm

  3. 在Helm应用列表中查找同名的Helm Release,Helm Release名称与组件名称相同。然后单击操作列的删除,选中清除发布记录,将同名release删除。

  4. 确认删除完成后,重新安装或升级组件。

AddonOperationFailed.ErrApplyingPatch

问题原因

该组件新旧版本的YAML模板存在无法兼容的问题,导致组件无法正常升级。该现象可能由于以下原因造成:

  • 已经通过其他途径在集群中安装了该组件的其他版本,例如社区版本等。

  • 手动修改过组件的YAML模板。

  • 当前组件旧版本已经不再维护。

解决方案

您可能需要根据报错信息对当前集群已安装的组件模板进行手动处理。具体解决方案,可提交工单咨询。

示例

例如,由于集群安装的旧版Flannel版本已经不再维护,升级时存在Container Name冲突的问题,导致组件升级失败。报错如下:

spec.template.spec.initContainers[1].name: Duplicate value: \"install-cni\"

解决此类问题,您可以通过执行命令kubectl -n kube-system edit ds kube-flannel-ds,编辑Flannel的YAML模板,删除spec.template.spec.containers字段中名为install-cni的一整段container定义(删除示例代码的7~21行注释行)。

      containers:
      - name: kube-flannel
        image: registry-vpc.{{.Region}}.aliyuncs.com/acs/flannel:{{.ImageVersion}}
        command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr" ]
        ...
        # 此处省略,删除7~21注释行。
    # - command:
      # - /bin/sh
      # - -c
      # - set -e -x; cp -f /etc/kube-flannel/cni-conf.json /etc/cni/net.d/10-flannel.conf;
        # while true; do sleep 3600; done
      # image: registry-vpc.cn-beijing.aliyuncs.com/acs/flannel:v0.11.0.1-g6e46593e-aliyun
      # imagePullPolicy: IfNotPresent
      # name: install-cni
      # resources: {}
      # terminationMessagePath: /dev/termination-log
      # terminationMessagePolicy: File
      # volumeMounts:
      # - mountPath: /etc/cni/net.d
        # name: cni
      # - mountPath: /etc/kube-flannel/
         # 以下省略,删除7~21注释行。
          name: flannel-cfg
        ...
       

删除上述YAML模板片段不会导致业务中断,片段删除后Flannel容器会自动进行滚动更新。更新完成后,您可在控制台重新触发Flannel组件版本升级。关于如何升级组件,请参见管理组件