25-k8s集群中-RBAC用户角色资源权限

一、RBAC概述

1,k8s集群的交互逻辑(简单了解)

        我们通过k8s各组件架构,指导各个组件之间是使用https进行数据加密及交互的,那么同理,我们作为“使用”k8s的各种资源,也是通过https进行数据加密的;

        k8s通过我们家目录下的证书来判断我们是谁?通过证书内容,认定我们的权限;

用户证书的位置

[root@k8s231 ~]# ll -a .kube/config 
-rw------- 1 root root 5634 Jan  1 19:40 .kube/config

2,k8s的安全架构(简单了解)

3,RBAC用户授权的逻辑(重要)

用户/主题Topic

        1,User

        2,SerciceAccount

        3,Group

用户角色:

        1,Role:局部资源角色

        2,ClusterRole:全局资源角色

角色绑定:

        1,RoleBinding

        2,ClusterRoleBinding

4,查看现有的集群默认角色

[root@k8s231 ~]# kubectl get clusterrole | grep -v system

admin:主要用于授权命名空间所有读写的权限

cluster-admin:超级管理员,由集群所有权限

edit:允许对大多数对象进行读写操作,不允许查看或者修改角色、角色绑定;

view:允许对命名空间大多数对象进行读写,不允许查看角色、角色绑定、secret;

#####

kubeadm用户,只有使用kubeadm部署k8s时才会出现,不用关心它;

二、流程介绍

1,用户的创建流程

1,User

2,SerciceAccount

3,Group

        本质上讲,在k8s系统中,用户,就是一个文件,这个文件在当前登录用户的家目录下;

这个文件config,就代表“我”是谁;

        这里面并没有角色、权限信息,角色和权限信息,在其他位置;

[root@k8s231 ~]# ll .kube/config 
-rw------- 1 root root 5634 Jan  1 19:40 .kube/config

        所以,要创建用户,就是要创建这个文件;

        那么如何创建这个文件呐?

· ssl流程介绍

        知道了ssl原理,https请求过程,我们就了解了,ssl的安全机制;

        实际上k8s当中“根证书”早就生成好了,在我们kubeadm部署的时候,就自动帮我们生成了;

        k8s是模拟ca机构,给自己颁发证书,自己验证自己,所以,整数中有私钥、公钥等;

[root@k8s231 ~]# ll /etc/kubernetes/pki/
total 56
-rw-r--r-- 1 root root 1281 Jan  1 19:39 apiserver.crt
-rw-r--r-- 1 root root 1155 Jan  1 19:39 apiserver-etcd-client.crt
-rw------- 1 root root 1679 Jan  1 19:39 apiserver-etcd-client.key
-rw------- 1 root root 1675 Jan  1 19:39 apiserver.key
-rw-r--r-- 1 root root 1164 Jan  1 19:39 apiserver-kubelet-client.crt
-rw------- 1 root root 1679 Jan  1 19:39 apiserver-kubelet-client.key

#根证书
-rw-r--r-- 1 root root 1099 Jan  1 19:39 ca.crt

#ca机构的私钥
-rw------- 1 root root 1679 Jan  1 19:39 ca.key
drwxr-xr-x 2 root root  162 Jan  1 19:39 etcd
-rw-r--r-- 1 root root 1115 Jan  1 19:39 front-proxy-ca.crt
-rw------- 1 root root 1675 Jan  1 19:39 front-proxy-ca.key
-rw-r--r-- 1 root root 1119 Jan  1 19:39 front-proxy-client.crt
-rw------- 1 root root 1679 Jan  1 19:39 front-proxy-client.key
-rw------- 1 root root 1675 Jan  1 19:39 sa.key
-rw------- 1 root root  451 Jan  1 19:39 sa.pub

· 生成用户证书

        一个用户一个证书,这个用户证书,就是用来生成,用户文件的(也就是家目录下的config)

· 生成kubeconfig用户授权文件

        有了这个授权文件,我们就拥有了一个用户了;

        但是,还没有任何权限,还无法使用;

2,创建角色和规则

        通过资源清单的方式,创建角色和规则;

        角色就是:

1,Role:局部资源角色

2,ClusterRole:全局资源角色

        规则就是:这个角色的权限;能使用什么资源、不能使用什么资源,,,,

3,角色与用户的绑定

        根据角色的不同,创建资源清单,对应不同的绑定资源清单的编写;

1,RoleBinding

2,ClusterRoleBinding

        只要角色和用户绑定完成,那么,RBAC的整个流程就结束了;

        我们就成功创建了一个带有特定权限的用户;就可以分发给“同事”进行使用了;

4,逻辑流程的总结

三、RBAC创建初体验

1,创建用户【user】

· 生成用户ssl证书

        以往我们使用openssl的工具命令生成证书,比较繁琐,本次学习,我给大家介绍一个证书生成工具,叫做cfssl证书生成工具;

1,上传/下载cfssl证书生成工具

cfssl工具百度网盘地址:

链接:https://pan.baidu.com/s/1gDRQuxekvgInplLkpjvhQw?pwd=f31x 
提取码:f31x

或者去github地址下载:Releases · cloudflare/cfssl · GitHub

[root@k8s231 rbac]# rz -E
[root@k8s231 rbac]# ll
-rw-r--r-- 1 root root 10808877 Nov  8 00:30 cfssl.zip

2,解压cfssl工具压缩包

[root@k8s231 rbac]# unzip cfssl.zip 
[root@k8s231 rbac]# ll
-rw-r--r-- 1 root root 12054528 Aug 30 15:46 cfssl_1.6.4_linux_amd64
-rw-r--r-- 1 root root  9560064 Aug 30 15:45 cfssl-certinfo_1.6.4_linux_amd64
-rw-r--r-- 1 root root  7643136 Aug 30 15:48 cfssljson_1.6.4_linux_amd64
-rw-r--r-- 1 root root 10808877 Nov  8 00:30 cfssl.zip

3,删除压缩包,将cfssl文件改名

        为什么改名?为了便于使用~如果你不嫌费力,可以不改~

[root@k8s231 rbac]# rm -rf cfssl.zip 
[root@k8s231 rbac]# rename _1.6.4_linux_amd64 "" *
[root@k8s231 rbac]# ll
-rw-r--r-- 1 root root 12054528 Aug 30 15:46 cfssl
-rw-r--r-- 1 root root  9560064 Aug 30 15:45 cfssl-certinfo
-rw-r--r-- 1 root root  7643136 Aug 30 15:48 cfssljson

4,将cfssl文件编程全局命令

        将这三个文件,移动到/usr/local/bin目录下,编程全局命令~

[root@k8s231 rbac]# mv ./* /usr/local/bin/

5,给cfssl执行文件加执行权限

[root@k8s231 rbac]# chmod +x /usr/local/bin/cfssl*

6,编辑cfssl工具的生成用户ssl证书的配置文件

        根证书

[root@k8s231 rbac]# cat ca-config.json 
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "87600h"
      }
    }
  }
}

        客户端验证签名证书

[root@k8s231 rbac]# cat csr.json 
{
  "CN": "xinjizhiwa",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

7,使用cfssl工具生成用户的ssl证书

[root@k8s231 rbac]# cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes csr.json | cfssljson -bare xinjizhiwa

参数解释:

#使用k8s自带的证书来签发客户端证书(位置就在/etc/kubernetes/pki/下面);
-ca=/etc/kubernetes/pki/ca.crt 
-ca-key=/etc/kubernetes/pki/ca.key 
-config=ca-config.json 
-profile=kubernetes csr.json | cfssljson -bare xinjizhiwa

查看证书

[root@k8s231 rbac]# ll
total 20
-rw-r--r-- 1 root root  292 Feb 21 20:06 ca-config.json
-rw-r--r-- 1 root root  223 Feb 21 20:07 csr.json
-rw-r--r-- 1 root root 1001 Feb 21 20:11 xinjizhiwa.csr
-rw------- 1 root root 1675 Feb 21 20:11 xinjizhiwa-key.pem
-rw-r--r-- 1 root root 1285 Feb 21 20:11 xinjizhiwa.pem

至此,我们用户的ssl证书申请完毕了;

· 生成用户kubeconfig文件

1,编辑生成kubeconfig文件的执行脚本

[root@k8s231 rbac]# cat kubeconfig.sh 
#!/bin/bash

# 配置集群;
# --certificate-authority:指定K8s的ca根证书文件路径
# --embed-certs:
#   1,true,表示将根证书文件的内容写入到配置文件中,
#   2,false,则只是引用配置文件,将kubeconfig
# --server:指定APIServer的地址。
# --kubeconfig:指定kubeconfig的配置文件名称
kubectl config set-cluster xinjizhiwa-cluster \
  --certificate-authority=/etc/kubernetes/pki/ca.crt \
  --embed-certs=true \
  --server=https://10.0.0.231:6443 \
  --kubeconfig=xinjizhiwa.kubeconfig
 
# 设置客户端认证,客户端将来需要携带证书让服务端验证
kubectl config set-credentials xinjizhiwa-client \
  --client-key=xinjizhiwa-key.pem \
  --client-certificate=xinjizhiwa.pem \
  --embed-certs=true \
  --kubeconfig=xinjizhiwa.kubeconfig

# 设置默认上下文,可以用于绑定多个客户端和服务端的对应关系(客户端和服务端绑定)。
kubectl config set-context xinjizhiwa \
  --cluster=xinjizhiwa-cluster \
  --user=xinjizhiwa-client \
  --kubeconfig=xinjizhiwa.kubeconfig

# 设置当前使用的上下文(正式生效)
kubectl config use-context xinjizhiwa --kubeconfig=xinjizhiwa.kubeconfig

2,执行生成kubeconfig用户文件的执行脚本

        正式生成用户

[root@k8s231 rbac]# bash kubeconfig.sh 
Cluster "xinjizhiwa-cluster" set.
User "xinjizhiwa-client" set.
Context "xinjizhiwa" created.
Switched to context "xinjizhiwa".

查看生成的kubeconfig用户文件

[root@k8s231 rbac]# ll
......
-rw------- 1 root root 5802 Feb 21 20:24 xinjizhiwa.kubeconfig

拓展知识:也可以使用config资源清单编写生成用户kubeconfig文件

[root@k8s231 rbac]# cat xinjizhiwa.kubeconfig 
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: ......(/etc/kubernetes/pki/ca.crt)
    server: https://10.0.0.231:6443
  name: xinjizhiwa-cluster
contexts:
- context:
    cluster: xinjizhiwa-cluster
    user: xinjizhiwa-client
  name: xinjizhiwa
current-context: xinjizhiwa
kind: Config
preferences: {}
users:
- name: xinjizhiwa-client
  user:
    client-certificate-data: .......(xinjizhiwa.pem或者写入公钥串,pem记得base64 -d之后使用)
    client-key-data: ......(xinjizhiwa-key.pem)

此时使用这个用户,取查看pod,会提示你没有权限,因为咱们还没有创建、绑定角色;

[root@k8s231 rbac]# kubectl get pods --kubeconfig=xinjizhiwa.kubeconfig

至此,我们用户“xinjizhiwa”就创建完成了;

2,创建角色编写规则

· 编辑角色资源清单

        上述内容中,我们知道,角色有两种,一种是全局角色ClusterRole,另一种是局部角色Role;

        我们先创建一个局部的Role角色作为学习;

[root@k8s231 rbac]# cat role.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: xinjizhiwa-role
  namespace: default
rules:
  #声明API组;[""]代表v1;["apps"]代表apps/v1
- apiGroup: ["","apps"]
  #声明API组下面的资源类型(不支持简写,只能写全称)
  resources: ["pods","deployments","services"]
  #声明使用方式(动作增删改查、、)
  verbs: ["get","list","delete"]

· 创建角色

[root@k8s231 rbac]# kubectl apply -f role.yaml

查看角色

[root@k8s231 rbac]# kubectl get role
NAME              CREATED AT
xinjizhiwa-role   2024-02-21T13:19:34Z

至此,用户和角色及规则都创建成功了;

3,绑定用户与角色

· 编辑绑定资源清单

[root@k8s231 rbac]# cat bind.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: xinjizhiwa-bind
  namespace: default
#声明用户主体(绑定的用户是哪个)
subjects:
#由于我们用户类型有三种,所以需要写明用户类型;
- kind: User
  #用户名称
  name: xinjizhiwa
  apiGroup: rbac.authorization.k8s.io
#声明角色主体(绑定的角色是哪个?)
roleRef: 
  #角色类型
  kind: Role
  #角色名称
  name: xinjizhiwa-role
  apiGroup: rbac.authorization.k8s.io

· 创建绑定资源

[root@k8s231 rbac]# kubectl apply -f bind.yaml

4,测试用户

协议个pod资源,使用用户“xinjizhiwa”创建,发现创建不了,提示权限不够;

因为,我们在创建角色规则的时候,只给了删除、和查看的能力,没有给create创建能力;

[root@k8s231 rbac]# cat pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-nginx
spec:
  containers:
  - name: c1
    image: nginx:1.20.1-alpine

[root@k8s231 rbac]# kubectl apply -f pod.yaml --kubeconfig=xinjizhiwa.kubeconfig

因为我们有default默认名称空间的查看、删除权限,所以我们可以进行查看;

测试查看功能

[root@k8s231 rbac]# kubectl get pods --kubeconfig=xinjizhiwa.kubeconfig

测试删除功能

[root@k8s231 rbac]# kubectl delete deploy --all --kubeconfig=xinjizhiwa.kubeconfig

到此,普通用户的创建、角色绑定、角色配置就学习完毕了;

四、其他节点使用用户登录操作k8s

        我们有了用户文件,将用户文件发送给“同事”,同事直接使用这个文件,就可以按照绑定的规则,操作k8s资源了;

1,模拟将用户文件发给同事

        比如,同事正在使用k8s233,我们把用户文件发给他

[root@k8s231 rbac]# scp xinjizhiwa.kubeconfig k8s233:/root/

2,同事在k8s233使用用户文件操作k8s资源

[root@k8s233 ~]# kubectl get pods --kubeconfig=xinjizhiwa.kubeconfig

3,操作资源不指定文件,默认指定设置

[root@k8s233 ~]# cp xinjizhiwa.kubeconfig ./.kube/config

[root@k8s233 ~]# kubectl get pods

五、用户组Group案例

1,用户组的概念

1,用户组的好处在于,无需单独为一个用户创建权限和绑定了,只需要统一把一个组进行授权,然后,将该组的用户加入进去,就没一个用户都拥有该组的权限了;

2,APIserver会优先校验用户名(ssl证书中的CN字段),若用户名没有对应的权限,则再去校验用户组(o)的权限;

        k8s中的用户、用户组都是提取ssl证书签名字段中的一个字段,不是在集群中创建的;

--证书签名中的CN字段:代表用户

--证书签名中的o字段:代表用户组

2,创建用户组Group

· 编辑cfssl证书请求文件

[root@k8s231 group]# cat ca-group.json 
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "87600h"
      }
    }
  }
}

[root@k8s231 group]# cat xinjizhiwa-csr.json 
{
  "CN": "xinjizhiwa",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "xinjizhiwa-group",
      "OU": "System"
    }
  ]
}

· 生成用户组证书

再次声明,你创建的是用户、还是用户组,取决于你的证书名称选择的签名字段,选择的是CN还是o;

[root@k8s231 group]# cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-group.json -profile=kubernetes xinjizhiwa-csr.json | cfssljson -bare xinjizhiwa-group

· 编辑脚本生成用户组kubeconfig用户组文件

[root@k8s231 group]# cat kubeconfig.sh 
#!/bin/bash

kubectl config set-cluster xinjizhiwa-cluster \
  --certificate-authority=/etc/kubernetes/pki/ca.crt \
  --embed-certs=true \
  --server=https://10.0.0.231:6443 \
  --kubeconfig=xinjizhiwa-group.kubeconfig
 
# 设置客户端认证
kubectl config set-credentials xinjizhiw-client \
  --client-key=xinjizhiwa-group-key.pem \
  --client-certificate=xinjizhiwa-group.pem \
  --embed-certs=true \
  --kubeconfig=xinjizhiwa-group.kubeconfig

# 设置默认上下文
kubectl config set-context xinjizhiwa-group \
  --cluster=xinjizhiwa-cluster \
  --user=xinjizhiw-client \
  --kubeconfig=xinjizhiwa-group.kubeconfig

# 设置当前使用的上下文
kubectl config use-context xinjizhiwa-group --kubeconfig=xinjizhiwa-group.kubeconfig

· 执行脚本生成用户组文件

[root@k8s231 group]# bash kubeconfig.sh

3,创建角色、绑定用户组

· 编辑资源清单

[root@k8s231 group]# cat rbac.yaml 
#创建角色
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: role-group
rules:
- apiGroups: ["","apps"]  
  resources: ["pods","nodes","services","deployments"]  
  verbs: ["get", "watch", "list","create"]  

---
#绑定用户组与角色
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: group-rolebinding
  namespace: default
#声明要绑定的用户/用户组
subjects:
  # 声明主体类型:组
- kind: Group
  # 组名(对应的O字段)
  name: xinjizhiwa-group  
  apiGroup: rbac.authorization.k8s.io
roleRef:
  # 角色类型
  kind: Role  
  # 绑定角色名称
  name: role-group
  apiGroup: rbac.authorization.k8s.io

· 创建用户组kubeconfig文件

[root@k8s231 group]# kubectl apply -f rbac.yaml

此时,我们就拥有了xinjizhiwa-group这个用户组了;

4,创建用户加入用户组

· 创建用户

[root@k8s231 user]# cat ca-config.json 
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "87600h"
      }
    }
  }
}
 

[root@k8s231 user]# cat group-user-xjzw.json 
{
  "CN": "xjzw",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "xinjizhiwa-group",
      "OU": "System"
    }
  ]
}

生成用户证书

[root@k8s231 user]# cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes group-user-xjzw.json | cfssljson -bare xjzw

· xjzw用户加入用户组

1,编辑生成kubeconfig用户文件的执行脚本

[root@k8s231 user]# ca kubeconfig.sh 
-bash: ca: command not found
[root@k8s231 user]# cat kubeconfig.sh 
#!/bin/bash

kubectl config set-cluster xinjizhiwa-cluster \
  --certificate-authority=/etc/kubernetes/pki/ca.crt \
  --embed-certs=true \
  --server=https://10.0.0.231:6443 \
  --kubeconfig=xjzw.kubeconfig
 
# 设置客户端认证
kubectl config set-credentials xjzw-client \
  --client-key=xjzw-key.pem \
  --client-certificate=xjzw.pem \
  --embed-certs=true \
  --kubeconfig=xjzw.kubeconfig

# 设置默认上下文
kubectl config set-context xinjizhiwa-contest \
  --cluster=xinjizhiwa-cluster \
  --user=xjzw-client \
  --kubeconfig=xjzw.kubeconfig

# 设置当前使用的上下文
kubectl config use-context xinjizhiwa-contest --kubeconfig=xjzw.kubeconfig

2,执行脚本

[root@k8s231 user]# bash kubeconfig.sh

5,测试用户是否拥有用户组的权限

[root@k8s231 user]# kubectl get pods --kubeconfig=xjzw.kubeconfig

总结,只要拥有了用户组,我们创建用户的时候,签名中“O”字段,与用户组名相同,那么创建出来的用户,就拥有了用户组的权限,就不在需要配置角色、绑定了;方便了很多;

六、基于【服务账号serviceaccount】授权

        serviceaccount用户,简称sa资源,用于自动化程序的用户创建;

        创建sa用户,就不需要使用证书来创建了,它是k8s集群中的一个资源,sa资源;

1,创建sa资源

· 声明式创建

[root@k8s231 sa]# vim sa01.yaml
apiVersion: v1
kind: ServiceAccount
metadata: 
  name: py01

[root@k8s231 sa]# kubectl apply -f sa01.yaml 
serviceaccount/py01 created

查看sa服务账号

[root@k8s231 sa]# kubectl get sa
NAME      SECRETS   AGE
default   1         51d
py01      1         4s

· 响应式创建

[root@k8s231 sa]# kubectl create serviceaccount py02

查看sa用户

[root@k8s231 sa]# kubectl get sa
NAME      SECRETS   AGE
default   1         51d
py01      1         2m4s
py02      1         4s

2,授权python程序对k8s-API的访问权限

· 创建用户

[root@k8s231 sa]# kubectl create serviceaccount py02

· 创建角色

[root@k8s231 sa]# vim role.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: python-role
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get","watch","list"]

[root@k8s231 sa]# kubectl apply -f role.yaml

· 绑定sa账号和角色

[root@k8s231 sa]# vim bind.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: python-role-sa
subjects:
- kind: ServiceAccount 
  name: py02
roleRef:
  kind: Role
  name: python-role
  apiGroup: rbac.authorization.k8s.io

[root@k8s231 sa]# kubectl apply -f bind.yaml

3,部署一个python的pod资源

[root@k8s231 sa]# vim pod.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dm-py
spec:
  replicas: 2
  selector:
    matchLabels:
      apps: python
  template:
    metadata:
      labels:
         apps: python
    spec:
      #这里就是sa账号,指定sa的名称,请确认该账号是有权限访问K8S集群的哟!
      serviceAccountName: py02
      containers:
      - image: python:3.9.16-alpine3.16
        name: py
        command:
        - tail 
        - -f
        - /etc/hosts

[root@k8s231 sa]# kubectl apply -f pod.yaml

4,进入pod中执行python代码

[root@k8s231 sa]# kubectl exec -it dm-py-64975879c8-b9sxg -- sh
/ # python --version
Python 3.9.16

#写一个python脚本
/ # cat > view-k8s-resources.py <<EOF
> from kubernetes import client, config

> with open('/var/run/secrets/kubernetes.io/serviceaccount/token') as f:
>      token = f.read()

> configuration = client.Configuration()
> configuration.host = "https://kubernetes"  # APISERVER地址
> configuration.ssl_ca_cert="/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"  # CA证书 
> configuration.verify_ssl = True   # 启用证书验证
> configuration.api_key = {"authorization": "Bearer " + token}  # 指定Token字符串
> client.Configuration.set_default(configuration)
> apps_api = client.AppsV1Api() 
> core_api = client.CoreV1Api() 
> try:
>   print("###### Deployment列表 ######")
>   #列出default命名空间所有deployment名称
>   for dp in apps_api.list_namespaced_deployment("default").items:
>     print(dp.metadata.name)
> except:
>   print("没有权限访问Deployment资源!")

> try:
>   #列出default命名空间所有pod名称
>   print("###### Pod列表 ######")
>   for po in core_api.list_namespaced_pod("default").items:
>     print(po.metadata.name)
> except:
>   print("没有权限访问Pod资源!")
> EOF
/ # 

####安装py使用k8s的插件########
/ # pip install kubernetes -i https://pypi.tuna.tsinghua.edu.cn/simple/

#执行python脚本

/ # python3 view-k8s-resources.py
###### Deployment列表 ######
没有权限访问Deployment资源!
###### Pod列表 ######
dm-py-64975879c8-b9sxg
dm-py-64975879c8-z76fp
pod-nginx

至此,关于k8s的RBAC的学习,就此结束;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/401084.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快速清理_卸载docker_找到不用的进程_centos磁盘爆满_清理磁盘---Linux工作笔记071

查看大文件,并且按照大小排名 cd / | du -h |sort -hr|head -30 可以看到根据不用的结果进行删除 可以看到在/data/dict目录很大,里面的都可以删除 然后再去卸载docker,要不然,没有磁盘是卸载不了的 systemctl stop docker systemctl stop docker.socket yum remove docker-…

Python查看已安装包的版本号(多方法)

目录 前言1. pip list2. pip show3. pkg_resources模块4. Python解释器 前言 一直使用pip list来查询&#xff0c;但如果想知道单个&#xff0c;应该怎么使用呢 在Python中&#xff0c;可以使用多种方法来查看已安装包的版本号 以下是一些常用的方法&#xff1a; 1. pip li…

Redis 工具类 与 Redis 布隆过滤器

Redis 工具类 1. 核心依赖 <!--redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>com.google.guava…

【快速搞定Webpack5】处理样式资源(三)

本次内容我们将学习使用webpack如何处理css、less、sass、scss等样式资源 介绍 webpack本身是不能识别样式资源的&#xff0c;所以我们需要借助loader包来帮助webpack解析样式资源 我们找loader都应该去官方文档中查找对应的loader&#xff0c;然后学习使用。 官方文档找不到…

Linux实验记录:使用LNMP架构部署动态网站环境

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注&#xff1a; LNMP动态网站部署架构是一套由&…

C 嵌入式系统设计模式 08:硬件代理模式

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述访问硬件的设计模式之一&…

Python 数据可视化之密度散点图 Density Scatter Plot

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 密度散点图&#xff08;Density Scatter Plot&#xff09;&#xff0c;也称为密度点图或核密度估计散点图&#xff0c;是一种数据可视化技术&#xff0c;主要用于展示大量数据点在二维平面上的分布情况…

解决MobaXterm网络错误连接超时问题

报错页面&#xff1a; 报错原因&#xff1a; ①网络断开了 ②网络端口&#xff0c;端口号改变 解决办法&#xff1a; ①重新连接网络按R ②固定端口号 第一步&#xff1a;编辑------>虚拟机网络编辑器&#xff08;我的Linux在虚拟机里&#xff09; 第二步&#xff1a;用…

MedicalGPT 训练医疗大模型,实现了包括增量预训练、有监督微调、RLHF(奖励建模、强化学习训练)和DPO(直接偏好优化)

MedicalGPT 训练医疗大模型&#xff0c;实现了包括增量预训练、有监督微调、RLHF(奖励建模、强化学习训练)和DPO(直接偏好优化)。 MedicalGPT: Training Your Own Medical GPT Model with ChatGPT Training Pipeline. 训练医疗大模型&#xff0c;实现了包括增量预训练、有监督微…

单调栈总结以及Leetcode案例解读与复盘

单调栈总结以及Leetcode案例解读与复盘 一、单调栈是什么&#xff1f; 单调栈&#xff08;monotonous stack&#xff09;是指栈的内部从栈底到栈顶满足单调性的栈结构。 二、如何维护单调性 新元素入栈时&#xff0c;会与栈顶元素进行比较&#xff0c;使得栈始终保持单调性…

Redis-内存管理

Redis是基于内存存储的&#xff0c;非关系型&#xff0c;键值对数据库。因此&#xff0c;对Redis来说&#xff0c;内存空间的管理至关重要。那Redis是如何内存管理的呢&#xff1f; 一、最大内存限制 Redis 提供了 maxmemory 参数允许用户设置 Redis 可以使用的最大内存大小。…

2023年12月CCF-GESP编程能力等级认证C++编程五级真题解析

一、单选题(每题 2 分,共 30 分) 第1题 下面C++代码用于求斐波那契数列,该数列第1、2项为1,以后各项均是前两项之和。下面有关说法错误的是( )。 A. fiboA( ) 用递归方式, fiboB() 循环方式 B. fiboA( ) 更加符合斐波那契数列的数学定义,直观易于理解,而 fiboB() 需…

Android TV遥控器探索,Android 桌面应用程序

Android TV 的遥控功能是通过红外遥控器或蓝牙遥控器来实现的。下面分别介绍这两种遥控器的工作原理&#xff1a; 红外遥控器&#xff1a; 红外遥控器是最常见的 Android TV 遥控器类型之一。 红外遥控器通过发送红外信号来控制电视或机顶盒。每个按键都有一个特定的红外编码&…

基于springboot+vue的课程答疑系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

【算法 - 动态规划】最长回文子序列

上篇文章中&#xff0c;我们学习一个新的模型&#xff1a; 样本对应模型&#xff0c;该模型的套路就是&#xff1a;以结尾位置为出发点&#xff0c;思考两个样本的结尾都会产生哪些可能性 。 而前篇文章中的 纸牌博弈问题 属于 [L , R]上范围尝试模型。该模型给定一个范围&…

【洛谷 P8780】[蓝桥杯 2022 省 B] 刷题统计 题解(二分查找+数学)

[蓝桥杯 2022 省 B] 刷题统计 题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a a a 道题目&#xff0c;周六和周日每天做 b b b 道题目。请你帮小明计算&#xff0c;按照计划他将在第几天实现做题数大于等于 n n n 题? 输入格式 输入一…

Android14 InputManager-InputReader的处理

IMS启动时会调用InputReader.start()方法 InputReader.cpp status_t InputReader::start() {if (mThread) {return ALREADY_EXISTS;}mThread std::make_unique<InputThread>("InputReader", [this]() { loopOnce(); }, [this]() { mEventHub->wake(); });…

Nignx的搭建与核心配置

目录 一、Nginx是什么&#xff1f; 1、Nginx概述 2、Nginx模块与作用 3、Nginx三大作用&#xff1a;反向代理&#xff0c;负载均衡&#xff0c;动静分离 nginx七层负载均衡调度算法&#xff08;六种&#xff09; 1、轮询&#xff08;默认调度算法&#xff09; 2、加权轮…

雨量水位在线监测站

TH-SW2随着科技的不断进步&#xff0c;雨量水位在线监测站在防汛、水资源管理、环境保护等领域发挥着越来越重要的作用。传统的雨量水位监测方法往往存在精度不高、实时性不强等问题&#xff0c;而雷达式测量技术的出现&#xff0c;则为这一领域带来了革命性的变化。 一、雨量水…

【踩坑专栏】主机ping虚拟机失败

我出现的问题finalshell连接超时&#xff0c;ping了一下发现ping都ping不通&#xff0c;于是发现问题所在。 最开始我是把虚拟机的网络设置改为桥接模式&#xff0c;问题解决了&#xff0c;但是这种模式的问题就是每次开机&#xff0c;ip都会改变&#xff0c;因此非常麻烦&…