- Kubernetes dashboard在SSL各种场景下的手动部署实践
- 来源:ServiceMesher
本文转载自zhangguanzhang的博客。
旨在面向新手讲解手动部署过程,本文dashboard的暴露不会用nodePort(不喜欢使用它)和apiserver的web proxy代理也就是/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
这种。
主要讲下四种场景方式:
纯dashboard http和https不惨合外部证书
openssl 证书给dashboard当https
个人向域名使用https小绿锁
ingress tls 代理http[s]的dashboard
以及最后讲解的如何定义带权限的token去利用token登陆dashboard。
先要理解的一点就是JWT(JSON Web Tokens)思想,k8s的很多addon都是pod形式跑的,addon的pod都是要连接kube-apiserver来操作集群来减少运维的工作量和提供方便。addon都是pod,pod操作和查看集群信息需要鉴权。
为此k8s使用了RBAC的思想(RBAC思想不是k8s独有的),资源对象和对声明的资源对象的操作权限组合最终落实到ServiceAccount
上,而每个名为name
的sa会关联着一个名为name-token-xxxxx
的secret。
可以通过kubectl describe命令或者api看这个secret实际上就是个token和一个ca.crt。下列命令列出缺省sa default的token和整个集群的ca.crt(jsonpath打印的时候敏感信息是base64编码需要自己解码):
kubectl get secret -o jsonpath=`{range .items[?(@.metadata.annotations.kubernetes\.io/service-account\.name=="default")].data}{"token: "}{.token}{"\n\n"}{"ca.crt: "}{.ca\.crt}{"\n"}{end}`
token: ZXlKaGJHY2lPaUpGVXpVeE1pSXNJbXR................
ca.crt: LS0tLS1CRUdJTiBDRVJUS..........................
每个pod都会被kubelet挂载pod声明的ServiceAccount关联的secret的里的ca.crt和token到容器里路径/var/run/secrets/kubernetes.io/serviceaccount
。
部署的yaml的话不推荐直接使用官方的yaml,我们需要看场景修改或者删减一些东西,这里先放下官方的yaml链接,后面以文件讲解。同时也推荐把本文看完了后再开始部署。
https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
全文我基本都是用的hostNetwork
和nodeName
固定在一台上,如果对k8s的几种svc和hostNetwork
以及hostPort
以及Ingress
熟悉的话可以自己决定暴露方式。
这里我是使用的下面这种方式暴露出去,也就意味着我们不需要svc可以删掉官方yaml里最后那段Dashboard Service
,访问的话用node的ip带上端口访问即可,改成大概下面这样:
...
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
containers:
- name: kubernetes-dashboard
image: registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.1
...
...
nodeName: k8s-m1
volumes:
...
纯dashboard
分为两种: http和开https,其中开https又分为使用自带的cert和openssl生成的。
默认自带的https
首先说说自带的https,镜像默认的entrypoint
是这样:
...
"Entrypoint": [
"/dashboard",
"--insecure-bind-address=0.0.0.0",
"--bind-address=0.0.0.0"
],
...
默认定义的容器启动参数为下面这样:
...
args:
- --auto-generate-certificates
...
这里我宿主机的8443被占用了,我修改了下dashboard的端口,后面同理:
...
ports:
- containerPort: 5443
protocol: TCP
command:
- /dashboard
- --bind-address=0.0.0.0
args:
- --auto-generate-certificates
- --port=5443
...
...
livenessProbe:
httpGet:
scheme: HTTPS
path: /
port: 5443
...
--auto-generate-certificates
从字面意思看是dashboard自己生成https的证书,但是实际上如下面的图这个证书chrome浏览器是不认的其他浏览器不清楚,chrome打开后在网页上是没有无视警告继续的选项,可以自行去试试看,网上也没找到添加例外只找到了全局关闭非权威SSL警告。不推荐这种(或者说这种完全行不通?)
使用http
使用http我们要小心有几个坑!
使用http我们只要使用选项--insecure-port
修改成下面即可端口不一定需要和我一样,pod的健康检查记得把`HTTPS
改成HTTP
:
ports:
- containerPort: 5443
protocol: TCP
command:
- /dashboard
- --insecure-bind-address=0.0.0.0
args:
- --insecure-port=5443
...
livenessProbe:
httpGet:
scheme: HTTP
path: /
port: 5443
默认http是不需要登陆的,所有人进去都是可以的,我们可以注意到dashboard默认带了一个sa以及一个Role:
# ------------------- Dashboard Role & Role Binding ------------------- #
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: kubernetes-dashboard-minimal
namespace: 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, u`pdate and d`elete Dashboard exclusive secrets.
- apiGroups: [""]
resources: ["secrets"]
resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs"]
verbs: ["get", "u`pdate", "d`elete"]
# Allow Dashboard to get and u`pdate `kubernetes-dashboard-settings` config map.
- apiGroups: [""]
resources: ["configmaps"]
resourceNames: ["kubernetes-dashboard-settings"]
verbs: ["get", "u`pdate"]
# 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-minimal
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: kubernetes-dashboard-minimal
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kube-system
这样绕过登陆的话所有人都是上面的权限了,所以我们得使用选项--enable-insecure-login
开启登陆界面,最终的args为下面:
...
args:
- --insecure-port=5443
- --enable-insecure-login=true
...
这样下进去是强制让登录了,但是token的话(后面说这个token如何创建和获取)是无法登陆的,找到issue说通过kubectl proxy出去的http和直接暴露的http将无法登陆(但是实际上我测了下百度浏览器可以登录)。
https://github.com/kubernetes/dashboard/issues/3216
https://github.com/kubernetes/dashboard/issues/2735
但是也不是意味着完全不能用这种方法,可以sa kubernetes-dashboard绑定到集群角色cluster-admin然后外面套层nginx的auth到它,然后配置iptables或者网络设备ACL让dashboard只收到来源ip是nginx。
openssl生成证书给dashboard当https证书
如果我们使用openssl生成证书给dashboard使用的话,浏览器会有跳过继续前往页面的选项,能够在内网没域名下使用,我们内网给研发搭建dashboard目前就是这样使用的。具体就是openssl命令生成证书并根据证书生成tls类型的secret:
mkdir certs
openssl req -nodes -newkey rsa:2048 -keyout certs/dashboard.key -out certs/dashboard.csr -subj "/C=/ST=/L=/O=/OU=/CN=kubernetes-dashboard"
openssl x509 -req -sha256 -days 10000 -in certs/dashboard.csr -signkey certs/dashboard.key -out certs/dashboard.crt
kubectl create secret generic kubernetes-dashboard-certs --from-f`ile=certs -n kube-system
这里生成secret后我们先分析下官方的yaml,我们可以用命令帮助--help
查看到dashboard的默认cert-dir是/certs
:
$ docker run --rm -ti --entrypoint /dashboard registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.1 --help | grep cert-dir
--default-cert-dir string Directory path containing `--tls-cert-f`ile` and `--tls-key-f`ile` f`iles. Used also when auto-generating certificates flag is set. (default "/certs")
而且可以注意到他有个挂载:
...
volumeMounts:
- name: kubernetes-dashboard-certs
mountPath: /certs
...
...
volumes:
- name: kubernetes-dashboard-certs
secret:
secretName: kubernetes-dashboard-certs
...
上面挂载的secret也是来源于官方yaml里的secret,也就说默认情况下这个secret是给选项--auto-generate-certificates
使用的:
apiVersion: v1
kind: Secret
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-certs
namespace: kube-system
type: Opaque
所以我们使用openssl部署dashboard的步骤是先上面openssl生成证书然后导入生成secret,然后yaml里删掉Dashboard Secret
然后修改dashboard的运行选项:
...
command:
- /dashboard
- --bind-address=0.0.0.0
args:
- --auto-generate-certificates
- --port=5443
...
上面为啥我开了自动生成证书的选项呢,这个选项开启时不会覆盖我们的挂载的certs文件的同时它还是全局https的开关- -坑了我好久。
个人向域名使用https小绿锁(有单点故障风险)
这里是通过域名+https访问,证书的话可以买的也可以免费签署的SSL证书都行。
我使用的是acme.sh + token
使用Let’s Encrypt
签署免费的SSL证书,也是我个人用的。另外acme申请证书的时候不一定非得通配符域名
安装acme.sh脚本:
curl -s https://get.acme.sh | sh
# 设置别名方便使用命令
alias acme.sh=~/.acme.sh/acme.sh
DNS API ,阿里云需要设置 RAM 策略对应为 AliyunDNSFullAccess,然后在控制台获取API的token,腾讯的话确保域名解析是dnspod,其他的域名提供商请查看 https://github.com/Neilpang/acme.sh/wiki/dnsapi 。
例如阿里的话去阿里云上生成token然后下面执行:
export Ali_Key="yourkey"
export Ali_Secret="yoursecret"
# 申请证书
acme.sh --issue --dns dns_ali -d `.k8s.youdomain.com
域名在腾讯云的话确保nameserver设置的是dnspod(好像默认就是这个),我们去dnspod的官网上使用登陆腾讯云的账号(例如我是qq登陆)后在开发者api里开启dnspod的api token。
注意token在创建的时候只显示一次,记得截图发给自己的时候别点错地方关了,不然得再创建个。
export DP_Id="1234"
export DP_Key="sADDsdasdgdsfsdfsdfasfdsfasfasfds"
acme.sh --issue --dns dns_dp -d `.zhangguanzhang.com
运行后会看到文件路径:
前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方。
注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/
, 请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化。
正确的使用方法是使用--installcert
命令,并指定目标位置, 然后证书文件会被copy到相应的位置。
COPY 证书,安装到 ~/cert
目录中,cert 证书使用的是 fullchain cert, keyf`ile和fullchain的证书名字随意,自己记住就行了。
mkdir -p ~/cert
acme.sh --installcert -d `.zhangguanzhang.com \
--key-f`ile ~/cert/zhangguanzhang.com.key \
--fullchain-f`ile ~/cert/zhangguanzhang.com.crt
然后从证书创建tls类型的secret:
kubectl -n kube-system create secret tls kubernetes-dashboard-certs \
--key ~/cert/zhangguanzhang.com.key \
--cert ~/cert/zhangguanzhang.com.crt
删掉官方yaml文件里的Dashboard Secret
,我们发现tls的secret是下面俩文件名:
$ kubectl -n kube-system get secrets kubernetes-dashboard-certs -o yaml
apiVersion: v1
data:
tls.crt: ....
tls.key: ....
kind: Secret
metadata:
name: kubernetes-dashboard-certs
namespace: kube-system
type: kubernetes.io/tls
我们修改运行参数关闭insecure和指定使用证书文件,这里用5443是因为我公网ip没备案,如果ip备案了可以5443改成443(记得yaml其他地方端口也修改下):
...
command:
- /dashboard
args:
- --auto-generate-certificates
- --bind-address=0.0.0.0
- --port=5443
- --tls-cert-f`ile=tls.crt
- --tls-key-f`ile=tls.key
...
创建dashboard后在云上的域名控制台设置解析过来,通过https的域名访问。
Ingress Controller使用域名证书代理dashboard
上面直接dashboard使用域名证书会有单点故障,所以实际应用我们可以用高可用的ingress nginx(详见之前的文章)来代理集群内部的dashboard
这里我使用的是Ingress nginx
。
从证书创建tls类型的secret:
kubectl -n kube-system create secret tls dashboard-tls \
--key ~/cert/zhangguanzhang.com.key \
--cert ~/cert/zhangguanzhang.com.crt
官方yaml的deploy数量改多个后直接使用创建即可,然后创建下面ingress:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: dashboard-ingress
namespace: kube-system
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/rewrite-target: /
#nginx.ingress.kubernetes.io/secure-backends: "true" 该注释在0.18.0中被弃用,并在0.20.0发布后被删除,使用下面
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
tls:
- hosts:
- dashboard.example.com
secretName: dashboard-tls
rules:
- host: dashboard.example.com
http:
paths:
- backend:
serviceName: kubernetes-dashboard
servicePort: 443
如果ingress是tls的,dashboard是http的可以去掉上面三个annotations(这种情况我未测试,有兴趣可以自己试试)。
token
dashboard登陆的话可以选择kubeconfig和token,kubeconfig一般是集群外使用的,例如管理组件之间想和apiserver tls下通信都得使用kubeconfig,里面实际上就是ca签署的客户端证书+各自CN和O签署的证书。而token里的ca.crt也是客户端证书和kubeconfig里client-certificate-data
的是一样的,RBAC落实在它那个token字段。
很多addon可以看到他们的--help
选项看到也支持kubeconfig的,他们的默认逻辑是没有用kubeconfig选项下起来的时候会去查看secret路径/var/run/secrets/kubernetes.io/serviceaccount
获取token(也就是在pod里运行的请求逻辑),当然也并不意味着token一定在集群内用可以把secret的token获取到后制作成kubeconfig。
dashboard登陆的token如果使用管理员的话可以用rbac绑定集群管理员角色,这也是最常见的使用方法,像kubectl拥有集群管理员那样。如果对RBAC熟悉可以单独给不用部门生成不同权限的RBAC取token给人员登陆。
apiVersion: v1
kind: ServiceAccount
metadata:
name: dashboard # sa名字随意
namespace: kube-system
labels:
k8s-app: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dashboard
namespace: ""
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole # 权限来源于集群角色
name: cluster-admin # 这个是集群管理员角色名
subjects:
- kind: ServiceAccount
name: dashboard # 和上面名字一样
namespace: kube-system
取它token用于登陆dashboard,你在dashboard web上操作集群的时候实际上是拿着你登陆的token的去以api调用kube-apiserver。
使用下面命令取上面创建的sa的token:
kubectl -n kube-system get secret -o jsonpath=`{range .items[?(@.metadata.annotations.kubernetes\.io/service-account\.name=="dashboard")].data}{.token}{end}` | base64 -d
xxxxxxxxxxxxxx
最后Let’s Encrypt
的证书是一次3个月,可以看脚本官方文档去定时获取新的证书然后导入 https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E certmanager和acme.sh一样的原理去调用api签署域名证书,有兴趣可以去试试
参考
TLS termination - github.com
acme.sh wiki - github.com
certmanager trusted github.com
推荐阅读
面向 Kubernetes 编程:Kubernetes 是下一代操作系统
点击 查看更多
教育
-
- 不要再问孩子“作业写完了吗?”
- 每一个幸福快乐的妈妈都在“母亲大学”找到了力量孩子一放学回家,你就急着问他,“你作业写完没”“没写完赶紧去写”......殊不知这句话背后,透露出多少你不知道的秘密。请全天下的父母记住一句话:“孩子不怕...
- 母亲大学
-
- 注意!涉及沈阳考区4万多考生!参加这项考试需持核酸检测证明
- 紧急通知:4月1日起沈阳地铁有重大调整!2021年度二级建造师执业资格考试于5月29日、30日举行。明日是最后一天,也是报考人数最多的一天,沈阳考区报考人数为40536人。沈阳市考试院再次提醒所有考生,参加考试必...
- 沈阳晚报
-
- 清华副校长怒批中国学生:你们这么优秀,去国外打工却很满足?
- 清华副校长施一公:我们有多少极其优秀的中国学生去了国外能脱颖而出的?这个比例非常小!每一年能考上清华、北大的学生也是几千人而已,就拿去年2020年来说,清华北大的招生人数一共也才7000多人,还包含了内地...
- 爸妈说事
-
- 请转到朋友圈!中考、高考生家长会感谢你的,这个对他们有用!
- 没有意外 就是成功——写给中、高考考生的家长们四年前我的孩子参加了中考,一年前我又成为一个没有节假日、没有周末的高三学生家长,陪孩子度过了高考。现在回想起来,还清楚记得那时的心情:每天仔细地操持着...
- 班主任研究会
-
- 人民日报:老师,从疲劳到癌症只需四步!请保重好身体!(再忙也要读一读)
- 2020年9月高考优秀作文专辑9月出炉,买买买!高考第一品牌语文月刊代码46-88每月一本定价12元。其中每年8月高考优秀作文点评专辑、9月高考试题分析专辑、12月最新高考分类练习专辑、4月最高高考冲刺AB卷二...
- 语文日刊
-
- 2021报考捡漏,这几所大学的分校,毕业证一样,报考分数竟相差50分
- 分校、分校区,虽然只是一字之差,但是证书的含金量天差地别。但是,有些分校毕业证书完全一样,录取分数却相差很大,今天慧姐就来盘点一下。一、概述校区,实际上就是同一所高校,并未单列招生代码,只是学生生...
- 高中学生家长慧
-
- 梁鸿鹰:翻看着发黄变脆的纸页|往事
- 1978年日记所见文|梁鸿鹰教育……就像是在土地上种庄稼。我们的天性好比土壤,我们的教师的训诲好比种子,对青年人的教诲就好比适时播种……——希波克拉底我们出生时所缺少的一切,成年时所需要的一切,都来自...
- 当代
-
- 一个都不少,全部考上大学!
- 点蓝色字关注“央视新闻”高考临近在许多高三学子紧张备考之际江苏扬州有一群学生,已被高校录取但这个成绩背后饱含着汗水与泪水因为他们全部都是聋人↓↓↓“单考单招”考试中班上10名学生全部上榜今年4月扬州...
- 央视新闻
-
- 男孩留遗言跳楼自杀:“对不起,我控制不住玩手机,你们生个更好的吧!”,想要毁掉一
- 中小学家长慧点击上方蓝字关注关注点击进入→在线教育,为孩子找一个优秀的辅导教师文 | 朗读君来源 | 朗读君英语(ID:langdujun170)手机好似一个杀手,随时在威胁着孩子们。几天前,看到一则新闻:安徽黄山的...
- 中小学家长慧
-
- 中考提前5分钟发卷子,竟然是让做这些的!
- 考了那么多试,各位考场达人是否认真思考过:为啥所有考试都是提前5分钟发卷?不研究,不知道,一研究吓一跳!万万没想到,提前5分钟发卷还有这等用处!考前5分钟用不好,考试全白考!到底这5分钟的正确打开方式...
- 袁意
-
- 江门市开展党史学习教育工作会议召开,省委巡回指导组到会指导
- 昨日,江门市开展党史学习教育工作会议召开,深入学习贯彻习近平总书记在党史学习教育动员大会上的重要讲话精神,认真落实中央决策部署及省委工作安排,传达省委党史学习教育巡回指导工作任务和有关要求,推动我...
- 江门发布
-
- 贵安新区公布2021年义务教育阶段招生方案
- 近日,贵安新区2021年义务教育阶段招生工作实施方案公布。详情如下:招生原则 (一)坚持依法办学原则。由贵安新区社会事务协调局、各乡镇人民政府和贵安教育管理处统筹,按照“公平、公正、公开”的原则,全...
- 贵阳晚报
-
- 关于选大学及专业的13条忠告,很专业、很走心!
- 随着高考的临近,大家越来越关注志愿填报的相关信息,今天分享一个家长对于帮孩子挑大学选专业的一些经验总结,并提出了13个忠告。内容稍长,但回答了对高考志愿的大部分困惑,值得细读。选择正确才能收获跟努力...
- 好课堂
-
- 王元:纯粹数学的美丽与哀愁
- 没有应用的数学才是好的好就好在它没有应用王元:纯粹数学的美丽与哀愁本刊记者/宋春丹发于2021.5.31总第997期《中国新闻周刊》5月14日,中科院院士、中科院数学所原所长王元在北京病逝,享年91岁。在中科院数学...
- 中国新闻周刊
-
- 北大教授吐槽学渣女儿:跟倒数第二名有很大差距!网友评论亮了
- “不辅导作业父慈女孝,辅导作业鸡飞狗跳。”近日北京大学教育学院副教授丁延庆一段吐槽女儿的视频火了。丁教授全名丁延庆,他6岁能背下整本新华字典,本科就读于北大,后来进入哥伦比亚大学学习,获得了教育学...
- 齐鲁晚报
朋友会在“发现-看一看”看到你“在看”的内容