文档首页/ 云容器引擎 CCE/ 最佳实践/ 权限/ 通过配置kubeconfig文件实现集群权限精细化管理
更新时间:2024-05-31 GMT+08:00

通过配置kubeconfig文件实现集群权限精细化管理

问题场景

CCE默认的给用户的kubeconfig文件为cluster-admin角色的用户,相当于root权限,对于一些用户来说权限太大,不方便精细化管理。

目标

对集群资源进行精细化管理,让特定用户只能拥有部分权限(如:增、查、改)。

注意事项

确保您的机器上有kubectl工具,若没有请到Kubernetes版本发布页面下载与集群版本对应的或者最新的kubectl。

配置方法

下述示例配置只能查看和添加test空间下面的Pod和Deployment,不能删除。

  1. 配置sa,名称为my-sa,命名空间为test

    kubectl create sa my-sa -n test

  2. 配置role规则表,赋予不同资源相应的操作权限。

    vi role-test.yaml
    内容如下:

    本示例中权限规则包含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

  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

    此时,用户信息配置完成,继续执行步骤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
    1. 设置集群访问方式,其中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

    在集群内节点上执行操作或者最后使用该配置的节点为集群节点,不要将kubeconfig的路径设为/root/.kube/config。

    集群apiserver地址默认为内网地址,绑定弹性IP后可使用公网地址访问。

    图1 获取内网或外网apiserver地址

  6. 配置集群认证信息。

    1. 获取集群的token信息(这里如果是get获取需要based64 -d解码)。
    token=$(kubectl describe secret my-sa-token-secret -n test | awk '/token:/{print $2}')
    1. 设置使用集群的用户ui-admin
    kubectl config set-credentials ui-admin --token=$token --kubeconfig=/home/test.config

  7. 配置集群认证访问的context信息,ui-admin@test为context的名称。

    kubectl config set-context ui-admin@test --cluster=test-arm --user=ui-admin --kubeconfig=/home/test.config

  8. 设置context,设置完成后使用方式见验证权限

    kubectl config use-context ui-admin@test --kubeconfig=/home/test.config

    若需授予其他用户操作该集群并限制为上述权限,在步骤7结束后将生成的配置文件/home/test.config提供给该用户,由该用户置于自己机器上(用户机器须保证能访问集群apiserver地址),在该机器上执行步骤8使用kubectl时kubeconfig参数须指定为配置文件所在路径。

验证权限

  1. 可以查询test命名空间下的pod资源,被拒绝访问其他命名空间的Pod资源。
    kubectl get pod -n test --kubeconfig=/home/test.config

  2. 不可删除test命名空间下的Pod资源。

延伸阅读

更多Kubernetes中的用户与身份认证授权内容,请参见Authenticating