【问题标题】:Kubernetes log, User "system:serviceaccount:default:default" cannot get services in the namespaceKubernetes 日志,用户“system:serviceaccount:default:default”无法获取命名空间中的服务
【发布时间】:2017-12-26 03:15:40
【问题描述】:

Forbidden!Configured service account doesn't have access. Service account may have been revoked. User "system:serviceaccount:default:default" cannot get services in the namespace "mycomp-services-process"

对于上述问题,我创建了“mycomp-service-process”命名空间并检查了问题。

但它再次显示这样的消息:

Message: Forbidden!Configured service account doesn't have access. Service account may have been revoked. User "system:serviceaccount:mycomp-services-process:default" cannot get services in the namespace "mycomp-services-process"

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    当然,创建命名空间并不能解决问题,因为这根本不是问题。

    在第一个错误中,问题是serviceaccount 默认位于默认命名空间can not get services 中,因为它无权访问列表/获取服务。因此,您需要做的是使用clusterrolebinding 为该用户分配一个角色。

    按照最低权限设置,您可以首先创建一个有权访问列表服务的角色:

    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      namespace: default
      name: service-reader
    rules:
    - apiGroups: [""] # "" indicates the core API group
      resources: ["services"]
      verbs: ["get", "watch", "list"]
    

    上面 sn-p 所做的是创建一个可以列出、获取和监视服务的集群角色。 (您必须创建一个 yaml 文件并应用上述规范)

    现在我们可以使用这个集群角色来创建集群角色绑定:

    kubectl create clusterrolebinding service-reader-pod \
      --clusterrole=service-reader  \
      --serviceaccount=default:default
    

    在上述命令中,service-reader-pod 是 clusterrolebinding 的名称,它将服务读取器 clusterrole 分配给默认命名空间中的默认服务帐户。对于您面临的第二个错误,可以执行类似的步骤。

    在这种情况下,我创建了 clusterroleclusterrolebinding,但您可能想要创建 rolerolebinding。您可以查看documentation in detail here

    【讨论】:

    【解决方案2】:

    您应该将服务帐户system:serviceaccount:default:default(这是绑定到Pod的默认帐户)与角色cluster-admin绑定,只需创建一个yaml(命名为fabric8-rbac.yaml),内容如下:

    # NOTE: The service account `default:default` already exists in k8s cluster.
    # You can create a new account following like this:
    #---
    #apiVersion: v1
    #kind: ServiceAccount
    #metadata:
    #  name: <new-account-name>
    #  namespace: <namespace>
    
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
      name: fabric8-rbac
    subjects:
      - kind: ServiceAccount
        # Reference to upper's `metadata.name`
        name: default
        # Reference to upper's `metadata.namespace`
        namespace: default
    roleRef:
      kind: ClusterRole
      name: cluster-admin
      apiGroup: rbac.authorization.k8s.io
    

    然后,通过运行kubectl apply -f fabric8-rbac.yaml 应用它。

    如果您想解除绑定,只需运行kubectl delete -f fabric8-rbac.yaml

    【讨论】:

    • 虽然您在执行此操作后不会收到“拒绝访问”错误消息,但我强烈建议不要将 cluster-admin 角色分配给 Kubernetes 中的所有 pod簇。如果有人出于某种原因设法在您的一个应用程序中发现了一个安全问题,从而使他们能够执行本地命令,那么您只需将整个集群的管理员帐户交给他们。
    • 在 apiVersion rbac.authorization.k8s.io/v1beta1 上有一个弃用警告,改为使用 rbac.authorization.k8s.io/v1 并且警告会消失。
    • cluster-admin 角色不能分配给 kubernetes 集群中的所有 pod。这会为您的组织产生高级别的漏洞。这个答案不应该被标记为有帮助......
    猜你喜欢
    • 2019-03-30
    • 2020-07-15
    • 2020-11-06
    • 2021-01-21
    • 2019-08-30
    • 2023-03-17
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    相关资源
    最近更新 更多