背景
一直以来在内网开发、测试环境的K8S web控制台使用的是rancher面板。
通过使用rancher面板服务,在容器管理上运维、开发、测试人员的工作效率得到了极大的提升
问题
由于早期仅注重功能实现及用户体验上问题,忽略了权限管理上的问题。给用户开放出去的rancher面板用户均为cluster-owner权限。导致最近一天,突然接到研发人员的通知,说开发环境namespace下的所有工作负载都消失了。通过排查,发现问题时刻所有的node节点都正常运行,dev namespace已不存在,另外两个 test1、test2 namespace下的全部资源均运行正常。
因此初步怀疑是人工方式对namespace进行了删除操作,将dev namespace下的全部资源删除(包括secret、sa、configmap、pvc、deployment、svc等)
用户可能通过rancer面板删除namespace,也有少部分研发人员有服务器权限,可以操作kubectl工具进行删除操作,因此需要对rancher和kubectl工具进行权限配置
解决方案
1、首先对环境进行恢复
2、对rancher面板的权限配置
3、对kubect客户端进行权限配置
Rancher权限配置
当前rancher的用户均为全部类型的本地用户,在授权上将本地用户授权给集群
![1616383388915048.png 1.png]()
创建集群的用户角色Developer
![1616383413462622.png image.png]()
对新创建的角色进行授权,新的角色需要继承cluster member和view all projects角色的权限
![1616383426718655.png image.png]()
在集群中进行授权
![1616383477747755.png image.png]()
kubectl权限配置
创建serviceaccount
kubectl create sa developer
置developer-role的相关权限
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
labels:
kubernetes.io/bootstrapping: rbac-defaults
name: developer-role
namespace: default
rules:
- apiGroups:
- ""
resources:
- pods
- configmaps
verbs:
- get
- list
- watch
- apiGroups:
- apps
resources:
- pods
- deployments
verbs:
- get
- list
- watch
- create
- update
EOF
通过配置ClusterRoleBinding绑定serviceaccount和ClusterRole
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: developer-role-binding
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: developer-role
subjects:
- kind: ServiceAccount
name: developer
namespace: default
EOF
将密钥中的ca.crt解码后导出
kubectl get secret developer-token-2rz7l -n default -oyaml |grep ca.crt:|awk '{print $2}' |base64 -d > /home/ca.crt
生成config文件
kubectl config set-cluster fjhb-lan-k8s --server=https://192.168.1.59:9443 --certificate-authority=/home/ca.crt --embed-certs=true --kubeconfig=/home/test.config
将developer sa的token更新到config文件中
kubectl config set-cluster fjhb-lan-k8s --server=https://192.168.1.59:9443 --certificate-authority=/home/ca.crt --embed-certs=true --kubectoken=$(kubectl describe secret developer-token-2rz7l -n default | awk '/token:/{print $2}')
kubectl config set-credentials developer --token=$token --kubeconfig=/home/test.config
配置集群认证访问的上下文信息
kubectl config set-context developer --cluster=fjhb-lan-k8s --user=developer --kubeconfig=/home/test.config
kubectl config use-context developer --kubeconfig=/home/test.config
测试与验证
kubectl get cm -n default --kubeconfig=/home/test.config
kubectl get cm -n test1 --kubeconfig=/home/test.config
kubectl delete cm ingress-controller-leader-nginx -n default --kubeconfig=/home/test.config
![1616394565974270.png image.png]()
后续将test.config复制到kubectl客户端所在的主机上,放在运行命令用户的~/.kube目录下,重命名为config,即可达到预期效果!