A Role is a list of rules inside one namespace; each rule names API groups ("" for the core group, apps, batch...), resources (including subresources such as pods/log) and verbs (get, list, watch, create, update, patch, delete). A ClusterRole has the same shape without a namespace, so it can cover cluster-scoped resources or serve as a reusable template:
kubectl create role pod-reader --verb=get,list,watch --resource=pods,pods/log \
--dry-run=client -o yaml | yq -o json -I0 '.rules'
kubectl get clusterroles -o name | grep -v -e system: -e kindnet -e local-path | head
kubectl get clusterrole view \
-o jsonpath='{.aggregationRule.clusterRoleSelectors[0].matchLabels}{"\n"}'Output
[{"apiGroups":[""],"resources":["pods","pods/log"],"verbs":["get","list","watch"]}]
clusterrole.rbac.authorization.k8s.io/admin
clusterrole.rbac.authorization.k8s.io/cluster-admin
clusterrole.rbac.authorization.k8s.io/edit
clusterrole.rbac.authorization.k8s.io/kubeadm:get-nodes
clusterrole.rbac.authorization.k8s.io/view
{"rbac.authorization.k8s.io/aggregate-to-view":"true"}cluster-admin can do anything, admin and edit manage a namespace's workloads (only admin its roles), and view reads them but not Secrets. view is aggregated from every ClusterRole carrying that label, which is how an add-on's custom resources become readable to viewers without anyone editing view.