Kubernetes(k8s)-RBAC用户账户(UserAccount)介绍&应用

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

图片

我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。

我们上一小节介绍了使用RBAC给服务账户(ServiceAccount)添加权限,这个这个方式一般用于Pod内部,如果需要应用到Pod外部,比如我需要另外一个人来帮我维护我这个Kubernetes集群,但是我不能给他管理员权限,我需要给他创建一个相对较小的权限:比如我只允许他操作命名空间:user001;资源:pod,svc,权限:所有。

1.生成用户私钥

[root@master01 rbac]# openssl genrsa -out user001.key 2048
Generating RSA private key, 2048 bit long modulus
.....................+++
...........................+++
e is 65537 (0x10001)
[root@master01 rbac]# ls
user001.key

2.创建证书签名请求(csr) 

[root@master01 rbac]# openssl req -new -key user001.key -out user001.csr -subj "/CN=user001/O=k8s"
[root@master01 rbac]# ls
user001.csr  user001.key

3.给user001签发证书

这里需要经过集群的ca签发,也就是(/etc/kubernetes/pki/ca.crt文件),同一个ca签发的证书才会被认可(ca签发的集群证书和ca签发的kubectl证书)

[root@master01 rbac]# openssl x509 -req -in user001.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out user001.crt -days 3650
Signature ok
subject=/CN=user001/O=k8s
Getting CA Private Key
[root@master01 rbac]# ls
user001.crt  user001.csr  user001.key

4.创建集群证书

成功以后的配置文件具备了服务器地址和ca证书

[root@master01 rbac]# export KUBE_APISERVER="https://192.168.31.211:6443"
[root@master01 rbac]# 

[root@master01 rbac]# kubectl config set-cluster kubernetes \
>   --certificate-authority=/etc/kubernetes/pki/ca.crt \
>   --embed-certs=true \
>   --server=${KUBE_APISERVER} \
>   --kubeconfig=user001.kubeconfig
Cluster "kubernetes" set.
[root@master01 rbac]# ls
user001.crt  user001.csr  user001.key  user001.kubeconfig

5.添加用户信息

成功以后添加了用户user001,并添加了客户端证书和私钥

[root@master01 rbac]# kubectl config set-credentials user001 \
>   --client-certificate=/root/rbac/user001.crt \
>   --embed-certs=true \
>   --client-key=/root/rbac/user001.key \
>   --kubeconfig=user001.kubeconfig
User "user001" set.
[root@master01 rbac]# ls
user001.crt  user001.csr  user001.key  user001.kubeconfig

6.设置上下文(context)

成功以后会更新user001.kubeconfig,太抽象,我也不知道咋个解释。​​​​​​​

kubectl config set-context user001 \
  --cluster=kubernetes \
  --user=user001 \
  --kubeconfig=user001.kubeconfig

7.设置默认的上下文(context)

设置以后,就可以通过这个文件连接到kube-apiserver。​​​​​​​

kubectl config use-context user001 \
  --kubeconfig=user001.kubeconfig

图片

8.创建Role

这里实现的权限,就是我们需求里面的权限,如果需求是范围是是全集群则需要创建ClueterRole(也就是上个小节讲解的应用)。​​​​​​​

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: user001
  name: user001-role
rules:
- apiGroups: [""]
  resources: ["pods", "services"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

9.创建RoleBinding

绑定以后,这个权限就和前面的用户绑定到一起,并可以正常连接到集群,同上如果是集群范围则是ClusterRoleBinding。​​​​​​​

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: user001-rolebind
  namespace: user001
subjects:
- kind: User
  name: user001
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: user001-role
  apiGroup: rbac.authorization.k8s.io

10.验证权限

把这个文件放置到集群外,/root/.kube/config,在网络能通的情况下也可以直接使用kubectl命令。​​​​​​​

#有权限的资源,正常操作
kubectl get pod,svc -n user001  --kubeconfig=/root/rbac/user001.kubeconfig


​​​​​​​

图片

    #没权限的资源,提异常
    kubectl get cm,secret -n user001  --kubeconfig=/root/rbac/user001.kubeconfig 

    图片

    这个时候我们已经实现了我们的需求,把这个文件user001.kubeconfig提供给需要使用的人,他拿到这个文件放置到/root/.kube/config,然后客户端也安装了kubectl命令以后就可以在对应的节点操作集群权限范围内的资源。

    运维小路

    一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

    关注微信公众号《运维小路》获取更多内容。