Dashboard简介
在 Kubernetes 社区中,有一个很受欢迎的 Dashboard 项目,它可以给用户提供一个可视化的 Web 界面来查看当前集群的各种信息。用户可以用 Kubernetes Dashboard 部署容器化的应用、监控应用的状态、执行故障排查任务以及管理 Kubernetes 各种资源。
部署Dashboard
官方文档:
https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/
项目地址:
https://github.com/kubernetes/dashboard
helm 地址:
https://artifacthub.io/packages/helm/k8s-dashboard/kubernetes-dashboard
https://github.com/kubernetes/dashboard/tree/master/aio/deploy/helm-chart/kubernetes-dashboard
注意确认dashboard版本与kubernetes版本兼容性:
https://github.com/kubernetes/dashboard/releases
添加helm repo
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
安装dashboard
helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard \
--namespace kubernetes-dashboard \
--create-namespace \
--set replicaCount=2 \
--set service.type=NodePort \
--set service.nodePort=30080 \
--set resources.limits.cpu=200m
查看dashboard运行状态,以deployment方式部署,运行2副本pod及1个service:
[root@iZj6cc0krt5qucp7c4truyZ ~]# kubectl -n kubernetes-dashboard get pods
NAME READY STATUS RESTARTS AGE
kubernetes-dashboard-796f4764c9-b55bb 1/1 Running 0 9m51s
kubernetes-dashboard-796f4764c9-b7qwj 1/1 Running 0 31s
[root@iZj6cc0krt5qucp7c4truyZ ~]# kubectl -n kubernetes-dashboard get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard NodePort 10.233.22.92 <none> 443:30080/TCP 9m58s
Dashboard 支持 Kubeconfig 和 Token 两种认证方式,这里选择Token认证方式登录,默认serviceaccount只有读权限,这里创建admin用户。
官方参考文档:https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/README.md
创建dashboard-admin.yaml:
cat > dashboard-admin.yaml << EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard
namespace: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kubernetes-dashboard
EOF
创建登录用户
kubectl apply -f dashboard-admin.yaml
查看admin-user账户的token
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/kubernetes-dashboard -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
登陆dashboard,由于使用nodeport方式暴露服务,访问方式为https://任意节点IP+NodePort
:
https://36.134.133.238:30080/
把获取到的Token复制到登录界面的Token输入框中:
成功登陆dashboard:
删除dashboard
helm -n kubernetes-dashboard uninstall kubernetes-dashboard
配置ingress及可信SSL证书
以上方式默认使用nodeport暴露服务,证书也为自签名证书,下面使用ingress暴露dashboard服务并使用可信SSL证书。
前提条件:
- 集群已部署ingress控制器,本次使用ingress-nginx-controller
- 公网可用域名,本次使用阿里云自有域名
dashboard.apps.cloudcele.com
- 公网SSL可信证书,本次使用acme.sh生成免费证书,有效期三个月,默认自动续期
证书申请:
# 安装acme.sh
curl https://get.acme.sh | sh -s email=willzhmic@outlook.com
#由于使用阿里云域名,可直接使用accessKEY调用阿里云API自动为域名签发证书
export Ali_Key="xxxxxx"
export Ali_Secret="xxxxxx"
# 注意申请的是泛域名证书,任何匹配 * 的域名都可使用该证书
acme.sh --issue --dns dns_ali -d apps.cloudcele.com -d *.apps.cloudcele.com
查看本地生成的证书
[root@localhost ~]# ll /root/.acme.sh/apps.cloudcele.com/
total 36
-rw-r--r-- 1 root root 2329 Sep 3 17:15 apps.cloudcele.com.cer
-rw-r--r-- 1 root root 591 Sep 3 17:15 apps.cloudcele.com.conf
-rw-r--r-- 1 root root 997 Sep 3 17:14 apps.cloudcele.com.csr
-rw-r--r-- 1 root root 178 Sep 3 17:14 apps.cloudcele.com.csr.conf
-rw-r--r-- 1 root root 1679 Sep 3 17:08 apps.cloudcele.com.key
-rw-r--r-- 1 root root 4399 Sep 3 17:15 ca.cer
-rw-r--r-- 1 root root 6728 Sep 3 17:15 fullchain.cer
在集群中创建secrets以引用证书,仅用到fullchain.cer
证书和apps.cloudcele.com.key
密钥两个文件:
cd /root/.acme.sh/apps.cloudcele.com/
kubectl -n kubernetes-dashboard create secret tls kubernetes-dashboard-tls \
--key ./apps.cloudcele.com.key \
--cert ./fullchain.cer
使用helm部署dashboard
helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard \
--namespace kubernetes-dashboard \
--create-namespace \
--version 2.0.3 \
--set replicaCount=2 \
--set service.type=ClusterIP \
--set resources.limits.cpu=200m \
--set ingress.enabled=true \
--set ingress.path=/ \
--set ingress.hosts[0]=dashboard.apps.cloudcele.com \
--set ingress.tls[0].hosts[0]=dashboard.apps.cloudcele.com \
--set ingress.tls[0].secretName=kubernetes-dashboard-tls
浏览器访问验证:
使用dashboard
创建示例deployment,使用nodeport向集群外暴露服务。
yaml编写参考:
https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/
https://kubernetes.io/docs/concepts/services-networking/service/#nodeport
默认视图在default命名空间,可自行切换namespace,点击右上角+号创建资源:
有三种方式创建资源,这里使用第一种方式部署一个简单的nginx-app,设置2个副本,nodePort方式暴露服务,粘贴已经编写好的yaml文件点击upload:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx-app
spec:
selector:
matchLabels:
run: my-nginx-app
replicas: 2
template:
metadata:
labels:
run: my-nginx-app
spec:
containers:
- name: my-nginx-app
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-nginx-app
labels:
run: my-nginx-app
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
targetPort: 80
nodePort: 30081
selector:
run: my-nginx-app
集群外浏览器访问应用:http://<node_ip>:30081
点击deployment可以增加应用副本,查看和更新yaml配置,以及删除整个应用:
点击pod可以查看pod实时打印日志以及下载日志到本地,也可以登录到pod命令行界面,进入容器执行命令进行调试,以及更新pod yaml文件或删除pod(重启):