人是一个事件,它无法判断自己,是好是坏,全都交由他人评判。 | 荣格自传

   

统计
  • 建站日期:2016-12-04
  • 文章总数:255 篇
  • 评论总数:174 条
  • 分类总数:9 个
  • 最后更新:9月20日
文章 学习笔记

手动创建k8s集群管理员,生成kubeconfig文件

橙子柠檬
首页 学习笔记 正文

前言

为Kubernetes集群自定义超级管理员的方法至少有两种方法:一是将用户归入system:masters用户组,二是通过ClusterRoleBinding将用户绑定至内置集群角色 cluster-admin上,本文介绍采用第二种,手工创建一个qinzc用户,并授权该用户具备特定的权限。

1、生成证书

#生成目标(客户端)账号,生成qinzc.key
(umask 077;openssl genrsa -out qinzc.key 2048)

#创建证书签署请求,CN是用户名,O是用户组,第一种方法请把用户组改为system:masters (如:openssl  req -new -key qinzc.key -out qinzc.csr -subj "/CN=qinzc/O=system:masters"),
#生成 qinzc.csr
openssl  req -new -key qinzc.key -out qinzc.csr -subj "/CN=qinzc/O=kubernetes"

#签署证书,生成 qinzc.crt(ca.crtca.key 为K8S 根ca证书 )
openssl x509 -req -days 9999 -CA /etc/kubernetes/pki/ca.crt  -CAkey /etc/kubernetes/pki/ca.key  -CAcreateserial -in ./qinzc.csr -out qinzc.crt

#检查
openssl x509 -in qinzc.crt -text -noout

2、设置集群参数

kubectl config set-cluster kubernetes --embed-certs=true 
--certificate-authority=/etc/kubernetes/pki/ca.crt 
--server="https://k8s.qinzc.me:6443" 
--kubeconfig=./config

3、设置客户端认证参数

kubectl config set-credentials qinzc 
--embed-certs=true 
--client-certificate=./qinzc.crt 
--client-key=qinzc.key 
--kubeconfig=./config

4、设置客户端上下文参数

kubectl config set-context qinzc@kubernetes 
--cluster=kubernetes 
--user=qinzc 
--kubeconfig=./config

5、切换默认上下文

kubectl config use-context qinzc@kubernetes --kubeconfig=./config

6、 授权自定义权限方法

#给dev 名称空间 创建角色(命令)也可以通过yaml文件方式,
kubectl create role admin -n dev --resource="*.*" --verb="get,list,watch,create,delete,deletecollection,patch,update"

#yaml文件

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: admin
rules:
- apiGroups: [""]
  resources: ["pods", "services", pods/log"]
  verbs: ["get", "list", "watch"]

#集群角色授权
kubectl create clusterrole pv-admin --verb="*" --resource="persistentvolumeclaims,persistentvolumes"

#给qinzc用户绑定一个权限
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: qinzc-admin
  namespace: dev
subjects:
- kind: User
  name: qinzc
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: admin
  apiGroup: rbac.authorization.k8s.io

授权所有权限

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: my-admin
subjects:
- kind: User
  name: qinzc
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: cluster-admin    #集群内置管理员权限,该角色默认已经分配给了system:masters 用户组
  apiGroup: rbac.authorization.k8s.io

笔记:(生成集群管理员证书)

#1、 system:masters 为k8s默认已经创建集群管理员组:
openssl genrsa -out admin.key 2048
openssl req -new -key admin.key -out admin.csr -subj "/CN=admin/O=system:masters/OU=System"
openssl x509 -req -in admin.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out admin.pem -days 3650

#2、设置集群参数
kubectl config set-cluster kubernetes --embed-certs=true 
--certificate-authority=./ssl/ca.pem 
--server="https://192.168.4.215:6443" 
--kubeconfig=./config

#3、设置客户端认证参数,指定用户名,用户证书
kubectl config set-credentials kubernetes 
--embed-certs=true 
--client-certificate=./admin.pem 
--client-key=admin.key 
--kubeconfig=./config

#4、设置客户端上下文参数
kubectl config set-context kubernetes 
--cluster=kubernetes 
--user=admin 
--kubeconfig=./config

#5、设置当前上下文
kubectl config use-context kubernetes --kubeconfig=./config

#6、复制文件到.kube
mkdir ~/.kube
cp ./config  ~/.kube/config

#7、(如报权限错误请输入此条进行授权) 授权 kubernetes 证书访问 kubelet api 权限
kubectl create clusterrolebinding kube-apiserver:kubelet-apis --clusterrole=system:kubelet-api-admin --user kubernetes

说明:

访问api集群会需要认证用户名、以及用户组;那么所谓的用户名和用户组从哪里来定义呢?
我们来看看上面openssl创建证书的语句:
openssl req -new -key admin.key -out admin.csr -subj "/CN=admin/O=system:masters/OU=System"
其中这里的/CN=admin/O=system:masters/OU=System就是在CN定义用户为admin,O定义用户组为system:masters,OU 指定该证书的 Group 为 system:masters为k8s默认已经创建好了的集群管理员组

那么定义好之后,在kubernetes中是怎么使用的呢?
kube-apiserver 预定义了一些 RBAC 使用的 RoleBindings(角色),如 cluster-admin (角色)将 Group(组) system:masters与 Role(角色) cluster-admin 绑定,该 Role 授予了调用kube-apiserver 的所有 API的权限;
那么当然的,我们创建admin的证书的时候,就要按照该上面的说明定义好证书的组、用户。

另外当kubelet使用该证书访问kube-apiserver是什么样的过程呢?
在证书的签名中,OU 指定该证书的 Group 为 system:masters,kubelet 使用该证书访问 kube-apiserver 时 ,由于证书被 CA 签名,所以认证通过,同时由于证书用户组为经过预授权的 system:masters,所以被授予访问所有 API 的权限;
同理,如果你是使用CFSSL来签名证书也需要这样去配置好用户和用户组。在这里就不单独写CFSSL签kubernetes的相关证书了。
重要的是要好好理解证书签名与kubernetes的RBAC角色绑定的关系

版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。
版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!

-- 展开阅读全文 --
这篇文章最后更新于2021-5-17,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!
在本机运行另一台电脑上的软件 -RemoteApp Tool 开源远程神器
« 上一篇
阿里云短信发送API接口调用Demo-Python3
下一篇 »

发表评论

HI ! 请登录
注册会员,享受下载全站资源特权。
社交账号登录

一些标签

热门文章

1
2
kcptun加速SS实战-亲测100%加速成功
3
七个经典的聚会游戏惩罚措施
4
php.ini 配置文件 中文注释 详解

倒计时