乐趣区

关于kubernetes:Kubernetes之kuberconfig普通用户授权kubernetes集群

背景:

是这样的一个事件:服务运行于 kubernetes 集群(腾讯云 tke1.20.6)。日志采集到了 elasticsearch 集群 and 腾讯的 cls 日志服务中。小伙伴看日志感觉还是不太不便,还是想看控制台输入的。给他们调配过一台服务器(退出到集群中,然而有污点标签的节点)。为了不便他们测试一下货色。当初想让他们通过此 work 节点能够在控制台查看日志。失常的就是把 master 节点的 /root/.kube/ 目录下的 config 配置文件 copy 过去就能够了。然而这权限也太大了!从新温习一遍 kubeconfig 配置文件以及 role rolebinding 的常识!
注:namespace 为 official。想调配的权限是 list and log,嗯查看 pod 列表和查看日志 不能删除批改 namespace 下 pod。并且不能查看其余 namespace。

Kubernetes 之 kuberconfig

1. 创立用户凭证

前提:openssl 的装置就疏忽了 ……

1. 创立用户证书私钥

用户就用我本人名字了,私钥命名为 zhangpeng.key

openssl genrsa -out zhangpeng.key 2048

2. 创立证书签名申请文件

应用咱们刚刚创立的私钥创立一个证书签名申请文件:zhangpeng.csr,要留神须要确保在 -subj 参数中指定用户名和组(CN 示意用户名,O 示意组)

openssl req -new -key zhangpeng.key -out zhangpeng.csr -subj "/CN=zhangpeng/O=layabox"

可能你会呈现上面的报错:

注:图非下面执行命令的截图,其余环境下操作呈现的
解决形式如下:

cd /root
openssl rand -writerand .rnd


而后从新执行命名

openssl req -new -key zhangpeng.key -out zhangpeng.csr -subj "/CN=zhangpeng/O=layabox"

3. 生成最终证书文件

找到 Kubernetes 集群的 CA,如果你是应用的是 kubeadm 装置的集群,CA 相干证书位于 /etc/kubernetes/pki/ 目录上面,如果你是二进制形式搭建的,你应该在最开始搭建集群的时候就曾经指定好了 CA 的目录,咱们会利用该目录上面的 ca.crt 和 ca.key 两个文件来批准下面的证书申请。当然了我应用的是腾讯云的 tke 集群。证书是位于 /etc/kubernetes 目录下的 server.crt 和 server.key。这里就用这两个文件生成证书文件,命令如下:

root@ap-shanghai-k8s-master-1:~/ap-shanghai# openssl x509 -req -in zhangpeng.csr -CA /etc/kubernetes/ca.crt -CAkey /etc/kubernetes/ca.key -CAcreateserial -out zhangpeng.crt -days 3650
Signature ok
subject=CN = zhangpeng, O = layabox
Getting CA Private Key

查看咱们以后文件夹上面是否生成了一个证书文件

4. 在 kubernetes 集群中创立凭证和上下文(context)

创立新的用户凭证

root@ap-shanghai-k8s-master-1:~/ap-shanghai# kubectl config set-credentials zhangpeng --client-certificate=zhangpeng.crt  --client-key=zhangpeng.key
User "zhangpeng" set.

为用户设置 Context:

root@ap-shanghai-k8s-master-1:~/ap-shanghai# kubectl config set-context zhangpeng-context --cluster=kubernetes --namespace=official --user=zhangpeng
Context "zhangpeng-context" created.


到这里,zhangpeng 用户的配置就曾经创立胜利了,当初咱们应用以后的这个配置文件来操作 kubectl 命令的时候,应该会呈现谬误,因为咱们还没有为该用户定义任何操作的权限:

$ kubectl get pods --context=zhangpeng-context -n official
Error from server (Forbidden): pods is forbidden: User "zhangpeng" cannot list resource "pods" in API group ""in the namespace"official"

2. 创立角色

cat role.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: official
  name: official-log-role
rules:
- apiGroups: [""]
  resources: ["pods", "pods/log"]
  verbs: ["get", "list"]
kubectl apply -f role.yaml

注:可参照 https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/ rbac 鉴权

3. 创立角色权限绑定

cat rolebinding.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: ap-shanghai-rolebinding
  namespace: official
subjects:
- kind: User
  name: zhangpeng
  apiGroup: ""
roleRef:
  kind: Role
  name: official-log-role
  apiGroup: ""
kubectl apply -f rolebinding.yaml

4. 测试

root@ap-shanghai-k8s-master-1:~/ap-shanghai# kubectl get pods --context=zhangpeng-context
The connection to the server localhost:8080 was refused - did you specify the right host or port?

报错了为什么呢?喵一眼 /root/.kube/config 文件:

tke 集群默认的 cluster 是 local. 我在 1.2.4 步骤中 cluster 设置的是 kubernetes。这里间接在 config 文件中批改了 cluster 为 local。也强调一下在执行 1.2.4 步骤的时候肯定要先确认一下集群的 cluster 名称。不要间接 copy 拿来主义!

从新进行测试:

kubectl get pods --context=zhangpeng-context


因为这些 pod 都是线上跑的,我就新建一个 nginx pod 而后进行测试下是否能够 delete and edit

kubectl run nginx --image=nginx -n official
$ kubectl delete pods nginx --context=zhangpeng-context
Error from server (Forbidden): pods "nginx" is forbidden: User "zhangpeng" cannot delete resource "pods" in API group ""in the namespace"official"
$ kubectl edit nginx --context=zhangpeng-context
error: pods "nginx" could not be patched: pods "nginx" is forbidden: User "zhangpeng" cannot patch resource "pods" in API group ""in the namespace"official"
You can run `kubectl replace -f /tmp/kubectl-edit-kp0az.yaml` to try this update again.

嗯 而后将 config 文件 copy 到用户的跳板机下面 /root/.kube/config:

我是那么做的删除了原来的集群默认用户的 user and contexts。讲 contexts 默认用户设置为创立的 zhangpeng-context。当然了也记得把 client-certificate client-key 文件 copy 到对应目录(当然了本人也能够自定义下,而后批改一下 config 文件)

切换一下命名空间 namespace 试一试:

根本实现了集体的目标。RBAC and 平安上下文还要深刻温习一下!

退出移动版