运维开发实践 - Kubernetes - 用户权限管控

1.背景

当我们有一个k8s 集群,并且需要将该集群提供给用户使用的时候,我们当然只希望用户只能操作我们预先定义好的资源,即权限管控,RBAC

2. 介绍

Kubernetes中有2种权限管控,一种是为Pod中的应用提供权限管理;另一种是为用户提供权限管理;kubernetes内部使用RBAC这一套鉴权机制;

2.1.实现

shell 复制代码
openssl genrsa -out liyuan.key 2048
openssl req -new -key liyuan.key -out liyuan.csr -subj "/CN=liyuan"
# 登录集群主节点查看该目录下的证书,基于kubernetes证书签发新证书
openssl x509 -req -in liyuan.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out liyuan.crt -days 365
openssl x509 -in liyuan.crt -text -noout

# 创建用户liyuan,并未该用户绑定上述生成的证书
kubectl config set-credentials liyuan --client-certificate=./sa/liyuan.crt --client-key=./sa/liyuan.key 

# 设置当前上下文
# --namespace=default表示用户使用kubectl无需主动指定namespace, kubectl get po 会默认获取kube-system namespace下Pod资源
# --user=liyuan 别名
kubectl config set-context liyuan --cluster=kubernetes --namespace=default --user=liyuan
kubectl config use-context liyuan
kubectl config get-contexts

2.2. Role & RoleBinding(namespace层面资源权限管理)

  • Role 用户设置某个命名空间内的资源权限,必须和namespace绑定
  • RoleBinding用于绑定账户和Role
yaml 复制代码
# role-user.yaml
# 为用户liyuan赋予default namespace下获取Pod资源的权限
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: role-liyuan
rules:
  - apiGroups: [""] # "" 标明 core API 组
    resources: ["pods", "pods/log"]
    verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: rolebinding-liyuan
subjects:
  - kind: User
    name: liyuan
    apiGroup: rbac.authorization.k8s.io
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: role-liyuan
shell 复制代码
kubectl apply -f role-user.yaml

2.3. ClusterRole & ClusterRoleBinding (集群层面资源权限管理)

shell 复制代码
# clusterrole-user.yaml
# 为用户liyuan赋予获取集群下所有secrets资源的权限
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  # "namespace" 被忽略,因为 ClusterRoles 不受名字空间限制
  name: clusterrole-liyuan
rules:
  - apiGroups: [ "" ]
    # 在 HTTP 层面,用来访问 Secret 资源的名称为 "secrets"
    resources: [ "secrets" ]
    verbs: [ "get", "watch", "list" ]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: clusterrolebinding-liyuan
subjects:
  - kind: User
    name: liyuan
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: clusterrole-liyuan
  apiGroup: rbac.authorization.k8s.io

3. 参考

yaml 复制代码
# cluster-admin clusterrole
kind: ClusterRole
metadata:
  annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
  creationTimestamp: "2023-12-12T13:19:37Z"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: cluster-admin
  resourceVersion: "77"
  uid: ba8010ec-8a5c-4881-b26b-37fed5dc5c67
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
- nonResourceURLs:
  - '*'
  verbs:
  - '*'
shell 复制代码
# apiGroups: 默认为 *
# resources 
kubectl api-resources
# verbs
"get", "list", "watch", "create", "update", "patch", "delete"]

参考

为 Pod 配置服务账号
k8s之基于用户/用户组授权

相关推荐
一个天蝎座 白勺 程序猿2 小时前
KingbaseES数据库归档重做日志文件管理:从配置到运维的实战指南
运维·数据库·oracle·kingbasees·金仓数据库
分布式存储与RustFS5 小时前
镜像仓库的层别堆本地盘:用 RustFS 给 Docker Registry 当 S3 后端
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
陈希1236 小时前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
@兽血沸腾7 小时前
Windows系统安装Jenkins部署应用至远程Windows服务器操作指南
运维·服务器·jenkins
闲云自留地12 小时前
K8s 的记忆大脑!ETCD 集群部署、etcdctl 命令与备份恢复全通关
容器·kubernetes·etcd
讯捷蓝达12 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
weirong15 小时前
Operator 上生产前补的 6 件事,和 5 件我明确不做的
kubernetes
爱和冰阔落15 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
lisanmengmeng16 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮16 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频