k8s集群中的rbac权限管理

启用RBAC,需要在 apiserver 中添加参数--authorization-mode=RBAC,如果使用的kubeadm安装的集群,1.6 版本以上的都默认开启了RBAC
查看是否开启:
$ cat /etc/kubernetes/manifests/kube-apiserver.yaml

spec:
  containers:
  - command:
    - kube-apiserver
    - --advertise-address=192.168.1.243
    - --allow-privileged=true
    - --authorization-mode=Node,RBAC

Kubernetes有一个很基本的特性就是它的所有资源对象都允许执行 CRUD(Create、Read、Update、Delete)操作(也就是我们常说的增、删、改、查操作)
和rbac相关的资源对象包括:
1、Rule:规则,规则是一组属于不同 API Group 资源上的一组操作的集合
2、Role 和 ClusterRole:角色和集群角色,这两个对象都包含上面的 Rules 元素,二者的区别在于,在 Role 中,定义的规则只适用于单个命名空间,也就是和 namespace 关联的,而 ClusterRole 是集群范围内的,因此定义的规则不受命名空间的约束。
3、Subject:主题,对应在集群中尝试操作的对象,集群中定义了3种类型的主题资源:
User Account:这是有外部独立服务进行管理的,对于用户的管理集群内部没有一个关联的资源对象,所以用户不能通过集群内部的 API 来进行管理
Group:这是用来关联多个账户的,集群中有一些默认创建的组,比如cluster-admin
Service Account:通过Kubernetes API 来管理的一些用户帐号,和 namespace 进行关联的,适用于集群内部运行的应用程序,需要通过 API 来完成权限认证
4:RoleBinding 和 ClusterRoleBinding
简单来说就是把声明的 Subject 和我们的 Role 进行绑定的过程(给某个用户绑定上操作的权限),二者的区别也是作用范围的区别:RoleBinding 只会影响到当前 namespace 下面的资源操作权限,而 ClusterRoleBinding 会影响到所有的 namespace。

创建一个 User Account,只能访问 kube-system 这个命名空间
1、创建私钥
$ openssl genrsa -out dongyali.key 2048
2、创建证书签名请求文件
CN表示要创建的用户名,O表示要创建的组
penssl req -new -key dongyali.key -out dongyali.csr -subj "/CN=dongyali/O=booster"
3、生成最终的证书文件,设置证书的有效期为1000天
需要使用ca.crt和ca.key两个文件来批准证书请求,如果使用的是kubeadm安装的集群,这个两个文件位于/etc/kubernetes/pki/目录下面
$ openssl x509 -req -in dongyali.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out dongyali.crt -days 1000
$ ls
dongyali.csr dongyali.key dongyali.crt
4、使用刚刚创建的证书文件和私钥文件在集群中创建用户dongyali
$ kubectl config set-credentials dongyali --client-certificate=dongyali.crt --client-key=dongyali.key
5、为用户创建上下文,并限制在kube-system空间内
$ kubectl config set-context dongyali-context --cluster=kubernetes --namespace=kube-system --user=dongyali
6、为用户dongyali创建角色
创建一个允许用户操作 Deployment、Pod、ReplicaSets 的角色

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: dongyali-role
  namespace: kube-system
rules:
- apiGroups: ["", "extensions", "apps"]
  resources: ["deployments", "replicasets", "pods"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]     # 也可以使用[‘*‘]

7、创建角色绑定,绑定用户dongyali和角色

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dongyali-rolebinding
  namespace: kube-system
subjects:
- kind: User
  name: dongyali
  apiGroup: ""
roleRef:
  kind: Role
  name: dongyali-role
  apiGroup: ""

8、测试
$ kubectl get pods --context=dongyali-context
$ kubectl --context=dongyali-context get pods --namespace=default
Error from server (Forbidden): pods is forbidden: User "dongyali" cannot list pods in the namespace "default"

创建一个只能访问某个 namespace 的ServiceAccount
1、创建一个 ServiceAccount 对象
$ kubectl create sa dongyali-sa -n kube-system
2、创建role

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: dongyali-sa-role
  namespace: kube-system
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
- apiGroups: ["apps"]
  resources: ["deployments"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

3、创建一个 RoleBinding 对象

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: dongyali-sa-rolebinding
  namespace: kube-system
subjects:
- kind: ServiceAccount
  name: dongyali-sa
  namespace: kube-system
roleRef:
  kind: Role
  name: dongyali-sa-role
  apiGroup: rbac.authorization.k8s.io

创建一个可以访问所有 namespace 的ServiceAccount
需要使用 ClusterRole 和 ClusterRoleBinding 这两种资源对象
1、新建一个 ServiceAcount 对象

apiVersion: v1
kind: ServiceAccount
metadata:
  name: dongyali-sa2
  namespace: kube-system

2、创建一个 ClusterRoleBinding 对象
使用现有的集群角色cluster-admin,不用创建新的了

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: dongyali-sa2-clusterrolebinding
subjects:
- kind: ServiceAccount
  name: dongyali-sa2
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

原文地址:https://blog.51cto.com/dongdong/2433885

时间: 2024-11-10 13:21:36

k8s集群中的rbac权限管理的相关文章

K8S集群中部署jenkins

本文介绍在k8s环境中进行jenkins server的部署和配置.Jenkins是一个开源的.功能强大的持续集成和持续构建工具,采用master和salve架构,我们通过将jenkins集成环境部署在k8s集群中,可以实现jenkins slave按需创建.动态的伸缩.同时也提供了在k8s环境中应用的持续部署解决方案. 一.准备docker镜像文件 1.编译jenkins server docker镜像,默认的jenkis镜像已包含jdk,版本为1.8.0_171 # cat dockerfi

同一k8s集群中多nginx ingress controller

同一k8s集群中多nginx ingress controller同一k8s集群中,若有多个项目(对应多个namespace)共用一个nginx ingress controller,因此任意注册到ingress的服务有变更都会导致controller配置重载,当更新频率越来越高时,此controller压力会越来越大,理想的解决方案就是每个namespace对应一个nginx ingress controller,各司其职. NGINX ingress controller提供了ingress

【K8S学习笔记】Part2:获取K8S集群中运行的所有容器镜像

本文将介绍如何使用kubectl列举K8S集群中运行的Pod内的容器镜像. 注意:本文针对K8S的版本号为v1.9,其他版本可能会有少许不同. 0x00 准备工作 需要有一个K8S集群,并且配置好了kubectl命令行工具来与集群通信.如果未准备好集群,那么你可以使用Minikube创建一个K8S集群,或者你也可以使用下面K8S环境二者之一: Katacoda Play with Kubernetes 如果需要查看K8S版本信息,可以输入指令kubectl version. 在本练习中,我们将使

k8s集群中的存储持久化概述

存储分类:直连式存储,集中式共享存储,分布式存储文件存储,块存储,对象存储DAS,NAS,SANDAS属于直连式存储,将存储设备通过SCSI接口或者光纤通道直接和主板连接,不能实现数据共享NAS和SAN属于集中式共享存储NAS使用NFS和CIFS(原来叫SMB,微软的)协议SAN分为FC SAN和IP SANIP SAN使用iSCSI技术NFS实现linux之间共享,smaba基于CIFS协议,实现linux和windows之间文件共享ceph属于分布式共享系统 k8s集群中支持的持久存储主要包

将 master 节点服务器从 k8s 集群中移除并重新加入

背景 1 台 master 加入集群后发现忘了修改主机名,而在 k8s 集群中修改节点主机名非常麻烦,不如将 master 退出集群改名并重新加入集群(前提是用的是高可用集群). 操作步骤 ssh 登录另外一台 master 节点将要改名的 master 节点移出集群. kubectl drain blog-k8s-n0 kubectl delete node blog-k8s-n0 登录已退出集群的 master 服务器重置 kubelet 配置并重新加入集群. kubeadm reset k

实操教程丨如何在K8S集群中部署Traefik Ingress Controller

注:本文使用的Traefik为1.x的版本 在生产环境中,我们常常需要控制来自互联网的外部进入集群中,而这恰巧是Ingress的职责. Ingress的主要目的是将HTTP和HTTPS从集群外部暴露给该集群中运行的服务.这与Ingress控制如何将外部流量路由到集群有异曲同工之妙.接下来,我们举一个实际的例子来更清楚的说明Ingress的概念. 首先,想象一下在你的Kubernetes集群中有若干个微服务(小型应用程序之间彼此通信).这些服务能够在集群内部被访问,但我们想让我们的用户从集群外部也

k8s集群中的EFK日志搜集系统

Kubernetes 集群本身不提供日志收集的解决方案,一般来说有主要的3种方案来做日志收集:1.在每个节点上运行一个 agent 来收集日志由于这种 agent 必须在每个节点上运行,所以直接使用 DaemonSet 控制器运行该应用程序即可这种方法也仅仅适用于收集输出到 stdout 和 stderr 的应用程序日志简单来说,本方式就是在每个node上各运行一个日志代理容器,对本节点/var/log和 /var/lib/docker/containers/两个目录下的日志进行采集2.在每个

使用nfs在k8s集群中实现持久化存储

准备NFS服务192.168.1.244$ yum -y install nfs-utils rpcbind$ systemctl start nfs-server rpcbind$ systemctl enable nfs-server rpcbind$ mkdir -p /data/k8s$ cd /data/k8s$ echo 11111111 > index.html$ vim /etc/exports/data/k8s *(rw,async,no_root_squash)$ syste

K8S集群中使用Helm管理应用分发

本文介绍在k8s上部署和使用helm.Helm是Kubernetes的一个包管理工具,用来简化Kubernetes应用的部署和管理.可以把Helm比作CentOS的yum工具. 通过使用使用Helm可以管理Kubernetes manifest files.管理Helm安装包charts.基于chart的Kubernetes应用分发. 一.Helm的基本概念 Chart: 是helm的应用打包格式.Chart由一系列文件组成,这些文件类似rpm包 Chart目录结构:1.chart.yamlYa