k8s的rbac授权操作

博客围绕K8s的RBAC操作展开,但具体操作内容未给出。RBAC是K8s中重要的权限管理机制,对其进行操作可实现对集群资源访问的精细控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

只说操作不来理论哈
rbac是以插件形式串运行

Role        ---> RoleBinding  //作用于用户空间
ClusterRole ---> ClusterRoleBinding   //使用于集群级别

--创建私钥及证书--
openssl genrsa -out kuber1.key 2048
openssl  req -new -key kube-user1.key -out kube-user1.csr -subj "/CN=kube-user1/O=kubernetes"
openssl x509 -req -in kube-user1.csr -CA /opt/kubernetes/ssl/ca.pem  -CAkey /opt/kubernetes/ssl/ca-key.pem -CAcreateserial  -out kube-user1.crt -days 3650
kubectl config set-cluster mk8s --embed-certs=true --certificate-authority=/opt/kubernetes/ssl/ca.pem --server="https://192.168.0.81:6443"
kubectl  config set-credentials kube-user1 --embed-certs=true --client-certificate=/root/k8s_config/kube-user1.crt --client-key=/root/k8s_config/kube-user1.key
kubectl  config set-context kube-user1@mk8s --cluster=mk8s --user=kube-user1



kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: testing #所属名称空间
  name: my-pod
rules:
  - apiGroups: [""] #表示 core API group
    resources: ["pods","pods/log","services"] #可以访问的资源类型
    verbs: ["get","list","watch"]     #get,list,create,update,watch,proxy,redirect,delete and deletecollection

---
#rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: my-reader
  namespace: testing
subjects:
  - kind: User #要引用的资源对象(主体)所属的类型,可用值为"User","Group""ServiceAcount"
    name: kube-user1 #引用主体的名称
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role #引用的资源所属的类别,可以用值为Role或ClusterRole,必选
  name: my-pod  # 引用的资源名称
  apiGroup: rbac.authorization.k8s.io #引用资源(Role或ClusterRole)所属的API群组,必选



kubectl  config use-context kube-user1@mk8s
Switched to context "kube-user1@mk8s".

kubectl  config get-contexts
CURRENT   NAME                     CLUSTER      AUTHINFO      NAMESPACE
          default                  default      admin
*         kube-user1@mk8s          mk8s         kube-user1
          lemon-admin@kubernetes   kubernetes   lemon-admin
          lemon@kubernetes         kubernetes   lemon

kubectl  get pods
Error from server (Forbidden): pods is forbidden: User "kube-user1" cannot list resource "pods" in API group "" in the namespace "default"

kubectl  get pod -n testing
No resources found in testing namespace.


kubectl  get service
Error from server (Forbidden): services is forbidden: User "kube-user1" cannot list resource "services" in API group "" in the namespace "default"

kubectl  config use-context default
Switched to context "default".

#增加service资源
resources: ["pods","pods/log","service"]

kubectl apply -f role.yaml

kubectl  config use-context kube-user1@mk8s
Switched to context "kube-user1@mk8s".

Error from server (Forbidden): services is forbidden: User "kube-user1" cannot list resource "services" in API group "" in the namespace "testing": RBAC: role.rbac.authorization.k8s.io "services-admin" not found

kubectl  config use-context default
Switched to context "default".


kubectl create rolebinding lemon-admin-service --role=services-admin --user=kube-user1 -n testing
rolebinding.rbac.authorization.k8s.io/lemon-admin-service created



----------------------------------------------------------------------------------------
ClusterRole和ClusterRolebinding
 集群级别的角色资源和ClusterRole资源消除了能够管理与Role资源一样的许可权限之外,还可以用于集群组件的授权,配置方式及其在rule字段
 中可以嵌套也与Role资源类似。


#ClusterRole是集群级别不需要使用metadata.namespace字段
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: my-node-reader
rules:
  - apiGroups: [""]
    resources: ["nodes"]
    verbs: ["get","watch","list"]


---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: my-healthz-admin
rule:
  - nonResourceURLs:
    - /heatlhz
    verbs:
      - get
      - create

---

##聚合类型ClusterRole

---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: my-monitoring
aggregationRule:
  clusterRoleSelectors:
    - matchLabels:
        rbac.example.com/aggregate-to-monitoring: "true"
rules: []


---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: my-monitoring-endpoints
  lables:
    rbac.example.com/aggregate-to-monitring: "true"
# These rules will be added to the "monitroing  role
rules:
  - apiGroups: [""]
    resources: ["services","endpoints","pods"]
    verbs: ["get","list","watch"]



------------------------------------------------------------------------------------------------
面向用户内的内建ClusterRole
API Server内建立了一组默认的ClusterRole和ClusterRoleBinding以预留系统使用,其中大多数都以"system:"为前缘,另外一些
还有一些非以"system:"为前缘的默认的role资源,它们总是为面向用户的需求而设计的,包括超级用户角色(cluster-admin)用于授权收集
集群级别的权限的ClusterRoleBinding(Cluster-status)以授予特定的名称空间级别权限的RoleBinding(admin,edit,view).
[cluster-admin,cluster-status,admin,edit,view]

内建的ClusterRole资源cluster-admin拥有管理集群所有资源的权限,它基于同名的ClusterRoleBinding资源绑定到了"system:masters"
组上,这意味着所有隶属于此组的用户都将具有集群的超级管理管理权限。
/O=system:master/CN=kubernetes-admin

CluserRoeBindind用RoleBinding用法
kubectl create deployment my-dep --image=busybox -n testing
Error from server (Forbidden): deployments.apps is forbidden: User "kube-user1" cannot create resource "deployments" in API group "apps" in the namespace "testing": RBAC: role.rbac.authorization.k8s.io "services-admin" not found



#加入管理员群组(集群级别的权限)
kubectl create rolebinding dev-admin --clusterrole=cluster-admin --user=kube-user1 -n testing
rolebinding.rbac.authorization.k8s.io/dev-admin created
kubectl create deployment my-dep --image=busybox -n testing
deployment.apps/my-dep created



###ClusterRole 和ClusterRoleBinding实战:

openssl genrsa -out kube-user2.key 2048
openssl  req -new -key kube-user2.key -out kube-user2.csr -subj "/CN=kube-user2/O=lk8s"
openssl x509 -req -in kube-user2.csr -CA /opt/kubernetes/ssl/ca.pem  -CAkey /opt/kubernetes/ssl/ca-key.pem -CAcreateserial  -out kube-user2.crt -days 3650
kubectl config set-cluster lk8s --embed-certs=true --certificate-authority=/opt/kubernetes/ssl/ca.pem --server="https://192.168.0.81:6443"
kubectl  config set-credentials kube-user2 --embed-certs=true --client-certificate=/root/k8s_config2/kube-user2.crt --client-key=/root/k8s_config2/kube-user2.key
kubectl  config set-context kube-user2@lk8s --cluster=lk8s --user=kube-user2



openssl genrsa -out kube-mfz.key 2048
openssl  req -new -key kube-mfz.key -out kube-mfz.csr -subj "/CN=kube-mfz/O=mfzlk8s"
openssl x509 -req -in kube-mfz.csr -CA /opt/kubernetes/ssl/ca.pem  -CAkey /opt/kubernetes/ssl/ca-key.pem -CAcreateserial  -out kube-mfz.crt -days 3650
kubectl config set-cluster mfzlk8s --embed-certs=true --certificate-authority=/opt/kubernetes/ssl/ca.pem --server="https://192.168.0.81:6443"
kubectl  config set-credentials kube-mfz --embed-certs=true --client-certificate=/root/k8s_config2/kube-mfz.crt --client-key=/root/k8s_config2/kube-mfz.key
kubectl  config set-context kube-mfz@mfzlk8s --cluster=mfzlk8s --user=kube-mfz


kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: cluster-mfz-role
rules:
  - apiGroups: [""]
    resources: ["pods","deployments"]
    verbs: ["get","watch","list","create","delete"]



apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cluser-mfz-clusterrolebinding
subjects:
  - kind: User
    name: kube-mfz
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: cluster-mfz-role
  apiGroup: rbac.authorization.k8s.io


kubectl  get deployments
Error from server (Forbidden): deployments.apps is forbidden: User "kube-mfz" cannot list resource "deployments" in API group "apps" in the namespace "default"

#加入具有deployments权限的组里
kubectl create clusterrolebinding mfz-admin --clusterrole=system:controller:deployment-controller --user=kube-mfz
clusterrolebinding.rbac.authorization.k8s.io/mfz-admin created


#测试访问
kubectl  get deployments
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
db                       2/2     2            2           15d
memched-operator         1/1     1            1           11d
nfs-client-provisioner   1/1     1            1           65d
school-operator          1/1     1            1           35h
student                  15/15   15           15          35h

### Kubernetes RBAC 用户授权机制 #### 角色定义 在Kubernetes中,RBAC(基于角色的访问控制)用于管理谁可以做什么以及在哪里做。一个角色是一组权限规则的集合[^5]。这些权限以累加的方式组合在一起,并不存在否定规则。 对于特定命名空间内的资源,权限可以通过`Role`对象来定义;而对于跨所有命名空间或集群级别的资源,则使用`ClusterRole`对象。 #### 绑定用户与角色 为了使普通用户获得对集群内资源的操作能力,必须先将其绑定至适当的角色上。这通常通过创建`RoleBinding`或`ClusterRoleBinding`资源完成。前者适用于单个命名空间范围内的角色分配,后者则是针对全局性的`ClusterRole`进行绑定[^3]。 例如,要授予某位开发者对其开发环境所在命名空间下的Pods完全读写权限: ```yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: development name: pod-editor rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "create", "update", "patch", "delete"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: developer-pod-access namespace: development subjects: - kind: User name: "developer@example.com" roleRef: kind: Role name: pod-editor apiGroup: rbac.authorization.k8s.io ``` 这段配置首先定义了一个名为`pod-editor`的角色,它允许执行一系列关于Pod的操作。接着,通过`RoleBinding`将这个角色赋予给指定邮箱地址对应的用户,在此案例中即为`developer@example.com`。 #### 特殊角色 值得注意的是存在一些预设好的特殊角色,比如`cluster-admin`,该角色拥有几乎不受限制的最大化权限(`verbs=*`),可用于管理和维护整个Kubernetes集群[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值