RBAC配置只读用户
一.背景
有时候需要给第三方业务访问k8s集群,但是rancher无法实现提取容器内文件的功能。此时需要给第三方直接访问k8s集群的能力,并且进行一定的权限限制
二.操作前了解相关配置和要求
熟悉linux权限管理
熟悉k8s的RBAC权限管理
熟悉kube config文件相关信息
三.操作步骤
为集群创建一个用户
为用户创建一个私钥
openssl genrsa -out mumu-readonly.key 2048
接着用此私钥创建一个csr(证书签名请求)文件,其中我们需要在subject里带上用户信息(CN为用户名,O为用户组)
openssl req -new -key mumu-readonly.key -out mumu-readonly.csr -subj "/CN=mumu-readonly/O=readonly"
找到K8S集群(API Server)的CA证书文件,其位置取决于安装集群的方式,通常会在/etc/kubernetes/pki/
路径下,会有两个文件,一个是CA证书(ca.crt),一个是CA私钥(ca.key)
通过集群的CA证书和之前创建的csr文件,来为用户颁发证书
openssl x509 -req -in mumu-readonly.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out mumu-readonly.crt -days 365
最后将证书(mumu-readonly.crt)和私钥(mumu-readonly.key)保存起来,这两个文件将被用来验证API请求
创建kubeconfig
使用脚本创建kubeconfig文件
KUBE_API_SERVER="https://172.16.0.100:6443" kubectl config set-cluster kubernetes --server=${KUBE_API_SERVER} \ --certificate-authority=/etc/kubernetes/pki/ca.crt \ # 集群ca文件 --embed-certs=true \ --kubeconfig=readonly.kubeconfig kubectl config set-credentials mumu-readonly \ # mumu-readonly(名称) 前后要统一 --certificate-authority=/etc/kubernetes/pki/ca.crt \ # 集群ca文件 --embed-certs=true \ --client-key=mumu-readonly.key \ # 上文中生成的key文件 --client-certificate=mumu-readonly.crt \ # 上文中生成的crt文件 --kubeconfig=readonly.kubeconfig kubectl config set-context mumu-readonly --cluster=kubernetes \ # mumu-readonly (名称) --user=mumu-readonly \ --kubeconfig=readonly.kubeconfig kubectl config use-context mumu-readonly --kubeconfig=readonly.kubeconfig
此时会生成一个readonly.kubeconfig文件
基于RBAC建立只读ClusterRole文件
我们可以通过修改该文件的内容来控制具体的权限信息
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cluster-readonly rules: - apiGroups: - '' resources: - pods - pods/attach - pods/exec - pods/portforward - pods/proxy verbs: - get - list - watch - apiGroups: - '' resources: - configmaps - endpoints - persistentvolumeclaims - replicationcontrollers - replicationcontrollers/scale - secrets - serviceaccounts - services - services/proxy 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: - deployments - deployments/rollback - deployments/scale - statefulsets verbs: - get - list - watch - apiGroups: - autoscaling resources: - horizontalpodautoscalers verbs: - get - list - watch - apiGroups: - batch resources: - cronjobs - jobs - scheduledjobs verbs: - get - list - watch - apiGroups: - extensions resources: - daemonsets - deployments - ingresses - replicasets verbs: - get - list - watch
创建clusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: cluster-readonly roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-readonly # 需要绑定的clusterRole的名字 subjects: - apiGroup: rbac.authorization.k8s.io kind: User # 授权类型 name: mumu-readonly # 用户名称
到这里就基本完成了,可以使用上面生成的kubeconfig文件给到其他用户来使用。
四.注意事项
可以根据需求调整授权的权限
五.结果检查
测试是否可以删除pod等操作,确认只读权限配置没有问题