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中的名字。
标签:kubectl,隔离,--,kubeconfig,client,ns1,k8s,root From: https://www.cnblogs.com/chuanzhang053/p/17752331.html