k8s RBAC授权普通系统用户对namespace访问权限

背景:最近遇到一个问题,那就是需要给别人共享一下 Kubernetes 的某个资源的使用和访问权限,这个仅仅存在于某个 namespace 下,但是我又不能把管理员权限全都给它,我想只给他授予这一个 Namespace 下的权限,那应该怎么办呢?

比如我这边是需要只想授予 ads这个用户 对 data 这个 Namespace 的权限,这里我就需要利用到 Kubernetes 里面的 RBAC 机制来实现了,下面记录了我的操作流程。

一、创建ads用户的key

复制代码
cd /etc/kubernetes/ssl/

penssl req -new -key ads.key -out ads.csr -subj "/CN=ads"

openssl x509 -req -in ads.csr -CA /etc/kubernetes/ssl/ca.pem -CAkey /etc/kubernetes/ssl/ca-key.pem -CAcreateserial -out ads.crt -days 365

openssl x509 -in ads.crt -text -noout

注:使用https://github.com/easzlab/kubeasz创建的k8s,其密钥等默认位置为/etc/kubernetes/ssl

二、更改集群ads配置和用户上下文环境

复制代码
## 为ads用户项设置基础认证选项
kubectl config set-credentials ads --client-certificate=/etc/kubernetes/ssl/ads.crt --client-key=/etc/kubernetes/ssl/ads.key --embed-certs=true
## 设置上下文
kubectl config set-context ads --cluster=ads-cluster --user=ads --namespace=data

三、编辑以下文件进行授权

复制代码
################## cat ads.yaml 
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: data
  name: data
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["*"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: data
  namespace: data
subjects:
- kind: User
  name: ads
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: data
  apiGroup: rbac.authorization.k8s.io

执行 kubectl apply -f ads.yaml

四、导出 ads文件的config配置文件

复制代码
################# cat ads.sh 
server=https://10.2.33.80:6443
namespace=data
cluster_ca=$(cat /etc/kubernetes/ssl/ca.pem |base64 -w 0)
user_ca=$(cat /etc/kubernetes/ssl/ads.crt | base64 -w 0)
token=$(cat /etc/kubernetes/ssl/ads.key | base64 -w 0)
 
echo "apiVersion: v1
kind: Config
clusters:
 - name: ads-cluster
   cluster:
     certificate-authority-data: ${cluster_ca}
     server: ${server}
contexts:
 - name: ads
   context:
     cluster: ads-cluster
     namespace: ${namespace}
     user: ads
current-context: ads
users:
 - name: ads
   user:
     client-certificate-data: ${user_ca}
     client-key-data: ${token}
"> config

注:server为k8s的地址,可以从 ~/.kube/config 里查看

输出为 config文件

五、传输配置文件至ads系统用户主目录的kube下

/home/ads/.kube/

六、给这个用户配置多个namespace权限

1、需要为ads用户配置第二个ns的上下文,为确保简单将--cluster设置成一个

例如:为ads用户配置第二ns(monitor)权限

复制代码
kubectl config set-context ads --cluster=ads-cluster --user=ads --namespace=monitor

2、编辑执行步骤三中的配置文件并执行赋权

复制代码
####################### cat ads-monitor.yaml 
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: monitor
  name: monitor
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["*"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: monitor
  namespace: monitor
subjects:
- kind: User
  name: ads
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: monitor
  apiGroup: rbac.authorization.k8s.io

#####执行赋权
######kubectl apply -f ads-monitor.yaml

3、在ads的.kube下的config文件中添加monitor这个namespace名称即可

相关推荐
无言听风雨丶5 小时前
Kubernetes 控制平面深度剖析:从 kubectl apply 到 etcd 写入的全链路
平面·kubernetes·etcd
openFuyao6 小时前
openFuyao x 复旦大学软件工程实验室 Panel 回顾:Agentic时代,集群调度技术体系将如何演进?
kubernetes·openfuyao
螺蛳粉 螺蛳粉7 小时前
第 05 篇:etcd 深入:Raft 共识、watch 机制与快照备份恢复实战(底座认知 05)
docker·云原生·容器·kubernetes·etcd·分布式存储·kube-apiserver
相思难忘成疾10 小时前
从零搭建 Kubernetes 1.30 集群:kubeadm 部署一主多从实战(RHEL 9.3 + Docker + flannel)
linux·运维·kubernetes
weirong11 小时前
给 K8s 加一个自动值班员:分级故障自愈引擎
kubernetes
云和数据.ChenGuang11 小时前
Python 闭包详解:从原理到实战
linux·开发语言·人工智能·python·kubernetes
weirong16 小时前
为什么 HPA 会震荡?手写一个带冷却窗口的伸缩决策引擎
kubernetes
-星空下无敌17 小时前
Windows Docker K8s 安装部署Naocs ,SpringBoot 3.x 4.x 整合Naocs 版本兼容 配置中心、服务注册与发现
windows·docker·nacos·kubernetes·springboot·alibaba
吴声子夜歌17 小时前
Kubernetes权威指南——深入掌握Pod(使用StatefulSet搭建MongoDB集群)
容器·kubernetes
fb_1234517 小时前
K8s动态卷供应实战_StorageClass与LocalPath_NFS双Provisioner
云原生·容器·kubernetes