​ 有时候需要给开发或者第三方测试伙伴开放只读权限,防止误删操作,因此需要一个只读的kubeconfig

一、只读的clusterrole

使用rbac鉴权

kubernetes提供了4个预定义好的clusterrole来供用户直接使用:

默认 ClusterRole 默认 ClusterRoleBinding 描述
cluster-admin system:masters 允许超级用户在平台上的任何资源上执行所有操作。 当在 ClusterRoleBinding 中使用时,可以授权对集群中以及所有名字空间中的全部资源进行完全控制。 当在 RoleBinding 中使用时,可以授权控制角色绑定所在名字空间中的所有资源,包括名字空间本身。
admin 允许管理员访问权限,旨在使用 RoleBinding 在名字空间内执行授权。如果在 RoleBinding 中使用,则可授予对名字空间中的大多数资源的读/写权限, 包括创建角色和角色绑定的能力。 此角色不允许对资源配额或者名字空间本身进行写操作。 此角色也不允许对 Kubernetes v1.22+ 创建的 Endpoints 进行写操作。 更多信息参阅 “Endpoints 写权限”小节
edit 允许对名字空间的大多数对象进行读/写操作。此角色不允许查看或者修改角色或者角色绑定。 不过,此角色可以访问 Secret,以名字空间中任何 ServiceAccount 的身份运行 Pod, 所以可以用来了解名字空间内所有服务账户的 API 访问级别。 此角色也不允许对 Kubernetes v1.22+ 创建的 Endpoints 进行写操作。 更多信息参阅 “Endpoints 写操作”小节
view 允许对名字空间的大多数对象有只读权限。 它不允许查看角色或角色绑定。此角色不允许查看 Secrets,因为读取 Secret 的内容意味着可以访问名字空间中 ServiceAccount 的凭据信息,进而允许利用名字空间中任何 ServiceAccount 的身份访问 API(这是一种特权提升)。

正常情况下,每个集群里面有个名为view的默认的clusterrole,内容如下。你可以根据实际的需求来调整

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: view
rules:
- apiGroups:
  - ""
  resources:
  - configmaps
  - endpoints
  - persistentvolumeclaims
  - persistentvolumeclaims/status
  - pods
  - replicationcontrollers
  - replicationcontrollers/scale
  - serviceaccounts
  - services
  - services/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - bindings
  - events
  - limitranges
  - namespaces/status
  - pods/log
  - pods/status
  - replicationcontrollers/status
  - resourcequotas
  - resourcequotas/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - namespaces
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - apps
  resources:
  - controllerrevisions
  - daemonsets
  - daemonsets/status
  - deployments
  - deployments/scale
  - deployments/status
  - replicasets
  - replicasets/scale
  - replicasets/status
  - statefulsets
  - statefulsets/scale
  - statefulsets/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - autoscaling
  resources:
  - horizontalpodautoscalers
  - horizontalpodautoscalers/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - batch
  resources:
  - cronjobs
  - cronjobs/status
  - jobs
  - jobs/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - extensions
  resources:
  - daemonsets
  - daemonsets/status
  - deployments
  - deployments/scale
  - deployments/status
  - ingresses
  - ingresses/status
  - networkpolicies
  - replicasets
  - replicasets/scale
  - replicasets/status
  - replicationcontrollers/scale
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - policy
  resources:
  - poddisruptionbudgets
  - poddisruptionbudgets/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses
  - ingresses/status
  - networkpolicies
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - metrics.k8s.io
  resources:
  - pods
  - nodes
  verbs:
  - get
  - list
  - watch

二、创建serviceaccount(服务账号)

apiVersion: v1
kind: ServiceAccount
metadata:
  name: dev-jack
  namespace: kube-system

三、创建clusterrolebinding

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  creationTimestamp: null
  name: dev-jack
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: view
subjects:
- kind: ServiceAccount
  name: dev-jack
  namespace: kube-system
kubectl create clusterrolebinding  dev-jack  --clusterrole=view --serviceaccount=kube-system:dev-jack --dry-run -oyaml | kubectl apply -f -

四、生成kubeconfig

修改下面内容

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: 
    server: https://192.168.66.143:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: dev-jack
  name: default
current-context: default
kind: Config
preferences: {}
users:
- name: dev-jack
  user:
    token: 

或者使用下面命令生成

#secret name
secretname=$(kubectl -n kube-system get sa dev-jack -ojsonpath={.secrets[0].name})
#token
token=$(kubectl -n kube-system get secret $secretname -ojsonpath={.data.token} | base64 -d)
#生成kubeconfig文件
kubectl config set-cluster kubernetes --kubeconfig=/tmp/kubeconfig --certificate-authority /etc/kubernetes/ssl/ca.pem --embed-certs=true --server="https://192.168.66.144:6443"
#设置上下文
kubectl config set-context default --cluster kubernetes --user dev-jack --kubeconfig /tmp/kubeconfig
#添加token字段

五、测试是否能用

[root@master jack]# kubectl config use-context default --kubeconfig /tmp/kubeconfig 
Switched to context "default".
#不能获取节点信息
[root@master jack]# kubectl get node --kubeconfig /tmp/kubeconfig
Error from server (Forbidden): nodes is forbidden: User "system:serviceaccount:kube-system:dev-jack" cannot list resource "nodes" in API group "" at the cluster scope
#可以获取namespace信息
[root@master jack]# kubectl get ns --kubeconfig /tmp/kubeconfig
NAME              STATUS   AGE
default           Active   373d
ingress-nginx     Active   350d
kube-node-lease   Active   373d
kube-public       Active   373d
kube-system       Active   373d
nfs               Active   373d