有时候需要给开发或者第三方测试伙伴开放只读权限,防止误删操作,因此需要一个只读的kubeconfig
一、只读的clusterrole
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