k8s中,如何通过kubeconfig实现权限的隔离、用户的隔离?

发布时间 2023-10-09 17:35:51作者: Zhai_David

1、需求及背景说明

 

在k8s环境,如果想要实现不同的用户,可以有操作不同的命名空间的权限,对命名空间中的不同的对象有不同的操作的权限,该如何实现呢?

 

有什么样的使用的场景呢?

 

简单来说,虽然都是通过kubectl来对k8s集群进行管理的操作,但是不同的人员,通过不同的kube-config,就可以有不同的权限,实现不同的操作。

 

在文章接下来的部分,就通过一个实验,展示如何通过kubeconfig来实现这个需求。

 

2、实验过程

 

2.1 创建用户(客户端证书)

 

在k8s中,普通的用户,是通过在客户端的证书中CN字段来声明的,创建用户,也就是创建证书的过程。

 

  • 创建客户端密钥、CSR
openssl genrsa -out kubectl-client.key 2048
openssl req -new -key kubectl-client.key -out kubectl-client.csr \
        -subj "/CN=ns2-admin/O=admin"

 

其中,CN=ns1-admin是用户名,O=admin是用户组。也可以不指定。

 

命令执行后,会生成下面的2个文件:

[root@nccztsjb-node-23 kubectl-client]# ls -ltr
total 8
-rw-r--r-- 1 root root 1679 Oct  9 13:58 kubectl-client.key
-rw-r--r-- 1 root root  911 Oct  9 13:59 kubectl-client.csr

 

 

  • 基于集群的CA进行签名,生成客户端证书

注意:k8s集群,只认集群CA签名的证书。

openssl x509 -req \
             -CA /etc/kubernetes/pki/ca.crt \
             -CAkey /etc/kubernetes/pki/ca.key \
             -CAcreateserial \
             -in kubectl-client.csr \
             -out kubectl-client.crt

 

 

命令执行后,生成下面的3个文件:

[root@nccztsjb-node-23 kubectl-client]# ls -ltr
total 12
-rw-r--r-- 1 root root 1679 Oct  9 13:58 kubectl-client.key
-rw-r--r-- 1 root root  911 Oct  9 13:59 kubectl-client.csr
-rw-r--r-- 1 root root 1001 Oct  9 14:05 kubectl-client.crt
[root@nccztsjb-node-23 kubectl-client]# 

 

 

2.2 创建kubeconfig

 

这些信息,都是放在context里的信息,比如,集群、用户、环境,和k8s集群的集群没有绝对的关系。

 

  • 创建集群
kubectl config \
        --kubeconfig=config-ns1 \
        set-cluster kubernetes \
        --server=https://172.20.58.83:6443 \
        --embed-certs \
        --certificate-authority=/etc/kubernetes/pki/ca.crt 

 

参数说明:

--kubeconfig:kubectl使用访问集群使用的kubeconfig文件
set-cluster:集群的名字
--server:api server的信息
--embed-certs:将证书嵌入到kubeconfig文件中
--certificate-authority:ca的证书

 

 

  • 创建用户
kubectl config \
        --kubeconfig=config-ns1 \
        set-credentials ns1-admin \
        --client-certificate=kubectl-client.crt \
        --client-key=kubectl-client.key \
        --embed-certs=true

 

ns1-admin是context中的用户信息。

 

  • 创建context(上下文环境)
kubectl config \
        --kubeconfig=config-ns1 \
        set-context ns1-admin \
        --cluster=kubernetes \
        --namespace=ns1 \
        --user=ns1-admin     

 

在context关联,集群、命名空间、用户。

也就是说,在这个context中,要用哪个用户、管理哪个集群的哪个命名空间。

 

  • 设置当前的context
kubectl config --kubeconfig=config-ns1 use-context ns1-admin

 

也就是设置默认的工作环境。

 

OK,执行完以上的步骤后,查看生成的kubeconfig文件

[root@nccztsjb-node-23 kubectl-client]# cat config-ns1 
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJek1ESXlOekEzTXpFeE5sb1hEVE16TURJeU5EQTNNekV4Tmxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTUZoClNxaXNMalFIS29MMDlCWlJtUG12bkgwbzcwZWlmOXpZTCtROXlNUzlVODNwRXQ5dk93VnhvWk1JOWdqSEhxMnAKZjNlYk8xaktYVEhscnpmQ3VTL1pMSW1yRjF6ZElIV0NJb281dlRPbWxSbjNlQlNBNGZiUnhXQVBtTlZLc2txKwpxRmJ0NmhXM0pqaXFSZGdzSGd2ZnZGU0szZktmMmdRdjNpUDljb2p1NG5lNHRYWHUyVUIxSFZGY2l4UUxHK3NGCmNUektCU2RSSFJncXhiMUJWWEJXT2pmdjVqUGo4WFhxWEdFbVdLZ0czV0FQVkRQSjZqUWFQZ1VsWWNURmhpOTMKZHZwSTduanhxaXhCdm1XZEV4ZXorcVRJa0Z0N1p5bUpjdUVuWlNmK2E3UFZwWENhc2tiVUJnRmxkVHp5eVFUKwpwVnlZR1gzc3pOUGRJQndWNjdzQ0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZGT1QyTzhvYlJXdWFrRHIxck1mZklqK0NGcVZNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBQnRld3lIaitYaGZmUElIQ2p4YwpockpkcFNIdTJZbElsL3BhOFFGTHdyZUtQZHpzYXNYUElhUUJyU2FsNUQ0TTlQVVFwSk9XMzhpQjBqUnpXZU9FCmJWN25jNnhTOVZJWThSSEdmSytDWGlqbGowYWFFNHFERm9oWUZQeCtHVlV6SG1YdUp6bXlGSnhPYVc2VG9XSkIKYXE0OFY1YktBSzBHaTJnUlA5Q053d01DQTBBeFV2Y25HUHJWVjNDckNnMFhxcElQc2dyTWdkUFpwbllkdUk3RApydnZXZkFvZU9QL2w0SzJrSkw5QWJTMG91Z0F0cy9GTFB1dEhRbFNLWDZ2T0FtUWtVNzFtbXBuNDkzUEt0ckNjCllHamFxQjZnbFpzVGI0emovdlBDMUJIbTM2S2JUeHptckRVWXd2Z2oxQWhOSmtuNDE5MlFRRExwTzMzdGFaTkUKdFZJPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
    server: https://172.20.58.83:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    namespace: ns1
    user: ns1-admin
  name: ns1-admin
current-context: ns1-admin
kind: Config
preferences: {}
users:
- name: ns1-admin
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN0VENDQVowQ0NRRHpvZ3JKeXlJZS9EQU5CZ2txaGtpRzl3MEJBUXNGQURBVk1STXdFUVlEVlFRREV3cHIKZFdKbGNtNWxkR1Z6TUI0WERUSXpNVEF3T1RBMk1EVXlOVm9YRFRJek1URXdPREEyTURVeU5Wb3dKREVTTUJBRwpBMVVFQXd3SmJuTXhMV0ZrYldsdU1RNHdEQVlEVlFRS0RBVmhaRzFwYmpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCCkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUtZb2VCdG1MYlRkYVBucFNTaWYrRnNUNjhaNDJWZnVYRDg4VUZiVDZIYnIKRWQweHM4QVh6RUVIeDF2Uk5CZEkxcjgrbXVyUllyRml0YzFVL0ZpekdGSGZPa0JzY3RLdDViR1BSZXpZVFpWMQpHcCtMTFo4U2ptQU81ZURoT0picnZ5YUNOUDI4ejRhNWt3QWQ5Q1JjVlZYdkY2cFYxbStGVlJ5aEN2bnJJbGQ4CkJtdkRXL0I1cTNjNXlseGtCY2NTeE4vWE1MdVBDSG15SUlBZmZCUTFCeVcwSDh0TlBQVjhnQ3ppV1dYeHBENmEKOXdyNWpRUWxMZEl2d2kyZTBGOVZSbWRLQTBCRG9lOTFnNU1GYXNUR1gwZDFPSjYvVkNHZnhHMTlkaGVmWmg0ZQprVWZwS1NHQUlHVmlLdTdiWm9Ma1pBbFZIT2ZTczUrY2FiQVBqL09mc2dNQ0F3RUFBVEFOQmdrcWhraUc5dzBCCkFRc0ZBQU9DQVFFQUhLZkJLYjkzNjZEVkg5RW1UOGZOeWxTaEdrem5QbGYxY1cyUWhacTJtalJvZlRvN0ErTHoKRE53REk3U1dvcjhVMDB4b0xVMExsd21hUldZSXFpNGxWeUVFM2tLQXJPOFIyaU81WjFoMnoza2hvdkNGOXVKOApkcTZXQzY2cnVFNGM2b0hVRlJNdlBkaStSSHFNY0M5K3lOcjVrbHY3YVNrSEhiZytYNnRBL3Q3RjBReEZhTU9ICk1JM3ViT0c2UkhtYm1KYS9KUDRlOXpPUUFndmJyYVR1TXVtclBaTGlsRDFVay9qRjQyYmNQZC9lSnpmRVl5eUwKNTI4MjJGL21WTHNueGxoQWthUW1aTzJhTGpPTExZakxxNGRmOUg0SFJkZnJzWkRPVFBWeVpOMkJCeFptRk1YdAp3a2VMcU0za2NCSXhQYm9LYjBlS3l5UmhvcDUzZGorQXZBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBcGloNEcyWXR0TjFvK2VsSktKLzRXeFByeG5qWlYrNWNQenhRVnRQb2R1c1IzVEd6CndCZk1RUWZIVzlFMEYwald2ejZhNnRGaXNXSzF6VlQ4V0xNWVVkODZRR3h5MHEzbHNZOUY3TmhObFhVYW40c3QKbnhLT1lBN2w0T0U0bHV1L0pvSTAvYnpQaHJtVEFCMzBKRnhWVmU4WHFsWFdiNFZWSEtFSytlc2lWM3dHYThOYgo4SG1yZHpuS1hHUUZ4eExFMzljd3U0OEllYklnZ0I5OEZEVUhKYlFmeTAwODlYeUFMT0paWmZHa1BwcjNDdm1OCkJDVXQwaS9DTFo3UVgxVkdaMG9EUUVPaDczV0Rrd1ZxeE1aZlIzVTRucjlVSVovRWJYMTJGNTltSGg2UlIra3AKSVlBZ1pXSXE3dHRtZ3VSa0NWVWM1OUt6bjV4cHNBK1A4NSt5QXdJREFRQUJBb0lCQUNWN2U1eXlzQnpjMVpHSwp6clliWUNzcmswUnlmcFVYY0RmVG8wdnpBYjNSeVhYY2dIQVU3ajY5UW51ejljeEs0aWJDT0xCQUM4TjRRUXJRCjRSd2hTcHN0Z0RhSVFGN0dXOHB5UjVQbU41by9rSUh0STUxKzBoOVpQUUk5ekVZL2FCK0h2K3g5YTFNNUNiQTkKRVpZaVBoM2trYkliS3dSOVQzWGwzbFFDZHZ6RTRHK1RqNjNZZVVkUXFYYUtsdmgwaGFaMVFWTHk0Wjl0d1FkUQpLMllxR1dVWDRVN1BsQVhjNEQ1YVoyaG1pTjJ1UnYwZkNIdnN6VFROb2VBK2xnVDdWOXlrZXlHMFhSdGhhU2txClN5SVZkbWI3SXEwbnRZUjExc1ZneFFvQy9BcDdrRENUQlhrNnZwazdKemgxVDIzMGU3WnZONldUTTBTaUNEcGQKSHExSTdnRUNnWUVBMis3bE5NTXFmelFYUnVZcWlRS3hNRUF2Lzdhc0VaRUxEOFhDUzNCRnk5b3hxdWJBQ1VKeQpNMXE5L1hZT2FDL00zcVhKN2RuWkkzYUxNNFZpWEpEektKOVJ2dUE5UlAyWGcrc1NxYnl3T3pNQUY3Qm1UT05LCjdjSVdxeWVvYjNBMFRaUmJKdmIwdWovTktlcWJzVWk2YWVLNStUbjBTeE1ST2lpeXpFc2xHNzhDZ1lFQXdXZ0UKOUN5ZExlMmhIV0ZnQ3BFMExSZHQrNjZtTmNLMDZRVnM3MndtcG9lYjFiOGlOWXRuMXVDa1FtWTU3bWk1Z3lSQQpKZWJoZmlQRVRaWHhRdnVGRkgvL25PME9KQ2NXY0lNS09yaldqRkNOVjZVR2ExTyt3Ykl5aHBoR3BxZHBQNXpICnp2bkhZbm5xVkZrV2tTZEJvdmRSTXRXVHVpVWNJL1J1RC9JTFNyMENnWUVBa2ptYWNPTVZ2Uzh3RHJaM0wxTDMKNWNHM2FBZlhEWExtN055cUdxZ1I3OEFwWjV3MXI3SmE1V1ArajZkUFd0djFGVThiRzZYTXBiUnFScDMzVU40YQpuVGFZRGhWZkJ5Q24vVkJzdnlleDhCb3ZoSkNHNDdYM0dtOEJ6VmYzdCtmZERudUZ3emxNYXd5Q1pzMFNLT1BXCjlSR0dYbnEydnJkMXE3cGxia2pENmxjQ2dZQWdneVQ2Q3hudEk1cEcveHlQQ2pQVU5MRVhjeGVieC94emc2YjUKWkp2bXVMczRwbVhRekh1TFFyNDZMMGNqemRVSnQ2bFU5Y2dJVldqbGhnUkZ0MVI2eXIya21yRWE0THREOUxOZQpoYjREWG5NMFBaaWpxRE5VQ21tMStKay80THF2cCtKcTU5QmR2SkxvMVFVWEo1dEFFd1ZDWDJiekR0UDVNMWpoCk0xWTBuUUtCZ1FDdjZjRkU2WXhwbTZOS1dIUmRLN2QyMGZ5cVZNOE9xTDVsL1hUNHdrOFRsZnRFWEFoTXRETTEKbTdIN3E4S05hRnN5a1Z2RzNUaGxYUjhKcHpJQ05YTmxHbTFvNzRETmh0UTRDK0h0ZUNydTVySjN3Vmp3bzBIbwpZR0VtalIwRXRDdkN1SzJOTitpOE1mazYzRndmR3VDa0lJaTJVNUdiOU02ZUpHWG1PbXVITGc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
[root@nccztsjb-node-23 kubectl-client]#

 

 

2.3 通过kubeconfig访问集群

 

[root@nccztsjb-node-23 kubectl-client]# kubectl --kubeconfig=config-ns1 get pod
Error from server (Forbidden): pods is forbidden: User "ns1-admin" cannot list resource "pods" in API group "" in the namespace "ns1"
[root@nccztsjb-node-23 kubectl-client]# 
 

 

发现,用户ns1-admin是没有权限的。

 

这个时候,就需要用到k8s中的role和rolebinding。

 

授予对应的权限。

2.4 创建角色、权限

 

  • 创建role

也就是对应的权限的集合

 

使用下面的创建角色,这个角色,只有对pod的查看权限

 

注意:这里只是做个示例,需要其他的权限,可以在这里增加。

 

另外,这个角色的创建,使用管理员的账号创建。

 

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
  namespace: ns1
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["list", "get"]

 

 

[root@nccztsjb-node-23 ~]# kubectl get role -n ns1
NAME         CREATED AT
pod-reader   2023-09-25T04:03:16Z
[root@nccztsjb-node-23 ~]# 

 

 

  • 创建角色绑定
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: pod-reader-binding
  namespace: ns1
subjects:
- kind: User
  name: ns1-admin
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

 

 

将角色授予用户ns1-admin

[root@nccztsjb-node-23 ~]# kubectl get rolebinding -n ns1
NAME                 ROLE              AGE
pod-reader-binding   Role/pod-reader   14d
[root@nccztsjb-node-23 ~]# 

 

 

2.5 通过kubeconfig访问集群

 

权限授予完毕后,使用kubeconfig访问集群

kubectl --kubeconfig=config-ns1 get pod

 

 

发现,get pod是可以查到的,get svc就无法查到。

[root@nccztsjb-node-23 kubectl-client]# kubectl --kubeconfig=config-ns1 get pod
NAME                        READY   STATUS    RESTARTS   AGE
nginx-ns1-9774b85b4-b9v6s   1/1     Running   0          20d
nginx-ns1-9774b85b4-hp7hr   1/1     Running   0          20d
nginx-ns1-9774b85b4-lrsmw   1/1     Running   0          20d
[root@nccztsjb-node-23 kubectl-client]# kubectl --kubeconfig=config-ns1 get svc
Error from server (Forbidden): services is forbidden: User "ns1-admin" cannot list resource "services" in API group "" in the namespace "ns1"
[root@nccztsjb-node-23 kubectl-client]# 

 

 

这样这个kubeconfig就有了特定的权限了。

 

同样的,利用其他的kubeconfig,可以实现不同的权限。

 

这样,在管坯k8s集群时,使用不同的kubeconfig,就能够实现不同的管理权限了。而不是给所有的管理的权限了。

 

备注:最终k8s中检测到的用户名,是证书中CN的名字。而不是kubeconfig中的名字。