首页 > 其他分享 >k8s中,如何通过kubeconfig实现权限的隔离、用户的隔离?

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

时间:2023-10-09 17:47:17浏览次数:40  
标签:kubectl 隔离 -- kubeconfig client ns1 k8s root

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

相关文章

  • k8s修改集群IP--重置集群
     原来IP地址192.168.10.138k8s-master192.168.10.139k8s-node1192.168.10.140k8s-node2新IP地址192.168.10.148k8s-master192.168.10.149k8s-node1192.168.10.150k8s-node2cp-Rf/etc/kubernetes//etc/kubernetes-bakpki证书目录保留下来:rm-rf/etc/kuberne......
  • k8s修改集群IP--不重置集群
    正常在用集群想要更换ip master节点ip192.168.10.138改为192.168.10.148node1节点ip192.168.10.139改为192.168.10.149node2节点ip192.168.10.140改为192.168.10.150master节点1)执行脚本1233.sh 1233.sh内容如下:#master节点exportoldip1=192.168.10.138expor......
  • k8s-常用命令
    查看yam配置1.获取deploy列表kubectlgetdeploy-nsunlogin--context=sunlogin-k8s-context2.查看指定deploy配置kubectlgetdeploysunlogin-tag-oyaml-nsunlogin--context=sunlogin-k8s-context 动态扩容缩容kubectlscaledeploy--replicas=3nginx-ns......
  • 使用 kubeadm 安装 k8s 集群
    背景之前使用过kubespray​的ansibleplaybook安装集群,尽管此剧本是官方推荐使用的,但是它有以下缺点:剧本的编排太过于晦涩创建集群的过程中,会产生许多必要的配置文件和依赖​​以上种种,导致使用kubespray​安装的集群不利于后续的维护和部分运维功能的二次开发。一些集群......
  • 二进制部署k8s集群
    1.配置主机hostname2.配置hosts映射并拷贝至其他节点3.配置时间同步yum-yinstallchrony.x86_64vim/etc/chrony.confserverntp.aliyun.comiburstserverntp1.aliyun.comiburstserverntp2.aliyun.comiburstserverntp3.aliyun.comiburstsystemctlstar......
  • k8s之Helm
    Helm帮助您管理Kubernetes应用——HelmChart,Helm是查找、分享和使用软件构建Kubernetes的最优方式。复杂性管理——即使是最复杂的应用,HelmChart依然可以描述,提供使用单点授权的可重复安装应用程序。易于升级——随时随地升级和自定义的钩子消除您升级的痛苦。分......
  • 使用 Rancher 部署管理 K8S 集群
    目录使用Rancher部署管理K8S集群主机规划部署docker-ce(rancher)部署rancher使用Rancher部署管理K8S集群主机规划主机名称角色IP地址基础软件rancher管理k8s集群10.0.0.203docker-cemasterk8s集群主节点10.0.0.200docker-cenode1k8s集群......
  • K8S的Pod资源和命令
    目录K8S的Pod资源资源清单写法K8S命令查看创建标签删除pod沉浸式体验k8s标签使用重新认识POD共享网络共享存储(挂载)Pod对容器的封装和应用POD的生命周期initContainers初始化容器hook钩子健康检查探针就绪态探针存活态探针测试(健康检查探针)clusterIP在pod前加一个clusterIPPOD......
  • K8S控制器Controller资源
    目录K8S控制器Controller资源控制器Controller控制器作用控制器类型RS控制器Deployment控制器版本更新扩缩容DaemonSetHPA工作原理部署Metric-server生成测试镜像wordpress压测K8S控制器Controller资源控制器Controller控制器作用1.pod类型的资源,删除pod后,不会重建2.替用户监......
  • k8s部署jenkins+gitlab实现代码发布
     1.#k8s部署jenkins#k8s中运行jenkins服务,gitlab还是跑在物理机上,因为经常需要clone修改代码。#基于java命令,运⾏javawar包或jar包,本次以jenkins.war包部署⽅式为例,jenkins的数据保存⾄外部存储(NFS或者PVC)。1.1#镜像⽬录⽂件:#pwd/opt/k8s-data/docke......