本文永久链接: 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/projectIdlabels: 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

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

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

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

解决方法

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

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