背景

一直以来在内网开发、测试环境的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的用户均为全部类型的本地用户,在授权上将本地用户授权给集群

详细讲解如何对K8S权限进行优化_rancher

创建集群的用户角色Developer

详细讲解如何对K8S权限进行优化_rancher_02

对新创建的角色进行授权,新的角色需要继承cluster member和view all projects角色的权限

详细讲解如何对K8S权限进行优化_rancher_03

在集群中进行授权

详细讲解如何对K8S权限进行优化_kubectl_04

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

详细讲解如何对K8S权限进行优化_rancher_05

后续将test.config复制到kubectl客户端所在的主机上,放在运行命令用户的~/.kube目录下,重命名为config,即可达到预期效果!