
# 通过配置kubeconfig文件实现集群权限精细化管理
#### 问题场景
CCE默认的给用户的kubeconfig文件为cluster-admin角色的用户，相当于root权限，对于一些用户来说权限太大，不方便精细化管理。
#### 目标
对集群资源进行精细化管理，让特定用户只能拥有部分权限（如：增、查、改）。
#### 注意事项
确保您的机器上有kubectl工具，若没有请到[Kubernetes版本发布页面](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/README.md)下载与集群版本对应的或者最新的kubectl。
#### 配置方法
![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
下述示例配置只能查看和添加**test**空间下面的Pod和Deployment，不能删除。
1. 配置sa，名称为**my-sa** ，命名空间为**test** 。
   
   ```
   kubectl create sa my-sa -n test
   ```
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0271457115.png)
   
   
2. 配置role规则表，赋予不同资源相应的操作权限。 
   ```
   vi role-test.yaml
   ```
   内容如下：
   ![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
   本示例中权限规则包含test命名空间下Pod资源的只读权限（get/list/watch）以及deployment的读取（get/list/watch）和创建（create）权限。
   ```
   apiVersion: rbac.authorization.k8s.io/v1
   kind: Role
   metadata:
     annotations:
       rbac.authorization.kubernetes.io/autoupdate: "true"
     labels:
       kubernetes.io/bootstrapping: rbac-defaults
     name: myrole
     namespace: test
   rules:
   - apiGroups:
     - ""
     resources:
     - pods
     verbs:
     - get
     - list
     - watch
   - apiGroups:
     - apps
     resources:
     - pods
     - deployments
     verbs:
     - get
     - list
     - watch
     - create
   ```
   创建Role：
   ```
   kubectl create -f role-test.yaml
   ```
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0271467350.png)
   
   
3. 配置rolebinding，将sa绑定到role上，让sa获取相应的权限。 
   ```
   vi myrolebinding.yaml
   ```
   内容如下：
   ```
   apiVersion: rbac.authorization.k8s.io/v1
   kind: RoleBinding
   metadata:
     name: myrolebinding
     namespace: test
   roleRef:
     apiGroup: rbac.authorization.k8s.io
     kind: Role
     name: myrole
   subjects:
   - kind: ServiceAccount
     name: my-sa
     namespace: test
   ```
   创建RoleBinding：
   ```
   kubectl create -f myrolebinding.yaml
   ```
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0271467469.png)
   此时，用户信息配置完成，继续执行[5]\~[7]将用户信息写入到配置文件中。
   
   
4. 手动为ServiceAccount创建长期有效的Token。 
   ```
   vi my-sa-token.yaml
   ```
   内容如下：
   ```
   apiVersion: v1
   kind: Secret
   metadata:
     name: my-sa-token-secret
     namespace: test
     annotations:
       kubernetes.io/service-account.name: my-sa
   type: kubernetes.io/service-account-token
   ```
   创建Token：
   ```
   kubectl create -f my-sa-token.yaml
   ```
   
   
5. 配置集群访问信息。
   
   1. 将密钥中的ca.crt解码后导出备用：
   
   
   ```
   kubectl get secret my-sa-token-secret -n test -oyaml |grep ca.crt: | awk '{print $2}' |base64 -d > /home/ca.crt
   ```
   2. 设置集群访问方式，其中**test-arm** 为需要访问的集群，https://192.168.0.110:5443为集群apiserver地址（获取方法参见[图1]），**/home/test.config** 为配置文件的存放路径。
      - 如果通过内部apiserver地址，执行如下命令：
        ```
        kubectl config set-cluster test-arm --server=https://192.168.0.110:5443  --certificate-authority=/home/ca.crt  --embed-certs=true --kubeconfig=/home/test.config
        ```
        
      
      - 如果通过公网apiserver地址，执行如下命令：
        ```
        kubectl config set-cluster test-arm --server=https://192.168.0.110:5443 --kubeconfig=/home/test.config --insecure-skip-tls-verify=true
        ```
        
      
      
      ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0271466158.png "点击放大")
      
   
   
   ![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
   若**在集群内节点上执行操作** 或者**最后使用该配置的节点为集群节点**，不要将kubeconfig的路径设为/root/.kube/config。
   集群apiserver地址默认为内网地址，绑定弹性IP后可使用公网地址访问。
   图1获取内网或外网apiserver地址   
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001847239418.png "点击放大")
   
   
6. 配置集群认证信息。 
   1. 获取集群的token信息（这里如果是get获取需要based64 -d解码）。
   
   
   ```
   token=$(kubectl describe secret my-sa-token-secret -n test | awk '/token:/{print $2}')
   ```
   2. 设置使用集群的用户**ui-admin**。
   
   
   ```
   kubectl config set-credentials ui-admin --token=$token --kubeconfig=/home/test.config
   ```
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0271466198.png "点击放大")
   
   
7. 配置集群认证访问的context信息，**ui-admin@test** 为context的名称。
   
   ```
   kubectl config set-context ui-admin@test --cluster=test-arm --user=ui-admin --kubeconfig=/home/test.config
   ```
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0271466336.png "点击放大")
   
   
8. 设置context，设置完成后使用方式见[验证权限]。
   
   ```
   kubectl config use-context ui-admin@test --kubeconfig=/home/test.config
   ```
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0271466320.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
   若需授予其他用户操作该集群并限制为上述权限，在[7]结束后将生成的配置文件**/home/test.config** 提供给该用户，由该用户置于自己机器上（**用户机器须保证能访问集群apiserver地址** ），在该机器上执行[8]使用kubectl时kubeconfig参数须指定为配置文件所在路径。
   
   
 
 #### 验证权限
1. 可以查询**test** 命名空间下的pod资源，被拒绝访问其他命名空间的Pod资源。
   ```
   kubectl get pod -n test --kubeconfig=/home/test.config
   ```
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0271466402.png "点击放大")
   
2. 不可删除**test** 命名空间下的Pod资源。
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0271466430.png "点击放大")
   
 
#### 延伸阅读
更多Kubernetes中的用户与身份认证授权内容，请参见[Authenticating](https://kubernetes.io/docs/reference/access-authn-authz/authentication/)。
