建设好网站外链有哪些方式,机关单位特色的网站建设,网站服务器速度对seo有什么影响?,wordpress一年后续费一、RBAC概述
1#xff0c;k8s集群的交互逻辑#xff08;简单了解#xff09; 我们通过k8s各组件架构#xff0c;指导各个组件之间是使用https进行数据加密及交互的#xff0c;那么同理#xff0c;我们作为“使用”k8s的各种资源#xff0c;也是通过https进行数据加密的…一、RBAC概述
1k8s集群的交互逻辑简单了解 我们通过k8s各组件架构指导各个组件之间是使用https进行数据加密及交互的那么同理我们作为“使用”k8s的各种资源也是通过https进行数据加密的 k8s通过我们家目录下的证书来判断我们是谁通过证书内容认定我们的权限 用户证书的位置 [rootk8s231 ~]# ll -a .kube/config -rw------- 1 root root 5634 Jan 1 19:40 .kube/config 2k8s的安全架构简单了解 3RBAC用户授权的逻辑重要 用户/主题Topic 1,User 2,SerciceAccount 3,Group
用户角色 1Role局部资源角色 2ClusterRole全局资源角色
角色绑定 1RoleBinding 2ClusterRoleBinding
4查看现有的集群默认角色 [rootk8s231 ~]# kubectl get clusterrole | grep -v system admin主要用于授权命名空间所有读写的权限 cluster-admin:超级管理员由集群所有权限 edit允许对大多数对象进行读写操作不允许查看或者修改角色、角色绑定 view允许对命名空间大多数对象进行读写不允许查看角色、角色绑定、secret ##### kubeadm用户只有使用kubeadm部署k8s时才会出现不用关心它 二、流程介绍
1用户的创建流程 1,User 2,SerciceAccount 3,Group 本质上讲在k8s系统中用户就是一个文件这个文件在当前登录用户的家目录下
这个文件config就代表“我”是谁 这里面并没有角色、权限信息角色和权限信息在其他位置 [rootk8s231 ~]# ll .kube/config -rw------- 1 root root 5634 Jan 1 19:40 .kube/config 所以要创建用户就是要创建这个文件 那么如何创建这个文件呐
· ssl流程介绍 知道了ssl原理https请求过程我们就了解了ssl的安全机制 实际上k8s当中“根证书”早就生成好了在我们kubeadm部署的时候就自动帮我们生成了 k8s是模拟ca机构给自己颁发证书自己验证自己所以整数中有私钥、公钥等 [rootk8s231 ~]# 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 · 生成用户证书 一个用户一个证书这个用户证书就是用来生成用户文件的也就是家目录下的config
· 生成kubeconfig用户授权文件 有了这个授权文件我们就拥有了一个用户了 但是还没有任何权限还无法使用
2创建角色和规则 通过资源清单的方式创建角色和规则 角色就是 1Role局部资源角色 2ClusterRole全局资源角色 规则就是这个角色的权限能使用什么资源、不能使用什么资源
3角色与用户的绑定 根据角色的不同创建资源清单对应不同的绑定资源清单的编写 1RoleBinding 2ClusterRoleBinding 只要角色和用户绑定完成那么RBAC的整个流程就结束了 我们就成功创建了一个带有特定权限的用户就可以分发给“同事”进行使用了
4逻辑流程的总结 三、RBAC创建初体验
1创建用户【user】
· 生成用户ssl证书 以往我们使用openssl的工具命令生成证书比较繁琐本次学习我给大家介绍一个证书生成工具叫做cfssl证书生成工具
1上传/下载cfssl证书生成工具
cfssl工具百度网盘地址
链接https://pan.baidu.com/s/1gDRQuxekvgInplLkpjvhQw?pwdf31x 提取码f31x
或者去github地址下载Releases · cloudflare/cfssl · GitHub [rootk8s231 rbac]# rz -E [rootk8s231 rbac]# ll -rw-r--r-- 1 root root 10808877 Nov 8 00:30 cfssl.zip 2解压cfssl工具压缩包 [rootk8s231 rbac]# unzip cfssl.zip [rootk8s231 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 -rw-r--r-- 1 root root 10808877 Nov 8 00:30 cfssl.zip 3删除压缩包将cfssl文件改名 为什么改名为了便于使用~如果你不嫌费力可以不改~ [rootk8s231 rbac]# rm -rf cfssl.zip [rootk8s231 rbac]# rename _1.6.4_linux_amd64 * [rootk8s231 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目录下编程全局命令~ [rootk8s231 rbac]# mv ./* /usr/local/bin/ 5给cfssl执行文件加执行权限 [rootk8s231 rbac]# chmod x /usr/local/bin/cfssl* 6编辑cfssl工具的生成用户ssl证书的配置文件 根证书 [rootk8s231 rbac]# cat ca-config.json { signing: { default: { expiry: 87600h }, profiles: { kubernetes: { usages: [ signing, key encipherment, server auth, client auth ], expiry: 87600h } } } } 客户端验证签名证书 [rootk8s231 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证书 [rootk8s231 rbac]# cfssl gencert -ca/etc/kubernetes/pki/ca.crt -ca-key/etc/kubernetes/pki/ca.key -configca-config.json -profilekubernetes csr.json | cfssljson -bare xinjizhiwa 参数解释 #使用k8s自带的证书来签发客户端证书位置就在/etc/kubernetes/pki/下面 -ca/etc/kubernetes/pki/ca.crt -ca-key/etc/kubernetes/pki/ca.key -configca-config.json -profilekubernetes csr.json | cfssljson -bare xinjizhiwa 查看证书 [rootk8s231 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文件的执行脚本 [rootk8s231 rbac]# cat kubeconfig.sh #!/bin/bash # 配置集群; # --certificate-authority指定K8s的ca根证书文件路径 # --embed-certs # 1true表示将根证书文件的内容写入到配置文件中 # 2false,则只是引用配置文件将kubeconfig # --server指定APIServer的地址。 # --kubeconfig指定kubeconfig的配置文件名称 kubectl config set-cluster xinjizhiwa-cluster \ --certificate-authority/etc/kubernetes/pki/ca.crt \ --embed-certstrue \ --serverhttps://10.0.0.231:6443 \ --kubeconfigxinjizhiwa.kubeconfig # 设置客户端认证客户端将来需要携带证书让服务端验证 kubectl config set-credentials xinjizhiwa-client \ --client-keyxinjizhiwa-key.pem \ --client-certificatexinjizhiwa.pem \ --embed-certstrue \ --kubeconfigxinjizhiwa.kubeconfig # 设置默认上下文可以用于绑定多个客户端和服务端的对应关系客户端和服务端绑定。 kubectl config set-context xinjizhiwa \ --clusterxinjizhiwa-cluster \ --userxinjizhiwa-client \ --kubeconfigxinjizhiwa.kubeconfig # 设置当前使用的上下文(正式生效) kubectl config use-context xinjizhiwa --kubeconfigxinjizhiwa.kubeconfig 2执行生成kubeconfig用户文件的执行脚本 正式生成用户 [rootk8s231 rbac]# bash kubeconfig.sh Cluster xinjizhiwa-cluster set. User xinjizhiwa-client set. Context xinjizhiwa created. Switched to context xinjizhiwa. 查看生成的kubeconfig用户文件 [rootk8s231 rbac]# ll ...... -rw------- 1 root root 5802 Feb 21 20:24 xinjizhiwa.kubeconfig 拓展知识也可以使用config资源清单编写生成用户kubeconfig文件 [rootk8s231 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会提示你没有权限因为咱们还没有创建、绑定角色 [rootk8s231 rbac]# kubectl get pods --kubeconfigxinjizhiwa.kubeconfig 至此我们用户“xinjizhiwa”就创建完成了
2创建角色编写规则
· 编辑角色资源清单 上述内容中我们知道角色有两种一种是全局角色ClusterRole另一种是局部角色Role 我们先创建一个局部的Role角色作为学习 [rootk8s231 rbac]# cat role.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: xinjizhiwa-role namespace: default rules: #声明API组;[]代表v1[apps]代表apps/v1 - apiGroup: [,apps] #声明API组下面的资源类型不支持简写只能写全称 resources: [pods,deployments,services] #声明使用方式动作增删改查、、 verbs: [get,list,delete] · 创建角色 [rootk8s231 rbac]# kubectl apply -f role.yaml 查看角色 [rootk8s231 rbac]# kubectl get role NAME CREATED AT xinjizhiwa-role 2024-02-21T13:19:34Z 至此用户和角色及规则都创建成功了
3绑定用户与角色
· 编辑绑定资源清单 [rootk8s231 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 · 创建绑定资源 [rootk8s231 rbac]# kubectl apply -f bind.yaml 4测试用户
协议个pod资源使用用户“xinjizhiwa”创建发现创建不了提示权限不够
因为我们在创建角色规则的时候只给了删除、和查看的能力没有给create创建能力 [rootk8s231 rbac]# cat pod.yaml apiVersion: v1 kind: Pod metadata: name: pod-nginx spec: containers: - name: c1 image: nginx:1.20.1-alpine [rootk8s231 rbac]# kubectl apply -f pod.yaml --kubeconfigxinjizhiwa.kubeconfig 因为我们有default默认名称空间的查看、删除权限所以我们可以进行查看
测试查看功能 [rootk8s231 rbac]# kubectl get pods --kubeconfigxinjizhiwa.kubeconfig 测试删除功能 [rootk8s231 rbac]# kubectl delete deploy --all --kubeconfigxinjizhiwa.kubeconfig 到此普通用户的创建、角色绑定、角色配置就学习完毕了
四、其他节点使用用户登录操作k8s 我们有了用户文件将用户文件发送给“同事”同事直接使用这个文件就可以按照绑定的规则操作k8s资源了
1模拟将用户文件发给同事 比如同事正在使用k8s233我们把用户文件发给他 [rootk8s231 rbac]# scp xinjizhiwa.kubeconfig k8s233:/root/ 2同事在k8s233使用用户文件操作k8s资源 [rootk8s233 ~]# kubectl get pods --kubeconfigxinjizhiwa.kubeconfig 3操作资源不指定文件默认指定设置 [rootk8s233 ~]# cp xinjizhiwa.kubeconfig ./.kube/config [rootk8s233 ~]# kubectl get pods 五、用户组Group案例
1用户组的概念 1用户组的好处在于无需单独为一个用户创建权限和绑定了只需要统一把一个组进行授权然后将该组的用户加入进去就没一个用户都拥有该组的权限了 2APIserver会优先校验用户名ssl证书中的CN字段若用户名没有对应的权限则再去校验用户组o的权限 k8s中的用户、用户组都是提取ssl证书签名字段中的一个字段不是在集群中创建的 --证书签名中的CN字段代表用户 --证书签名中的o字段代表用户组 2创建用户组Group
· 编辑cfssl证书请求文件 [rootk8s231 group]# cat ca-group.json { signing: { default: { expiry: 87600h }, profiles: { kubernetes: { usages: [ signing, key encipherment, server auth, client auth ], expiry: 87600h } } } } [rootk8s231 group]# cat xinjizhiwa-csr.json { CN: xinjizhiwa, hosts: [], key: { algo: rsa, size: 2048 }, names: [ { C: CN, ST: BeiJing, L: BeiJing, O: xinjizhiwa-group, OU: System } ] } · 生成用户组证书
再次声明你创建的是用户、还是用户组取决于你的证书名称选择的签名字段选择的是CN还是o [rootk8s231 group]# cfssl gencert -ca/etc/kubernetes/pki/ca.crt -ca-key/etc/kubernetes/pki/ca.key -configca-group.json -profilekubernetes xinjizhiwa-csr.json | cfssljson -bare xinjizhiwa-group · 编辑脚本生成用户组kubeconfig用户组文件 [rootk8s231 group]# cat kubeconfig.sh #!/bin/bash kubectl config set-cluster xinjizhiwa-cluster \ --certificate-authority/etc/kubernetes/pki/ca.crt \ --embed-certstrue \ --serverhttps://10.0.0.231:6443 \ --kubeconfigxinjizhiwa-group.kubeconfig # 设置客户端认证 kubectl config set-credentials xinjizhiw-client \ --client-keyxinjizhiwa-group-key.pem \ --client-certificatexinjizhiwa-group.pem \ --embed-certstrue \ --kubeconfigxinjizhiwa-group.kubeconfig # 设置默认上下文 kubectl config set-context xinjizhiwa-group \ --clusterxinjizhiwa-cluster \ --userxinjizhiw-client \ --kubeconfigxinjizhiwa-group.kubeconfig # 设置当前使用的上下文 kubectl config use-context xinjizhiwa-group --kubeconfigxinjizhiwa-group.kubeconfig · 执行脚本生成用户组文件 [rootk8s231 group]# bash kubeconfig.sh 3创建角色、绑定用户组
· 编辑资源清单 [rootk8s231 group]# cat rbac.yaml #创建角色 kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: default name: role-group rules: - apiGroups: [,apps] resources: [pods,nodes,services,deployments] verbs: [get, watch, list,create] --- #绑定用户组与角色 kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: group-rolebinding namespace: default #声明要绑定的用户/用户组 subjects: # 声明主体类型组 - kind: Group # 组名(对应的O字段) name: xinjizhiwa-group apiGroup: rbac.authorization.k8s.io roleRef: # 角色类型 kind: Role # 绑定角色名称 name: role-group apiGroup: rbac.authorization.k8s.io · 创建用户组kubeconfig文件 [rootk8s231 group]# kubectl apply -f rbac.yaml 此时我们就拥有了xinjizhiwa-group这个用户组了
4创建用户加入用户组
· 创建用户 [rootk8s231 user]# cat ca-config.json { signing: { default: { expiry: 87600h }, profiles: { kubernetes: { usages: [ signing, key encipherment, server auth, client auth ], expiry: 87600h } } } } [rootk8s231 user]# cat group-user-xjzw.json { CN: xjzw, hosts: [], key: { algo: rsa, size: 2048 }, names: [ { C: CN, ST: BeiJing, L: BeiJing, O: xinjizhiwa-group, OU: System } ] } 生成用户证书 [rootk8s231 user]# cfssl gencert -ca/etc/kubernetes/pki/ca.crt -ca-key/etc/kubernetes/pki/ca.key -configca-config.json -profilekubernetes group-user-xjzw.json | cfssljson -bare xjzw · xjzw用户加入用户组
1编辑生成kubeconfig用户文件的执行脚本 [rootk8s231 user]# ca kubeconfig.sh -bash: ca: command not found [rootk8s231 user]# cat kubeconfig.sh #!/bin/bash kubectl config set-cluster xinjizhiwa-cluster \ --certificate-authority/etc/kubernetes/pki/ca.crt \ --embed-certstrue \ --serverhttps://10.0.0.231:6443 \ --kubeconfigxjzw.kubeconfig # 设置客户端认证 kubectl config set-credentials xjzw-client \ --client-keyxjzw-key.pem \ --client-certificatexjzw.pem \ --embed-certstrue \ --kubeconfigxjzw.kubeconfig # 设置默认上下文 kubectl config set-context xinjizhiwa-contest \ --clusterxinjizhiwa-cluster \ --userxjzw-client \ --kubeconfigxjzw.kubeconfig # 设置当前使用的上下文 kubectl config use-context xinjizhiwa-contest --kubeconfigxjzw.kubeconfig 2执行脚本 [rootk8s231 user]# bash kubeconfig.sh 5测试用户是否拥有用户组的权限 [rootk8s231 user]# kubectl get pods --kubeconfigxjzw.kubeconfig 总结只要拥有了用户组我们创建用户的时候签名中“O”字段与用户组名相同那么创建出来的用户就拥有了用户组的权限就不在需要配置角色、绑定了方便了很多
六、基于【服务账号serviceaccount】授权 serviceaccount用户简称sa资源用于自动化程序的用户创建 创建sa用户就不需要使用证书来创建了它是k8s集群中的一个资源sa资源
1创建sa资源
· 声明式创建 [rootk8s231 sa]# vim sa01.yaml apiVersion: v1 kind: ServiceAccount metadata: name: py01 [rootk8s231 sa]# kubectl apply -f sa01.yaml serviceaccount/py01 created 查看sa服务账号 [rootk8s231 sa]# kubectl get sa NAME SECRETS AGE default 1 51d py01 1 4s · 响应式创建 [rootk8s231 sa]# kubectl create serviceaccount py02 查看sa用户 [rootk8s231 sa]# kubectl get sa NAME SECRETS AGE default 1 51d py01 1 2m4s py02 1 4s 2授权python程序对k8s-API的访问权限
· 创建用户 [rootk8s231 sa]# kubectl create serviceaccount py02 · 创建角色 [rootk8s231 sa]# vim role.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: python-role rules: - apiGroups: [] resources: [pods] verbs: [get,watch,list] [rootk8s231 sa]# kubectl apply -f role.yaml · 绑定sa账号和角色 [rootk8s231 sa]# vim bind.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: python-role-sa subjects: - kind: ServiceAccount name: py02 roleRef: kind: Role name: python-role apiGroup: rbac.authorization.k8s.io [rootk8s231 sa]# kubectl apply -f bind.yaml 3部署一个python的pod资源 [rootk8s231 sa]# vim pod.yaml apiVersion: apps/v1 kind: Deployment metadata: name: dm-py spec: replicas: 2 selector: matchLabels: apps: python template: metadata: labels: apps: python spec: #这里就是sa账号指定sa的名称请确认该账号是有权限访问K8S集群的哟! serviceAccountName: py02 containers: - image: python:3.9.16-alpine3.16 name: py command: - tail - -f - /etc/hosts [rootk8s231 sa]# kubectl apply -f pod.yaml 4进入pod中执行python代码 [rootk8s231 sa]# kubectl exec -it dm-py-64975879c8-b9sxg -- sh / # python --version Python 3.9.16 #写一个python脚本 / # cat view-k8s-resources.py EOF from kubernetes import client, config with open(/var/run/secrets/kubernetes.io/serviceaccount/token) as f: token f.read() configuration client.Configuration() configuration.host https://kubernetes # APISERVER地址 configuration.ssl_ca_cert/var/run/secrets/kubernetes.io/serviceaccount/ca.crt # CA证书 configuration.verify_ssl True # 启用证书验证 configuration.api_key {authorization: Bearer token} # 指定Token字符串 client.Configuration.set_default(configuration) apps_api client.AppsV1Api() core_api client.CoreV1Api() try: print(###### Deployment列表 ######) #列出default命名空间所有deployment名称 for dp in apps_api.list_namespaced_deployment(default).items: print(dp.metadata.name) except: print(没有权限访问Deployment资源) try: #列出default命名空间所有pod名称 print(###### Pod列表 ######) for po in core_api.list_namespaced_pod(default).items: print(po.metadata.name) except: print(没有权限访问Pod资源) EOF / # ####安装py使用k8s的插件######## / # pip install kubernetes -i https://pypi.tuna.tsinghua.edu.cn/simple/ #执行python脚本 / # python3 view-k8s-resources.py ###### Deployment列表 ###### 没有权限访问Deployment资源 ###### Pod列表 ###### dm-py-64975879c8-b9sxg dm-py-64975879c8-z76fp pod-nginx 至此关于k8s的RBAC的学习就此结束