网站首页 文章专栏 01用户授权.md
01用户授权.md
创建于:2021-07-04 07:52:28 更新于:2024-11-21 12:51:03 羽瀚尘 406

简介

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

重启apiserver

给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": ""
        },
... 省略部分内容

参考: