Kubernetes 示例小册
--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cluster-role-example rules: - apiGroups: [""] resources: ["secrets"] resourceNames: ["my-secret"] verbs: ["get", "watch", "list"] - apiGroups: [""] resources: ["pods", "pods/log"] verbs: ["get", "list"] - apiGroups: ["apps"] resources: ["deployments"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] - apiGroups: ["batch", "extensions"] resources: ["jobs"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] - nonResourceURLs: ["/healthz", "/healthz/*"] verbs: ["get", "post"]
示例 YAML 解释
metadata
--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: # 由于 ClusterRoles 是一种集群范围的对象,因此不需要指定 namespace name: cluster-role-example
rules
在 HTTP 层面访问资源对象,
apiGroups: [""]
表示 core 这个 API 分组.rules: - apiGroups: [""] resources: ["secrets"] resourceNames: ["my-secret"] # 只能访问名称为 my-secret 的 secret 对象 verbs: ["get", "watch", "list"] - apiGroups: [""] resources: ["pods", "pods/log"] # log 是 pods 的子资源 verbs: ["get", "list"]
不同的资源对象可能在不同的 API 分组里, 具体可以查看 Kubernetes API, 其中
core
, apps
, batch
三个分组包含了大部分常用资源对象, 不同资源对象的可操作行为也不一样, 具体还是参考 Kubernetes API.- apiGroups: ["apps"] resources: ["deployments"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] - apiGroups: ["batch", "extensions"] # 可访问在两个 API group 中定义的 jobs 对象 resources: ["jobs"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
规则中还允许对指定的非资源 endpoint 和它所有子路径执行一些操作 (例如 GET 和 POST 请求), 但需要与 ClusterRoleBinding 绑定才能生效.
- nonResourceURLs: ["/healthz", "/healthz/*"] verbs: ["get", "post"]
ClusterRole 常见问题
- Role 和 ClusterRole 的区别?
Role 创建时必须指定所属的 namespace, 仅用于设置在某个 namespace 下的访问权限.
ClusterRole 创建时无须指定 namespace, 它是对集群整体资源生效的角色, 因此它可以访问集群范围的资源对象 (例如 nodes) 以及非资源的对象的 endpoint, 还可以跨 namespace 访问 pods 等资源对象.
- RoleBinding 和 ClusterRoleBinding 的作用是什么?
RoleBinding 或 ClusterRoleBinding 将角色绑定到主题 (subjects), 主题可以是用户组(Group), 用户 (User) 或服务账号(ServiceAccount).
只有用户和角色绑定了, 用户才能访问角色规则中定义的资源对象.
- ServiceAccount 作用是什么?
ServiceAccount 为 Pod 中的进程提供集群内部的身份信息, 详见 ServiceAccount 部分.
参考文档: