本节整体逻辑:
-
创建user alice:生成私钥和证书apply之后会被放到.kube/config。
-
添加一个role。
-
将role和alice进行'role binding'绑定。
-
用alice和cluster3集群 组成一个新的context。
-
以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-apiserver。kube-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可以吗?可以!