更新时间:2024-05-31 GMT+08:00
通过配置kubeconfig文件实现集群权限精细化管理
问题场景
CCE默认的给用户的kubeconfig文件为cluster-admin角色的用户,相当于root权限,对于一些用户来说权限太大,不方便精细化管理。
目标
对集群资源进行精细化管理,让特定用户只能拥有部分权限(如:增、查、改)。
注意事项
确保您的机器上有kubectl工具,若没有请到Kubernetes版本发布页面下载与集群版本对应的或者最新的kubectl。
配置方法
下述示例配置只能查看和添加test空间下面的Pod和Deployment,不能删除。
- 配置sa,名称为my-sa,命名空间为test。
kubectl create sa my-sa -n test
- 配置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
- 配置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
- 手动为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
- 配置集群访问信息。
- 将密钥中的ca.crt解码后导出备用:
kubectl get secret my-sa-token-secret -n test -oyaml |grep ca.crt: | awk '{print $2}' |base64 -d > /home/ca.crt
- 设置集群访问方式,其中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
- 如果通过内部apiserver地址,执行如下命令:
若在集群内节点上执行操作或者最后使用该配置的节点为集群节点,不要将kubeconfig的路径设为/root/.kube/config。
集群apiserver地址默认为内网地址,绑定弹性IP后可使用公网地址访问。
- 配置集群认证信息。
- 获取集群的token信息(这里如果是get获取需要based64 -d解码)。
token=$(kubectl describe secret my-sa-token-secret -n test | awk '/token:/{print $2}')
- 设置使用集群的用户ui-admin。
kubectl config set-credentials ui-admin --token=$token --kubeconfig=/home/test.config
- 配置集群认证访问的context信息,ui-admin@test为context的名称。
kubectl config set-context ui-admin@test --cluster=test-arm --user=ui-admin --kubeconfig=/home/test.config
- 设置context,设置完成后使用方式见验证权限。
kubectl config use-context ui-admin@test --kubeconfig=/home/test.config
验证权限
- 可以查询test命名空间下的pod资源,被拒绝访问其他命名空间的Pod资源。
kubectl get pod -n test --kubeconfig=/home/test.config
- 不可删除test命名空间下的Pod资源。
延伸阅读
更多Kubernetes中的用户与身份认证授权内容,请参见Authenticating。