一直以来在内网开发、测试环境的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的用户均为全部类型的本地用户,在授权上将本地用户授权给集群
创建集群的用户角色Developer
对新创建的角色进行授权,新的角色需要继承cluster member和view all projects角色的权限
在集群中进行授权
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 - services verbs: - get - list - watch - patch - apiGroups: - traefik.containo.us resources: - ingressroutes verbs: - create - delete - get - list - watch - update - patch - apiGroups: - apps resources: - pods - deployments - services verbs: - get - list - watch - create - update - patch 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}') export token=$(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后续将test.config复制到kubectl客户端所在的主机上,放在运行命令用户的~/.kube目录下,重命名为config,即可达到预期效果!
【文章原创作者:武汉seo服务 http://www.5h5q.com提供,感谢支持】