首页 > 其他分享 >k8s 使用 RBAC 鉴权 建立不同用户使用k8s。只有指定命名空间的权限

k8s 使用 RBAC 鉴权 建立不同用户使用k8s。只有指定命名空间的权限

时间:2023-05-04 14:35:27浏览次数:45  
标签:kubectl kubernetes 20230408 RBAC test sa k8s 鉴权

k8s 使用 RBAC 鉴权

https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/rbac/

# 创建sa账号
kubectl create sa sa-test-20230408


# 使用sa 账号创建pod资源
[root@master01 sa]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
 name: sa-test-pod-20230408
 namespace: default
 labels:
   app: sa
spec:
  serviceAccountName: sa-test-20230408
  containers:
  - name: sa-nginx
    ports:
    - containerPort: 80
    image: nginx
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh","-c","sleep 3600"]
    
# 进去pod容器访问资源,没授权访问
[root@master01 sa]# kubectl  exec -it sa-test-pod-20230408 -- /bin/bash

root@sa-test-pod-20230408:/var/run/secrets/kubernetes.io/serviceaccount# curl --cacert ./ca.crt -H  "Authorization: Bearer $(cat ./token)"  https://kubernetes/api/v1/namespaces/default
返回信息"code": 403


# 授权sa-test-20230408 有cluster-admin 权限后访问
kubectl create clusterrolebinding sa-test-20230408-clusterrolebinding  --clusterrole=cluster-admin --serviceaccount=default:sa-test-20230408


root@sa-test-pod-20230408:/var/run/secrets/kubernetes.io/serviceaccount# curl --cacert ./ca.crt -H  "Authorization: Bearer $(cat ./token)"  https://kubernetes/api/v1/namespaces/default
{
  "kind": "Namespace",
  "apiVersion": "v1",
  "metadata": {
    "name": "default",
    "uid": "f6ba86a9-b5ec-4850-a1d4-2afb7fc61083",
    "resourceVersion": "842384",
    "creationTimestamp": "2023-02-22T03:17:00Z",
    "labels": {
      "field.cattle.io/projectId": "p-hph99",
      "kubernetes.io/metadata.name": "default"
    },



# 查看clusterrolebinding 授权信息

[root@master01 ~]# kubectl  get clusterrolebinding| grep 20230408
sa-test-20230408-clusterrolebinding                    ClusterRole/cluster-admin                                                          2m28s

[root@master01 ~]# kubectl  describe  clusterrolebinding sa-test-20230408-clusterrolebinding
Name:         sa-test-20230408-clusterrolebinding
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  ClusterRole
  Name:  cluster-admin
Subjects:
  Kind            Name              Namespace
  ----            ----              ---------
  ServiceAccount  sa-test-20230408  default

创建不同用户操作k8s

限制不同的用户操作 k8s 集群

ssl 认证
生成一个证书
(1)生成一个私钥
cd /etc/kubernetes/pki/
(umask 077; openssl genrsa -out k8s-test-20230408.key 2048)
(2)生成一个证书请求
openssl req -new -key k8s-test-20230408.key -out k8s-test-20230408.csr -subj "/CN=k8s-test-20230408"
(3)生成一个证书
openssl x509 -req -in k8s-test-20230408.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out k8s-test-20230408.crt -
days 3650

在 kubeconfig 下新增加一个 k8s-test-20230408 这个用户
[root@xuegod63 ~]# cp /root/.kube/config /root/.kube/config.bak
(1)把 k8s-test-20230408 这个用户添加到 kubernetes 集群中,可以用来认证 apiserver 的连接
kubectl config set-credentials k8s-test-20230408 --client-certificate=./k8s-test-20230408.crt --client-key=./k8s-test-20230408.key
--embed-certs=true
(2)在 kubeconfig 下新增加一个上下文
kubectl config set-context k8s-test-20230408@kubernetes --cluster=kubernetes --user=k8s-test-20230408
(3)切换账号到 k8s-test-20230408,默认没有任何权限
kubectl config use-context k8s-test-20230408@kubernetes
kubectl config use-context kubernetes-admin@kubernetes 这个是集群用户,有任何权限
把 user 这个用户通过 rolebinding 绑定到 clusterrole 上,授予权限,权限只是在 k8s-test-20230408 这个名称
空间有效
kubectl create ns k8s-test-20230408
(1)把 k8s-test-20230408 这个用户通过 rolebinding 绑定到 clusterrole 上
kubectl create rolebinding k8s-test-20230408 -n k8s-test-20230408 --clusterrole=cluster-admin --user=k8s-test-20230408
(2)切换到 k8s-test-20230408 这个用户
kubectl config use-context k8s-test-20230408@kubernetes
(3)测试是否有权限
kubectl get pods -n k8s-test-20230408
有权限操作这个名称空间
kubectl get pods
没有权限操作其他名称空间

添加一个 k8s-test-20230408 的普通用户
useradd k8s-test-20230408
cp -ar /root/.kube/ /home/k8s-test-20230408/

# 查看当前使用账号
[root@master01 pki]# kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://192.168.10.202:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: k8s-test-20230408
name: k8s-test-20230408@kubernetes
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: k8s-test-20230408
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
- name: kubernetes-admin
user:
client-certificate-data: REDACTED
client-key-data: REDACTED


# 编辑config文件,只留k8s-test-20230408 用户的配置信息
[root@master01 sa]# cat /home/k8stest/.kube/config


chown -R k8s-test-20230408.k8s-test-20230408 /home/k8s-test-20230408/
su - k8s-test-20230408
kubectl get pods -n k8s-test-20230408


[k8stest@master01 ~]$ kubectl apply -f pod2.yaml -n k8s-test-20230408
pod/tomcat-pod-20230408-2 created
[k8stest@master01 ~]$
[k8stest@master01 ~]$ kubectl get pod
Error from server (Forbidden): pods is forbidden: User "k8s-test-20230408" cannot list resource "pods" in API group "" in the namespace "default"
[k8stest@master01 ~]$ kubectl get pod -n k8s-test-20230408
NAME READY STATUS RESTARTS AGE
tomcat-pod-20230408 1/1 Running 0 64s
tomcat-pod-20230408-2 1/1 Running 0 17s
[k8stest@master01 ~]$
[k8stest@master01 ~]$
[k8stest@master01 ~]$ kubectl get pod -n k8s-test-20230408
NAME READY STATUS RESTARTS AGE
tomcat-pod-20230408 1/1 Running 0 2m23s
tomcat-pod-20230408-2 1/1 Running 0 96s
[k8stest@master01 ~]$ kubectl delete -f pod2.yaml -n k8s-test-20230408
pod "tomcat-pod-20230408-2" deleted
[k8stest@master01 ~]$ kubectl get pod -n k8s-test-20230408
NAME READY STATUS RESTARTS AGE
tomcat-pod-20230408 1/1 Running 0 2m42s


最后不要忘了切换回 kubernetes-admin 用户:
kubectl config use-context kubernetes-admin@kubernetes

 

标签:kubectl,kubernetes,20230408,RBAC,test,sa,k8s,鉴权
From: https://www.cnblogs.com/liuyoushui/p/17298511.html

相关文章

  • k8s 控制器-Replicaset-Deployment cordon drain
    k8s控制器-Replicaset-Deployment#cordon警戒线 执行后不会在调度到该节点上了[root@master01deployment]#kubectlcordonnode01node/node01cordoned[root@master01deployment]# NAMESTATUSROLESAGEVERSIONmaster0......
  • k8s labels 创建和删除
    #1lables#nodelabel[root@master01pod]#kubectllabelpodspod-selftime=2023 [root@master01pod]#kubectlgetnode--show-labels [root@master01pod]#kubectllabelnodesnode01host- #2podlabel [root@master01pod]#kubectllabelnodesno......
  • 案例分享-full gc导致k8s pod重启
     在之前的记一次k8spod频繁重启的优化之旅中分享过对于pod频繁重启的一些案例,最近又遇到一例,继续分享出来希望能给大家带来些许收获。问题现象报警群里突然显示某pod频繁重启,我随即上去查看日志,主要分这么几步:  1.查看pod重启的原因,kubectldescirbepodLastState:......
  • 01. k8s1.15.1高可用版本(docker引擎,Centos7.9)
    1.软件版本首先要把centos7系统的内核升级最好4.4以上(默认3.10的内核,运行大规模docker的时候会有bug)软件/系统版本备注Centos7.9最小安装版k8s1.15.1flannel0.11etcd3.3.102.角色分配k8s角色主机名节点IP备注master1+etcd1mas......
  • 读取 k8s 存储在 etcd 上的数据
    读取k8s存储在etcd上的数据EtcdAssistant是一款Etcd可视化管理工具,便捷高效地操作您的etcd集群;支持多种键的视图;管理租约、用户、角色和权限。etcd是一个分布式KV存储系统,在分布式系统中被广泛使用,Kubernetes就是使用了etcd存储持久化数据,包括创建的所有Pod、Deploy......
  • kubevirt实验部署:k8s1.23.17+kube-ovn+nfs+kubevirt+ceph 集成使用
    标签(空格分隔):kubernetes系列一:kubevirt的简介KubeVirt是一个Kubernetes插件,它为Kubernetes提供了在与容器相同的基础结构上提供、管理和控制虚拟机的能力。KubeVirt是由云原生计算基金会(CNCF)赞助的开源项目,目前正处于孵化阶段。KubeVirt使Kubernetes能够使用与容器化工作负......
  • k8s DCGM GPU采集指标项说明
    dcgm-exporter采集指标项指标解释dcgm_fan_speed_percentGPU风扇转速占比(%)dcgm_sm_clockGPUsm时钟(MHz)dcgm_memory_clockGPU内存时钟(MHz)dcgm_gpu_tempGPU运行的温度(℃)dcgm_power_usageGPU的功率(w)dcgm_pcie_tx_throughputGPUPCIeTX传......
  • 值得收藏:K8S的kubectl常用命令已经按场景分好类,请您查阅。
    kubectl知多少kubectl是K8S中的一个命令行工具,主要用于管理和操作K8S集群。kubectl通过向K8SAPI发送REST请求,允许用户与K8S集群中的各种资源进行交互,例如Pod、Service、Deployment等。kubectl提供了一种简单而灵活的方式来管理和操作K8S集群,它支持交互式和批处......
  • 云原生第二周--使用kubeasz部署多master的k8s集群
    1k8s集群介绍1.1k8s单master架构单master节点的架构,通常只用于测试环境,生产环境绝对不允许;这是因为k8s集群master的节点是单点,一旦master节点宕机,将导致整个集群不可用;其次单master节点apiServer是性能瓶颈;从上图我们就可以看到,master节点所有组件和node节点中的kubel......
  • K8s报错:[preflight] WARNING: JoinControlPane.controlPlane settings will be ignore
    一、报错信息[preflight]WARNING:JoinControlPane.controlPlanesettingswillbeignoredwhencontrol-planeflagisnotset.[preflight]Runningpre-flightcheckserrorexecutionphasepreflight:[preflight]Somefatalerrorsoccurred:[ERRORFileAvailabl......