背景:
是这样的一个事情: 服务运行于 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
- image.PNG
2. 创建证书签名请求文件
使用我们刚刚创建的私钥创建一个证书签名请求文件: zhangpeng.csr, 要注意需要确保在 - subj 参数中指定用户名和组 (CN 表示用户名, O 表示组)
openssl req -new -key zhangpeng.key -out zhangpeng.csr -subj "/CN=zhangpeng/O=layabox"
可能你会出现下面的报错:
image.PNG
注: 图非上面执行命令的截图, 其他环境下操作出现的
解决方式如下:
- cd /root
- openssl rand -writerand .rnd
- image.PNG
然后重新执行命名
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
查看我们当前文件夹下面是否生成了一个证书文件
image.PNG
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.
- image.PNG
到这里, 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
注: 可参照 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 文件:
image.PNG
tke 集群默认的 cluster 是 local. 我在 1.2.4 步骤中 cluster 设置的是 kubernetes. 这里直接在 config 文件中修改了 cluster 为 local. 也强调一下在执行 1.2.4 步骤的时候一定要先确认一下集群的 cluster 名称. 不要直接 copy 拿来主义!
重新进行测试:
- kubectl get pods --context=zhangpeng-context
- image.PNG
由于这些 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:
image.PNG
我是那么做的删除了原来的集群默认用户的 user and contexts. 讲 contexts 默认用户设置为创建的 zhangpeng-context. 当然了也记得把 client-certificate client-key 文件 copy 到对应目录 (当然了自己也可以自定义下, 然后修改一下 config 文件)
image.PNG
切换一下命名空间 namespace 试一试:
image.PNG
基本实现了个人的目的. RBAC and 安全上下文还要深入复习一下!
来源: https://www.qcloud.com/developer/article/1886667