kubectl 与什么角色和角色绑定关联?

sri*_*259 2 kubernetes kubectl

我试图了解 kubectl 如何获得运行命令的权限。据我了解,与 kubernetes 集群的所有交互都通过 kube-apiserver。kubectl get pods因此,当我们从主节点运行 kubectl 命令时,请求将通过 kube-apiserver 进行。

apiserver 进行身份验证和授权并返回结果。kubectl 与任何其他用户或资源一样,也应该与角色和角色绑定相关联,以获取访问集群上资源的权限。如何检查 kubectl 关联到哪个角色和角色绑定?

如果这是一个荒谬的问题,我深表歉意。

ade*_*asi 5

这个答案是其他答案的扩展,可以帮助您在使用客户端证书时使用脚本:

从当前上下文中获取用户和组:

如果您使用客户端证书,您的~/.kube/config文件包含client-certificate-data当前上下文的用户的证书。该数据是一个base64编码证书,可以用文本形式显示openssel。您的问题的有趣信息位于 参考资料Subject部分。

该脚本将打印Subject客户端证书的行:

$ kubectl config view --raw -o json \
    | jq ".users[] | select(.name==\"$(kubectl config current-context)\")" \
    | jq -r '.user["client-certificate-data"]' \
    | base64 -d | openssl x509 -text | grep "Subject:"
Run Code Online (Sandbox Code Playgroud)

通过 Docker for Mac 运行 kubernetes 时在我的 Mac 上输出:

Subject: O=system:masters, CN=docker-for-desktop

O是一个组织,代表 kubernetes 中的一个

CN是通用名称,由 kubernetes 解释为用户

找到对应的 clusterrole 和 clusterrolebinding:

现在您知道当前正在使用 kubectl 的用户和组。要找出您正在使用哪个(集群)角色绑定,您必须查找已识别的组/用户:

$ group="system:masters"
$ kubectl get clusterrolebindings -o json \
    | jq ".items[] | select(.subjects[].name==\"$group\")"
Run Code Online (Sandbox Code Playgroud)
{
  "apiVersion": "rbac.authorization.k8s.io/v1",
  "kind": "ClusterRoleBinding",
  "metadata": {
    "annotations": {
      "rbac.authorization.kubernetes.io/autoupdate": "true"
    },
    "creationTimestamp": "2020-03-31T14:12:13Z",
    "labels": {
      "kubernetes.io/bootstrapping": "rbac-defaults"
    },
    "name": "cluster-admin",
    "resourceVersion": "95",
    "selfLink": "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings/cluster-admin",
    "uid": "878fa48b-cf30-42e0-8e3c-0f27834dfeed"
  },
  "roleRef": {
    "apiGroup": "rbac.authorization.k8s.io",
    "kind": "ClusterRole",
    "name": "cluster-admin"
  },
  "subjects": [
    {
      "apiGroup": "rbac.authorization.k8s.io",
      "kind": "Group",
      "name": "system:masters"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

您可以在输出中看到该组与ClusterRole cluster-admin. 您可以仔细查看这个 clusterrole 以查看详细的权限:

{
  "apiVersion": "rbac.authorization.k8s.io/v1",
  "kind": "ClusterRoleBinding",
  "metadata": {
    "annotations": {
      "rbac.authorization.kubernetes.io/autoupdate": "true"
    },
    "creationTimestamp": "2020-03-31T14:12:13Z",
    "labels": {
      "kubernetes.io/bootstrapping": "rbac-defaults"
    },
    "name": "cluster-admin",
    "resourceVersion": "95",
    "selfLink": "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings/cluster-admin",
    "uid": "878fa48b-cf30-42e0-8e3c-0f27834dfeed"
  },
  "roleRef": {
    "apiGroup": "rbac.authorization.k8s.io",
    "kind": "ClusterRole",
    "name": "cluster-admin"
  },
  "subjects": [
    {
      "apiGroup": "rbac.authorization.k8s.io",
      "kind": "Group",
      "name": "system:masters"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)
$ kubectl get clusterrole cluster-admin -o yaml
Run Code Online (Sandbox Code Playgroud)