目录
背景
在已有的k8s(v1.23)集群上安装dashboard(v2.5.1)。
为什么k8s版本选择v1.23?这个版本包含docker engine组件dockershim。再高的版本容器如果使用docker需要使用容器运行时接口(CRI)方式。
k8s和dashboard版本对应
根据k8s集群的版本安装对应版本的dashboard。版本不对应有可能会导致dashboard某些功能不能使用。
从官网查看对应关系:
Releases · kubernetes/dashboard · GitHub
安装dashboard
使用dashboard官网提供的yaml文件(recommended.yaml)一键安装:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml
v2.5.1版本dashboard所有的资源都在命名空间“kubernetes-dashboard”中。可以从recommended.yaml看到:
命令查看dashboard的pods
kubectl get pods -n kubernetes-dashboard -o wide
这两个pod正常运行说明dashboard安装成功!!!
访问dashboard
安装完dashboard,然后就是如何访问到dashboard了。
v2.5.1版本的recommended.yaml默认的service模式是clusterIp(高版本的有的直接就是nodePort模式)。clusterIp模式只能在集群内访问,外网是不能访问的。
一般实现访问的方式有三种:kubectl proxy、nodePort或ingress、kubectl port-forward。
kubectl proxy
kubectl proxy是通过在本地的kubectl上暴露一个服务端口,通常为127.0.0.1:8001的非https访问, 你不能在master或者node上跑这个命令,否则除非你的master或者node有图形化的浏览器,不然还是无法看到图形dashboard。所以要在你自己的本地跑这个命令(所以,我擦,好麻烦,所以你还有在本地设置你kubectl的kubeconfig确保本地kubectl可以有权限操作所有)。然后就可以通过本地浏览器访问http://127.0.0.1:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login 看到界面了。
总结:kubectl proxy
启动的是本地代理服务器,只能通过 localhost 访问,这个只适合本地单集群使用。
nodeport或者ingress来暴露出来服务
通过nodeport或者ingress来暴露出来服务,这种方式比较容易理解,等于正常发布一个服务,所以将官方的的yaml改为nodeport方式即可。
使用kubectl edit命令直接修改service,只需要将type: ClusterIP
修改为 type: NodePort即可。
kubectl -n kubernetes-dashboard edit service kubernetes-dashboard
看一下具体分配的 node port 是哪个:
$ kubectl -n kubernetes-dashboard get service kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard NodePort 10.106.3.227 <none> 443:32212/TCP 9h
可以看到这里分配的是 32212 端口。
然后就是 node 的 ip 地址了,如果是单节点的集群,那么 node ip 就固定为 master node 的IP,可以通过 kubectl cluster-info
获取。如果是多节点的集群,则需要找到 kubernetes-dashboard 服务被部署到了哪个节点。
$ kubectl get pods -A -o wide | grep kubernetes-dashboard
kubernetes-dashboard dashboard-metrics-scraper-799d786dbf-krhln 1/1 Running 0 32m 10.244.1.3 skyserver2 <none> <none>
kubernetes-dashboard kubernetes-dashboard-6b6b86c4c5-ptstx 1/1 Running 0 9h 10.244.1.2 skyserver2 <none> <none>
如图 kubernetes-dashboard 服务被部署到了 skyserver2 节点,skyserver2 的 IP 是 192.168.0.50,则拼合起来的地址是
https://192.168.0.50:32212
kubectl port-forward
$ kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 8080:443
Forwarding from 127.0.0.1:8080 -> 8443
Forwarding from [::1]:8080 -> 8443
类似的,也只能本地访问 https://localhost:8080 。
dashboard登录
访问成功后,出现登录页面。让用户选择是用token的方式登录,还是kubeconfig方式登录
token登录
token可以通过下面的命令简单获取到:
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret -o name | grep namespace) | grep token
输出为:
$ kubectl -n kube-system describe $(kubectl -n kube-system get secret -n kube-system -o name | grep namespace) | grep token
Name: namespace-controller-token-r87br
Type: kubernetes.io/service-account-token
token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImNuYUVPT3FRR0dVOFBmN3pFeW81Y1p5R004RVh6VGtJUUpfSHo1ZVFMUVEifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJuYW1lc3BhY2UtY29udHJvbGxlci10b2tlbi1yODdiciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJuYW1lc3BhY2UtY29udHJvbGxlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImU2NjU3ODI3LTc4NTUtNDAzOC04MmJjLTlmMjI0OWM3NzYyZiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTpuYW1lc3BhY2UtY29udHJvbGxlciJ9.sVRT_x5NB4sqYwyyqn2Mm3hKg1jhvCsCDMbm_JY-3a19tknzwv_ZPpGOHWrPxmCG45_-tHExi7BbbGK1ZAky2UjtEpxmtVNR6yqHRMYvXtqifqHI4yS6ig-t5WiZ0a4h1q6xZfWsM9nlINSTGQbguCCN2kXUYyAZ0HPdPhdFtmyH9_fjI-FXQOPeK9t9GfWn9Nm52T85spzriwOMY96fFXZ3YaiuzfY5aBtGoxLwDu7O2GOazBmeFaRzEEGR0RjgdM7WPFmtDvbaidIJDPkLznqftqwUFeWHjz6-toO8iaKW_QKHFBvZTQ6uXSc__tbcSYyThu3Ty97-Ml8TArhacw
复制这里的 token 提交就可以登录。
kubeconfig登录
在 kebeconf 文件(路径为 ~/.kube/config
)中加入 token 信息:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: XXXXXX==
server: https://192.168.0.41:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: XXXXX==
client-key-data: XXXX=
token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImNuYUVPT3FRR0dVOFBmN3pFeW81Y1p5R004RVh6VGtJUUpfSHo1ZVFMUVEifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJuYW1lc3BhY2UtY29udHJvbGxlci10b2tlbi1yODdiciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJuYW1lc3BhY2UtY29udHJvbGxlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImU2NjU3ODI3LTc4NTUtNDAzOC04MmJjLTlmMjI0OWM3NzYyZiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTpuYW1lc3BhY2UtY29udHJvbGxlciJ9.sVRT_x5NB4sqYwyyqn2Mm3hKg1jhvCsCDMbm_JY-3a19tknzwv_ZPpGOHWrPxmCG45_-tHExi7BbbGK1ZAky2UjtEpxmtVNR6yqHRMYvXtqifqHI4yS6ig-t5WiZ0a4h1q6xZfWsM9nlINSTGQbguCCN2kXUYyAZ0HPdPhdFtmyH9_fjI-FXQOPeK9t9GfWn9Nm52T85spzriwOMY96fFXZ3YaiuzfY5aBtGoxLwDu7O2GOazBmeFaRzEEGR0RjgdM7WPFmtDvbaidIJDPkLznqftqwUFeWHjz6-toO8iaKW_QKHFBvZTQ6uXSc__tbcSYyThu3Ty97-Ml8TArhacw
默认生成的kebuconf文件是不带 token 字段的,加上即可。
然后在页面上提交这个 kebuconf 文件即可登录。相比token登录方式,不需要每次去获取token内容,一次保存之后以后方便很多。
创建账户
默认的账户token没有权限,登录dashboard后什么也看不到。我们创建一个管理员账号,并用该账号的token登录
#创建账户
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
#授权
kubectl create clusterrolebinding dashboard-admin-rb --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
#获取账号token
kubectl get secrets -n kubernetes-dashboard | grep dashboard-admin
kubectl describe secrets “上一步获取到的secrets名称” -n kubernetes-dashboard
用该账户的token登录以后,就能正常访问了!!
修改为http访问
默认情况下,dashboard需要以https的方式访问。使用浏览器访问dashboard时,可以连接上,但是浏览器会因为网站使用的是自签名证书而报错 “此网站连接不安全” 拒绝访问。各浏览器的处理:
- edag:拒绝访问,可以使用魔术短语:
thisisunsafe
(没有输入框,只要单击该页面以确保它具有焦点,然后键盘输入即可) - firefox:默认拒绝,选择"接受风险并继续"后可以正常访问
- Chrome:待测试,应该可以使用魔术短语:
thisisunsafe
- Safari: 默认拒绝,点击 “Show details” -> “visit this website” -> “visit website” 可以绕开限制继续访问
我们也可以关闭https的模式,使用http访问:
第一步
还未安装dashboard则直接修改dashboard的资源清单文件(recommended.yaml),或者使用kubelet edit
命令编辑已部署的资源清单,
首先配置置 kubernetesui/dashboard:v2.5.1
镜像的启动参数,主要是--enable-insecure-login
与--insecure-port=8080
参数。
$ kubectl edit deployments.apps -n kubernetes-dashboard kubernetes-dashboard
args:
# - --auto-generate-certificates
- --namespace=kubernetes-dashboard
- --enable-insecure-login
- --insecure-port=8080
# Pod 端口暴露
ports:
- name: https
containerPort: 8443
protocol: TCP
- name: http
containerPort: 8080
protocol: TCP
# Pod 健康检查
livenessProbe:
# httpGet:
# scheme: HTTPS
# path:
# port: 8443
httpGet:
scheme: HTTP
path:
port: 8080
第二步
配置 kubernetes-dashboard 的 Service 资源管理器
kubectl edit svc -n kubernetes-dashboard kubernetes-dashboard
ports:
- name: https
port: 443
protocol: TCP
targetPort: 8443
- name: http
port: 8080
protocol: TCP
targetPort: 8080
selector:
k8s-app: kubernetes-dashboard
sessionAffinity: None
type: ClusterIP
$ kubectl get svc -n kubernetes-dashboard kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard ClusterIP 11.19.103.247 <none> 443/TCP,8080/TCP 3h39m
卸载dashboard
kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml