k8s 集群安全 rbac
k8s 集群安全-认证
sa和用户的区别
sa是给k8s内部进程通讯用的
用户是给我们使用的
rbac概念
基于角色的访问控制(RBAC) 是一种基于企业内个人用户的角色来管理对计算机或网络资源的访问的方法。 在此上下文中,权限是单个用户执行特定任务的能力, 例如查看、创建或修改文件。
被启用之后,RBAC(基于角色的访问控制)使用 rbac.authorization.k8s.io API 组来驱动鉴权决策,从而允许管理员通过 Kubernetes API 动态配置权限策略。
要启用 RBAC,请使用 --authorization-mode = RBAC 启动 API 服务器
RBAC三要素
-
Subjects,也就是主体。可以是开发人员、集群管理员这样的自然人,也可以是- 系统组件进程,或者是 Pod 中的逻辑进程;在k8s中有以下三种类型:
-
User Account:用户,这是有外部独立服务进行管理的,管理员进行私钥的分配,用户可以使用 KeyStone或者 Goolge 帐号,甚至一个用户名和密码的文件列表也可以。对于用户的管理集群内部没有一个关联的资源对象,所以用户不能通过集群内部的 API 来进行管理
-
Group:组,这是用来关联多个账户的,集群中有一些默认创建的组,比如cluster-admin。
-
Service Account:服务帐号,通过Kubernetes API 来管理的一些用户帐号,和 namespace 进行关联的,适用于集群内部运行的应用程序,需要通过 API 来完成权限认证,所以在集群内部进行权限操作,都需要使用到 ServiceAccount,这也是本文的重点。
-
-
API Resource,也就是请求对应的访问目标。在 Kubernetes 集群中也就是各类资源,Pod,Deployment等;
-
Verbs,对应为请求对象资源可以进行哪些操作,包括但不限于"get", “list”, “watch”, “create”, “update”, “patch”, “delete”,"deletecollection"等。
RBAC四对象
Role:包含一组代表相关权限的规则。 这些权限是纯粹累加的(不存在拒绝某操作的规则)。
RoleBinding:将角色中定义的权限赋予一个或者一组用户。 它包含若干主体(用户、组或服务账户)的列表和对这些主体所获得的角色的引用。 RoleBinding 在指定的名字空间中执行授权。RoleBinding 也可以引用 ClusterRole。
ClusterRole:包含一组代表相关权限的规则。 这些权限是纯粹累加的(不存在拒绝某操作的规则)。
ClusterRoleBinding:将角色中定义的权限赋予一个或者一组用户。 它包含若干 主体(用户、组或服务账户)的列表和对这些主体所获得的角色的引用。 ClusterRoleBinding 在集群范围执行授
1.1 机制说明
Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介,也是外部控制的入口。
- 所以 Kubernetes 的安全机制基本就是围绕保护 API Server 来设计的。
- Kubernetes 使用了
- 认证(Authentication)
- 鉴权(Authorization)
- 准入控制(Admission Control)三步来保证API Server的安全
如上图所示,用户必须经过认证,鉴权,准入控制才能访问对应的资源对象
2.1 认证
判断自己是自己,可以理解为校门口大爷,判断你是不是学生,防止校外人员进入
认证方式分为https认证和sa认证
etcd通过https的ca联通apiserver
kubectl和kubec-proxy使用token和一个ca证书的hash值,与apiserver之间双向认证
kubectl是在各个节点上可以部署的,通过https
Authentication,认证经历了三个阶段
- HTTP Token 认证:通过一个 Token 来识别合法用户
- HTTP Token 的认证是用一个很长的特殊编码方式的并且难以被模仿的字符串 - Token 来表达客户的一种方式。Token 是一个很长的很复杂的字符串,每一个 Token 对应一个用户名存储在 API Server 能访问的文件中。当客户端发起 API 调用请求时,需要在 HTTP Header 里放入 Token
- HTTP Base 认证:通过 用户名+密码 的方式认证
- 用户名+:+密码 用 BASE64 算法进行编码后的字符串放在 HTTP Request 中的 Heather Authorization 域里发送给服务端,服务端收到后进行编码,获取用户名及密码
- 最严格的 HTTPS 证书认证:基于 CA 根证书签名的客户端身份认证方式
2.1.1 HTTPS 证书认证:
2.1.2 需要认证的节点
两种类型
- Kubenetes 组件对 API Server 的访问:kubectl、Controller Manager、Scheduler、kubelet、kube-proxy
- Kubernetes 管理的 Pod 对容器的访问:Pod(dashborad 也是以 Pod 形式运行)
2.1.2.1 安全性说明
- Controller Manager、Scheduler 与 API Server 在同一台机器,所以直接使用 API Server 的非安全端口访问,--insecure-bind-address=127.0.0.1
- kubectl、kubelet、kube-proxy 访问 API Server 就都需要证书进行 HTTPS 双向认证
2.1.2.2 证书颁发
- 手动签发:通过 k8s 集群的跟 ca 进行签发 HTTPS 证书
- 自动签发:kubelet 首次访问 API Server 时,使用 token 做认证,通过后,Controller Manager 会为 kubelet 生成一个证书,以后的访问都是用证书做认证了
2.1.2.3 证书有两套:k8s就是两套cs架构
- apiserver作为server,其他的kubectl.kube-proxy是client
- etcd作为server时,apiserver是client
api和etcd的ca证书
2.1.3 kubeconfig
kubeconfig 文件包含集群参数(CA证书、API Server地址),客户端参数(上面生成的证书和私钥),集群 context 信息(集群名称、用户名)。Kubenetes 组件通过启动时指定不同的 kubeconfig 文件可以切换到不同的集群
2.1.4 ServiceAccount
Pod中的容器访问API Server。因为Pod的创建、销毁是动态的,所以要为它手动生成证书就不可行了。Kubenetes使用了Service Account解决Pod 访问API Server的认证问题
2.1.5 Secret 与 SA 的关系
Kubernetes 设计了一种资源对象叫做 Secret,分为两类,一种是用于 ServiceAccount 的 service-account-token, 另一种是用于保存用户自定义保密信息的 Opaque [əʊˈpeɪk] 。ServiceAccount 中用到包含三个部分:Token、ca.crt、namespace
- token是使用 API Server 私钥签名的 JWT。用于访问API Server时,Server端认证
- ca.crt,根证书。用于Client端验证API Server发送的证书
- namespace, 标识这个service-account-token的作用域名空间
Json web token (JWT) , 是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准([(RFC 7519] ).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该 token 也可直接被用于认证,也可被加密
kubectl get secret --all-namespaces
kubectl describe secret default-token-5gm9r --namespace=kube-system
默认情况下,每个 namespace 都会有一个 ServiceAccount,如果 Pod 在创建时没有指定 ServiceAccount,就会使用 Pod 所属的 namespace 的 ServiceAccount
默认挂载目录: /run/secrets/kubernetes.io/serviceaccount/
2.1.6 SA和role的关系
在 Kubernetes 中,Service Account(SA)和 Role 是两个不同的概念,它们分别用于授权和身份验证。SA 是 Kubernetes 中的一种身份验证机制,用于向应用程序和容器提供身份验证和授权。Role 则是一种 Kubernetes 资源类型,用于定义一组权限,以访问 Kubernetes 中的 API 对象。
- 在 Kubernetes 中,SA 和 Role 之间有一种关系,即通过 RoleBinding 或 ClusterRoleBinding。RoleBinding 将一个 SA 绑定到一个 Role 上,而 ClusterRoleBinding 将一个 SA 绑定到一个 ClusterRole 上。这样,SA 就可以访问 Role 或 ClusterRole 定义的 Kubernetes API 对象。
以下是一些关于 SA 和 Role 的更详细信息:
-
Service Account:SA 是一种 Kubernetes 中的身份验证机制,用于向应用程序和容器提供身份验证和授权。每个 Kubernetes 命名空间都有一个默认的 SA,该 SA 可以被应用程序和容器使用。SA 可以通过 Secret 对象的 token 或证书来进行身份验证。SA 还可以通过 RoleBinding 或 ClusterRoleBinding 与 Role 或 ClusterRole 相关联,以授权对 Kubernetes API 对象的访问。
-
Role:Role 是一种 Kubernetes 资源类型,用于定义一组权限,以访问 Kubernetes 中的 API 对象。Role 被定义在命名空间级别,它只能访问同一命名空间中的 Kubernetes API 对象。Role 可以定义多个规则,每个规则都指定了一组 API 对象和允许或拒绝的操作。例如,一个 Role 可以允许读取 Pod、Service 和 ConfigMap,但禁止修改它们。
-
RoleBinding:RoleBinding 是一种 Kubernetes 资源类型,用于将一个 SA 绑定到一个 Role 上,以授权对 Kubernetes API 对象的访问。RoleBinding 定义了一个 SA 和一个 Role 的绑定关系,并指定了该 SA 对该 Role 的访问权限。RoleBinding 可以定义在命名空间级别或集群级别。
-
ClusterRole:ClusterRole 是一种 Kubernetes 资源类型,用于定义一组权限,以访问 Kubernetes 中的 API 对象。与 Role 不同,ClusterRole 被定义在整个集群范围内,可以访问所有命名空间中的 Kubernetes API 对象。ClusterRole 可以定义多个规则,每个规则都指定了一组 API 对象和允许或拒绝的操作。
-
ClusterRoleBinding:ClusterRoleBinding 是一种 Kubernetes 资源类型,用于将一个 SA 绑定到一个 ClusterRole 上,以授权对 Kubernetes API 对象的访问。ClusterRoleBinding 定义了一个 SA 和一个 ClusterRole 的绑定关系,并指定了该 SA 对该 ClusterRole 的访问权限。ClusterRoleBinding 可以定义在命名空间级别或集群级别。
总之,SA 和 Role 是 Kubernetes 中的两个关键概念,用于授权和身份验证。通过 RoleBinding 或 ClusterRoleBinding,SA 可以访问 Role 或 ClusterRole 定义的 Kubernetes API 对象,以执行相应的操作。
3.1 鉴权
假如你是学生进了学校,想进校长办公室逛一圈,虽然你是学生可以进入学校,但是不一定有权限进校长办公室,即一个人有没有权限访问一个资源
Authorization
上面认证过程,只是确认通信的双方都确认了对方是可信的,可以相互通信。而鉴权是确定请求方有哪些资源的权限。API Server 目前支持以下几种授权策略 (通过 API Server 的启动参数 “--authorization-mode” 设置)
- AlwaysDeny:表示拒绝所有的请求,一般用于测试
- AlwaysAllow:允许接收所有请求,如果集群不需要授权流程,则可以采用该策略
- ABAC(Attribute-Based Access Control):基于属性的访问控制,表示使用用户配置的授权规则对用户请求进行匹配和控制
- Webhook:通过调用外部 REST 服务对用户进行授权
- RBAC(Role-Based Access Control):基于角色的访问控制,现行默认规则
3.1.1 RBAC 授权模式
RBAC(Role-Based Access Control)基于角色的访问控制,在 Kubernetes 1.5 中引入,现行版本成为默认标准。相对其它访问控制方式,拥有以下优势:
- 对集群中的资源和非资源均拥有完整的覆盖
- 整个 RBAC 完全由几个 API 对象完成,同其它 API 对象一样,可以用 kubectl 或 API 进行操作
- 可以在运行时进行调整,无需重启 API Server
3.1.1.1 RBAC 的 API 资源对象说明
RBAC 引入了 4 个新的顶级资源对象:Role、ClusterRole、RoleBinding、ClusterRoleBinding,4 种对象类型均可以通过 kubectl 与 API 操作
分了角色角色绑定,集群角色集群角色绑定,角色集群角色绑定三种
已上图为例,之前我们需要创建4个角色,和4个对应的权限,关联关系
现在我们制定4个角色的权限,然后创建一个账号绑定4个固定的权限,由原先的8个降为5个,每个命名空间都有一个,批量后效果显著。且权利只能降级不能升级
3.1.1.2 需要注意的是 Kubenetes 并不会提供用户管理,那么 User、Group、ServiceAccount 指定的用户又是从哪里来的呢? Kubenetes 组件(kubectl、kube-proxy)或是其他自定义的用户在向 CA 申请证书时,需要提供一个证书请求文件
//以往我们创建ca证书需要在linux页面交互,而json就可以满足避免这些交互,且用户名无需提前创建
{
"CN": "admin", //这里被ca签发证书后,api-server遇到这个请求就能知道这是admin,无需提前创建,就跟新员工入职一样,ca给你签发了一个工作证,apiserver就是看门老大爷
"hosts": [], //当前证书可以在哪些机器可以来访问我,不写默认是所有机器都可以访问
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "HangZhou",
"L": "XS",
"O": "system:masters", //system:masters 默认保留关键字,不可以使用system,我这里是因为 system:masters这个组已经存在了,我不可以新建,但是我可以加入
"OU": "System"
}
]
}
API Server会把客户端证书的CN字段作为User,把names.O字段作为Group
kubelet 使用 TLS Bootstaping 认证时,API Server 可以使用 Bootstrap Tokens 或者 Token authentication file 验证 =token,无论哪一种,Kubenetes 都会为 token 绑定一个默认的 User 和 Group
Pod使用 ServiceAccount 认证时,service-account-token 中的 JWT 会保存 User 信息
有了用户信息,再创建一对角色/角色绑定(集群角色/集群角色绑定)资源对象,就可以完成权限绑定了
3.1.2 Role and ClusterRole
在 RBAC API 中,Role 表示一组规则权限,权限只会增加(累加权限),不存在一个资源一开始就有很多权限而通过 RBAC 对其进行减少的操作;Role 可以定义在一个 namespace 中,如果想要跨 namespace 则可以创建 ClusterRole
我们会有第一个集群管理员,k8s初始化的,我们可以用这个集群管理员再新建其他集群管理员并赋予权限
3.1.2.1 role
//如下角色,作用空间再default命名空间下
kind: Role //类型角色
apiVersion: rbac.authorization.k8s.io/v1beta1 //接口
metadata: //元数据
namespace: default //默认命名空间
name: pod-reader //角色名称
rules:
- apiGroups: [""] # "" indicates the core API group //里面指定版本路径信息,版本和路径不同,所对应的接口权限也不一样,缺省代表默认的v1版本
resources: ["pods"] //可以操作的对象
verbs: ["get", "watch", "list"] //可执行的动作
//查看当前已有角色,如下,谁有cluster-admin这个角色的权限,谁就是集群管理员
kubectl get clusterrole
NAME AGE
admin 64d
cluster-admin 64d
edit 64d
flannel 63d
nginx-ingress-clusterrole 19d
system:aggregate-to-admin 64d
system:aggregate-to-edit 64d
system:aggregate-to-view 64d
system:auth-delegator 64d
...
3.1.2.2 ClusterRole 具有与 Role 相同的权限角色控制能力,不同的是 ClusterRole 是集群级别的,ClusterRole 可以用于:
- 集群级别的资源控制( 例如 node 访问权限 )
- 非资源型 endpoints( 例如 /health 访问 )
- 所有命名空间资源控制(例如 pods )
kind: ClusterRole //类型集群角色
apiVersion: rbac.authorization.k8s.io/v1beta1 //版本
metadata:
# "namespace" omitted since ClusterRoles are not namespaced
name: secret-reader //集群角色名称
rules:
- apiGroups: [""] //同上,默认核心组v1版本
resources: ["secrets"] //对象类型
verbs: ["get", "watch", "list"] //可执行的动作
3.1.3 RoleBinding and ClusterRoleBinding
role和clusterrole角色创建好后,我们需要绑定角色与用户组之间的关系
3.1.3.1 角色绑定角色
RoloBinding 可以将角色中定义的权限授予用户或用户组,RoleBinding 包含一组权限列表(subjects),权限列表中包含有不同形式的待授予权限资源类型(users, groups, or service accounts);RoloBinding 同样包含对被 Bind 的 Role 引用;RoleBinding 适用于某个命名空间内授权,而 ClusterRoleBinding 适用于集群范围内的授权
//将 default 命名空间的 pod-reader Role 授予 jane 用户,此后 jane 用户在 default 命名空间中将具有 pod-reader 的权限
kind: RoleBinding //角色绑定
apiVersion: rbac.authorization.k8s.io/v1beta1 //接口组版本
metadata:
name: read-pods //当前角色的名字
namespace: default //所在角色的命名空间
subjects:
- kind: User //用户类型
name: jane //用户名称
apiGroup: rbac.authorization.k8s.io //rbac的组
roleRef:
kind: Role //来源于一个角色
name: pod-reader //角色名称
apiGroup: rbac.authorization.k8s.io
3.1.3.2 角色绑定集群角色
RoleBinding 同样可以引用 ClusterRole 来对当前 namespace 内用户、用户组或 ServiceAccount 进行授权,这种操作允许集群管理员在整个集群内定义一些通用的 ClusterRole,然后在不同的 namespace 中使用 RoleBinding 来引用
例如,以下 RoleBinding 引用了一个 ClusterRole,这个 ClusterRole 具有整个集群内对 secrets 的访问权限;但是其授权用户 dave 只能访问 development 空间中的 secrets(因为 RoleBinding 定义在 development 命名空间)
# This role binding allows "dave" to read secrets in the "development" namespace.
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: read-secrets
namespace: dev # This only grants permissions within the "development" namespace.
subjects:
- kind: User
name: dave
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: secret-reader
apiGroup: rbac.authorization.k8s.io
3.1.3.3 集群角色绑定就群角色
使用 ClusterRoleBinding 可以对整个集群中的所有命名空间资源权限进行授权;以下 ClusterRoleBinding 样例展示了授权 manager 组内所有用户在全部命名空间中对 secrets 进行访问
# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace.
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: read-secrets-global
subjects:
- kind: Group
name: manager
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: secret-reader
apiGroup: rbac.authorization.k8s.io
3.1.4 对pod更细的权限划分 Resources
Kubernetes 集群内一些资源一般以其名称字符串来表示,这些字符串一般会在 API 的 URL 地址中出现;同时某些资源也会包含子资源,例如 logs 资源就属于 pods 的子资源,API 中 URL 样例如下
GET /api/v1/namespaces/{namespace}/pods/{name}/log
如果要在 RBAC 授权模型中控制这些子资源的访问权限,可以通过 / 分隔符来实现,以下是一个定义 pods 资资源 logs 访问权限的 Role 定义样例
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
namespace: default
name: pod-and-pod-logs-reader
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"] //pods相当屋里所有的门,屋里厕所门是pods/log,给你一把钥匙能开所有的门,把pods删掉后,你就只能开厕所门 pods/log 了
verbs: ["get", "list"]
3.1.5 to Subjects
RoleBinding 和 ClusterRoleBinding 可以将 Role 绑定到 Subjects;Subjects 可以是 groups、users 或者 service accounts
Subjects 中 Users 使用字符串表示,它可以是一个普通的名字字符串,如 “alice”;也可以是 email 格式的邮箱地址,如 “wangyanglinux@163.com”;甚至是一组字符串形式的数字 ID 。但是 Users 的前缀 system: 是系统保留的,集群管理员应该确保普通用户不会使用这个前缀格式
Groups 书写格式与 Users 相同,都为一个字符串,并且没有特定的格式要求;同样 system: 前缀为系统保留
3.2.1 实践1
3.2.2 实践2:创建一个用户只能管理 dev 空间
- 我们首先创建一个证书
- 然后转换成kubeconfig文件(访问的钥匙)
- 创建一个名称空间,然后把kubeconfig里面封装的用户授权给名称空间,即rollbing
- kubectl用这个kubeconfig文件去操作
3.2.1.1 创建证书
coredns公司不仅创建了flannel,etcd等工具,还开发了一个根据json格式进行证书签发的工具
需要从外网下载,太慢了,我存放到网盘上了
链接:https://pan.baidu.com/s/1K8iOwnHwgWSB9Zh99Sx1vA
提取码:pecv
# 下载证书生成工具
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
mv cfssl* /usr/bin/;chmod 755 /usr/bin/cfssl*
vim /etc/kubernetes/pki/devuser.json // /etc/kubernetes/pki/一般是k8s保存证书的位置,我们放到这里了
{
"CN": "devuser",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
//签发证书
cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes ./devuser.json | cfssljson -bare devuser
//-ca=ca.crt 指定ca证书,注意这里是/etc/kubernetes/pki/下面的,不是/etc/kubernetes/pki/etcd,否则创建出来的证书只能访问etcd
//-ca-key=ca.key 指定ca私钥
//-profile=kubernetes 指定为哪个类型去创建我们的证书
// ./devuser-csr.json 指定我们的json文件位置
//cfssljson 交给cfssljson
//-bare devuser 指定你添加内部用户叫什么,如果改名字需要把json里的也改掉
//生成的文件:
// devuser.pem 证书
// devuser-key.pem 私钥
//设置集群参数
export KUBE_APISERVER="https://192.168.50.121:6443"
kubectl config set-cluster kubernetes \ //涉及一个集群
--certificate-authority=/etc/kubernetes/pki/ca.crt \ //注意指定的是集群ca证书,不是刚才生成的
--embed-certs=true \ //允许认证
--server=${KUBE_APISERVER} \ //指定服务端地址
--kubeconfig=devuser.kubeconfig //把当前信息保存到devuser.kubeconfig文件中
//生成的文件:
// devuser.kubeconfig 配置文件
# 设置客户端认证参数
kubectl config set-credentials devuser \
--client-certificate=/etc/kubernetes/pki/devuser.pem \ //指定刚才生成的证书
--client-key=/etc/kubernetes/pki/devuser-key.pem \ //指定刚才生成的私钥
--embed-certs=true \
--kubeconfig=devuser.kubeconfig //追加到刚才生成的配置文件里,添加客户端认证参数
# 设置上下文参数
kubectl config set-context kubernetes \
--cluster=kubernetes \ //集群名称
--user=devuser \ //用户名
--namespace=dev \ //命名哪个命名空间
--kubeconfig=devuser.kubeconfig
//我们可以kubectl get ns 查看命名空间,可以看到现在没有dev的命名空间,这是所谓的家,我们手动创建这个命名空间,创建好后,我们的用户凭据有了,命名空间也有了
kubectl create ns dev;kubectl get ns
//设置默认上下文,用kubectl测试生成的devuser.kubeconfig 是否可用
kubectl config use-context kubernetes --kubeconfig=devuser.kubeconfig
//拷贝到root目录下后,当前的kubectl就是用当前用户去登陆了,但是目前devuser这个用户没有任何权限,需要绑定权限,没有意义
cp -f ./devuser.kubeconfig /root/.kube/config
//绑定权限
kubectl create rolebinding devuser-admin-binding --clusterrole=admin --user=devuser --namespace=dev
//rolebinding 角色绑定
//devuser-admin-binding 当前rollbing的名称
//--clusterrole=admin 集群角色admin,admin和cluster-admin都是集群管理员角色
//--user=devuser 指定绑定哪个用户
//--namespace=dev 指定绑定哪个命名空间
//也可以查看yaml而不运行
kubectl create rolebinding devuser-admin-binding --clusterrole=admin --user=devuser --namespace=dev --dry-run -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
creationTimestamp: null
name: devuser-admin-binding //名字
namespace: dev //所在命名空间
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole //角色来源类型角色集群
name: admin //角色
subjects: //标识点
- apiGroup: rbac.authorization.k8s.io
kind: User //用户类型
name: devuser //用户
//查看刚才创建的rolebinding
kubectl get rolebinding -n dev
//如果有一天不想把devuser赋予给dev当管理员了删掉devuser-admin-binding 就可以了
kubectl delete rolebinding devuser-admin-binding -n dev
//我们把上面创建的 devuser.kubeconfig拷贝到非root用户下,非root用户就能以admin的角色集群的权限登陆kubectl了
useradd liwenchao;passwd liwenchao
cp devuser.kubeconfig /home/liwenchao/
cd /home/liwenchao/;mkdir -p .kube
chown liwenchao.liwenchao devuser.kubeconfig;mv devuser.kubeconfig .kube/
su liwenchao;cd ~
echo "export KUBECONFIG=/etc/kubernetes/^Cmin.conf" >> ~/.bash_profile
source .bash_profile
kubectl get pods
//以上我们实现了一半的资源控制,因为同一个集群下,即使分了小组,一个命名空间仍然可以使用全部的集群资源,对其他小组做不到公平,我们后面可以资源划分,每个人分一块,即使用不了也空闲着
4.1 准入控制
假如你是学生,有特权进了校长办公室,但是你砸了校长电脑,这个动作是不被允许的,需要被约束删除这种砸电脑的权限。所以准入控制是防止外来攻击恶意操作
准入控制是API Server的插件集合,通过添加不同的插件,实现额外的准入控制规则。甚至于API Server的一些主要的功能都需要通过 Admission Controllers 实现,比如 ServiceAccount
官方文档上有一份针对不同版本的准入控制器推荐列表,其中最新的 1.14 的推荐列表是:
NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota
列举几个插件的功能:
- NamespaceLifecycle: 防止在不存在的 namespace 上创建对象,防止删除系统预置 namespace,删除 namespace 时,连带删除它的所有资源对象。
- LimitRanger:确保请求的资源不会超过资源所在 Namespace 的 LimitRange 的限制。
- ServiceAccount: 实现了自动化添加 ServiceAccount。
- ResourceQuota:确保请求的资源不会超过资源的 ResourceQuota 限制。