系列文章链接
实践: 创建一个用户只能管理 dev 空间
-
在集群的master节点主机生成用户
$ useradd devuser $ passwd devuser
如果在集群的master节点通过这个用户连接然后执行kubectl命令肯定是没有权限的,需要给他生成证书,然后设置权限
-
设置证书生成引导文件
# k8s的用户名就是从CN上获取的。组是从O上获取的。这个用户或者组用于后面的角色绑定使用 $ mkdir /root/cert/devuser && cd /root/cert/devuser $ vim devuser-csr.json { "CN": "devuser", # 用户名 "hosts": [], #代表连接的主机地址 []不输入代表全部 "key": { "algo": "rsa", #加密算法 "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", # 组名 "OU": "System" } ] }
-
下载证书生成工具
$ 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
-
给devuser用户生成证书
-ca -ca-key
是指定我们k8s的根证书和私钥,也就是==/etc/kubernetes/pki/==目录下的ca.crt和ca.key ``-profile`是指定我们上面设置的证书引导json文件
最好在/etc/kubernetes/pki/执行这个生成证书的过程方便管理证书
$ cfssl gencert -ca=ca.crt -ca-key=ca.key \ -profile=kubernetes \ /root/cert/devuser/devuser-csr.json | cfssljson -bare devuser
执行完会多出devuser.csr、devuser-key.pem、devuser.pem文件
- 回到 /root/cert/devuser 设置集群参数
# 设置集群访问地址环境变量
$ export KUBE_APISERVER="https://192.168.181.111:6443"
# 创建k8s认证文件 kubernetes是集群名称 --embed-certs=true是否认证加密 --server=指定k8s服务器信息 --kubeconfig=最后创建出devuser.kubeconfig 文件
$ kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/pki/ca.crt \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=devuser.kubeconfig
# cat一下就会看到devuser.kubeconfig文件,里面的集群名字、证书、集群地址、字段有值,其他的配置还是空,需要我们继续配置
- 继续 接下来设置客户端认证参数
# devuser是客户端认证的用户名 --client-certificate指定生成的客户端证书 --client-key指定客户端私钥 --embed-certs=true是否认证加密 再次写入到devuser.kubeconfig文件
$ 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
# 再次cat一下devuser.kubeconfig文件,里面有了name用户名 和 client-certificate-data用户客户端证书信息和client-key-data:客户端私钥信息 还是得继续设置
- 设置上下文参数,命名空间 要提前创建下dev命名空间
# --cluster集群名称 --user用户名 --namespace 要访问的命名空间 再次写入到 devuser.kubeconfig文件
$ kubectl config set-context kubernetes --cluster=kubernetes --user=devuser --namespace=dev --kubeconfig=devuser.kubeconfig
- 进行权限下发绑定rolebinding操作,admin在k8s集群里面是一个什么权限都有的clusterrole,把这个clusterrole绑定到我们创建的用户devuser,把这个rolebinding放在dev命名空间下
$ kubectl create rolebinding devuser-admin-binding --clusterrole=admin --user=devuser --namespace=dev
- 把devuser.kubeconfig文件考培到devuser用户目录文件夹,也就是/home/devuser/文件夹
# 考培前先在/home/devuser/文件夹 创建.kube/文件夹
$ mkdir /home/devuser/.kube/
# 把devuser.kubeconfig文件考培到devuser下的.kube/文件夹
$ cp devuser.kubeconfig /home/devuser/.kube/
# 把devuser.kubeconfig文件分给devuser用户 chown命令是指定文件的拥有者
$ chown devuser:devuser /home/devuser/.kube/devuser.kubeconfig
# 然后用登录devuser 连接集群的master节点,把文件名字做一个修改 但是老是报错“mv: 无法将"devuser.kubeconfig" 移动至"config": 权限不够”,我还是使用root 修改的文件名
$ cd /home/devuser/.kube
$ mv devuser.kubeconfig config
- root给devuser用户切换上下文,让devuser用户读取到config的信息
$ cd /home/devuser/.kube
$ kubectl config use-context kubernetes --kubeconfig=config
- 测试
# 使用 devuser用户查看pod
$ kubectl get pod