背景
172.16.99.128
是的我k8s集群的master节点,此处是从这里获取集群的证书。
创建访问architechure
命名空间的用户
- 给用户
devops
创建一个私钥
openssl genrsa -out devops.key 2048
- 使用我们刚刚创建的私钥创建一个证书签名请求文件:
devops.csr
,要注意需要确保在-subj
参数中指定用户名和组(CN
表示用户名,O
表示组)
openssl req -new -key devops.key -out devops.csr -subj "/CN=devops/O=architechure"
- 然后找到我们的Kubernetes集群的CA,我们使用的是kubeadm安装的集群,CA相关证书位于
/etc/kubernetes/pki/
目录下面,如果你是二进制方式搭建的,你应该在最开始搭建集群的时候就已经指定好了CA的目录,我们会利用该目录下面的ca.crt
和ca.key
两个文件来批准上面的证书请求,生成最终的证书文件,我们这里设置证书的有效期为500
天
scp root@172.16.99.128:/etc/kubernetes/pki/ca.crt .
scp root@172.16.99.128:/etc/kubernetes/pki/ca.key .
openssl x509 -req -in devops.csr -CA ./ca.crt -CAkey ./ca.key -CAcreateserial -out devops.crt -days 500
➜ ls -al
total 72
drwxr-xr-x 11 marion staff 352 Dec 25 11:32 .
drwxr-xr-x 13 marion staff 416 Dec 25 11:26 ..
-rw-r--r-- 1 marion staff 17 Dec 25 11:32 .srl
-rw-r--r-- 1 marion staff 1156 Dec 25 11:32 README.md
-rw-r--r-- 1 marion staff 1025 Dec 25 11:30 ca.crt
-rw------- 1 marion staff 1675 Dec 25 11:30 ca.key
-rw-r--r-- 1 marion staff 1009 Dec 25 11:32 devops.crt
-rw-r--r-- 1 marion staff 924 Dec 25 11:30 devops.csr
-rw-r--r-- 1 marion staff 1679 Dec 25 11:27 devops.key
- 现在我们可以使用刚刚创建的证书文件和私钥文件在集群中创建新的凭证:
kubectl config set-credentials devops --client-certificate=devops.crt --client-key=devops.key
- 通过刚才创建的用户凭证创建新的上下文(Context)
#如果你的电脑上正在管理多个集群的,可能你的集群名字会被改变,因此在下面的--cluster参数处指明实际的集群名称,如下图
kubectl config set-context devops-context --cluster=cluster-tf26gt9mmk --namespace=architechure --user=devops
- 尝试通过该用户操作命令
➜ kubectl get pods --context=devops-context
Error from server (Forbidden): pods is forbidden: User "devops" cannot list resource "pods" in API group "" in the namespace "architechure" # 因为该devops-context还没有操作API的权限
- 给用户创建一个role的角色devops.role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: devops-role
namespace: architechure
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["deployments", "replicasets", "pods"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # 也可以使用['*']
然后在集群中创建该角色
代码语言:javascript复制kubectl apply -f ./devops.role.yaml
- 创建权限与角色之间的绑定关系devops-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: devops-rolebinding
namespace: architechure
subjects:
- kind: User
name: devops
apiGroup: ""
roleRef:
kind: Role
name: devops-role # 上一步创建的devops-role实体
apiGroup: ""
在集群中创建角色与用户之间的绑定关系
代码语言:javascript复制k apply -f ./devops-rolebinding.yaml
- 此时我们可以通过kubecm切换到该角色上
此时,从下图就可以查看到当前集群的有一个新的用户角色devops
,上面用到的Kubecm我们之前也分享过,如果需要可以点此跳转
- 权限验证
> kubectl get pods
No resources found in architechure namespace.
> kubectl get replicasets
No resources found in architechure namespace.
> kubectl get deploy
No resources found in architechure namespace.
> kubectl get svc
Error from server (Forbidden): services is forbidden: User "devops" cannot list resource "services" in API group "" in the namespace "architechure"
总结一下就是:
- 根据集群的CA证书创建出来用户证书
- 根据用户证书创建该用户在集群内的凭证和上下文内容
- 要想用户能进行基本的操作,需要对用户针对apiGroup授权
为devops用户增加指定命名空间的权限
- 我们先把当前上下文切换到之前有权限操作的
user-tf26gt9mmk
用户上
kubecm switch
# select dev
否则以下步骤会出错:
- 首先需要创建针对指定命名空间的上下文
kubectl config set-context devops-context --cluster=cluster-tf26gt9mmk --namespace=default --user=devops
此时查询列举default空间下的pods是不行的,因为还没允许操作
代码语言:javascript复制kubectl get pods --context=devops-context
Error from server (Forbidden): pods is forbidden: User "devops" cannot list resource "pods" in API group "" in the namespace "default"
- 创建default空间下的role与rolebinding
devops-role-default.yaml
代码语言:javascript复制apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: devops-role
namespace: default
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["deployments", "replicasets", "pods"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # 也可以使用['*']
devops-rolebinding-default.yaml
代码语言:javascript复制apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: devops-rolebinding
namespace: default
subjects:
- kind: User
name: devops
apiGroup: ""
roleRef:
kind: Role
name: devops-role
apiGroup: ""
然后我们在集群中创建这两个对象
代码语言:javascript复制kubectl apply -f devops-role-default.yaml
kubectl apply -f devops-rolebinding-default.yaml
- 查看role资源对象是否创建
kubectl get role -A |grep devops-role # 分别在architechure和default命名空间下
architechure devops-role 2021-05-17T07:57:27Z
default devops-role 2021-05-28T03:19:24Z
- 切换当前上下文环境,验证是否可以操作资源
kubecm switch
# select devops-context
kubectl get pods -n default
kubectl get pods -n architechure
到这里就基本上说清楚如何创建一个用户、授权操作k8s集群的过程了。