4-5-k8s组件-dashboard
1.部署web服务 dashboard
github网站: GitHub - kubernetes/dashboard: General-purpose web UI for Kubernetes clusters

新版本的dashboard, 需要使用helm命令安装对应的软件包。 Helm 是 Kubernetes 的包管理器
官网安装使用手册: Helm | 安装Helm
安装
helmroot@kubeadm-master1:~# snap install --classic helm helm 3.14.4 from Snapcrafters✪ installed安装对应
dashboard。这个安装命令可以在dashboard的github简介页面看到
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/ helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard命令运行完成之后可以查看对应的服务
root@kubeadm-master1:~# kubectl get svc -A NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default kubernetes ClusterIP 10.20.0.1 <none> 443/TCP 19h kube-system kube-dns ClusterIP 10.20.0.10 <none> 53/UDP,53/TCP,9153/TCP 19h kubernetes-dashboard kubernetes-dashboard-api ClusterIP 10.20.30.89 <none> 8000/TCP 38m kubernetes-dashboard kubernetes-dashboard-auth ClusterIP 10.20.46.203 <none> 8000/TCP 38m kubernetes-dashboard kubernetes-dashboard-kong-manager NodePort 10.20.115.164 <none> 8002:30133/TCP,8445:30703/TCP 38m kubernetes-dashboard kubernetes-dashboard-kong-proxy ClusterIP 10.20.125.238 <none> 443/TCP 38m kubernetes-dashboard kubernetes-dashboard-metrics-scraper ClusterIP 10.20.51.239 <none> 8000/TCP 38m kubernetes-dashboard kubernetes-dashboard-web ClusterIP 10.20.215.169 <none> 8000/TCP 38m 默认
Dashboard只能集群内部访问 , 修改Service为NodePort类型 , 暴露到外部用于访问dashboardroot@kubeadm-master1:~# kubectl edit svc -n kubernetes-dashboard kubernetes-dashboard-kong-proxy对应
type修改为NodePort, 这里通过nodeport: 30976, 指定暴露出来的端口
之后检查是否生效

创建临时
tokencat > dashboard-user.yaml << EOF apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard EOF kubectl apply -f dashboard-user.yaml # 创建token kubectl -n kubernetes-dashboard create token admin-user root@kubeadm-master1:~# kubectl -n kubernetes-dashboard create token admin-user eyJhbGciOiJSUzI1NiIsImtpZCI6Im53Z3NxQnBSRlJEQ19NclV5S3dMUkNGUEVITEt2c1lxZC1QUS1BajNEaTAifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNiZWFyLmxvY2FsIl0sImV4cCI6MTcxNDgyNTA0NSwiaWF0IjoxNzE0ODIxNDQ1LCJpc3MiOiJodHRwczovL2t1YmVybmV0ZXMuZGVmYXVsdC5zdmMuY2JlYXIubG9jYWwiLCJrdWJlcm5ldGVzLmlvIjp7Im5hbWVzcGFjZSI6Imt1YmVybmV0ZXMtZGFzaGJvYXJkIiwic2VydmljZWFjY291bnQiOnsibmFtZSI6ImFkbWluLXVzZXIiLCJ1aWQiOiJiZjA5NTFlZC0xZTNkLTRjODMtYWQ5OC04ZDhiYmJkMTk4NTEifX0sIm5iZiI6MTcxNDgyMTQ0NSwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmFkbWluLXVzZXIifQ.LoNtMCxz8ayOUE_Y5d93gT2LRoCFWvxOITLlslTC8A5U_Iy9WYTnZBLfwADgkaN4XpNif5Cg-ea-W6k7dS19-D0guCVZTl8fjIIpqVwsX7Ptoh_MiwZWf5x2RFp1_78RJpBDYoTj-CsYEl7sa44Qq7UpgoehUS5H4BIi0X9JqufsUacLLXf_7ENrL4q64k_7svsBQhCvfV3O2bWRzvqiOxphAISWbtisY7IBmZhl9zKKuz0eJz0i4U4-AbMjmEtzNE4kPRDZoVO5EL82c4oz-63qbzN2mvbzUkj05t1hGt4BIK4d6Ny_ldGLYY_7SwHl_CLhtrDAfu5UsEwO06gPSw 创建长期
tokencat > dashboard-user-token.yaml << EOF apiVersion: v1 kind: Secret metadata: name: admin-user namespace: kubernetes-dashboard annotations: kubernetes.io/service-account.name: "admin-user" type: kubernetes.io/service-account-token EOF kubectl apply -f dashboard-user-token.yaml # 查看密码 kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d另外可以通过以下命令 : 创建service account并绑定默认cluster-admin管理员集群角色
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin kubectl describe secrets -n kube-system $(kubectl -n kubernetes-dashboard get secret | awk '/dashboard-admin/{print $1}')
将生成的临时
token复制到页面中。页面访问的端口是上面截图中生成的随机端口30976。使用集群中任意一个https://IP:30976即可。
之后页面登录成功

这里有两点需要说明
如果需要卸载已经通过helm安装好的dashboard,直接使用命令helm uninstall <deployment_name> --namespace <namespace_name> , 即直接运行helm uninstall kubernetes-dashboard --namespace kubernetes-dashboard即可。或者使用helm delete kubernetes-dashboard。
这个安装的是最新的7.3.2 版本。只有v7版本需要使用helm安装
root@kubeadm-master1:~# helm list --namespace kubernetes-dashboard
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
kubernetes-dashboard kubernetes-dashboard 1 2024-05-04 10:07:51.336904721 +0000 UTC deployed kubernetes-dashboard-7.3.2 之前版本对应v3.0.0-alpha0 、v2.7。对应的安装方式是直接使用以下命令安装即可。剩余安装步骤基本一致
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v3.0.0-alpha0/charts/kubernetes-dashboard.yaml2. dashboard访问
Kubernetes Dashboard是 Kubernetes 的官方 Web UI. 通过Kubernetes Dashboard, 我们可以方便地管理资源和部署应用. 从 dashboard-1.7.x 起, 只允许 localhost 访问. 那么如何方便从本地访问dashboard呢? 本文介绍几种方案.
下面这一段是网上内容。唯一和实际的区别是访问的url
http://127.0.0.1:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard-kong-proxy:443/proxy/#/login
这里的443端口需要和services的端口对应
root@kubeadm-master1:~# kubectl get services -o wide -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes-dashboard-api ClusterIP 10.20.186.86 <none> 8000/TCP 35m app.kubernetes.io/instance=kubernetes-dashboard,app.kubernetes.io/name=kubernetes-dashboard-api,app.kubernetes.io/part-of=kubernetes-dashboard
kubernetes-dashboard-auth ClusterIP 10.20.205.208 <none> 8000/TCP 35m app.kubernetes.io/instance=kubernetes-dashboard,app.kubernetes.io/name=kubernetes-dashboard-auth,app.kubernetes.io/part-of=kubernetes-dashboard
kubernetes-dashboard-kong-manager NodePort 10.20.172.128 <none> 8002:32603/TCP,8445:32156/TCP 35m app.kubernetes.io/component=app,app.kubernetes.io/instance=kubernetes-dashboard,app.kubernetes.io/name=kong
kubernetes-dashboard-kong-proxy ClusterIP 10.20.169.139 <none> 443/TCP 35m app.kubernetes.io/component=app,app.kubernetes.io/instance=kubernetes-dashboard,app.kubernetes.io/name=kong
kubernetes-dashboard-metrics-scraper ClusterIP 10.20.7.198 <none> 8000/TCP 35m app.kubernetes.io/instance=kubernetes-dashboard,app.kubernetes.io/name=kubernetes-dashboard-metrics-scraper,app.kubernetes.io/part-of=kubernetes-dashboard
kubernetes-dashboard-web ClusterIP 10.20.31.132 <none> 8000/TCP 35m app.kubernetes.io/instance=kubernetes-dashboard,app.kubernetes.io/name=kubernetes-dashboard-web,app.kubernetes.io/part-of=kubernetes-dashboard2.1 本地安装了 kubectl, 并且可以直接访问到 master 的 IP
如果本地(工作电脑)上安装了 kubectl, 并且可以直接访问到 master 的 IP, 那么就很简单, 可以直接在本地启动 k8s proxy:
# 前台启动, 注意会占用终端窗口
kubectl proxy2.2 本地没有安装 kubectl, 但是可以直接访问到 master 的 IP
如果本地没有安装 kubectl, 但是可以直接访问到 master 的 IP, 那么可以在 master (假设 hostname 为 ttg12, 当然也可以是集群内任意一台安装了 kubectl 的机器, 这里为了简便就简化到 master 上, 下同) 上开启 k8s proxy:
kubectl proxy --address='0.0.0.0' --accept-hosts='^\*$' &这时候我们可以访问到 Dashboard 的登录页面, http://ttg12:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/, 但是如果我们选择 "Token" 模式, 并输入上面记录的token, 点击"Sign in", 心里默数三下, 等待进入期待已久的主页面...
然后事实却是, 你数了10遍1-2-3, 页面还是没有任何反应.
于是你想到按下F12, 打开浏览器的调试窗口"Networking". 发现登录是登录成功了, 但是config接口却返回了状态401.

原因是, 即便 proxy 允许外网访问, 但是从 dashboard-1.7.x 起, 只允许 localhost 访问. Github 有人提过 issue, 但是回复说这是 feature, 不是 bug, 怪只怪初学者不懂的太多.
所以, 我们需要通过端口转发来访问localhost. 有如下2种方法.
2.2.1 方法一: kubectl port-forward
注意: 这种方法适合有正式ssl证书的情况. 如果没有, 先用方法二进行访问.
In an environment where one needs to access the dashboard from another host than the
kubectl proxy's localhost, one can run:kubectl port-forward --namespace kubernetes-dashboard service/kubernetes-dashboard 10443:443 --address 0.0.0.0to access the dashboard through HTTPS
然后访问: https://ttg12:10443
不过因为测试环境没有正式的ssl证书, 所以浏览器会拒绝访问. 需要采用方法二.
2.2.2 方法二: ssh端口转发
在工作电脑(需要能 ssh 连接 k8s master)上, 使用以下命令转发端口:
$ ssh -L localhost:8001:localhost:8001 -NT faceless@ttg12
faceless@ttg12's password:输入master机器faceless账号的登录密码后, 转发成功.
然后通过如下本地地址访问: http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
终于见到 Dashboard 主页本尊.

2.3 本地没有安装 kubectl, 且不可直接访问到 master 的 IP
这种情况一般是 k8s 集群完全在内网, 日常访问通过跳板机进行, 这也是生产环境正常的状态. 这种情况下, 我们有2种方案.
2.3.1 在跳板机启动 kube-proxy, 然后本地 ssh 端口转发
首先在跳板机上启动 kube-proxy (假设跳板机的 hostname 是 ttg11):
kubectl proxy --address='0.0.0.0' --accept-hosts='^\*$' &然后本地 ssh 端口转发到跳板机:
ssh -L localhost:8001:localhost:8001 -NT weiping@ttg11然后通过如下本地地址访问: http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
2.3.2 本地直接通过跳板机 ssh 端口转发到 k8s master
首先在 k8s master (或内网上的其他机器) 上启动 kube-proxy (假定 k8s master的 hostname 是 ttg12):
kubectl proxy --address='0.0.0.0' --accept-hosts='^\*$' &然后本地端口通过跳板机 (假设跳板机的 hostname 是 ttg11) ssh 转发到 k8s master 上:
# 格式为: ssh -L localhost:<本地使用端口>:<k8s-master-IP或域名>:<k8s-master-port> -NT <跳板机登录账户>@<跳板机IP或域名>
ssh -L localhost:8001:ttg12:8001 -NT weiping@ttg11然后通过如下本地地址访问: http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
2.4 登录方式
创建
ServiceAccount,根据其管理目标,使用rolebinding或clusterrolebinding绑定至合理role或clusterrole;获取到此
ServiceAccount的secret,查看secret的详细信息,其中就有token;生成
kubeconfig文件kubectl config set-cluster --kubeconfig=/PATH/TO/SOMEFILE kubectl config set-credentials NAME --token=$KUBE_TOKEN --kubeconfig=/PATH/TO/SOMEFILE kubectl config set-context kubectl config use-context
使用实例如下:
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kubernetes-dashboard get secret | awk '/dashboard-admin/{print $1}')
$ kubectl create serviceaccount dashboard -n kubernetes-dashboard
$ kubectl create rolebinding def-ns-admin --clusterrole=admin --serviceaccount=default:def-ns-admin
$ kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard
$ kubectl describe sa dashboard -n kubernetes-dashboard
Name: dashboard
Namespace: kubernetes-dashboard
Labels: <none>
Annotations: <none>
Image pull secrets: <none>
Mountable secrets: dashboard-token-vtncb
Tokens: dashboard-token-vtncb
Events: <none>
$ kubectl describe secret dashboard-token-vtncb -n kubernetes-dashboard创建kubeconfig认证文件
root@harbor:~# DASH_TOCKEN=$(kubectl -n kube-system get secret admin-user -o jsonpath={.data.token} |base64 -d)
root@harbor:~# kubectl config set-cluster cluster1 --server=192.168.71.150:6443 --kubeconfig=/usr/local/src/dashbord-admin.conf
Cluster "cluster1" set.
root@harbor:~# kubectl config set-credentials dashboard-admin --token=$DASH_TOCKEN --kubeconfig=/usr/local/src/dashbord-admin.conf
User "dashboard-admin" set.
root@harbor:~# kubectl config set-context dashboard-admin@cluster1 --cluster=kubernetes --user=dashboard-admin --kubeconfig=/usr/local/src/dashbord-admin.conf
Context "dashboard-admin@cluster1" created.
root@harbor:~# kubectl config set-context dashboard-admin@cluster1 --cluster=cluster1 --user=dashboard-admin --kubeconfig=/usr/local/src/dashbord-admin.conf
Context "dashboard-admin@cluster1" modified.
root@harbor:~# kubectl config use-context dashboard-admin@cluster1 --kubeconfig=/usr/local/src/dashbord-admin.conf
Switched to context "dashboard-admin@cluster1".
root@harbor:~#