Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >为了让大家能够看到K8S Dashboard DEMO,我创建了一个“只读用户”

为了让大家能够看到K8S Dashboard DEMO,我创建了一个“只读用户”

作者头像
云爬虫技术研究笔记
发布于 2020-02-19 02:39:11
发布于 2020-02-19 02:39:11
49100
代码可运行
举报
运行总次数:0
代码可运行
2020年2月6日

小编:Lateautumn4lin(逆向小小小学生)

前言

这两天抽空搞了下Kubernetes集群和Traefik,有很多朋友私信我想要看看实际的Kubernetes集群 Dashboard Demo效果,所以简单的把这两个服务开放出来啦!

PS:相关代码都在Github仓库 https://github.com/lateautumn4lin/KubernetesResearch/tree/master/ClusterEcology/generate_readonly

1

1. 暴露服务的两个步骤

有关于Kubernetes集群暴露服务我只是使用的是最简单的方案(大佬们勿喷) ,让服务公网访问就是很简单的两步,如下(PS:原理上Kubernetes集群集群暴露出来我使用了Traefik,而要通过域名访问Traefik需要在本地配置Host解析,为了避免让大家少操作异步,我直接在我的域名上增加了子域名的解析):

1. 子域名解析

因为我的域名是固定的,也就是cloudcrawler.club,所以我之后提供的服务域名都是基于主域名来的,例如xxx.cloudcrawler.club,为了要使大家访问到xxx.cloudcrawler.club的时候能够访问到我的访问,所以在域名解析中增加了子域名的解析,指向的记录值也是我Kubernetes集群的Master节点的IP值,这样,就可以保证访问xxx.cloudcrawler.club的时候访问到的是经过Traefik路由之后的Kubernetes集群服务了。

2. 服务建立

顺序说反了,应该是先建立服务再配置域名解析。不过大家也可以反着理解,一个服务总是有客户端和服务端的,客户端对应用户,用户只知道访问方式,通过xxx.cloudcrawler.club来访问,而不会关心服务端的构造,所以我们在第一步先建立好了对用户友好的客户端,这种做法其实也不算反,因为很多企业也是先把功能吹出去,再去实现的,哈哈。

说多了,视线回到服务建立这一块,我们要暴露的是两个Dashboard,Traefik Dashboard本身就只是一个只读的Dashboard,所以暴露出去也不会影响应用本身。而Kubernetes Dashboard就不同了,用户可以通过它来进行操作,会涉及到集群和应用本身,所以我就需要建立一个“只读用户”来给使用者进行查看。

2

理解Kubernetes集群的服务和角色的关系

我们在创建“只读用户”之前,先来理解下在Kubernetes集群中用户是怎么定义的,在官方文档中提到:

其实,Kubernetes集群借鉴了RABC的角色权限控制机制,也就是基于角色的权限访问控制(Role-Based Access Control),把Role和Subject分开,在通过Binding把两者联结在一起,能够更加细粒度和方便的去控制用户的权限。

而在Kubernetes集群中又会因为是否涉及到集群权限做了区分,关于服务和用户也做了区分,例如在Subject分为User和Service。我们下面会用到的是ClusterRole、ServiceAccount、ClusterRoleBinding,原理就是我们要创建一个只读权限的ClusterRole,并且把这个Role和我们新建的一个ServiceAccount通过ClusterRoleBinding绑定,并且我们在登录的时候实际上就是获取ServiceAccount的Token,把Token给Dashboard这个服务,让服务去访问集群,获取相关信息。

3

依靠官方View Role建立只读用户

Kubernetes集群里有一个默认的叫作viewclusterrole,它其实就是一个有只读权限的的角色,我们来看一下这个角色,具体有哪些权限

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master1 readonly]# kubectl describe clusterrole view
Name:         view
Labels:       kubernetes.io/bootstrapping=rbac-defaults
              rbac.authorization.k8s.io/aggregate-to-edit=true
Annotations:  rbac.authorization.kubernetes.io/autoupdate: true
PolicyRule:
  Resources                                    Non-Resource URLs  Resource Names  Verbs
  ---------                                    -----------------  --------------  -----
  bindings                                     []                 []              [get list watch]
  configmaps                                   []                 []              [get list watch]
  endpoints                                    []                 []              [get list watch]
  events                                       []                 []              [get list watch]
  limitranges                                  []                 []              [get list watch]
  namespaces/status                            []                 []              [get list watch]
  namespaces                                   []                 []              [get list watch]
  persistentvolumeclaims/status                []                 []              [get list watch]
  persistentvolumeclaims                       []                 []              [get list watch]
  pods/log                                     []                 []              [get list watch]
  pods/status                                  []                 []              [get list watch]
  pods                                         []                 []              [get list watch]
  replicationcontrollers/scale                 []                 []              [get list watch]
  replicationcontrollers/status                []                 []              [get list watch]
  replicationcontrollers                       []                 []              [get list watch]
  resourcequotas/status                        []                 []              [get list watch]
  resourcequotas                               []                 []              [get list watch]
  serviceaccounts                              []                 []              [get list watch]
  services/status                              []                 []              [get list watch]
  services                                     []                 []              [get list watch]
  controllerrevisions.apps                     []                 []              [get list watch]
  daemonsets.apps/status                       []                 []              [get list watch]
  daemonsets.apps                              []                 []              [get list watch]
  deployments.apps/scale                       []                 []              [get list watch]
  deployments.apps/status                      []                 []              [get list watch]
  deployments.apps                             []                 []              [get list watch]
  replicasets.apps/scale                       []                 []              [get list watch]
  replicasets.apps/status                      []                 []              [get list watch]
  replicasets.apps                             []                 []              [get list watch]
  statefulsets.apps/scale                      []                 []              [get list watch]
  statefulsets.apps/status                     []                 []              [get list watch]
  statefulsets.apps                            []                 []              [get list watch]
  horizontalpodautoscalers.autoscaling/status  []                 []              [get list watch]
  horizontalpodautoscalers.autoscaling         []                 []              [get list watch]
  cronjobs.batch/status                        []                 []              [get list watch]
  cronjobs.batch                               []                 []              [get list watch]
  jobs.batch/status                            []                 []              [get list watch]
  jobs.batch                                   []                 []              [get list watch]
  daemonsets.extensions/status                 []                 []              [get list watch]
  daemonsets.extensions                        []                 []              [get list watch]
  deployments.extensions/scale                 []                 []              [get list watch]
  deployments.extensions/status                []                 []              [get list watch]
  deployments.extensions                       []                 []              [get list watch]
  ingresses.extensions/status                  []                 []              [get list watch]
  ingresses.extensions                         []                 []              [get list watch]
  networkpolicies.extensions                   []                 []              [get list watch]
  replicasets.extensions/scale                 []                 []              [get list watch]
  replicasets.extensions/status                []                 []              [get list watch]
  replicasets.extensions                       []                 []              [get list watch]
  replicationcontrollers.extensions/scale      []                 []              [get list watch]
  nodes.metrics.k8s.io                         []                 []              [get list watch]
  pods.metrics.k8s.io                          []                 []              [get list watch]
  ingresses.networking.k8s.io/status           []                 []              [get list watch]
  ingresses.networking.k8s.io                  []                 []              [get list watch]
  networkpolicies.networking.k8s.io            []                 []              [get list watch]
  poddisruptionbudgets.policy/status           []                 []              [get list watch]
  poddisruptionbudgets.policy                  []                 []              [get list watch]

可以看到,它对拥有的浆糊的访问权限都是get listwatch,也就是都是不可以进行写操作的权限。这样我们就可以像最初把用户绑定到cluster-admin一样,新创建一个用户,绑定到默认的view role上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl create  sa dashboard-readonly   -n  kube-system
kubectl create  clusterrolebinding dashboard-readonly --clusterrole=view --serviceaccount=kube-system:dashboard-readonly

通过以上命令我们创建了一个叫作dashboard-readonly的用户,然后把它绑定到view这个role上。我们可以通过kubectl describe secret -n=kube-system dashboard-readonly-token-随机字符串(可以通过kubectl get secret -n=kube-system把所有的secret都列出来,然后找到具体的那一个)查看dashboard-readonly用户的secret,里面包含token,,我们把token复制到dashboard登陆界面登陆。

登录之后我们可以看到,我们随便进到一个deployment里面,可以看到左上角仍然有scaleeditdelete这些权限,其实不用担心,你如果尝试editscale的时候,虽然没有提示,但是操作是不成功的。如果你点击了delete,则会出现一个错误提示,如下图,提示dashboard-readonly用户没有删除的权限。

4

真正建立一个只读用户

以前我们通过把用户绑定到view这个角色上创建了一个具有只读权限的用户,但是实际上你会发现,这个用户并不是一个完全意义上的只读权限用户,它是没有cluster级别的一些权限的,比如NodesPersistent Volumes等权限,比如我们点击左侧的Nodes标签,就会出现以下提示:

下面我们来手动创建一个对cluster级别的资源也有只读权限的用户

首先,我们先创建一个名叫作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl create  sa dashboard-real-readonly  -n  kube-system

下面我们来创建一个叫作dashboard-viewonlyclusterrole

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: dashboard-viewonly
rules:
- apiGroups:
  - ""
  resources:
  - configmaps
  - endpoints
  - persistentvolumeclaims
  - pods
  - replicationcontrollers
  - replicationcontrollers/scale
  - serviceaccounts
  - services
  - nodes
  - persistentvolumeclaims
  - persistentvolumes
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - bindings
  - events
  - limitranges
  - namespaces/status
  - pods/log
  - pods/status
  - replicationcontrollers/status
  - resourcequotas
  - resourcequotas/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - namespaces
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - apps
  resources:
  - daemonsets
  - deployments
  - deployments/scale
  - replicasets
  - replicasets/scale
  - statefulsets
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - autoscaling
  resources:
  - horizontalpodautoscalers
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - batch
  resources:
  - cronjobs
  - jobs
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - extensions
  resources:
  - daemonsets
  - deployments
  - deployments/scale
  - ingresses
  - networkpolicies
  - replicasets
  - replicasets/scale
  - replicationcontrollers/scale
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - policy
  resources:
  - poddisruptionbudgets
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - networking.k8s.io
  resources:
  - networkpolicies
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - storage.k8s.io
  resources:
  - storageclasses
  - volumeattachments
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - rbac.authorization.k8s.io
  resources:
  - clusterrolebindings
  - clusterroles
  - roles
  - rolebindings
  verbs:
  - get
  - list
  - watch

然后把它绑定到dashboard-real-readonly ServiceAccount

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: dashboard-viewonly
subjects:
- kind: ServiceAccount
  name: dashboard-real-readonly
  namespace: kube-system

后面就是获取这个用户的token进行登陆了,看到Dashboard页面也能够显示出Nodes的信息了。

5

服务访问方式

到此为止,所有工作已经做好了,现在来测试下能否通过子域名访问我们的服务。

我的服务地址是

  • Traefik Dashboard: ingress.cloudcrawler.club
  • Kubernetes Dashboard: kubernetes.cloudcrawler.club 有关用户Token可以在微信公众号《云爬虫技术研究笔记》回复Token进行获取。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云爬虫技术研究笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
从 ESLint 开始,说透我如何在团队项目中基于 Vue 做代码校验
最近遇到了一个老项目,比较有意思的是这个项目集前后端的代码于一起,而后端也会去修改前端代码,所以就出现了后端用 IntelliJ IDEA 来开发前端项目,而前端用 VSCode 来开发前端项目的情况。于是乎,出现了代码规范的问题,所以就有了这篇文章,整理了一下前端代码校验以及在 Vue 项目中的实践。
用户4456933
2021/07/12
2.5K0
从 ESLint 开始,说透我如何在团队项目中基于 Vue 做代码校验
15分钟快速配置eslint,prettier,lint-staged,husky,commitizen实现前端项目代码规范化
当前,前端项目支持代码规范校验、代码格式化已经必不可少,同时需要支持代码提交前对代码格式校验预检查,这里提供一份最简单的配置供大家参考。
蓓蕾心晴
2022/05/09
4.8K2
15分钟快速配置eslint,prettier,lint-staged,husky,commitizen实现前端项目代码规范化
eslint+prettier学习
配置文件可以从基本配置扩展启用的规则集,不添加则不会继承任何扩展集,仅按照rules下的基本配置来执行。
蓓蕾心晴
2020/09/24
2.2K0
小程序开发格式化代码ESLint、Prettier、husky、lint-stage
依赖 yarn init yarn add --dev babel-eslint@10.0.3 yarn add --dev eslint@6.7.1 yarn add --dev eslint-config-alloy@3.7.1 yarn add --dev eslint-config-prettier@6.10.0 yarn add --dev eslint-plugin-prettier@3.1.4 yarn add --dev prettier@2.0.5 yarn add --dev prett
kif
2023/02/27
2.6K0
【JS】308- 深入理解ESLint
小沈是一个刚刚开始工作的前端实习生,第一次进行团队开发,难免有些紧张。在导师的安排下,拿到了项目的 git 权限,开始进行 clone。
pingan8787
2019/08/06
1.3K0
前端科普系列(5):ESLint - 守住优雅的护城河
【前端科普系列】帮助阅读者了解web前端,主要覆盖web前端的基础知识,但不深入讲解,定位为大而全并非细而精,适合非前端开发的同学对前端有一个系统的认识,能更好的与前端开发协作。尽可能的写成科普类文章,对于前端开发而言,只适合刚入门的新手。
2020labs小助手
2020/10/28
2.5K0
Eslint配置
开发的过程中不同的编辑器,不同的格式化插件对应的代码格式都有差异,这就导致代码风格不一致或是合并冲突。
码客说
2022/09/19
2.9K0
Eslint配置
【TypeScript】014-工程相关
2019 年 1 月,TypeScirpt 官方决定全面采用 ESLint 作为代码检查的工具,并创建了一个新项目 typescript-eslint,提供了 TypeScript 文件的解析器 @typescript-eslint/parser 和相关的配置选项 @typescript-eslint/eslint-plugin 等。而之前的两个 lint 解决方案都将弃用:
訾博ZiBo
2025/01/06
2360
Eslint该如何配置?Eslint使用以及相关配置说明
Eslint在过往接触过的很多开源项目内都有它的身影,习惯一个人写代码了,总觉得它可有可无,但是归根结底,好处还是很多的。
房东的狗丶
2023/02/17
3.7K0
Eslint该如何配置?Eslint使用以及相关配置说明
Eslint使用入门指南
ESLint最初是由Nicholas C. Zakas 于2013年6月创建的开源项目。它的目标是提供一个插件化的javascript代码检测工具。
Snine
2022/02/21
2.2K0
emo——给项目配置prettier,eslint,husky加强协作规范
给自己的一个初始化项目配置一些规范; Prettier - Code formatter: Prettier - Code formatter ESLint: ESLint Git gitignore: https://git-scm.com/docs/gitignore#_pattern_format
思索
2024/08/15
1190
emo——给项目配置prettier,eslint,husky加强协作规范
制定自己团队的前端开发规范之 eslint
为了大家方便,我将之前长长的 eslint 进行了更换,因为时间原因和使用方面的原因,没将自己的 eslint 上传成 eslint-config,直接使用腾讯的 eslint-config-alloy。
石燕平
2019/12/03
1.7K0
深度讲解TS:这样学TS,迟早进大厂【21】:代码检查
初学者玩转 TypeScript系列,总计 21 期,点赞、收藏、评论、关注、三连支持! TS系列地址: 21篇文章带你玩转ts
江一铭
2022/09/08
2.7K0
ESLint 配置入门
ESLint 是一款检查 JavaScript 程序是否符合特定的规则的工具。比如字符串用单引号还是双引号,tab 缩进用 2 个空格还是 4 个空格还是其他,这些都可以用 ESLint 来规定。
前端西瓜哥
2022/12/21
1.6K0
ESLint 配置入门
ESLint静态代码检查
ESLint是一个用来识别 ECMAScript 并且按照规则给出报告的代码检测工具,使用它可以避免低级错误和统一代码的风格。如果每次在代码提交之前都进行一次eslint代码检查,就不会因为某个字段未定义为undefined或null这样的错误而导致服务崩溃,可以有效的控制项目代码的质量。
xiangzhihong
2022/11/30
2.2K0
给 eslint 写一个插件
eslint 是非常有名的 linter,地球上每一个 JavaScript 程序员都应该知道。
疯狂的技术宅
2020/12/15
8930
ES Lint 在 React Natvie 项目的应用
1,在开始之前,首先看下官网及资料 官网: https://eslint.org/ 官方 Getting Started [https://eslint.org/docs/user-guide/getting-started](https://eslint.org/docs/user- guide/getting-started) 官方规则说明 https://eslint.org/docs/rules/ 配置rule 说明 https://blog.csdn.net/Cy_Shay/article/details/78217381
张云飞Vir
2020/03/16
5650
使用eslint + prettier + husky + lint-staged 约束项目的最佳实践!
大家好,我是HoMeTown,最近在搭建一个公司与某一线大厂有合作,需要做一个性能极其优化的微信小程序,我们组正好刚从企微项目里抽出身来,所以这个艰巨的任务就交给我们来完成了,首先开了一天会,跟合作方的前端经理PM 确定好了技术选型以及规范,分工细则下来以后,得到项目架构&少许业务开发的任务,优化交给合作方去做,因此这个项目会有很多人参与进来,一个强有力的项目约束是十分重要的!
HoMeTown
2022/10/26
1.9K0
使用eslint + prettier + husky + lint-staged 约束项目的最佳实践!
webpack-dev-server使用报错
参考 https://stackoverflow.com/questions/57724011/how-to-fix-cannot-find-module-webpack-bin-config-yargs
用户6379025
2022/12/26
5010
项目eslint从零到一
eslint在项目里并不太陌生,通常在使用脚手架时,会默认让你安装执行的eslint,当公司项目比较规范时,常常会配置组内统一的eslint规则,eslint帮助我们在开发阶段检查代码是否符合标准规范,统一了我们组内不同项目代码风格,也可以帮助我们养成良好的代码习惯,统一eslint对于项目的可维护性必不可少,今天我们一起学习一下如果改进你项目的规范。
Maic
2022/07/28
1.6K0
项目eslint从零到一
推荐阅读
相关推荐
从 ESLint 开始,说透我如何在团队项目中基于 Vue 做代码校验
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验