Dashboard 是基于网页的 Kubernetes 用户界面。您可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。您可以使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源(如 Deployment,Job,DaemonSet 等等)。例如,您可以对 Deployment 实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用。
Dashboard 同时展示了 Kubernetes 集群中的资源状态信息和所有报错信息。
网页界面 (Dashboard) - 图5

部署 Dashboard UI

默认情况下不会部署 Dashboard。可以通过以下命令部署:

  1. kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml

https://github.com/kubernetes/dashboard/blob/master/aio/deploy/recommended.yaml
image.png

访问 Dashboard UI

为了保护您的集群数据,默认情况下,Dashboard 会使用最少的 RBAC 配置进行部署。 当前,Dashboard 仅支持使用 Bearer 令牌登录。 要为此样本演示创建令牌,您可以按照创建示例用户上的指南进行操作。

警告: 在教程中创建的样本用户将具有管理特权,并且仅用于教育目的。

https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md

创建用户

如上图,跳转到了登录页面,那我们就先创建个用户:

1.创建服务账号

首先创建一个叫admin-user的服务账号,并放在kube-system名称空间下:

  1. # admin-user.yaml
  2. apiVersion: v1
  3. kind: ServiceAccount
  4. metadata:
  5. name: admin-user
  6. namespace: kube-system

执行kubectl create命令:

kubectl create -f admin-user.yaml

image.png

2.绑定角色

默认情况下,kubeadm创建集群时已经创建了admin角色,我们直接绑定即可:

# admin-user-role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system

执行kubectl create命令:

kubectl create -f  admin-user-role-binding.yaml

image.png

3.获取Token

现在我们需要找到新创建的用户的Token,以便用来登录dashboard:

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

image.png
输出类似:

Name:         admin-user-token-plzkf
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: admin-user
              kubernetes.io/service-account.uid: 3b2d4aca-b977-48df-9690-9c658bf606e5

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6ImVHbm9iSWxKYkFvM2VnMi0taDdRSGRyMUFMREVwS0VVNXB6ZEZEWHk1MDQifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXBsemtmIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIzYjJkNGFjYS1iOTc3LTQ4ZGYtOTY5MC05YzY1OGJmNjA2ZTUiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.AQ7UEfrXgYahFF9ar9pW6ztxX08BAuFAF3V2vNZAyQDqvLvWX3LR4ER1VJuKUuczZChweqrNbT9kuwwrlF3aZGV0BaWEIndgNnW_IjNoRtTYdkrweoo0LVrDvc2NeNJbDJQVuFO7OORG7Tlj8gwBS0bRjapWh0vmzirY5ut8q0bh30gOE1a2GsQuXXTm4I207LpVICdS1O5lr2-zTChTh4YGcSCcYOBkxcCncpM3FPhcZqPFTIVwPR96XWjUORM1h79AeMbHsyzo8758srOqDRXO0R_Xgh5PrKPqMdGzZbhRqJl5Oy_khoz9bez3b27JKwfkdOyyvTifYlPlzyMeQA

然后把Token复制到登录界面的Token输入框中,登入后显示如下:

命令行代理

您可以使用 kubectl 命令行工具访问 Dashboard,命令如下:

kubectl proxy

kubectl 会使得 Dashboard 可以通过 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ 访问。
UI 只能 通过执行这条命令的机器进行访问。更多选项参见 kubectl proxy --help

注意: Kubeconfig 身份验证方法不支持外部身份提供程序或基于 x509 证书的身份验证。

我们也可以使用--address--accept-hosts参数来允许外部访问:

kubectl proxy --address='0.0.0.0'  --accept-hosts='^*$'

image.png
然后我们在外网访问http://<master-ip>:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/,可以成功访问到登录界面,但是却无法登录,这是因为Dashboard只允许localhost127.0.0.1使用HTTP连接进行访问,而其它地址只允许使用HTTPS。因此,如果需要在非本机访问Dashboard的话,只能选择其他访问方式。

欢迎界面

当访问空集群的 Dashboard 时,您会看到欢迎界面。页面包含一个指向此文档的链接,以及一个用于部署第一个应用程序的按钮。此外,您可以看到在默认情况下有哪些默认系统应用运行在 kube-system 命名空间 中,比如 Dashboard 自己。
image.png

kubectl 命令行

https://kubernetes.io/zh/docs/reference/kubectl/cheatsheet/

# get 命令的基本输出
kubectl get services                          # 列出当前命名空间下的所有 services
kubectl get pods --all-namespaces             # 列出所有命名空间下的全部的 Pods
kubectl get pods -o wide                      # 列出当前命名空间下的全部 Pods,并显示更详细的信息
kubectl get deployment my-dep                 # 列出某个特定的 Deployment
kubectl get pods                              # 列出当前命名空间下的全部 Pods
kubectl get pod my-pod -o yaml                # 获取一个 pod 的 YAML

# describe 命令的详细输出
kubectl describe nodes my-node
kubectl describe pods my-pod

# 列出当前名字空间下所有 Services,按名称排序
kubectl get services --sort-by=.metadata.name

# 列出 Pods,按重启次数排序
kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'

# 列举所有 PV 持久卷,按容量排序
kubectl get pv --sort-by=.spec.capacity.storage

# 获取包含 app=cassandra 标签的所有 Pods 的 version 标签
kubectl get pods --selector=app=cassandra -o \
  jsonpath='{.items[*].metadata.labels.version}'

# 获取所有工作节点(使用选择器以排除标签名称为 'node-role.kubernetes.io/master' 的结果)
kubectl get node --selector='!node-role.kubernetes.io/master'

# 获取当前命名空间中正在运行的 Pods
kubectl get pods --field-selector=status.phase=Running

# 获取全部节点的 ExternalIP 地址
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'

# 列出属于某个特定 RC 的 Pods 的名称
# 在转换对于 jsonpath 过于复杂的场合,"jq" 命令很有用;可以在 https://stedolan.github.io/jq/ 找到它。
sel=${$(kubectl get rc my-rc --output=json | jq -j '.spec.selector | to_entries | .[] | "\(.key)=\(.value),"')%?}
echo $(kubectl get pods --selector=$sel --output=jsonpath={.items..metadata.name})

# 显示所有 Pods 的标签(或任何其他支持标签的 Kubernetes 对象)
kubectl get pods --show-labels

# 检查哪些节点处于就绪状态
JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' \
 && kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True"

# 列出被一个 Pod 使用的全部 Secret
kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq

# 列举所有 Pods 中初始化容器的容器 ID(containerID)
# Helpful when cleaning up stopped containers, while avoiding removal of initContainers.
kubectl get pods --all-namespaces -o jsonpath='{range .items[*].status.initContainerStatuses[*]}{.containerID}{"\n"}{end}' | cut -d/ -f3

# 列出事件(Events),按时间戳排序
kubectl get events --sort-by=.metadata.creationTimestamp

# 比较当前的集群状态和假定某清单被应用之后的集群状态
kubectl diff -f ./my-manifest.yaml

列出当前命名空间下的所有 services

# get 命令的基本输出
kubectl get services

image.png

列出所有命名空间下的全部的 Pods

kubectl get pods --all-namespaces

image.png

https://github.com/kubernetes/dashboard/blob/master/docs/user/accessing-dashboard/README.md#login-not-available

部署容器化应用

通过一个简单的部署向导,您可以使用 Dashboard 将容器化应用作为一个 Deployment 和可选的 Service 进行创建和部署。可以手工指定应用的详细配置,或者上传一个包含应用配置的 YAML 或 JSON 文件。
点击任何页面右上角的 创建 按钮以开始。

指定应用的详细配置

部署向导需要您提供以下信息:

  • 应用名称(必填):应用的名称。内容为应用名称标签 会被添加到任何将被部署的 Deployment 和 Service。

在选定的 Kubernetes 命名空间 中,应用名称必须唯一。必须由小写字母开头,以数字或者小写字母结尾,并且只含有小写字母、数字和中划线(-)。小于等于24个字符。开头和结尾的空格会被忽略。

  • 容器镜像(必填):公共镜像仓库上的 Docker 容器镜像 或者私有镜像仓库(通常是 Google Container Registery 或者 Docker Hub)的 URL。容器镜像参数说明必须以冒号结尾。
  • pod 的数量(必填):您希望应用程序部署的 Pod 的数量。值必须为正整数。

系统会创建一个 Deployment 用于保证集群中运行了期望的 Pod 数量。

  • 服务(可选):对于部分应用(比如前端),您可能想对外暴露一个 Service ,这个 Service(外部 Service)可能用的是集群之外的公网 IP 地址。对于外部 Service 的情况,需要开放一个或者多个端口来满足。更多信息请参考 这里

其它只能对集群内部可见的 Service 称为内部 Service。
不管哪种 Service 类型,如果您选择创建一个 Service,而且容器在一个端口上开启了监听(入向的),那么您需要定义两个端口。创建的 Service 会把(入向的)端口映射到容器可见的目标端口。该 Service 会把流量路由到您部署的 Pod。支持的协议有 TCP 和 UDP。这个 Service 的内部 DNS 解析名就是之前您定义的应用名称的值。
如果需要,您可以打开 高级选项 部分,这里您可以定义更多设置:

  • 描述:这里您输入的文本会作为一个 注解 添加到 Deployment,并显示在应用的详细信息中。
  • 标签:应用默认使用的 标签 是应用名称和版本。您可以为 Deployment、Service(如果有)定义额外的标签,比如 release(版本)、environment(环境)、tier(层级)、partition(分区) 和 release track(版本跟踪)。

例子:

release=1.0
tier=frontend
environment=pod
track=stable
  • 命名空间:Kubernetes 支持多个虚拟集群依附于同一个物理集群。这些虚拟集群被称为 命名空间,可以让您将资源划分为逻辑命名的组。

Dashboard 通过下拉菜单提供所有可用的命名空间,并允许您创建新的命名空间。命名空间的名称最长可以包含 63 个字母或数字和中横线(-),但是不能包含大写字母。
命名空间的名称不能只包含数字。如果名字被设置成一个数字,比如 10,pod 就
在 namespace 创建成功的情况下,默认会使用新创建的命名空间。如果创建失败,那么第一个命名空间会被选中。

  • 镜像拉取 Secret:如果要使用私有的 Docker 容器镜像,需要拉取 secret 凭证。

Dashboard 通过下拉菜单提供所有可用的 secret,并允许您创建新的 secret。secret 名称必须遵循 DNS 域名语法,比如 new.image-pull.secret。secret 的内容必须是 base64 编码的,并且在一个 .dockercfg 文件中声明。secret 名称最大可以包含 253 个字符。
在镜像拉取 secret 创建成功的情况下,默认会使用新创建的 secret。如果创建失败,则不会使用任何 secret。

  • CPU 需求(核数)和内存需求(MiB):您可以为容器定义最小的 资源限制。默认情况下,Pod 没有 CPU 和内存限制。
  • 运行命令运行命令参数:默认情况下,您的容器会运行 Docker 镜像的默认 入口命令。您可以使用 command 选项覆盖默认值。
  • 以特权运行:这个设置决定了在 特权容器 中运行的进程是否像主机中使用 root 运行的进程一样。特权容器可以使用诸如操纵网络堆栈和访问设备的功能。
  • 环境变量:Kubernetes 通过 环境变量 暴露 Service。您可以构建环境变量,或者将环境变量的值作为参数传递给您的命令。它们可以被应用用于查找 Service。值可以通过 $(VAR_NAME) 语法关联其他变量。

    上传 YAML 或者 JSON 文件

    Kubernetes 支持声明式配置。所有的配置都存储在遵循 Kubernetes API 架构的 YAML 或者 JSON 配置文件中。
    作为一种替代在部署向导中指定应用详情的方式,您可以在 YAML 或者 JSON 文件中定义应用,并且使用 Dashboard 上传文件:

    使用 Dashboard

    以下各节描述了 Kubernetes Dashboard UI 视图;包括它们提供的内容,以及怎么使用它们。

    导航栏

    当在集群中定义 Kubernetes 对象时,Dashboard 会在初始视图中显示它们。默认情况下只会显示 默认 命名空间中的对象,可以通过更改导航栏菜单中的命名空间筛选器进行改变。
    Dashboard 展示大部分 Kubernetes 对象,并将它们分组放在几个菜单类别中。

    管理概述

    集群和命名空间管理的视图, Dashboard 会列出节点、命名空间和持久卷,并且有它们的详细视图。节点列表视图包含从所有节点聚合的 CPU 和内存使用的度量值。详细信息视图显示了一个节点的度量值,它的规格、状态、分配的资源、事件和这个节点上运行的 Pod。

    负载

    显示选中的命名空间中所有运行的应用。视图按照负载类型(如 Deployment、ReplicaSet、StatefulSet 等)罗列应用,并且每种负载都可以单独查看。列表总结了关于负载的可执行信息,比如一个 ReplicaSet 的准备状态的 Pod 数量,或者目前一个 Pod 的内存使用量。
    工作负载的详情视图展示了对象的状态、详细信息和相互关系。例如,ReplicaSet 所控制的 Pod,或者 Deployment 关联的 新 ReplicaSet 和 Pod 水平扩展控制器。

    服务

    展示允许暴露给外网服务和允许集群内部发现的 Kubernetes 资源。因此,Service 和 Ingress 视图展示他们关联的 Pod、给集群连接使用的内部端点和给外部用户使用的外部端点。

    存储

    存储视图展示持久卷申领(PVC)资源,这些资源被应用程序用来存储数据。

    配置

    展示的所有 Kubernetes 资源是在集群中运行的应用程序的实时配置。通过这个视图可以编辑和管理配置对象,并显示那些默认隐藏的 secret。

    日志查看器

    Pod 列表和详细信息页面可以链接到 Dashboard 内置的日志查看器。查看器可以钻取属于同一个 Pod 的不同容器的日志。
    网页界面 (Dashboard) - 图14

    接下来

    更多信息,参见 Kubernetes Dashboard 项目页面.
    https://kubernetes.io/zh/docs/tasks/access-application-cluster/web-ui-dashboard