kubeconfig方式远程登录kubernetes并限制用户在特定的命名空间内
老段工作室8周年
描述
本章要实现的效果是,mary用户远程登录kubernetes,并只能在game项目里查看pod,没有其他任何权限。
实验拓扑
下面在master上操作
为mary用户颁发证书
随便创建一个目录存放证书,这里是/ca-mary
[root@vms61 ~]# mkdir /ca-mary
[root@vms61 ~]# cd /ca-mary
[root@vms61 ca-mary]# ls
[root@vms61 ca-mary]#
生成mary的私钥
[root@vms61 ca-mary]# openssl genrsa -out client.key 2048
Generating RSA private key, 2048 bit long modulus
.................................................................+++
.......................+++
e is 65537 (0x10001)
[root@vms61 ca-mary]#
生成mary的证书请求文件
[root@vms61 ca-mary]# openssl req -new -key client.key -subj "/CN=mary" -out client.csr
[root@vms61 ca-mary]# ls
client.csr client.key
[root@vms61 ca-mary]#
为了方便使用,把kubernetes证书的路径定义为一个变量dir:
[root@vms61 ca-mary]# dir=/etc/kubernetes/pki/
[root@vms61 ca-mary]#
用kubernetes自带的ca私钥为mary颁发证书
[root@vms61 ca-mary]# openssl x509 -req -in client.csr -CA $dir/ca.crt -CAkey $dir/ca.key -CAcreateserial -out client.crt -days 3650
Signature ok
subject=/CN=mary
Getting CA Private Key
[root@vms61 ca-mary]# ls
client.crt client.csr client.key
[root@vms61 ca-mary]#
同时把kubernetes的ca的证书拷贝过来:
[root@vms61 ca-mary]# cp $dir/ca.crt .
[root@vms61 ca-mary]# ls
ca.crt client.crt client.csr client.key
[root@vms61 ca-mary]#
创建测试用的命名空间
创建一个命名空间game,等会设置mary只能在game里对pod执行get操作
[root@vms61 ca-mary]# kubectl create ns game
namespace/game created
[root@vms61 ca-mary]#
并在game命名空间里创建一个pod
[root@vms61 ca-mary]# kubectl run pod1 --image=nginx --image-pull-policy=IfNotPresent
pod/pod1 created
[root@vms61 ca-mary]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod1 1/1 Running 0 5s
[root@vms61 ca-mary]#
创建角色,并为mary授权
在game命名空间里创建role1角色,仅仅对pod具有get权限
[root@vms61 ca-mary]# kubectl create role role1 --verb=get,watch,list --resource=pods -n game
role.rbac.authorization.k8s.io/role1 created
[root@vms61 ca-mary]#
在把role1绑定mary
[root@vms61 ca-mary]# kubectl create rolebinding role1bing --role=role1 --user mary -n game
rolebinding.rbac.authorization.k8s.io/role1bing created
[root@vms61 ca-mary]#
为mary用户配置kubeconfig文件
首先创建模板文件kubeconfig
[root@vms61 ca-mary]# cat kubeconfig
apiVersion: v1
kind: Config
preferences: {}
clusters:
- cluster:
name: cluster1
users:
- name: mary
contexts:
- context:
name: context1
namespace: game
[root@vms61 ca-mary]#
在此kubeconfig文件里指定master的地址及证书:
[root@vms61 ca-mary]# kubectl config --kubeconfig=kubeconfig set-cluster cluster1 --server=https://192.168.26.61:6443 --certificate-authority=ca.crt --embed-certs=true
Cluster "cluster1" set.
[root@vms61 ca-mary]#
设置mary的密钥
[root@vms61 ca-mary]# kubectl config --kubeconfig=kubeconfig set-credentials mary --client-certificate=client.crt --client-key=client.key --embed-certs=true
User "mary" set.
[root@vms61 ca-mary]#
设置mary的上下文信息
[root@vms61 ca-mary]# kubectl config --kubeconfig=kubeconfig set-context context1 --cluster=cluster1 --namespace=game --user=mary
Context "context1" modified.
[root@vms61 ca-mary]#
修改kubeconfig,找到current-context
current-context: "context1"
把kubeconfig文件拷贝到客户端vms31 root家目录里。
在客户端vms30上测试
以下操作在客户端上做。
先安装kubectl命令
[root@vms30 ~]# yum install -y kubectl-1.18.2-0 --disableexcludes=kubernetes
...输出...
[root@vms30 ~]#
设置KUBECONFIG变量
[root@vms30 ~]# export KUBECONFIG=./kubeconfig
[root@vms30 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod1 1/1 Running 0 5m
[root@vms30 ~]#
可以看到正常运行。
[root@vms30 ~]# kubectl get deploy
Error from server (Forbidden): deployments.apps is forbidden: User "mary" cannot list resource "deployments" in API group "apps" in the namespace "game"
[root@vms30 ~]#
这里是没有权限查看deployment的权限。
[root@vms30 ~]# kubectl get pods -n default
Error from server (Forbidden): pods is forbidden: User "mary" cannot list resource "pods" in API group "" in the namespace "default"
[root@vms30 ~]#
也没有查看其他命名空间里pod的权限。