新版的dashboard在安全方面下了不少功夫,也提供了多种认证方式。以下就踩过的坑来进行一下介绍。

dashboard官方文档:

https://github.com/kubernetes/dashboard/wiki

  • Installation

    • Recommended setup
  • 访问dashboard
  • 为用户授权

Installation

dashboard有两个发行版本,offical和deployment. 这里使用offical版本。

dashboard的安装文档中提到了3中方式:
1. quick setup
快速安装,但是只能通过kubectl proxy的方式使用本机地址(localhost,127.0.0.1)来进行登录。
2. recommended setup
常规安装,可以通过NodePortingress的方式访问。
3. alternative setup
采用http协议访问,出于安全性考虑,就没使用这个了。

快速安装和常规安装几乎一模一样,唯一不同的是采用常规安装的时候,需要先生成dashboard的服务器端证书,然后通过configMap挂载到dashboard容器中。

Recommended setup

第一步,生成证书:

mkdir certs && cd certsopenssl genrsa -out dashboard.key 2048openssl req -new -key dashboard.key -out dashboard.csr -config dashboard-csr.confopenssl x509 -req -in dashboard.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out dashboard.crt -days 1000 -extensions v3_ext -extfile dashboard-csr.conf

dashboard-csr.conf 文件内容如下:

[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn[ dn ]
C = CN
L = SZ
O = Fonsview
CN = 172.16.6.79[ req_ext ]
subjectAltName = @alt_names[ alt_names ]
DNS.1 = kubernetes-dashboard
DNS.2 = kubernetes-dashboard.kube-system
DNS.3 = kubernetes-dashboard.kube-system.svc
DNS.4 = kubernetes-dashboard.kube-system.svc.cluster
DNS.5 = kubernetes-dashboard.kube-system.svc.cluster.local
DNS.6 = dashboard.k8s.fonsview.com
IP.1 = 172.16.6.79
IP.2 = 172.16.6.47
IP.3 = 172.16.6.249[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
subjectAltName=@alt_names

这里我直接使用了kubernetes 里面的ca证书,用浏览器访问的时候会提示该网站证书不可靠. 官方推荐是去Let’s Encrypt 网站中生成自己的证书。

将创建好的证书,添加到Secret中.

kubectl create secret generic kubernetes-dashboard-certs --from-file=./certs -n kube-system

下载kubernetes-dashboard.yaml

修改kubernetes-dashboard的yaml文件:

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-dashboard
        image: gcr.io/google_containers/kubernetes-dashboard-amd64:v1.8.0ports:- containerPort: 8443
          protocol: TCPargs:# - --auto-generate-certificates- --tls-key-file=dashboard.key
          - --tls-cert-file=dashboard.crt
          - --authentication-mode=basic
          # 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-certs
          mountPath: /certs# Create on-disk volume to store exec logs- mountPath: /tmp
          name: tmp-volumelivenessProbe:httpGet:scheme: HTTPSpath: /port: 8443initialDelaySeconds: 30timeoutSeconds: 30volumes:- name: kubernetes-dashboard-certs
        secret:secretName: kubernetes-dashboard-certs- name: tmp-volume
        emptyDir: {}serviceAccountName: kubernetes-dashboard# Comment the following tolerations if Dashboard must not be deployed on mastertolerations:- key: node-role.kubernetes.io/master
        effect: NoSchedule

添加--tls-key-file--tls-cert-file.

如果要采用用户名和密码的认证形式,需要加上--authentication-mode=basic。 默认是使用token认证。

Note: 这里要注意证书的路径

然后执行

kubectl apply -f kubernetes-dashboard.yaml

不出意外的话,可以用命令看到pod能正常启动:

[root@walker-1 kubernetes]# kubectl get po -o wide --namespace=kube-system | grep dashboard
kubernetes-dashboard-68b6699b8-mrvfl         1/1       Running   0          5s        192.168.187.202   walker-1.novalocal

访问dashboard

修改dashboard的service, 改为NodePort的访问形式

[root@walker-1 kubernetes]# kubectl describe svc kubernetes-dashboard -n kube-system
Name:                     kubernetes-dashboard
Namespace:                kube-system
Labels:                   k8s-app=kubernetes-dashboard
Annotations:              kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"k8s-app":"kubernetes-dashboard"},"name":"kubernetes-dashboard","namespace":...
Selector:                 k8s-app=kubernetes-dashboard
Type:                     NodePort
IP:                       10.103.175.251
Port:                     <unset>  443/TCP
TargetPort:               8443/TCP
NodePort:                 <unset>  32723/TCP
Endpoints:                192.168.187.202:8443
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

至此就可以通过 https://<nodeip>:<nodeport> 的方式来访问dashboard了

官网上还提及了通过apiserver和kubectl proxy 的方式来访问页面。据个人实际使用,kubectl proxy默认监听127.0.0.1。只能通过本地地址去访问。当然可以绑定到其他地址,但是页面无法进行登录操作。这在文档中有描述:

NOTE: Dashboard should not be exposed publicly using kubectl proxy command as it only allows HTTP connection. For domains other than localhost and 127.0.0.1 it will not be possible to sign in. Nothing will happen after clicking Sign in button on login page.

通过apiserver端口来访问时,会出现403权限问题。提示是以匿名用户身份访问的,权限拒绝。但是要让浏览器支持提供身份请求显然不现实,所以也放弃了。

为用户授权

如果使用token的认证方式来登录,也是可行的。不过需要为service account添加合适的权限。如果想直接跳过认证,那么默认是以kubernetes-dashboard的service account账户来访问。如果不做配置,kubernetes-dashboard 只能访问很少一部分资源。官方文档中提供了将所有权限赋予kubernetes-dashboard的配置。

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:name: kubernetes-dashboardlabels:k8s-app: kubernetes-dashboard
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: kubernetes-dashboardnamespace: kube-system

将用户绑定到 cluster-admin权限组。这样一来kubernetes-dashboard就能访问平台所有资源。这样做很方便,但有安全风险,不建议。

token认证方案已经很好了,但是大佬们显然更倾向使用账户+密码的方式认证。具体配置步骤如下:

  1. 在dashboard的deployment配置中,添加 --authentication-mode=basic
  2. 修改apiserver的配置,在启动参数中添加密码文件、ABAC认证以及指定ABAC策略文件。

    • 编辑密码文件
      密码文件的格式如下:
password,user,uid,"group1, group2..."

详情可参考:https://kubernetes.io/docs/admin/authentication/#static-password-file

为了方便起见,我创建了/etc/kubernetes/dashboard 文件夹

[root@walker-1 ~]# cd /etc/kubernetes/dashboard/
[root@walker-1 dashboard]# cat dashboard.basic
password,walker,123123,system:authenticated

Note: 一定要为用户添加system:authenticated组,否则默认为system:unauthenticated组,用户被视为匿名用户,丧失访问权限。

  • 编辑ABAC策略文件
[root@walker-1 dashboard]# cat dashboard-abac.json
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "walker", "namespace": "*", "resource": "*", "apiGroup": "*"}}

这里把所有权限放开给walker用户。

有关ABAC认证参考:https://kubernetes.io/docs/admin/authorization/abac/

Note: 策略文件中的用户名要和密码文件对应。

  • 修改apiserver配置
apiVersion: v1
kind: Pod
metadata:annotations:scheduler.alpha.kubernetes.io/critical-pod: ""creationTimestamp: nulllabels:component: kube-apiservertier: control-planename: kube-apiservernamespace: kube-system
spec:containers:- command:- kube-apiserver- --service-cluster-ip-range=10.96.0.0/12- --service-account-key-file=/etc/kubernetes/pki/sa.pub- --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key- --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt- --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key- --enable-bootstrap-token-auth=true- --admission-control=Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota- --advertise-address=172.16.6.47- --client-ca-file=/etc/kubernetes/pki/ca.crt- --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt- --insecure-port=0- --requestheader-username-headers=X-Remote-User- --requestheader-extra-headers-prefix=X-Remote-Extra-- --requestheader-allowed-names=front-proxy-client- --tls-private-key-file=/etc/kubernetes/pki/apiserver.key- --allow-privileged=true- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname- --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt- --secure-port=6443- --requestheader-group-headers=X-Remote-Group- --tls-cert-file=/etc/kubernetes/pki/apiserver.crt- --authorization-mode=Node,RBAC,ABAC- --authorization-policy-file=/etc/kubernetes/dashboard/dashboard-abac.json- --basic-auth-file=/etc/kubernetes/dashboard/dashboard.basic- --etcd-servers=http://walker-1:2379,http://walker-2:2379,http://walker-4:2379image: gcr.io/google_containers/kube-apiserver-amd64:v1.8.1livenessProbe:failureThreshold: 8httpGet:host: 127.0.0.1path: /healthzport: 6443scheme: HTTPSinitialDelaySeconds: 15timeoutSeconds: 15name: kube-apiserverresources:requests:cpu: 250mvolumeMounts:- mountPath: /etc/kubernetes/pkiname: k8s-certsreadOnly: true- mountPath: /etc/kubernetes/dashboardname: k8s-dashboardreadOnly: true- mountPath: /etc/ssl/certsname: ca-certsreadOnly: true- mountPath: /etc/pkiname: ca-certs-etc-pkireadOnly: truehostNetwork: truevolumes:- hostPath:path: /etc/kubernetes/pkitype: DirectoryOrCreatename: k8s-certs- hostPath:path: /etc/kubernetes/dashboardtype: DirectoryOrCreatename: k8s-dashboard- hostPath:path: /etc/ssl/certstype: DirectoryOrCreatename: ca-certs- hostPath:path: /etc/pkitype: DirectoryOrCreatename: ca-certs-etc-pki
status: {}

添加了ABAC认证方式,--authorization-policy-file以及--basic-auth-file。将/etc/kubernetes/dashboard 挂载到容器中。

  1. 重启apiserver, 使用添加的用户进行访问。
    先使用一个错误的密码试试认证有没有生效:

在使用正确密码登录:

至此密码认证方式配置完毕。

dashboard 1.8相关推荐

  1. 【K8S实践】关于Kubernetes Dashboard的实践学习

    前言: 陆陆续续,学k8s一个月了,从开始看docker容器书,视频,怎么都无法上手:到后来闷着头实践地傻瓜式操作:到今天整个完全串通好!感觉到学习也是一段深刻的成长经历! 过程: 这个过程中使用的工 ...

  2. 2021年大数据ELK(二十八):制作Dashboard

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 制作Dashboard 一.点击第三个组件图标,并创建一个新的Dashboar ...

  3. Intellij IDEA中开启Run Dashboard模式

    由于微服务在启动时数量较多,需要逐个进行管理,所以最好是在一个统一的地方,如Run Dashboard面板中,那么如何开启这个面板呢 1.按照文件方式打开project 2.打开workspace.x ...

  4. CentOS 7部署OpenStack(9)—部署dashboard

    安装dashboard [root@controller ~]# yum install -y openstack-dashboard 配置dashboard [root@controller ~]# ...

  5. HTML5 Dashboard – 那些让你激动的 Web 技术

    HTML5 Dashboard 是一个 Mozilla 推出的项目,里面展示了最前沿的 HTML5,CSS3,JavaScript 技术.每一项技术都有简洁,在线演示以及详细的文档链接.这些技术将成为 ...

  6. Spring Cloud(五)断路器监控(Hystrix Dashboard)

    在上两篇文章中讲了,服务提供者 Eureka + 服务消费者 Feign,服务提供者 Eureka + 服务消费者(rest + Ribbon),本篇文章结合,上两篇文章中代码进行修改加入 断路器监控 ...

  7. Spring Cloud第十二篇:断路器监控(Hystrix Dashboard)

    在我的第四篇文章断路器讲述了如何使用断路器,并简单的介绍了下Hystrix Dashboard组件,这篇文章更加详细的介绍Hystrix Dashboard. 一.Hystrix Dashboard简 ...

  8. (十二)企业级java springcloud b2bc商城系统开源源码二次开发-断路器监控(Hystrix Dashboard)...

    一.Hystrix Dashboard简介 在微服务架构中为例保证程序的可用性,防止程序出错导致网络阻塞,出现了断路器模型.断路器的状况反应了一个程序的可用性和健壮性,它是一个重要指标.Hystrix ...

  9. Kubernetes 1.8.4 手动安装教程-安装Dashboard(七)

    2019独角兽企业重金招聘Python工程师标准>>> Dashboard Dashboard 是 Kubernetes 社区官方开发的仪表板,有了仪表板后管理者就能够透过 Web- ...

  10. [k8s] 第十章 DashBoard

    第十章 DashBoard ​ 之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的.其实,为了提供更丰富的用户体验,kubernetes还开发了一个基于web的用户界面( ...

最新文章

  1. java protobuf 例子_用 Maven 实现一个 protobuf 的 Java语言例子
  2. Vue2.0增删改查案例(Vue+Less+LocalStorage)
  3. Kinect开发笔记之八C#实现Kinect声音的追踪
  4. 分布式精华问答 | 分布式与集群的区别是什么?
  5. 斜面上的根骨骼运动以及刚体测试
  6. 职称计算机ppt考试试题,职称计算机考试PPT试题
  7. 软核、固核、硬核的区别
  8. 阿里云马涛:云原生时代的开源操作系统长什么样
  9. 高效能人士的七个习惯读后感与总结概括-(第七章,第八章,第九章)
  10. Web 前端本地化(一)
  11. 云南省初中计算机考试试题,云南省初中学业水平考试信息技术(中考)总复习资料+信息技术中考复习题...
  12. 唐山校友会会长苏伟与徐飞校长的一次短信交流
  13. Elasticsearch 组合聚集(Composite aggregation)实现交叉分析
  14. 小白期货CTP程序化交易开发入门(一)--CTP开发基础
  15. MySQL 8.0.29 解压版安装教程(亲测有效)
  16. 关于微信小程序获取头像和昵称
  17. spss 自动线性建模
  18. 多传感器信息融合笔记
  19. 全球与中国反刍动物饲料市场现状及未来发展趋势
  20. 如何加减单元格指定数字_excel如何计算

热门文章

  1. Android模仿手机京东商城实训小项目(含源码)
  2. 传统行业如何搭建大数据团队?
  3. 基于坐标变换与随机Hough 变换的抛物线运动目标检测算法
  4. IDEA的一些炫酷的插件
  5. Jenson不等式及其在EM估计与KL散度中的应用
  6. 半物理仿真系统——EPB HIL系统解决方案
  7. 腾讯AI在星际2完整对战中击败“作弊级”内建Bot
  8. 麦克林排名计算机,转需!2021年加拿大麦克林杂志排名大学院校推荐
  9. LeetCode(172) Factorial Trailing Zeroes
  10. Java扫雷游戏心得体会总结_扫雷心得 - stme - BlogJava