当我们安装好集群后,如果想要把 kubectl 命令交给用户使用,就不得不对用户的身份进行认证和对其权限做出限制。
kubernetes 认证基本流程(2种认证方式,pod 与 k8s组件)

2.鉴权(RBAC 授权模式)
实践:( 下面以创建一个 devuser 用户并将其绑定到 dev namespace 为例说明)
需要注意的是 Kubenetes 并不会提供用户管理。 需要创建一个linux用户
1 2 |
useradd devuser passwd devuser |
那么 User、Group、ServiceAccount 指定的用户又是从哪里 来的呢?
Kubenetes 组件(kubectl、kube-proxy)或是其他自定义的用户在向 CA 申请证书时,需要提供一个 证书请求文件
1.创建CA证书和秘钥(创建 devuser-csr.json 文件)
1 2 |
mkdir /root/install-k8s/cert/devuser/ cd /root/install-k8s/cert/devuser/ |
devuser-csr.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "CN": "devuser", "hosts": [], #代表可以使用的主机名(如果有多个主),如果不写,所有主机都可以使用 "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "System" } ] } |
下载证书生成工具
1 2 3 4 5 6 7 8 9 10 11 |
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 mv cfssl_linux-amd64 /usr/local/bin/cfssl wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 mv cfssljson_linux-amd64 /usr/local/bin/cfssljson wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo #赋予可执行权限 chmod a+x /usr/local/bin/* |
生成证书
1 2 |
cd /etc/kubernets/pki cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes /root/install-k8s/cert/devuser/devuser-csr.json | cfssljson -bare devuser |

设置集群参数
1 2 3 4 5 6 7 8 |
# 设置集群参数 export KUBE_APISERVER="https://192.168.66.20:6443" #设置环境变量 kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/pki/ca.crt \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=devuser.kubeconfig |
1 2 3 4 5 6 |
# 设置客户端认证参数(这里请一行一行复制) kubectl config set-credentials devuser \ --client-certificate=/etc/kubernetes/pki/devuser.pem \ --client-key=/etc/kubernetes/pki/devuser-key.pem \ --embed-certs=true \ --kubeconfig=devuser.kubeconfig |
1 2 3 4 5 6 |
# 设置上下文参数(帮我们绑定到某个命名空间,例如下面将devuser绑定到dev命名空间) kubectl config set-context kubernetes \ --cluster=kubernetes \ --user=devuser \ --namespace=dev \ --kubeconfig=devuser.kubeconfig |
去k8s创建下dev的命名空间
1 |
kubectl create namespace dev |
rolebinding
1 2 3 4 5 |
#将admin的clusterrole进行rolebinding,下放层级绑定至dev的命名空间,代表我这个用户有在dev命名空间下的所有权限 kubectl create rolebinding devuser-admin-binding --clusterrole=admin --user=devuser --namespace=dev #上面语句解释:#创建一个rolebinding名称为devuser-admin-binding 将devuser绑定到dev命名空间下 |
将配置文件复制到,devuser用户home下
1 2 3 4 5 |
mkdir /home/devuser/.kube/ cp -f ./devuser.kubeconfig /home/devuser/.kube/devuser.kubeconfig chown devuser:devuser /home/devuser/.kube/devuser.kubeconfig |
另开一个窗口,使用devuser用户登录到主节点机器 (这里切记一定要重新登录到devuser,不可以su devuser切换,因为切换后还是原来的环境变量,或者一定要使用就用 su -devuser切换。)
1 |
cd .kube && mv devuser.kubeconfig config |
设置默认上下文(让k8s读取到devuser.kubeconfig)
1 |
kubectl config use-context kubernetes --kubeconfig="devuser.kubeconfig" |

1 2 3 4 |
#查看 kubectl 的 context kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE * kubernetes kubernetes devuser dev |
创建一个pod测试下是否在dev命名空间下
1 |
kubectl run nginx --image=hub.atshooter.com/k8s/nginx:v1.0 |

因为权限的原因,他只能看到自己命名空间下的pod
现在我们再去k8s的admin用户命名空间下查看
1 |
kubectl get pod --all-namespace |

(用户权限设置完成)
- 本文固定链接: https://www.yoyoask.com/?p=2393
- 转载请注明: shooter 于 SHOOTER 发表