实现过程:创建证书->转换为kubeconfig文件->创建名字空间->角色绑定

创建证书:用户创建没有create user命令,只能在创建证书,并且被apiserver信任的ca签发的时候,这个用户才能出现

转换为kubeconfig文件:把这个证书通过一些命令转换为kubeconfig文件,因为在kubectl连接集群去进行认证,鉴权的时候,我们会使用到kubeconfig文件里的信息(使用到这种文件格式)

创建名字空间:手动创建dev名字空间,默认没有

角色绑定:在dev名字空间下,完成用户和权力之间的绑定

在 /etc/kubernetes/pki/下存放证书,这个路径本身就存储了很多其他证书

1.编辑devuser.json:

{
  "CN": "devuser",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

2.下载证书生成工具

# 下载 CFSSL 工具
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64

# 移动并重命名文件到系统路径
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo

# 添加执行权限
chmod +x /usr/local/bin/cfssl
chmod +x /usr/local/bin/cfssljson
chmod +x /usr/local/bin/cfssl-certinfo

# 生成用户证书

cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes devuser.json | cfssljson -bare devuser

3.转换为kubeconfig文件

把我们刚才生成的证书一点一点传过来,可以手动去生成,但不建议,可以使用官方给我们的命令去做

# 设置集群参数

export KUBE_APISERVER="https://192.168.175.11:6443"

kubectl config set-cluster kubernetes \

--certificate-authority=ca.crt \

--embed-certs=true \

--server=${KUBE_APISERVER} \

--kubeconfig=devuser.kubeconfig

-----------------------------------------------------------------------------------------------

--certificate-authority=ca.crt 的含义:

  • 这个参数告诉 kubectl:"使用当前目录下的 ca.crt 文件作为证书颁发机构"

  • 这个文件不会被复制到其他地方

  • kubectl 会读取这个文件的内容,进行 Base64 编码,然后将编码后的数据写入到 devuser.kubeconfig 文件中

# 设置客户端认证参数

kubectl config set-credentials devuser \

--client-certificate=devuser.pem \

--client-key=devuser-key.pem \

--embed-certs=true \

--kubeconfig=devuser.kubeconfig

# 设置上下文参数-把集群和用户关联起来

kubectl config set-context kubernetes \

--cluster=kubernetes \

--user=devuser \

--namespace=dev \

--kubeconfig=devuser.kubeconfig

# 创建dev名字空间

kubectl create ns dev

#角色绑定绑定集群角色

kubectl create rolebinding devuser-admin-binding --clusterrole=admin --user=devuser --namespace=dev

# 设置默认上下文

可以提前加载这个kubeconfig文件,让它生成一些关于用户的信息

kubectl config use-context kubernetes --kubeconfig=devuser.kubeconfig

把devuser用户放在当前默认的调用路径/root/.kube/config下,去验证我们的权限执行结果

当前我们已经是devuser用户了,用户的权限默认是为空的,必须要累加,devuser只有dev名字空间下的相关管理员权限

成功了

 ✅ 成功的情况

bash

kubectl get pod
# 默认使用 dev 命名空间,成功列出 pod

✅ 预期的失败情况

bash

kubectl get pod -A
# 错误信息:User "devuser" cannot list resource "pods" in API group "" at the cluster scope

配置完全正确:

  1. ✅ dev 命名空间权限正常

    • 可以在 dev 命名空间中查看、创建、管理资源

    • 看到了您之前创建的 dev-deploy-d7448d978-q9x6j pod

  2. ✅ 集群级别权限被正确限制

    • 无法查看其他命名空间的资源(-A 参数)

    • 收到了正确的权限拒绝错误信息

我们可以配合我们的linux系统用户,去完成不同的名字空间管理员的隔离

配合当前的linux系统用户,做到用户级别的隔离

dev这个用户就是要去管理dev名字空间的管理员

告诉它服务器是192.168.175.11,用户名:dev,密码:123456就可以连接到linux服务器里,默认权限就是devuser,这是最好的状态

kubectl会默认寻找当前用户家目录.kube/config文件

如果在linux里创建一个dev用户,它也有自己的家目录,只要把刚才的devuser.kubeconfig文件放在这个家目录下,就实现了

[root@k8s-master01 ~]# useradd dev
[root@k8s-master01 ~]# passwd dev
Changing password for user dev.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@k8s-master01 ~]# mkdir /home/dev/.kube
[root@k8s-master01 ~]# cp -a /etc/kubernetes/pki/devuser.kubeconfig /home/dev/.kube/config
[root@k8s-master01 ~]# chown -R dev:dev /home/dev/.kube
就可以了,创建了一个linux用户dev,地址192.168.175.11,用户名:dev,密码:123456,,,连接上终端后是linux用户级别

chown -R dev:dev /home/dev/.kube 
给他权限,-R:递归一下 dev:dev:用户名dev:组dev   ,从哪里开始算/home/dev/.kube,就开始往后去递进权限

更多推荐