原文出处: 25-k8s集群中-RBAC用户角色资源权限_权限 资源 角色-优快云博客
这里根据自己的实践做了完善笔记.
1,用户的创建流程
1,User
2,SerciceAccount
3,Group
本质上讲,在k8s系统中,用户,就是一个文件,这个文件在当前登录用户的家目录下;
这个文件config,就代表“我”是谁;
这里面并没有角色、权限信息,角色和权限信息,在其他位置;
[root@k8s231 ~]# ll .kube/config
-rw------- 1 root root 5634 Jan 1 19:40 .kube/config
所以,要创建用户,就是要创建这个文件;
那么如何创建这个文件呐?
· ssl流程介绍
知道了ssl原理,https请求过程,我们就了解了,ssl的安全机制;实际上k8s当中“根证书”早就生成好了,在我们kubeadm部署的时候,就自动帮我们生成了;
k8s是模拟ca机构,给自己颁发证书,自己验证自己,所以,整数中有私钥、公钥等;
[root@k8s231 ~]# ll /etc/kubernetes/pki/
total 56
-rw-r--r-- 1 root root 1281 Jan 1 19:39 apiserver.crt
-rw-r--r-- 1 root root 1155 Jan 1 19:39 apiserver-etcd-client.crt
-rw------- 1 root root 1679 Jan 1 19:39 apiserver-etcd-client.key
-rw------- 1 root root 1675 Jan 1 19:39 apiserver.key
-rw-r--r-- 1 root root 1164 Jan 1 19:39 apiserver-kubelet-client.crt
-rw------- 1 root root 1679 Jan 1 19:39 apiserver-kubelet-client.key
#根证书
-rw-r--r-- 1 root root 1099 Jan 1 19:39 ca.crt
#ca机构的私钥
-rw------- 1 root root 1679 Jan 1 19:39 ca.key
drwxr-xr-x 2 root root 162 Jan 1 19:39 etcd
-rw-r--r-- 1 root root 1115 Jan 1 19:39 front-proxy-ca.crt
-rw------- 1 root root 1675 Jan 1 19:39 front-proxy-ca.key
-rw-r--r-- 1 root root 1119 Jan 1 19:39 front-proxy-client.crt
-rw------- 1 root root 1679 Jan 1 19:39 front-proxy-client.key
-rw------- 1 root root 1675 Jan 1 19:39 sa.key
-rw------- 1 root root 451 Jan 1 19:39 sa.pub
1.生成用户证书
一个用户一个证书,这个用户证书,就是用来生成,用户文件的(也就是家目录下的config)
· 生成kubeconfig用户授权文件
有了这个授权文件,我们就拥有了一个用户了;但是,还没有任何权限,还无法使用;
2.创建角色和规则
通过资源清单的方式,创建角色和规则;
角色就是:
1,Role:局部资源角色
2,ClusterRole:全局资源角色
规则就是:这个角色的权限;能使用什么资源、不能使用什么资源,,,,
3,角色与用户的绑定
根据角色的不同,创建资源清单,对应不同的绑定资源清单的编写;1,RoleBinding
2,ClusterRoleBinding
只要角色和用户绑定完成,那么,RBAC的整个流程就结束了;
我们就成功创建了一个带有特定权限的用户;就可以分发给“同事”进行使用了;
4,逻辑流程的总结
RBAC创建初体验
1,创建用户【user】
· 生成用户ssl证书
以往我们使用openssl的工具命令生成证书,比较繁琐,本次学习,我给大家介绍一个证书生成工具,叫做cfssl证书生成工具;
1,上传/下载cfssl证书生成工具
或者去github地址下载:https://github.com/cloudflare/cfssl/releases/tag/v1.6.4
这里用到几个文件.
1.
2.
cfssl-certinfo_1.6.4_linux_amd64
3.
3.将文件上传到服务器(这里是k8s主节点.)
[root@k8s231 rbac]# ll
2,解压cfssl工具压缩包
[root@k8s231 rbac]# ll
-rw-r--r-- 1 root root 12054528 Aug 30 15:46 cfssl_1.6.4_linux_amd64
-rw-r--r-- 1 root root 9560064 Aug 30 15:45 cfssl-certinfo_1.6.4_linux_amd64
-rw-r--r-- 1 root root 7643136 Aug 30 15:48 cfssljson_1.6.4_linux_amd64
3,删除压缩包,将cfssl文件改名
[root@k8s231 rbac]# rename _1.6.4_linux_amd64 "" *
[root@k8s231 rbac]# ll
-rw-r--r-- 1 root root 12054528 Aug 30 15:46 cfssl
-rw-r--r-- 1 root root 9560064 Aug 30 15:45 cfssl-certinfo
-rw-r--r-- 1 root root 7643136 Aug 30 15:48 cfssljson
4,将cfssl文件编程全局命令
将这三个文件,移动到/usr/local/bin目录下,编程全局命令~
[root@k8s231 rbac]# mv ./* /usr/local/bin/
5,给cfssl执行文件加执行权限
[root@k8s231 rbac]# chmod +x /usr/local/bin/cfssl*
6,编辑cfssl工具的生成用户ssl证书的配置文件
# 根证书
[root@k8s231 rbac]# cat ca-config.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
客户端验证签名证书
[root@k8s231 rbac]# cat csr.json
{
"CN": "xinjizhiwa",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
7,使用cfssl工具生成用户的ssl证书
[root@k8s231 rbac]# cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes csr.json | cfssljson -bare xinjizhiwa
参数解释:
#使用k8s自带的证书来签发客户端证书(位置就在/etc/kubernetes/pki/下面);
-ca=/etc/kubernetes/pki/ca.crt
-ca-key=/etc/kubernetes/pki/ca.key
-config=ca-config.json
-profile=kubernetes csr.json | cfssljson -bare xinjizhiwa
8.查看证书
[root@k8s231 rbac]# ll
total 20
-rw-r--r-- 1 root root 292 Feb 21 20:06 ca-config.json
-rw-r--r-- 1 root root 223 Feb 21 20:07 csr.json
-rw-r--r-- 1 root root 1001 Feb 21 20:11 xinjizhiwa.csr
-rw------- 1 root root 1675 Feb 21 20:11 xinjizhiwa-key.pem
-rw-r--r-- 1 root root 1285 Feb 21 20:11 xinjizhiwa.pem
至此,我们用户的ssl证书申请完毕了;
生成用户kubeconfig文件
1,编辑生成kubeconfig文件的执行脚本
[root@k8s231 rbac]# cat kubeconfig.sh
#!/bin/bash
# 配置集群;
# --certificate-authority:指定K8s的ca根证书文件路径
# --embed-certs:
# 1,true,表示将根证书文件的内容写入到配置文件中,
# 2,false,则只是引用配置文件,将kubeconfig
# --server:指定APIServer的地址。
# --kubeconfig:指定kubeconfig的配置文件名称
kubectl config set-cluster xinjizhiwa-cluster \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true \
--server=https://192.168.59.21:6443 \
--kubeconfig=xinjizhiwa.kubeconfig
# 设置客户端认证,客户端将来需要携带证书让服务端验证
kubectl config set-credentials xinjizhiwa-client \
--client-key=xinjizhiwa-key.pem \
--client-certificate=xinjizhiwa.pem \
--embed-certs=true \
--kubeconfig=xinjizhiwa.kubeconfig
# 设置默认上下文,可以用于绑定多个客户端和服务端的对应关系(客户端和服务端绑定)。
kubectl config set-context xinjizhiwa \
--cluster=xinjizhiwa-cluster \
--user=xinjizhiwa-client \
--kubeconfig=xinjizhiwa.kubeconfig
# 设置当前使用的上下文(正式生效)
kubectl config use-context xinjizhiwa --kubeconfig=xinjizhiwa.kubeconfig
2,执行生成kubeconfig用户文件的执行脚本
正式生成用户
[root@k8s231 rbac]# bash kubeconfig.sh
Cluster "xinjizhiwa-cluster" set.
User "xinjizhiwa-client" set.
Context "xinjizhiwa" created.
Switched to context "xinjizhiwa".
查看生成的kubeconfig用户文件
[root@k8s231 rbac]# ll
......
-rw------- 1 root root 5802 Feb 21 20:24 xinjizhiwa.kubeconfig
拓展知识:也可以使用config资源清单编写生成用户kubeconfig文件
[root@k8s231 rbac]# cat xinjizhiwa.kubeconfig
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: ......(/etc/kubernetes/pki/ca.crt)
server: https://10.0.0.231:6443
name: xinjizhiwa-cluster
contexts:
- context:
cluster: xinjizhiwa-cluster
user: xinjizhiwa-client
name: xinjizhiwa
current-context: xinjizhiwa
kind: Config
preferences: {}
users:
- name: xinjizhiwa-client
user:
client-certificate-data: .......(xinjizhiwa.pem或者写入公钥串,pem记得base64 -d之后使用)
client-key-data: ......(xinjizhiwa-key.pem)
此时使用这个用户,取查看pod,会提示你没有权限,因为咱们还没有创建、绑定角色;
[root@k8s231 rbac]# kubectl get pods --kubeconfig=xinjizhiwa.kubeconfig
至此,我们用户“xinjizhiwa”就创建完成了;
2,创建角色编写规则
编辑角色资源清单
上述内容中,我们知道,角色有两种,一种是全局角色ClusterRole,另一种是局部角色Role;我们先创建一个局部的Role角色作为学习;
[root@k8s231 rbac]# cat role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: xinjizhiwa-role
namespace: default
rules:
#声明API组;[""]代表v1;["apps"]代表apps/v1
- apiGroups: ["","apps"]
#声明API组下面的资源类型(不支持简写,只能写全称)
resources: ["pods","deployments","services"]
#声明使用方式(动作增删改查、、)
verbs: ["get","list","delete"]
· 创建角色
[root@k8s231 rbac]# kubectl apply -f role.yaml
查看角色
[root@k8s231 rbac]# kubectl get role
NAME CREATED AT
xinjizhiwa-role 2024-02-21T13:19:34Z
至此,用户和角色及规则都创建成功了;
3,绑定用户与角色
编辑绑定资源清单
[root@k8s231 rbac]# cat bind.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: xinjizhiwa-bind
namespace: default
#声明用户主体(绑定的用户是哪个)
subjects:
#由于我们用户类型有三种,所以需要写明用户类型;
- kind: User
#用户名称
name: xinjizhiwa
apiGroup: rbac.authorization.k8s.io
#声明角色主体(绑定的角色是哪个?)
roleRef:
#角色类型
kind: Role
#角色名称
name: xinjizhiwa-role
apiGroup: rbac.authorization.k8s.io
· 创建绑定资源
[root@k8s231 rbac]# kubectl apply -f bind.yaml
4,测试用户
测试创建功能
(这里role权限资源文件中没有将创建资源的能力给到该用户所以应该是创建不成功的)
协议个pod资源,使用用户“xinjizhiwa”创建,发现创建不了,提示权限不够;
[root@k8s1 /zpf/rbac]$kubectl create -f pod.yaml --kubeconfig=xinjizhiwa.kubeconfig
Error from server (Forbidden): error when creating "pod.yaml": pods is forbidden: User "xinjizhiwa" cannot create resource "pods" in API group "" in the namespace "default
因为,我们在创建角色规则的时候,只给了删除、和查看的能力,没有给create创建能力;
[root@k8s231 rbac]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-nginx
spec:
containers:
- name: c1
image: nginx:1.20.1-alpine
[root@k8s231 rbac]# kubectl apply -f pod.yaml --kubeconfig=xinjizhiwa.kubeconfig
将创建权限分配给这个用户.
[root@k8s1 /zpf/rbac]$vim role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: xinjizhiwa-role
namespace: default
rules:
#声明API组;[""]代表v1;["apps"]代表apps/v1
- apiGroups: ["","apps"]
#声明API组下面的资源类型(不支持简写,只能写全称)
resources: ["pods","deployments","services"]
#声明使用方式(动作增删改查、、)
verbs: ["get","list","delete","create"]
更新role资源
[root@k8s1 /zpf/rbac]$kubectl create -f role.yaml
role.rbac.authorization.k8s.io/xinjizhiwa-role created
查看role中的权限
[root@k8s1 /zpf/rbac]$kubectl describe role xinjizhiwa-role
Name: xinjizhiwa-role
Labels: <none>
Annotations: <none>
PolicyRule:
Resources Non-Resource URLs Resource Names Verbs
--------- ----------------- -------------- -----
deployments [] [] [get list delete create]
pods [] [] [get list delete create]
services [] [] [get list delete create]
deployments.apps [] [] [get list delete create]
pods.apps [] [] [get list delete create]
services.apps [] [] [get list delete create]
使用该用户创建一个pod资源
创建pod
[root@k8s1 /zpf/rbac]$kubectl create -f pod.yaml --kubeconfig=xinjizhiwa.kubeconfig
pod/pod-nginx created
查看创建情况
[root@k8s1 /zpf/rbac]$kubectl get po --kubeconfig=xinjizhiwa.kubeconfig |grep nginx
pod-nginx 1/1 Running 0 23s
因为我们有default默认名称空间的查看、删除权限,所以我们可以进行查看;
测试查看功能
[root@k8s231 rbac]# kubectl get pods --kubeconfig=xinjizhiwa.kubeconfig
测试删除功能
[root@k8s1 /zpf/rbac]$kubectl delete -f pod.yaml --kubeconfig=xinjizhiwa.kubeconfig
pod "pod-nginx" deleted
E1112 17:21:15.528756 17595 reflector.go:147] vendor/k8s.io/client-go/tools/watch/informerwatcher.go:146: Failed to watch *unstructured.Unstructured: unknown
E1112 17:21:16.654387 17595 reflector.go:147] vendor/k8s.io/client-go/tools/watch/informerwatcher.go:146: Failed to watch *unstructured.Unstructured: unknown
#这里有点疑惑,为啥输出打印报错,但是查询pod是删除成功了?查了一下貌似可能是客户端的bug
[root@k8s1 /zpf/rbac]$kubectl get po
NAME READY STATUS RESTARTS AGE
到此,普通用户的创建、角色绑定、角色配置就学习完毕了;
四、其他节点使用用户登录操作k8s
这里我使用的是一台nas的节点.(上面需要安装一个kubectl).
#安装kubectl,这里将主节点的kubectl推送到nas服务器上.(这里如果目标服务器上相关目录没有的话就创建一个.)
[root@k8s1 /zpf/rbac]$whereis kubectl
kubectl: /usr/local/bin/kubectl
[root@k8s1 /zpf/rbac]$scp ./kubectl root@192.168.59.20://usr/local/bin/
#....输入用户名密码.如果做了免密认证就不需要密码
将用户证书推送到nas服务器
[root@k8s1 /zpf/rbac]$scp xinjizhiwa.kubeconfig root@192.168.59.20:/root/.kube/
#...同上
#将用户证书重命名一下,方便系统读取
[root@nfs ~/.kube]$mv xinjizhiwa.kubeconfig config
#验证结果
[root@nfs ~/.kube]$kubectl get po
NAME READY STATUS RESTARTS AGE
jenkins-master-5457754f77-m2gs8 1/1 Running 1 (7d ago) 7d1h
nfs-client-provisioner-64fb48857b-wnwg7 1/1 Running 41 (14d ago) 71d
postgres-sonar-6ccc55ddb6-tqnww 1/1 Running 6 (14d ago) 68d
sonarqube-856876d5c7-542gc 1/1 Running 6 (14d ago) 68d
worker1-5d4679b9c7-zggcf 1/1 Running 0 8d
worker2-5ffcbdbbf-hnbkp 1/1 Running 0 8d
五,用户组使用
1.创建用户证书
配置用户证书信息,其中包含
[root@k8s1 /zpf/rbac/group]$cat ca-group.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
配置证书组信息
[root@k8s1 /zpf/rbac/group]$cat group-user-xjzw.json
{
"CN": "xinjizhiwa",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "xinjizhiwa-group",
"OU": "System"
}
]
}
使用cfssl生成用户签名以及证书(包含公钥私钥)
[root@k8s1 /zpf/rbac/group]$cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-group.json -profile=kubernetes group-user-xjzw.json |cfssljson -bare xjzw
2024/11/18 17:17:55 [INFO] generate received request
2024/11/18 17:17:55 [INFO] received CSR
2024/11/18 17:17:55 [INFO] generating key: rsa-2048
2024/11/18 17:17:55 [INFO] encoded CSR
2024/11/18 17:17:55 [INFO] signed certificate with serial number 603463176556423048384677089408337471674534126173
2024/11/18 17:17:55 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements").
#这里就是根据刚刚的俩文件,外加k8s的根证书生成了三个文件,
#用户签名xjzw.csr
#用户私钥xjzw-key.pem
#用户公钥xjzw.pem
将这几个文件添加到一个文件中,
[root@k8s1 /zpf/rbac/group]$cat kuberconfig.sh
#!/bin/bash
# 配置集群;
# --certificate-authority:指定K8s的ca根证书文件路径
# --embed-certs:
# 1,true,表示将根证书文件的内容写入到配置文件中,
# 2,false,则只是引用配置文件,将kubeconfig
# --server:指定APIServer的地址。
# --kubeconfig:指定kubeconfig的配置文件名称
kubectl config set-cluster xinjizhiwa-cluster \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true \
--server=https://192.168.59.21:6443 \
--kubeconfig=xinjizhiwa-group.kubeconfig
#这里指定xinjizhiwa-group.kubeconfig 文件,将根签名信息以及端口信息写到xinjizhiwa-group.kubeconfig这个文件中.
# 设置客户端认证,客户端将来需要携带证书让服务端验证
kubectl config set-credentials xinjizhiwa-client \
--client-key=xjzw-key.pem \
--client-certificate=xjzw.pem \
--embed-certs=true \
--kubeconfig=xinjizhiwa-group.kubeconfig
#这里同样指定文件xinjizhiwa-group.kubeconfig,将客户端的公钥,私钥,写到xinjizhiwa-group.kubeconfig文件中.
# 设置默认上下文,可以用于绑定多个客户端和服务端的对应关系(客户端和服务端绑定)。
kubectl config set-context xinjizhiwa-group \
--cluster=xinjizhiwa-cluster \
--user=xinjizhiwa-client \
--kubeconfig=xinjizhiwa-group.kubeconfig
#默认上下文,写到xinjizhiwa-group.kubeconfig文件中.
# 设置当前使用的上下文(正式生效)
kubectl config use-context xinjizhiwa-group --kubeconfig=xinjizhiwa-group.kubeconfig
将文件推送到node节点进行测试
#master操作
[root@k8s1 /zpf/rbac/group]$scp xinjizhiwa-group.kubeconfig root@192.168.59.22:/root
#node节点操作
[root@node1 ~]$cd /root/
[root@node1 ~]$mkdir .kube
[root@node1 ~]$mv xinjizhiwa-group.kubeconfig .kube/config
测试是否成功
[root@node1 ~]$kubectl get po
NAME READY STATUS RESTARTS AGE
jenkins-master-5457754f77-m2gs8 1/1 Running 2 (6d ago) 13d
nfs-client-provisioner-64fb48857b-wnwg7 1/1 Running 47 (31m ago) 77d
postgres-sonar-6ccc55ddb6-tqnww 1/1 Running 7 (7h2m ago) 74d
sonarqube-856876d5c7-542gc 1/1 Running 7 (7h2m ago) 74d
worker1-5d4679b9c7-zggcf 1/1 Running 1 (7h2m ago) 14d
worker2-5ffcbdbbf-hnbkp 1/1 Running 1 (7h2m ago) 14d
#验证成功


225

被折叠的 条评论
为什么被折叠?



