网站首页 文章专栏 01用户授权.md
k8s是一个集群,那么集群的机器之间需要通信,控制信息也要传递到master节点中。为了保证这些通信信息的安全性,k8s有着强大的用户认证与授权机制。
如果我们直接用rest api访问master节点,会出现错误:
curl命令 -k参数用户跳过https证书验证,我们的证书是自签的,必须跳过验证。
curl https://192.168.25.180:6443/api/v1/namespaces/kube-system/pods -k
返回如下结果。
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "pods is forbidden: User \"system:anonymous\" cannot list resource \"pods\" in API group \"\" in the namespace \"kube-system\"",
"reason": "Forbidden",
"details": {
"kind": "pods"
},
"code": 403
}
前提: 已经部署好k8s,并且可以在master节点中正常使用kubectl.
新建basic-auth-file
用于存放用户名和密码格式是密码,用户名,用户id类似下面的例子
sudo su
touch /etc/kubernetes/pki/basic-auth-file
cat >/etc/kubernetes/pki/basic-auth-file<<EOF
wAr4DwsLfF1UBRYxuKU8P3zh6E6YYtib,k8sadmin,1
EOF
给kube-apiserver添加basic_auth验证
sed -i "s;- kube-apiserver;- kube-apiserver\n - --basic-auth-file=/etc/kubernetes/pki/basic-auth-file;g" /etc/kubernetes/manifests/kube-apiserver.yaml
保存。注意,保存后apiserver会重新启动,如果apiserver未能正常启动,使用docker logs
查看原因,修正后用docker restart
重启。发现如果重启失败,coredns
同样会CrashLoopBackOff
, 而调度器不会自动重启这些pod,同样使用docker restart
重启。
k8s1.6后版本都采用RBAC授权模型,我们还得给用户一些权限。在k8s里有一个比较大的权限clusterrole cluster-admin,我们把这个权限赋给我们的管理员用户
kubectl create clusterrolebinding login-on-dashboard-with-cluster-admin --clusterrole=cluster-admin --user=k8sadmin
如果提示 "login-on-dashboard-with-cluster-admin" already exists
,执行下面的指令删除
kubectl delete clusterrolebinding login-on-dashboard-with-cluster-admin
注意使用cluster-admin可能会有安全性问题
这时候再访问master节点
curl 命令
curl -u k8sadmin:wAr4DwsLfF1UBRYxuKU8P3zh6E6YYtib https://192.168.25.180:6443/api/v1/nodes -k
返回结果:
{
"kind": "NodeList",
"apiVersion": "v1",
"metadata": {
"selfLink": "/api/v1/nodes",
"resourceVersion": "2962"
},
"items": [
{
"metadata": {
"name": "node01",
"selfLink": "/api/v1/nodes/node01",
"uid": "1a85b57f-c69e-4086-8b91-ffe154bf57a9",
"resourceVersion": "2915",
"creationTimestamp": "2019-08-02T08:44:42Z",
"labels": {
"beta.kubernetes.io/arch": "amd64",
"beta.kubernetes.io/os": "linux",
"kubernetes.io/arch": "amd64",
"kubernetes.io/hostname": "node01",
"kubernetes.io/os": "linux",
"node-role.kubernetes.io/master": ""
},
... 省略部分内容
参考: