本文永久链接: https://www.xtplayer.cn/rancher/project-management-cattle-io-not-found/

问题背景

有时候可能会在 rancher server 中看到很多如下的错误提示:

2019/07/16 06:33:23 [ERROR] NamespaceController default [resourceQuotaSyncController] failed with : project.management.cattle.io "cluster-vp4z8/project-zj5k9" not found, [resourceQuotaUsedLimitController] failed with : project.management.cattle.io "cluster-vp4z8/project-zj5k9" not found
2019/07/16 06:33:39 [ERROR] NamespaceController kube-system [resourceQuotaSyncController] failed with : project.management.cattle.io "cluster-rvvmm/project-r6l6q" not found, [resourceQuotaUsedLimitController] failed with : project.management.cattle.io "cluster-rvvmm/project-r6l6q" not found

出现问题时,尝试通过在 local 集群或者单 rancher 容器中运行以下命令去查询集群 ID 、项目 ID、命名空间 ID。

kubectl get cluster --all-namespaces
kubectl get projects.management.cattle.io --all-namespaces
kubectl get ns --all-namespaces

对比查询结果,均不存在错误提示中的 集群 ID、项目 ID、命名空间 ID。

问题分析

  1. 新的集群第一次导入时,会自动给 K8S 和 rancher 相关的命名空间添加 annotations: field.cattle.io/projectId 和 labels: field.cattle.io/projectId,rancher 通过这两个参数来控制和更新命名空间。

  2. 找一个命名空间查看其 yaml 配置,比如:kubectl get ns kube-system -oyaml

    apiVersion: v1
    kind: Namespace
    metadata:
    annotations:
    field.cattle.io/projectId: local:p-zkhr5
    lifecycle.cattle.io/create.namespace-auth: "true"
    creationTimestamp: "2019-03-24T05:56:17Z"
    finalizers:
    - controller.cattle.io/namespace-auth
    labels:
    field.cattle.io/projectId: p-zkhr5
    name: kube-system
    resourceVersion: "383933986"
    selfLink: /api/v1/namespaces/kube-system
    uid: 8a3306c1-4df9-11e9-906a-00163e145e40
    spec:
    finalizers:
    - kubernetes
    status:
    phase: Active

    可以看到 labels 和 annotations 中带有与 集群 ID 和项目 ID 相关的参数。

  3. 截止 rancher v2.4.6 、v2.3.9,重复导入的 K8S 集群,原集群中的命名空间不会自动移动到 Rancher projects 下。访问 Rancher UI ,在 集群|项目/命名空间 下可以看到命名空间都是在 全部 下。

  4. 重复导入的 K8S 集群,因为不会自动把命名空间移动到 Rancher projects 下,所以命名空间 yaml 配置的参数没有自动更新,resourceQuotaSyncController 是根据这两个参数来控制命名空间,因此在 Rancher server 中看到了最开始的错误日志。

解决方法

要解决这个问题,只需要让命名空间更新 labels 和 annotations 两个参数即可。

  1. 把如下图的命名空间移动到 system 项目下。
  1. 把 default 命名空间移动到 default 项目下。
  1. 其他的命名空间,根据实际的规划来移动到对应的项目下。