今年3月份在公司的内部k8s培训会上,开发同事表示使用dashboard的可以满足日常开发需求,例如查看pod的日志,执行exec指令,查看pod的运行状态等,但对basic认证的权限控制表示担忧。
之前介绍过在1.5.2版本上部署dashboard服务,在1.9.1版本离线部署中,也介绍过dashboard服务的RBAC配置和使用技巧。因此本文将在前文基础上完善Heapster的整合与利用token对用户权限进行控制。
dashboard的特点主要如下:
1、能够直观的看到rc、deployment、pod、services等k8s组件的运行情况和日志信息。
2、结合heapster和influxdb后,dashboard的监控图表上可以看到pod的cpu和内存消耗情况。

Heapster介绍

1、Heapster是容器集群监控和性能分析工具,支持Kubernetes和CoreOS。 
2、K8S集群的HPA功能的实现就依赖于这些metric数据,HPA将Heapster作为Resource Metrics API,向其获取metric。
3、Kubernetes有个cAdvisor监控(在1.9版本里面,cAdvisor已经和kubelet整合在一起)。
在每个kubernetes Node上都会运行cAdvisor,它会收集本机以及容器的监控数据(cpu,memory,filesystem,network,uptime)。Heapster是一个收集者,Heapster可以收集Node节点上的cAdvisor数据,将每个Node上的cAdvisor的数据进行汇总,还可以按照kubernetes的资源类型来集合资源,比如Pod、Namespace,可以分别获取它们的CPU、内存、网络和磁盘的metric。默认的metric数据聚合时间间隔是1分钟。还可以把数据导入到第三方工具(如InfluxDB)。

Influxdb数据库介绍

2、Influxdb数据库的相关知识介绍,可参考文档:https://www.jianshu.com/p/d2935e99006e
2、如果对Heapster收集到的metric数据没有持久化的需求,可以不配置Influxdb数据库
3、本文Influxdb数据库的存储采用emptydir的方式实现,实际使用过程中,可以选择吧Influxdb数据库部署在k8s集群外部,或者使用其他存储方案。
4、如果有需要的话,还可以集成一个grafana做web展示。Grafana配置可参考文档:http://blog.51cto.com/ylw6006/2084403

一、获取相关镜像

需要科学上网方式获取到dashboard相关的镜像文件,仓库可纳入本地仓库统一管理

# cat /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://192.168.115.2:1080"
# systemctl  daemon-reload
# systemctl restart docker
# docker pull k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3
# docker pull k8s.gcr.io/heapster-influxdb-amd64:v1.3.3
# docker pull k8s.gcr.io/heapster-amd64:v1.4.2

二、准备配置文件

1、k8s-dashborad-sa.yaml文件,secrct和serviceaccount配置

# cat k8s-dashborad-sa.yaml
# ------------------- Dashboard Secret ------------------- #
apiVersion: v1
kind: Secret
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboard-certsnamespace: kube-system
type: Opaque
---
# ------------------- Dashboard Service Account ------------------- #
apiVersion: v1
kind: ServiceAccount
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kube-system

2、k8s-dashborad-rbac.yaml文件,配置 Role和Role Binding

# cat k8s-dashborad-rbac.yaml
# ------------------- Dashboard Role & Role Binding ------------------- #
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: kubernetes-dashboard-minimalnamespace: kube-system
rules:# Allow Dashboard to create 'kubernetes-dashboard-key-holder' secret.
- apiGroups: [""]resources: ["secrets"]verbs: ["create"]# Allow Dashboard to create 'kubernetes-dashboard-settings' config map.
- apiGroups: [""]resources: ["configmaps"]verbs: ["create"]# Allow Dashboard to get, update and delete Dashboard exclusive secrets.
- apiGroups: [""]resources: ["secrets"]resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs"]verbs: ["get", "update", "delete"]# Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
- apiGroups: [""]resources: ["configmaps"]resourceNames: ["kubernetes-dashboard-settings"]verbs: ["get", "update"]# Allow Dashboard to get metrics from heapster.
- apiGroups: [""]resources: ["services"]resourceNames: ["heapster"]verbs: ["proxy"]
- apiGroups: [""]resources: ["services/proxy"]resourceNames: ["heapster", "http:heapster:", "https:heapster:"]verbs: ["get"]---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: kubernetes-dashboard-minimalnamespace: kube-system
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: kubernetes-dashboard-minimal
subjects:
- kind: ServiceAccountname: kubernetes-dashboardnamespace: kube-system

3、k8s-dashborad-deployment.yaml配置文件,定义创建pod的模板和副本数

# cat k8s-dashborad-deployment.yaml
# ------------------- Dashboard Deployment ------------------- #
kind: Deployment
apiVersion: apps/v1beta2
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kube-system
spec:replicas: 1revisionHistoryLimit: 10selector:matchLabels:k8s-app: kubernetes-dashboardtemplate:metadata:labels:k8s-app: kubernetes-dashboardspec:containers:- name: kubernetes-dashboardimage: k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3ports:- containerPort: 8443protocol: TCPargs:- --auto-generate-certificates# Uncomment the following line to manually specify Kubernetes API server Host# If not specified, Dashboard will attempt to auto discover the API server and connect# to it. Uncomment only if the default does not work.# - --apiserver-host=http://my-address:portvolumeMounts:- name: kubernetes-dashboard-certsmountPath: /certs# Create on-disk volume to store exec logs- mountPath: /tmpname: tmp-volumelivenessProbe:httpGet:scheme: HTTPSpath: /port: 8443initialDelaySeconds: 30timeoutSeconds: 30volumes:- name: kubernetes-dashboard-certssecret:secretName: kubernetes-dashboard-certs- name: tmp-volumeemptyDir: {}serviceAccountName: kubernetes-dashboard# Comment the following tolerations if Dashboard must not be deployed on mastertolerations:- key: node-role.kubernetes.io/mastereffect: NoSchedule

4、 k8s-dashborad-service.yaml配置文件,定义service

# cat k8s-dashborad-service.yaml
# ------------------- Dashboard Service ------------------- #
kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kube-system
spec:ports:- port: 443targetPort: 8443nodePort: 8490type: NodePortselector:k8s-app: kubernetes-dashboard

三、通过配置文件创建dashboard

# kubectl create -f .
# kubectl get pod,deployment,svc -n kube-system

四、配置使用basic认证方式

默认情况下只支持kubeconfig和令牌认证

# echo 'admin,admin,1' > /etc/kubernetes/basic_auth_file
# grep 'auth' /usr/lib/systemd/system/kube-apiserver.service   --authorization-mode=Node,RBAC \--runtime-config=rbac.authorization.k8s.io/v1alpha1 \--enable-bootstrap-token-auth=true \--token-auth-file=/etc/kubernetes/token.csv \--basic-auth-file=/etc/kubernetes/basic_auth_file \# grep  ‘basic’  k8s-dashborad-deployment.yaml   (配置在args下面)- --authentication-mode=basic# systemctl daemon-reload
# systemctl restart kube-apiserver
# kubectl apply -f k8s-dashborad-deployment.yaml 

将admin用户和cluter-admin role进行角色绑定

# curl --insecure https://vm1:6443 -basic -u admin:admin
# kubectl create clusterrolebinding  \
login-on-dashboard-with-cluster-admin  \
--clusterrole=cluster-admin --user=admin
# curl --insecure https://vm1:6443 -basic -u admin:admin  

五、访问测试


六、整合heapster和influxdb

在没有配置heapster和influxdb的情况下,pod的metric信息是无法获取到的,而早前版本K8S的HPA特性依赖的metric数据来源恰巧就是heapster和influxdb。

1、准备yaml配置文件

# cat heapster-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: heapsternamespace: kube-system
# cat heapster-rbac.yaml
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:name: heapster
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: system:heapster
subjects:
- kind: ServiceAccountname: heapsternamespace: kube-system
# cat heapster-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: heapsternamespace: kube-system
spec:replicas: 1template:metadata:labels:task: monitoringk8s-app: heapsterspec:serviceAccountName: heapstercontainers:- name: heapsterimage: k8s.gcr.io/heapster-amd64:v1.4.2imagePullPolicy: IfNotPresentcommand:- /heapster- --source=kubernetes:https://kubernetes.default- --sink=influxdb:http://monitoring-influxdb.kube-system.svc:8086
# cat heapster-service.yaml
apiVersion: v1
kind: Service
metadata:labels:task: monitoringkubernetes.io/cluster-service: 'true'kubernetes.io/name: Heapstername: heapsternamespace: kube-system
spec:ports:- port: 80targetPort: 8082selector:
k8s-app: heapster
# cat influxdb-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: monitoring-influxdbnamespace: kube-system
spec:replicas: 1template:metadata:labels:task: monitoringk8s-app: influxdbspec:containers:- name: influxdbimage: k8s.gcr.io/heapster-influxdb-amd64:v1.3.3volumeMounts:- mountPath: /dataname: influxdb-storagevolumes:- name: influxdb-storageemptyDir: {}
# cat influxdb-service.yaml
apiVersion: v1
kind: Service
metadata:labels:task: monitoringkubernetes.io/cluster-service: 'true'kubernetes.io/name: monitoring-influxdbname: monitoring-influxdbnamespace: kube-system
spec:ports:- port: 8086targetPort: 8086selector:k8s-app: influxdb



获取heapster中的获取支持的metrics

# kubectl run -i --tty curl --namespace=kube-system  \
--image=registry.59iedu.com/webwurst/curl-utils /bin/sh
# curl http://heapster/api/v1/model/metrics
# curl http://heapster/api/v1/model/debug/allkeys 

# kubectl get node
# kubectl top node 


当heapster和influxdb pod都正常运行的时候,在dashboard里面就可以看到CPU和内存的监控数据了。

七、配置用户权限

1、删除apiserver里面basic认证相关的配置后重启apiserver
--basic-auth-file=/etc/kubernetes/basic_auth_file

# systemctl daemon-reload
# systemctl  restart kube-apiserver

2、删除clusterrolebinding

# kubectl delete  clusterrolebinding  login-on-dashboard-with-cluster-admin

3、修改k8s-dashborad-deployment.yaml文件
去掉- --authentication-mode=basic参数

4、创建普通用户,赋予所有namespace下资源的get、watch和list权限。
这里通过clusterrole和culsterrolebinding赋予所有namespace相关资源的get、watch、list权限,实际应用环境建议使用创建role和rolebinding指定特定的namespace相关资源权限,各资源权限的赋予规则遵循最小权限原则。

# cat rbac-yang.yaml
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: role-yang
rules:
- apiGroups: [""]resources: ["*"]verbs: ["get","watch","list" ]
- apiGroups: ["storage.k8s.io"]resources: ["*"]verbs: ["get","watch","list" ]
- apiGroups: ["rbac.authorization.k8s.io"]resources: ["*"]verbs: ["get","watch","list" ]
- apiGroups: ["batch"]resources: ["*"]verbs: ["get","watch","list" ]
- apiGroups: ["apps"]resources: ["*"]verbs: ["get","watch","list" ]
- apiGroups: ["extensions"]resources: ["*"]verbs: ["get","watch","list" ]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: role-bind-yang
subjects:
- kind: ServiceAccountname: yangnamespace: kube-system
roleRef:kind: ClusterRolename: role-yangapiGroup: rbac.authorization.k8s.io
# kubectl create sa yang -n kube-system
# kubectl create -f rbac-yang.yaml
# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep yang | awk '{print $1}')

5、测试普通用户的权限




6、创建super用户admin

# kubectl create sa admin -n kube-system
# cat rbac-admin.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:name: admin
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: adminnamespace: kube-system# kubectl create -f rbac-admin.yaml
# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin | awk '{print $1}')


使用admin用户的token登陆后继承cluster-admin的权限

参考:
https://github.com/kubernetes/dashboard/wiki/Creating-sample-user
https://github.com/kubernetes/dashboard/wiki/Access-control
https://github.com/kubernetes/heapster/blob/master/docs/model.md

K8S使用dashboard管理集群相关推荐

  1. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.感谢 在此感谢.net ...

  2. Kubeadm 快速搭建 k8s v1.24.1 集群(openEuler 22.03 LTS)

    kubeadm 简介 kubeadm 是 Kubernetes(以下简称 k8s)官方提供的用于快速安装部署 k8s 集群的工具,伴随 k8s 每个版本的发布都会同步更新,kubeadm 会对集群配置 ...

  3. Kubernetes(k8s)入门及集群部署文档

    文章目录 一.k8s 快速入门 简介 部署方式的进化 k8s能做什么 架构 整体主从方式 Master 节点架构 Node 节点架构 概念 快速体验 流程叙述 二.k8s 集群安装 前置要求 了解ku ...

  4. 基于kubeadm快速部署kubernetes K8S V1.17.4集群-无坑完整版

    基于kubeadm快速部署kubernetes K8S V1.17.4集群,并部署Dashboard Web页面,实现可视化查看Kubernetes资源 主机配置规划 服务器名称(hostname) ...

  5. NoSQL(二):创建、管理集群

    创建集群 集群环境 拓扑结构 IP规划 工作原理 工作原理 无论有多少台redis服务器,一共都会有0-16383共16384个槽 slot的作用:用来确定存储变量时,变量存储在哪一台redis服务器 ...

  6. k8s使用port-forward访问集群中的应用程序(只能在执行命令的机器上开放端口)

    k8s使用port-forward访问集群中的应用程序 本文描述了如何使用 kubectl port-forward 访问 Kubernetes 集群中的 Redis Server.这种连接方式在实际 ...

  7. 管理集群中的 crs 管理员

     管理集群中的 crs 管理员 oracle Managing CRS Administrators in the Cluster Use the following commands to ma ...

  8. # kubeadm ——k8S新节点加入集群-notready 问题解决

    kubeadm --k8S新节点加入集群 https://www.cnblogs.com/chuangcc/p/10697394.html 加入集群除了需要 token 外,还需要 Master 节点 ...

  9. K8s-kubectl远程管理集群

    在实际工作中,我们有一个需求,需要远程登陆管理集群.其实不用非要登录k8s-master去敲命令,可以使用任意一台内网互通的机器安装kubectl命令,去远程管理集群,非常方便 1.安装kubectl ...

最新文章

  1. 程序物语(四):苹果是如何落到牛顿头上的?
  2. VTK:颜色边缘用法实战
  3. framework dyld: Symbol not found: _OBJC_CLASS_xxx
  4. 作为IT从业者,你是如何做好个人职业规划?
  5. C++ 类模板语法初步01
  6. 3.13 判读是否是对称素数
  7. mfa助听器设备能否在android,助听器的蓝牙功能到底有什么用,购买的价格,以及购买时要注意什么等问题...
  8. 微信小程序开发:禁止输入表情的控制,验证方法,光标控制
  9. 如何找到最快的DNS服务器!!
  10. python执行速度太慢为什么还_为什么你写的Python运行的那么慢呢?
  11. 详解display:inline | block |inline-block的区别(转)
  12. 地址坐标LA3708:Graveyard
  13. 多精度数带余除法_算法笔记 (一) 高精度
  14. 视频加密并上传至oss实现高并发访问
  15. Multisim小信号调谐放大器电路仿真
  16. android电视与苹果手机图片,小米电视怎么投屏?图文讲解安卓和苹果手机投屏到小米电视方法...
  17. 对微信公众号文章爬取进行分析
  18. python语言程序设计基础上海交通大学_python语言程序设计基础第四章答案
  19. 智齿客服Android集成流程,智齿客服接入_智齿客服客服系统如何接入网站_智齿客服接入流程_企业服务汇...
  20. 服务器搭建免流系统,国内服务器搭建免流

热门文章

  1. sql如何粘贴一列不同的数值_原来Excel的复制粘贴有这么多不为人知的用法
  2. python爬取京东商品属性_python爬虫小项目:爬取京东商品信息
  3. java 二维数组动态添加,菜鸟求助: 二维数组如何实现动态接收?
  4. linux命令 三大利器,awk、grep、sed是linux操作文本的三大利器,也是必须掌握的linux命令之一...
  5. ug链轮设计软件_正版UG软件,UG软件代理,正版UG软件模块功能介绍
  6. 计算机技术学 试卷,计算机技术及科学技术学院试卷模板A.doc
  7. android系统打印功能实现,Android实现系统打印功能
  8. 使用webpack5模块联邦
  9. html canvas绘制网格,canvas(七)绘制网格和坐标轴
  10. Android设置Spinner控件的文字居中显示