在 kubernetes 上观看了关于 RBAC(基于角色的访问控制)的视频后(其中这个对我来说是最透明的),我遵循了这些步骤,但是在 k3s 上,而不是在所有消息来源所暗示的 k8s 上。根据我收集到的信息(不工作),问题不在于实际的角色绑定过程,而在于 API 服务未确认的 x509 用户证书
$ kubectl 获取 pods --kubeconfig userkubeconfig
错误:您必须登录到服务器(未经授权)
也没有记录在Rancher 的关于 K3s 安全性的 wiki 上(同时记录了他们的 k8s 实现)?虽然描述了 Rancher 2.x本身,但不确定这是我的实现问题,还是 k3s <-> k8s 的问题。
$ kubectl version --short
Client Version: v1.20.5+k3s1
Server Version: v1.20.5+k3s1
通过重复该过程,我的步骤如下:
- 获取 k3s ca 证书
这被描述为在/etc/kubernetes/pki (k8s) 下,但基于此似乎在/var/lib/rancher/k3s/server/tls/ (server-ca.crt & server-ca.key) .
- 来自 ca certs 的 Gen 用户证书
#generate user key
$ openssl genrsa -out user.key 2048
#generate signing request from ca
openssl req -new -key user.key -out user.csr -subj "/CN=user/O=rbac"
# generate user.crt from this
openssl x509 -req -in user.csr -CA server-ca.crt -CAkey server-ca.key -CAcreateserial -out user.crt -days 365
- 根据证书为用户创建 kubeConfig 文件:
# Take user.crt and base64 encode to get encoded crt
cat user.crt | base64 -w0
# Take user.key and base64 encode to get encoded key
cat user.key | base64 -w0
- 创建的配置文件:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: <server-ca.crt base64-encoded>
server: https://<k3s masterIP>:6443
name: home-pi4
contexts:
- context:
cluster: home-pi4
user: user
namespace: rbac
name: user-homepi4
current-context: user-homepi4
kind: Config
preferences: {}
users:
- name: user
user:
client-certificate-data: <user.crt base64-encoded>
client-key-data: <user.key base64-encoded>
- 设置角色和角色绑定(在指定的命名空间“rbac”内)
- 角色
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: user-rbac
namespace: rbac
rules:
- apiGroups:
- "*"
resources:
- pods
verbs:
- get
- list
- 角色绑定
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: user-rb
namespace: rbac
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: user-rbac
subjects:
apiGroup: rbac.authorization.k8s.io
kind: User
name: user
在这一切之后,我得到了有趣的时光......
$ kubectl get pods --kubeconfig userkubeconfig
error: You must be logged in to the server (Unauthorized)
请问有什么建议吗?
显然这个stackOverflow问题提出了一个解决问题的方法,但是在github提要之后,它或多或少地归结为这里遵循的相同方法(除非我遗漏了什么)?