本文介绍授权管理过程的一些常见问题的解决方法。

鉴权失败问题

RBAC授权使用问题

RAM授权使用问题

控制台提示没有权限,报错详情:ForbiddenQueryClusterNamespace Forbidden query namespaces

问题现象

当您在控制台界面操作时,出现错误提示ForbiddenQueryClusterNamespace Forbidden query namespaces

问题原因和解决措施

当前RAM用户或RAM角色没有任何集群内Namespace的RBAC访问权限,需要在授权管理页面对该账号进行授权,具体操作,请参见配置RAM用户或RAM角色RBAC权限

控制台提示没有权限,报错详情:APISERVER_403

问题现象

当您在控制台界面操作时,出现错误提示APISERVER_403

问题原因和解决措施

当前RAM用户或RAM角色没有被授予K8s集群相应的RBAC权限,需要在授权管理页面对该账号进行授权。具体操作,请参见配置RAM用户或RAM角色RBAC权限。关于K8s RBAC鉴权的更多说明,请参见官方文档

控制台提示子账号不具备授权管理权限

问题现象

当您在控制台界面操作时,出现错误提示当前子账号不具备授权管理权限,请联系主账号或权限管理员授权

问题原因

当前RAM用户或RAM角色缺少必要的RAM授权或对集群的RBAC管理员权限。默认情况下,RAM用户或RAM角色(该例用RAM用户或RAM角色A描述)不具备对其他RAM用户或RAM角色授权RBAC的能力。

解决措施
说明 RAM用户或RAM角色如何给其他RAM用户或RAM角色进行RBAC授权,请参见以下内容进行操作。
  • RBAC管理员权限:需要确保当前登录的RAM用户或RAM角色在目标集群或命名空间上被授予预置的管理员角色或自定义中的cluster-admin角色。
  • RAM授权权限:需要确保当前登录的RAM用户或RAM角色被授予必要的RAM权限,策略内容需要包括:
    • 列举其他RAM用户或RAM角色
    • 给指定RAM用户或RAM角色授予RAM权限策略
    • 查看指定RAM用户或RAM角色的K8s RBAC权限配置
    • K8s RBAC授权能力

授予RAM权限方法:

登录RAM控制台,向RAM用户或RAM角色A授予RAM权限,请参见自定义RAM授权策略。 授权策略内容示例参考如下:

{
    "Statement": [{
            "Action": [
                "ram:Get*",
                "ram:List*",
                "cs:GetUserPermissions",
                "cs:GetSubUsers",
                "cs:GrantPermission"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "ram:AttachPolicyToUser",
                "ram:AttachPolicyToRole"
            ],
            "Effect": "Allow",
            "Resource":  [
                "acs:ram:*:*:policy/xxxxxx",
                "acs:*:*:*:user/*"
            ]
        }
    ],
    "Version": "1"
}
说明 xxxxxx需要替换成您想要绑定的RAM策略名称。例如,您替换成*,表示RAM用户或RAM角色A拥有所有RAM策略的授权绑定能力。

当RAM用户或RAM角色A完成了上述策略的绑定后,即拥有对其他RAM用户或RAM角色在指定策略范围内的RAM授权能力,以及在集群内的RBAC授权能力。关于对其他RAM用户或RAM角色授权的具体操作,请参见配置RAM用户或RAM角色RBAC权限

根据错误信息判断是RAM授权问题还是RBAC授权问题

可以通过API或控制台的错误信息快速判断是RAM权限缺失还是RBAC权限缺失导致的问题。
  • RAM权限缺失问题

    问题现象

    API或控制台上报类似下方的错误信息:
    RAM policy Forbidden for action cs:DescribeEvents
    STSToken policy Forbidden for action cs:DescribeClusterNodes

    问题原因

    从上述错误信息可以得出,RAM用户或RAM角色未授权RAM Action cs:DescribeEvents的权限。

    解决方案

    如果API或控制台的错误信息中包含RAM policy ForbiddenSTSToken policy Forbidden,说明是RAM权限缺失导致的问题。请对相应的RAM权限进行授权,具体操作,请参见自定义RAM授权策略

  • RBAC权限缺失问题

    问题现象

    API或控制台上报类似下方的错误信息:
    events is forbidden: User "<uid>" cannot list resource "events" in API group "" at the cluster scope
    ForbiddenQueryClusterNamespace, Forbidden query namespaces

    问题原因

    从上述错误信息可以得出,用户<uid>未被授权列出资源事件的权限。

    解决方案

    如果API或控制台的错误信息中包含APISERVER_403User "xxx" cannot xx resource "xx" in API groupForbiddenQueryClusterNamespace,说明是RBAC权限缺失导致的问题。请对相应角色添加对应集群内RBAC权限,具体操作,请参见配置RAM用户或RAM角色RBAC权限

已经有AdministratorAccess或AliyunCSFullAccess权限,仍旧无法访问集群

容器服务ACK的授权体系包含RAM授权和RBAC授权两部分。更多信息,请参见授权概述。在RAM管理控制台完成AdministratorAccess或AliyunCSFullAccess的RAM授权后,还需要在授权管理页面完成RBAC授权后才能访问集群。关于如何进行RBAC授权,请参见配置RAM用户或RAM角色RBAC权限

授权是否可以精确到应用级别?

可以。您可以通过自定义ClusterRole策略,在策略规则中的resourceNames字段指定相应应用实例名称实现应用级别的授权。

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击授权管理
  3. 授权管理页面中的选择子账号配置向导中选择需要授权的RAM用户或RAM角色,单击管理权限
    说明 如果您使用RAM用户或RAM角色授权,请先确保该RAM用户或RAM角色已完成集群RBAC配置自定义RAM授权策略文档中的RAM授权,同时已被授予集群内RBAC管理员权限或cluster-admin角色。
  4. 单击集群RBAC配置页面的122添加权限,指定集群和命名空间,选中自定义角色,并在自定义的下拉列表中选择对应的ClusterRole名称,完成后单击下一步
    AN13
    说明 当前针对RAM用户或RAM角色的授权,支持在一个目标集群或命名空间上授予一个预置角色和多个自定义角色。
    集群和命名空间的预置角色定义可查看下面的角色权限说明:
    表 1. 角色权限说明
    角色 集群内RBAC权限
    管理员 对所有命名空间下所有资源的读写权限。
    运维人员 对所有命名空间下控制台可见Kubernetes资源的读写权限,对集群节点、存储卷、命名空间、配额的只读权限。
    开发人员 对所有命名空间或所选命名空间下控制台可见Kubernetes资源的读写权限。
    受限用户 对所有命名空间或所选命名空间下控制台可见Kubernetes资源的只读权限。
    自定义 权限由您所选择的ClusterRole决定,请在确定所选ClusterRole对各类资源的操作权限后再进行授权,以免RAM用户或RAM角色获得不符合预期的权限。详情请参见容器服务自定义 RAM 授权策略

    相关后续操作步骤,请参见配置RAM用户或RAM角色RBAC权限

被授权了cs:admin权限的RAM用户或RAM角色在K8s无法创建CRD

部分容器服务集群(2019年05月以前创建的集群)的默认管理员权限并不包含全部K8s资源访问权限,您可以绑定一个自定义的cluster-admin,或者删除集群已有cs:admin的ClusterRole,然后重新创建ClusterRole。

YAML文件模板样例如下:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cs:admin
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
- nonResourceURLs:
  - '*'
  verbs:
  - '*'

RAM用户或RAM角色如何给其他RAM用户或RAM角色进行RBAC授权

若您登录过程中遇到此问题,请参见控制台提示子账号不具备授权管理权限操作解决。

已授予RAM用户或RAM角色对所有集群的只读权限,但部分集群看不到

问题现象

通过RAM控制台给RAM用户或RAM角色授权了全部集群的只读权限,通过RBAC授予了其中两个集群指定命名空间的访问权限。之前RAM用户或RAM角色在控制台可以看到所有集群,然而现在只能看到部分集群。用户的RAM权限正常,且近期没有做权限变更。

问题原因

您没有使用对应的RAM用户或RAM角色登录RAM控制台或者使用了特定的资源组,切换为使用相应的RAM用户或RAM角色登录RAM控制台并且资源组切换为账号全部资源

解决方案

  1. 登录容器服务管理控制台
  2. 在顶部菜单栏,选择账号全部资源 > 账号全部资源
    11
  3. 将鼠标移至控制台右上角头像位置,确保是子账号登录。

如何给RAM用户或RAM角色添加创建集群的权限?

  1. 用阿里云账号进行容器服务系统角色的批量授权。
    • 服务角色的授权是一次性操作,如果您不确定是否已经完成,可以使用阿里云账号登录后打开以下链接做容器服务系统角色一次性的批量授权:ur.alipay.com/1paTcxSWdAEW70GVH5TZiO
    • 关于容器服务默认系统角色说明,请参见容器服务默认角色
  2. 主账号对目标子账号进行自定义RAM授权策略操作。

    请确保目标RAM账号至少有cs:CreateCluster权限。具体操作,请参见自定义RAM授权策略

    YAML文件模板样例如下:

    {
     "Statement": [{
         "Action": [
             "cs:CreateCluster"
         ],
         "Effect": "Allow",
         "Resource": [
             "*"
         ]
     }],
     "Version": "1"
    }
    说明
    • 由于集群创建过程中需要选择关联的VPC等云资源,请根据需要进行对应的RAM授权操作。
    • 请确保目标子账号至少有VPC资源的List权限,该权限的授权可以通过授权系统策略AliyunVPCReadOnlyAccess完成。
    • 如果有其他的资源配置需要,请参考对应服务的系统策略或授权文档进行授权操作。更多信息,请参见RAM授权

如何手动打开ACK服务角色默认一键授权页面?

因为某种原因把ACK的RAM授权给删了,需要重新授权。

具体操作,请参见步骤二:一键授权默认角色
说明 重新授权需要用阿里云账号操作。

ECS的RAM角色被删后如何恢复?

ECS节点上运行的应用中请求metadata api 100地址时提示404Message:Node condition RAMRoleError is now: True, reason: NodeHasNoRAMRole。您可以选择以下方案尝试恢复ECS的RAM角色:

  • ECS的RAM角色被删后,您需要为节点授予相应的RAM角色。具体操作,请参见更换实例RAM角色
    • Master节点需要授予集群信息 > 集群资源 > Master RAM角色的RAM角色。
    • Worker节点需要授予集群信息 > 集群资源 > Worker RAM 角色的RAM角色。
  • 如果您修改了RAM角色的策略内容,需要确认修改的内容是否有问题。
  • 如果您是在上报提示前修改了RAM角色,请尝试恢复为上报提示前RAM角色策略内容授权版本。

如何在Kubernetes集群指定RAM中的自定义角色?

Kubernetes集群暂不支持指定RAM中的自定义角色,但是在Kubernetes集群中创建Worker时会自动生成一个角色,您可以通过给该角色添加Policy的方式,来实现角色授权。

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群信息管理页单击集群资源页签。
  5. 集群资源页面,单击Worker RAM角色右侧的链接。
  6. RAM 角色管理页面,单击权限策略名称。
  7. 进入策略权限页面,单击修改策略内容,将以下内容填入后,单击下一步。本示例中授予该角色伸缩和删除集群的权限。如果您想了解更多的权限,请参见自定义RAM授权策略
    {
                "Action": [
                  "cs:ScaleCluster",
                  "cs:DeleteCluster"
                ],
                "Resource": "*",
                "Effect": "Allow"
             }
    修改权限

当RAM用户因为离职等原因需要删除时,是否会影响线上业务?

删除RAM用户不会影响其他账号的正常集群管控操作。您需要使用主账号及时吊销离职用户的KubeConfig权限,具体操作,请参见主账号吊销其子账号的KubeConfig凭证

注意 在吊销前,您需要替换已在应用中使用的离职用户的KubeConfig凭证。