CKA冲刺40天笔记 - day23 Kubernetes RBAC Explained - Role Based Access Control

本节整体逻辑:

  1. 创建user alice:生成私钥和证书apply之后会被放到.kube/config。

  2. 添加一个role。

  3. 将role和alice进行'role binding'绑定。

  4. 用alice和cluster3集群 组成一个新的context。

  5. 以alice的身份进入新的context。

一、创建user alice,Authentication

由于day21生成的adam的证书只有一天已经过期,现在重新生成一个新用户alice

bash 复制代码
kubectl config use-context kind-cka-cluster3
#重新生成一个用户
#生成客户端私钥
openssl genrsa -out day23-alice.key 2048
#使用私钥day23-alice.key生成带有私钥签名的CSR alice.csr
openssl req -new -key day23-alice.key -out alice.csr -subj '/CN=alice'
#CSR上的request进行base64解码,从官方文档复制一个csr.yaml,改成alice-csr.yaml,将上面的alice.csr放进去:
cat alice.csr | base64 | tr -d "\n"
kubectl apply -f alice-csr.yaml
#CA用自己的私钥给csr签名,生成alice这个客户端的证书
kubectl certificate approve alice




#查看证书
cd C:\Users\Administrator\.kube
#openssl调用 OpenSSL 加密工具箱, 处理 X.509 格式的证书(这是互联网和 Kubernetes 中最通用的公钥证书标准),-noout不要输出证书的编码原始内容, -text以文本形式打印证书内容 
openssl x509  -noout -text -in ./alice.crt
#可以看到证书详情

#approve之后,user adam怎样拿到证书?
kubectl get csr/alice -o yaml > alice-certificate.yaml
#将certificate字段解码 base64 -d
echo <粘贴certificate字段> | base64 -d > alice.crt
#或者一步得到证书:
kubectl get csr alice -o jsonpath='{.status.certificate}'| base64 -d > alice.crt
#移动到.kube路径
mv alice.crt C:/Users/Administrator/.kube
mv day23-alice.key alice.key

已经完成Authentication认证了,但是还没有给他权限(Authorization)。测试他目前有无权限执行kubectl get pods

bash 复制代码
#我有权限看到pods吗?
kubectl auth can-i get pod
#我是谁
kubectl auth whoami
#以adam的身份查看能否看到pods:
kubectl auth can-i get pod --as alice
#返回了No
#以下步骤演示怎样给alice这个权限:

二、创建一个权限为只读的role

官方文档:https://kubernetes.io/docs/reference/access-authn-authz/rbac/#role-example

先创建role,设定权限为只读,作为演示:

bash 复制代码
#read-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
#end---

#apply,查看role
kubectl get roles
kubectl describe role pod-reader

三、将role和alice进行'role binding'绑定

还是先去文档,抄binding.yaml的例子

bash 复制代码
#read-role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
# This role binding allows "jane" to read pods in the "default" namespace.
# You need to already have a Role named "pod-reader" in that namespace.
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
# You can specify more than one "subject"
#********用户adam要绑定pod-reader权限********
- kind: User
  name: adam # "name" is case sensitive
  apiGroup: rbac.authorization.k8s.io
#********用户alice要绑定pod-reader权限********
- kind: User
  name: alice
  apiGroup: rbac.authorization.k8s.io
roleRef:
  # "roleRef" specifies the binding to a Role / ClusterRole
  kind: Role #this must be Role or ClusterRole
  name: pod-reader # this must match the name of the Role or ClusterRole you wish to bind to
  apiGroup: rbac.authorization.k8s.io
#end---

#apply
kubectl get rolebinding
kubectl describe rolebinding read-pods
#再验证adam现在有权限了没有:
kubectl auth can-i get pods --as alice
#回答是yes

#可以看到default namespace只有一个role
kubectl get roles -A
#查看当前集群全部role的数量:
kubectl get roles -A --no-headers | wc -l

四、Authentication. 真正作为alice连接服务器

bash 复制代码
$ kubectl get pods
Unable to connect to the server: tls: failed to find any PEM data in certificate input#在 kubeconfig 文件中添加(或更新)用户 alice ,并使用 alice.key 中的私钥和 alice.crt 中的证书来作为他的身份凭证:
kubectl config set-credentials alice --client-key=alice.key --client-certificate=alice.crt

#这一步gitbash报错:
#error: Rel: can't make E:\...\alice.crt relative to C:\Users\Administrator\.kube
#原因是 kubectl 尝试将您提供的证书文件路径(E:\...)转换为相对于 kubeconfig 文件所在目录(C:\Users\Administrator\.kube)的相对路径,但失败了。
#先将两个文件放到C:\Users\Administrator\.kube,cd到这个路径,
#然后再执行以上命令,成功。User "alice" set.

#创建新的context,使用用户alice和cluster3:
kubectl config set-context adam --cluster=kind-cka-cluster3 --user=adam
#查看现在有多少context,找到了新context名叫alice:
kubectl config get-contexts
kubectl config use-context alice
kubectl auth whoami
#现在身份是alice了

#除了.kube/config还能在哪看config?
kubectl config view
#会打印相同内容


#报错笔记
$ kubectl get pods
Unable to connect to the server: tls: failed to find any PEM data in certificate input
#原因是,adam的证书已经过期了。需要重新提交CSR拿到证书

五、K8S的api组有两种,二者的区别在哪?为什么要分两个组?

特性 核心组 (Core Group) 命名组 (Named Groups)
API 版本表示 v1 (没有 API Group 名称) group-name/version (如 rbac.authorization.k8s.io/v1)
API Group 名称 空字符串或简写为 /api/v1 完整的 Group 名称 (通常是倒置域名格式)
包含的资源 核心组 代表了 Kubernetes 的最小核心历史遗留 。是最基础、最核心、不可或缺 的资源。 特定功能、扩展性、模块化 的资源。
资源示例 Pod, Service, Node, Namespace, Volume Role, RoleBinding, Deployment, Ingress, Custom Resources
设计理念 保持极度稳定,不应被移除或修改 将相关的功能组织到独立的命名空间中(例如,所有权限相关的资源放在 rbac.authorization.k8s.io,所有应用编排放在 apps)。允许独立迭代、引入新功能、易于扩展。
资源路径 /api/v1/... /apis/group-name/v1/...
创建role、创建rolebinding除了上文的声明式,也可以命令行式

来自官方文档:

https://kubernetes.io/docs/reference/kubectl/generated/kubectl_create/kubectl_create_role/

https://kubernetes.io/docs/reference/kubectl/generated/kubectl_create/kubectl_create_rolebinding/

bash 复制代码
kubectl create role pod-reader --verb=get --verb=list --verb=watch --resource=pods
#dry-run
kubectl create rolebinding read-pods --dry-run=client --role=pod-reader --user=alice --user=adam -o yaml > abc.yaml
#这里--role=pod-reader 和 --clusterrole=pod-reader区别在于作用范围不同:
#--role只作用于当前namespace,
#--clusterrole作用于整个集群。

六、什么是API

API (Application Programming Interface),即"应用程序编程接口"。

你去餐厅吃饭,不需要知道后厨(server)怎么做饭的,只需要把你的需求(request)告诉服务员(API),API把需求转达给服务器,并给你响应(response)。API 让两个独立的系统(你和厨房)可以交互,而不需要彼此了解内部细节(黑盒化)。

七、什么是 REST API?(特定的"服务规则")

API 只是一个概念,实现它的方式有很多种。REST (Representational State Transfer) 是目前最流行的一种设计风格架构规范。它利用 HTTP 协议(GET/POST/PUT/DELETE)来操作资源(URL)。

Kubernetes (K8s) 是一个完全基于 API 构建的系统。kube-apiserver 是 K8s 的核心大脑,它本质上就是一个巨大的 REST API 服务器

Kubernetes 的一切操作(无论是你敲命令,还是控制面板点击)最终都会转化为 REST API 请求 发送给 kube-apiserverkube-apiserver 接收这些请求,验证后写入 etcd,从而改变集群的状态。

操作意图 kubectl 命令 实际发送给 API Server 的 REST 请求
查看 Pod kubectl get pod my-pod GET /api/v1/namespaces/default/pods/my-pod
创建 Pod kubectl create -f pod.yaml POST /api/v1/namespaces/default/pods (Body 内容为 pod.yaml 转换成的 JSON)
删除 Pod kubectl delete pod my-pod DELETE /api/v1/namespaces/default/pods/my-pod
修改副本数 kubectl scale --replicas=3 ... PATCH /apis/apps/v1/namespaces/default/deployments/my-dep

除了使用kubectl 联络kubeAPI server,用外部api比如restAPI可以吗?可以!

相关推荐
摇滚侠1 小时前
2025最新 SpringCloud教程,Seata-基础-环境搭建,笔记64
笔记·spring·spring cloud
unclecss1 小时前
键盘输入延迟 800 ms?!——一次终端“假死”排查笔记
linux·运维·笔记·性能优化·auditd
jimmyleeee2 小时前
人工智能基础知识笔记二十四:构建一个可以解析PDF简历的Agent
笔记·pdf
jimmyleeee2 小时前
人工智能基础知识笔记二十五:构建一个优化PDF简历的Agent
人工智能·笔记
地中海~2 小时前
LARGE LANGUAGE MODELS ARE NOT ROBUST ICLR2024
人工智能·笔记·nlp
im_AMBER2 小时前
Leetcode 70 好数对的数目 | 与对应负数同时存在的最大正整数
数据结构·笔记·学习·算法·leetcode
Yyyy4822 小时前
k8s部署wordpress
云原生·容器·kubernetes
hd51cc4 小时前
MFC消息 学习笔记
笔记·学习·mfc
一周困⁸天.10 小时前
K8S-Ingress资源对象
云原生·容器·kubernetes