1、创建命名空间

在 Kubernetes 中,命名空间(Namespace)是一种非常重要的资源管理方式,它能够将不同的业务、项目或者团队的资源隔离开来,避免资源之间的冲突。接下来,我们将创建一个名为 kubernetes-dashboard 的命名空间,用于部署 Kubernetes Dashboard。

1
2
kubectl create ns kubernetes-dashboard
alias kd='kubectl -n kubernetes-dashboard'

上述命令中,kubectl create ns kubernetes-dashboard 用于创建 kubernetes-dashboard 命名空间。而 alias kd=‘kubectl -n kubernetes-dashboard’ 则是为了方便后续操作,创建了一个别名 kd,这样在后续的命令中,我们可以直接使用 kd 来代表在 kubernetes-dashboard 命名空间下执行命令。更多关于命名空间的详细介绍,可以参考Kubernetes 命名空间官方文档

2、编辑YAML

在部署 Kubernetes Dashboard 之前,我们需要编辑一个 YAML 文件来定义相关的资源。YAML 文件是 Kubernetes 中用于描述资源配置的常用文件格式,通过它可以精确地定义我们需要部署的资源的各种属性。

执行上述命令后,会打开一个文本编辑器,我们可以在其中编写或者修改 kubernetes-dashboard.yaml 文件的内容。下面是编辑该文件时可能涉及的一些关键内容及对应的配置示例:

1
vi kubernetes-dashboard.yaml

编辑过程中可能会遇到各种问题,例如语法错误等,你可以参考Kubernetes YAML 语法指南来确保文件的正确性。编辑完成后的文件示例截图如下:

在这里插入图片描述
在这里插入图片描述

3、部署Pod

当 YAML 文件编辑完成后,我们就可以使用 kubectl apply 命令来部署相关的资源了。该命令会根据 YAML 文件中的定义,在 Kubernetes 集群中创建或更新相应的资源。

1
kubectl apply -f kubernetes-dashboard.yaml

执行上述命令后,可能会出现如下提示信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
namespace/kubernetes-dashboard configured
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created

从输出信息中可以看到,Kubernetes 依次创建或配置了命名空间、服务账户、服务、密钥、配置映射、角色、集群角色、角色绑定、集群角色绑定、部署和指标收集服务等资源。更多关于 kubectl apply 命令的详细用法,可以参考Kubectl 命令官方文档。

4、查看资源

部署完成后,我们可以使用 kubectl get 命令来查看在 kubernetes-dashboard 命名空间下部署的 Pod 和服务的详细信息。

1
kubectl get pod,svc -n kubernetes-dashboard -o wide

该命令会以详细的格式输出 kubernetes-dashboard 命名空间下的所有 Pod 和服务的信息,包括 Pod 的名称、状态、所在节点、IP 地址,以及服务的名称、类型、IP 地址、端口等信息。通过查看这些信息,我们可以确认资源是否成功部署,以及资源的运行状态是否正常。

5、生产Token

为了能够登录 Kubernetes Dashboard 的 Web 界面,我们需要生成一个有效的 Token。Token 是一种身份验证的凭证,用于验证用户的身份,确保只有授权的用户能够访问 Dashboard。

1
kubectl describe -n kube-system  $(kubectl -n  kube-system get secret -n kube-system  -o name  | grep namespace) | grep token

上述命令会在 kube-system 命名空间下查找与命名空间相关的密钥,并从中提取出 Token 信息。生成的 Token 是一串长字符串,我们需要妥善保存,后续登录 Dashboard 时会用到。更多关于 Kubernetes 身份验证和 Token 的详细内容,可以参考Kubernetes 身份验证官方文档。

6、Web界面访问

注意:一定是https,否则无法访问

在访问 Kubernetes Dashboard 的 Web 界面时,需要注意一定要使用 https 协议,否则将无法正常访问。这是因为 Dashboard 默认配置了安全的访问方式,使用 https 可以确保数据在传输过程中的安全性。

在访问之前,我们可以先检查一下网络连接是否正常。可以使用以下命令来查看 Pod 的详细信息和端口监听情况

1
2
3
4
5
kd get pod -o wide

netstat -aptn|grep 311

telnet ip地址 31111

kd get pod -o wide 命令用于查看 kubernetes-dashboard 命名空间下所有 Pod 的详细信息,包括 Pod 的 IP 地址、所在节点等。netstat -aptn|grep 311 命令用于查看系统中是否有进程监听 311 相关的端口。telnet ip地址 31111 命令用于测试与指定 IP 地址和端口的网络连接是否正常。如果这些命令执行后没有出现错误,说明网络连接正常,可以尝试访问 Dashboard 的 Web 界面。

访问登录页面

打开浏览器,输入 https://ip地址:31111/ (将ip地址 替换为实际的 IP 地址),即可打开 Kubernetes Dashboard 的登录页面。在登录页面中,输入之前生成的 Token,然后点击登录按钮,即可登录到 Dashboard。

在这里插入图片描述

查看资源

登录成功后,我们可以在 Dashboard 中查看各种资源的详细信息。Dashboard 提供了直观的界面,方便我们查看 Pod、服务、部署等资源的状态、配置信息等。
在这里插入图片描述

编辑资源

除了查看资源,我们还可以在 Dashboard 中直接编辑资源的配置信息。通过点击相应资源的编辑按钮,我们可以修改资源的各种属性,例如 Pod 的副本数量、服务的端口配置等。
在这里插入图片描述

查看日志

在排查问题或者监控应用程序运行状态时,查看 Pod 的日志信息是非常重要的。在 Dashboard 中,我们可以方便地查看每个 Pod 的日志内容,帮助我们快速定位和解决问题。
在这里插入图片描述

7、使用体验

优点:

1、功能相对全面

Kubernetes Dashboard 提供了丰富的功能,涵盖了资源的查看、编辑、监控、日志查看等多个方面,能够满足我们日常对 Kubernetes 集群进行管理和运维的大部分需求。无论是查看 Pod 的运行状态,还是对部署进行滚动更新,都可以在 Dashboard 中方便地完成。

2、UI简介

Dashboard 的用户界面设计简洁明了,易于上手。即使是对 Kubernetes 不太熟悉的用户,也能够快速找到自己需要的功能入口,通过直观的界面操作来完成各种管理任务。

8、附录:部署文件

以下是完整的 kubernetes-dashboard.yaml 部署文件示例,你可以根据实际需求进行调整和修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
# Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: v1
kind: Namespace
metadata:
name: kubernetes-dashboard

---

apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard

---

kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 31111
selector:
k8s-app: kubernetes-dashboard

---

apiVersion: v1
kind: Secret
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-certs
namespace: kubernetes-dashboard
type: Opaque

---

apiVersion: v1
kind: Secret
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-csrf
namespace: kubernetes-dashboard
type: Opaque
data:
csrf: ""

---

apiVersion: v1
kind: Secret
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-key-holder
namespace: kubernetes-dashboard
type: Opaque

---

kind: ConfigMap
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-settings
namespace: kubernetes-dashboard

---

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
rules:
# Allow Dashboard to get, update and delete Dashboard exclusive secrets.
- apiGroups: [""]
resources: ["secrets"]
resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]
verbs: ["get", "update", "delete"]
# Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
- apiGroups: [""]
resources: ["configmaps"]
resourceNames: ["kubernetes-dashboard-settings"]
verbs: ["get", "update"]
# Allow Dashboard to get metrics.
- apiGroups: [""]
resources: ["services"]
resourceNames: ["heapster", "dashboard-metrics-scraper"]
verbs: ["proxy"]
- apiGroups: [""]
resources: ["services/proxy"]
resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"]
verbs: ["get"]

---

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
rules:
# Allow Metrics Scraper to get metrics from the Metrics server
- apiGroups: ["metrics.k8s.io"]
resources: ["pods", "nodes"]
verbs: ["get", "list", "watch"]

---

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: kubernetes-dashboard
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kubernetes-dashboard

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kubernetes-dashboard
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kubernetes-dashboard

---

kind: Deployment
apiVersion: apps/v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: kubernetes-dashboard
template:
metadata:
labels:
k8s-app: kubernetes-dashboard
spec:
containers:
- name: kubernetes-dashboard
image: registry.cn-beijing.aliyuncs.com/qingfeng666/dashboard:v2.0.4
imagePullPolicy: Always
ports:
- containerPort: 8443
protocol: TCP
args:
- --auto-generate-certificates
- --namespace=kubernetes-dashboard
# 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:port
volumeMounts:
- name: kubernetes-dashboard-certs
mountPath: /certs
# Create on-disk volume to store exec logs
- mountPath: /tmp
name: tmp-volume
livenessProbe:
httpGet:
scheme: HTTPS
path: /
port: 8443
initialDelaySeconds: 30
timeoutSeconds: 30
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsUser: 1001
runAsGroup: 2001
volumes:
- name: kubernetes-dashboard-certs
secret:
secretName: kubernetes-dashboard-certs
- name: tmp-volume
emptyDir: {}
serviceAccountName: kubernetes-dashboard
nodeSelector:
"kubernetes.io/os": linux
# Comment the following tolerations if Dashboard must not be deployed on master
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule

---

kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: dashboard-metrics-scraper
name: dashboard-metrics-scraper
namespace: kubernetes-dashboard
spec:
ports:
- port: 8000
targetPort: 8000
selector:
k8s-app: dashboard-metrics-scraper

---

kind: Deployment
apiVersion: apps/v1
metadata:
labels:
k8s-app: dashboard-metrics-scraper
name: dashboard-metrics-scraper
namespace: kubernetes-dashboard
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: dashboard-metrics-scraper
template:
metadata:
labels:
k8s-app: dashboard-metrics-scraper
annotations:
seccomp.security.alpha.kubernetes.io/pod: 'runtime/default'
spec:
containers:
- name: dashboard-metrics-scraper
image: registry.cn-beijing.aliyuncs.com/qingfeng666/metrics-scraper:v1.0.4
ports:
- containerPort: 8000
protocol: TCP
livenessProbe:
httpGet:
scheme: HTTP
path: /
port: 8000
initialDelaySeconds: 30
timeoutSeconds: 30
volumeMounts:
- mountPath: /tmp
name: tmp-volume
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsUser: 1001
runAsGroup: 2001
serviceAccountName: kubernetes-dashboard
nodeSelector:
"kubernetes.io/os": linux
# Comment the following tolerations if Dashboard must not be deployed on master
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
volumes:
- name: tmp-volume
emptyDir: {}