本文环境:
- k3s version v1.29.6+k3s2 (b4b156d9)
go version go1.21.11
配置:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: # 所属命名空间
name: # 角色名
rules: # 权限
- apiGroups: [] # 授权给哪些组
resources: [] # 授权哪些资源
verbs: [] # 给予哪些权限
配置:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: # 角色名
rules: # 权限
- apiGroups: [] # 授权给哪些组
resources: [] # 授权哪些资源
verbs: [] # 给予哪些权限
core/v1
对象 | 权限名 | 作用域 | 子项目 |
配置文件 | configmaps | 命名空间 | - |
事件 | events | 命名空间 | - |
命名空间 | namespaces | 集群 | - |
节点 | nodes | 集群 | - |
PVC | persistentvolumeclaims | 命名空间 | - |
PV | persistentvolumes | 集群 | - |
Pod | pods | 命名空间 | logsstatusexec |
保密字典 | secrets | 命名空间 | - |
服务账号 | serviceaccounts | 命名空间 | - |
服务 | services | 命名空间 | - |
apps/v1
对象 | 权限名 | 作用域 | 子项目 |
守护进程 | daemonsets | 命名空间 | - |
无状态服务 | deployments | 命名空间 | - |
有状态服务 | statefulsets | 命名空间 | - |
autoscaling/v2
对象 | 权限名 | 作用域 | 子项目 |
自动伸缩 | horizontalpodautoscalers | 命名空间 | - |
batch/v1
对象 | 权限名 | 作用域 | 子项目 |
定时任务 | cronjobs | 命名空间 | - |
任务 | jobs | 命名空间 | - |
events.k8s.io/v1
对象 | 权限名 | 作用域 | 子项目 |
事件 | events | 命名空间 | - |
helm.cattle.io/v1
对象 | 权限名 | 作用域 | 子项目 |
Helm项目 | helmcharts | 命名空间 | - |
networking.k8s.io/v1
对象 | 权限名 | 作用域 | 子项目 |
Ingress实现对象 | ingressclasses | 集群 | - |
Ingress | ingresses | 命名空间 | - |
rbac.authorization.k8s.io/v1
不是哥们?你真的要给配权限的权限吗?
对象 | 权限名 | 作用域 | 子项目 |
集群授权 | clusterrolebindings | 集群 | - |
集群权限 | clusterroles | 集群 | - |
授权 | rolebindings | 命名空间 | - |
权限 | roles | 命名空间 | - |
内容来源: 资源请求 - 鉴权 | Kubernetes
HTTP 动词 | 请求动词 |
POST | create |
GET HEAD | get (针对单个资源)list (针对集合,包括完整的对象内容)watch (用于查看单个资源或资源集合) |
PUT | update |
PATCH | patch |
DELETE | delete (针对单个资源)deletecollection (针对集合) |
如何为用户签发证书 - 证书和证书签名请求 | Kubernetes
- 创建私钥
openssl genrsa -out user.key 2048
openssl req -new -key user.key -out user.csr -subj "/CN=${用户名}/O=${用户组}"
- 创建签名请求
Kubernetes 签名者 - 证书和证书签名请求 | Kubernetes
kubectl apply -f - << EOF
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: new-user-${用户名}
spec:
request: `base64 -w0 user.csr`
signerName: kubernetes.io/kube-apiserver-client
usages:
- client auth
EOF
- 批准签名请求
只能管理员操作
kubectl certificate approve new-user-${用户名}
- 获取证书
kubectl get csr new-user-${用户名} -o jsonpath='{.status.certificate}'| base64 -d > user.crt
- 获取集群ca证书
kubectl -n default get cm 'kube-root-ca.crt' -o jsonpath='{.data.ca\.crt}' > ca.crt
- 组合 KubeConfig
apiVersion: v1
kind: Config
clusters:
- name: ${你定义的集群名}
cluster:
certificate-authority-data: ${ca.crt 的 base64编码}
server: ${集群API Server地址}
users:
- name: ${CN的用户名}
user:
client-certificate-data: ${user.crt 的 base64编码}
client-key-data: ${user.key 的 base64编码}
contexts:
- name: ${你定义的配置名} # 推荐 用户@集群
context:
cluster: ${你定义的集群名}
namespace: ${默认命名空间} # 可选
user: ${用户名}
current-context: ${你定义的配置名}
apiVersion: v1
kind: ServiceAccount
metadata:
name: # 服务账号名
namespace: # 服务账号所在的命名空间
automountServiceAccountToken: true / false # 可选,表明是否也许自动挂载到 /var/run/secrets/kubernetes.io/serviceaccount/
apiVersion: v1
kind: Pod
...
spec:
...
containers:
- ...
serviceAccountName: ${服务账号名}
automountServiceAccountToken: true
apiVersion: v1
kind: Config
clusters:
- name: ${你定义的集群名}
cluster:
certificate-authority-data: ${ca.crt 的 base64编码}
server: ${集群API Server地址}
users:
- name: ${CN的用户名}
user:
token: ${Base64解码后的Token}
contexts:
- name: ${你定义的配置名} # 推荐 用户@集群
context:
cluster: ${你定义的集群名}
namespace: ${默认命名空间} # 可选
user: ${用户名}
current-context: ${你定义的配置名}
各种示例: subjects 示例 - 使用 RBAC 鉴权 | Kubernetes
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: # 授权名称
namespace: # 所属命名空间
subjects: # 授权对象
- kind: User # 授权给用户
name: # 用户名
apiGroup: rbac.authorization.k8s.io
- kind: Group # 授权给用户组(也就是证书的 O)
name: # 组名
apiGroup: rbac.authorization.k8s.io
- kind: ServiceAccount # 授权给服务账号
name: # 服务账号名
namespace: # 服务账号所在的命名空间
roleRef:
kind: Role / ClusterRole # 授予角色类型
name: # 角色名(必须和 RoleBinding 在同一个命名空间)
apiGroup: rbac.authorization.k8s.io
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: # 授权名称
subjects: # 授权对象
- kind: User # 授权给用户
name: # 用户名
apiGroup: rbac.authorization.k8s.io
- kind: Group # 授权给用户组(也就是证书的 O)
name: # 组名
apiGroup: rbac.authorization.k8s.io
- kind: ServiceAccount # 授权给服务账号
name: # 服务账号名
namespace: # 服务账号所在的命名空间
roleRef:
kind: ClusterRole # 授予角色类型
name: # 角色名(必须和 RoleBinding 在同一个命名空间)
apiGroup: rbac.authorization.k8s.io