K8S如何让worker使用kubectl命令(RBAC方法)
背景
目前集群规划如下
kubeadm安装集群master节点默认能使用kubectl命令,worker则不能使用。这是因为worker节点没授权。当然,你可以通过以下方式授权
mkdir .kube
scp master1:/root/.kube/config .kube/
但这样无疑给了worker节点非常大的权限,如何限制用户在worker的权限呢?(用户只有worker节点的登录密码,master节点用户是登录不上的)为了实现限制用户权限的需求,则要使用RBAC进行控制。
以下为worker使用者授权名称空间default的pod的查看权限
证书相关操作(生成与签名)
证书流程如下
申请者(test4)操作
# 创建私钥 保存在当前目录 文件名叫test4user.key
openssl genrsa -out test4user.key 2048
# 用此私钥创建一个csr(证书签名请求)文件
openssl req -new -key test4user.key -subj "/CN=test4user" -out test4user.csr
管理者(master)操作
以下可见,master节点有ca私钥,worker只有证书,所以签名证书只有管理员master才能做到
# 把签名请求文件csr给管理员(master),管理员用ca私钥、证书生成证书
openssl x509 -req -in test4user.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out test4user.crt -days 365
集群设置
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!命令1命令2只执行其中一条即可
# !!!!!!!!!!!!!!!!!!!!命令1
# 添加集群信息(默认是在~/.kube/config,用--kubeconfig指定参数)
# k8s的worker节点也会有ca证书,默认位置在/etc/kubernetes/pki/ca.crt
kubectl config set-cluster kubernetes --server=https://10.0.2.18:8443 --certificate-authority=/etc/kubernetes/pki/ca.crt --kubeconfig=/root/.kube/test4user_config
# !!!!!!!!!!!!!!!!!!!!命令2
# 添加集群信息(此处是~/.kube/config)
# worker节点推荐执行这个
# --server=https://10.0.2.18:8443 这个是我集群的负载均衡,你们可以改成master的ip加6443端口
kubectl config set-cluster kubernetes --server=https://10.0.2.18:8443 --certificate-authority=/etc/kubernetes/pki/ca.crt
# 添加用户信息
kubectl config set-credentials test4user --client-certificate=test4user.crt --client-key=test4user.key --embed-certs=true
# 添加上下文信息(环境)
kubectl config set-context test4user@kubernetes --cluster=kubernetes --user=test4user
# 查看当前上下文(环境)
kubectl config get-contexts
# 使用上下文
kubectl config use-context test4user@kubernetes
# 查看当前上下文
kubectl config get-contexts
授权(master操作)
cat >test4user-role-bind.yaml<<EOF
kind: Role # 角色
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: test4user-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"] #权限只读
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: test4user-rolebinding
namespace: default
subjects: #绑定主体
- kind: User
name: test4user
apiGroup: rbac.authorization.k8s.io
roleRef: #绑定角色
kind: Role
name: test4user-role
apiGroup: rbac.authorization.k8s.io
EOF
kubectl apply -f test4user-role-bind.yaml
测试验证
kubectl get pods
kubectl get pods -n default
kubectl get pods -n kube-system
kubectl get nodes