「Kubernetes」- 部署 Dashboard 服务(Kubernetes v1.18.9)

  CREATED BY JENKINSBOT

问题描述

虽然很多复杂的操作还是要通过命令行来完成,但是通过图形化界面能够快速完成简单操作,而且操作更加友好、数据显示更加直观,这是命令行所无法相提并论的。

鉴于此,我们将在集群中部署 Dashboard 界面,实现对集群的资源的简单管理、显示正在运行的应用、查看资源状态、查看集群信息等等。但是 kubernetes/dashboard: General-purpose web UI for Kubernetes clusters 表示 Dashboard 只是用于完成简单通用的管理任务,更加复杂的操作还要通过其他组件来完成。

该笔记将记录:在 Kubernetes Cluster 中,如何安装部署 Dashboard 服务,并提供 HTTPS 访问,以及常见问题的处理方法。

解决方案

系统环境:Kubernetes Cluster v1.18.9

第一步、下载部署文件

根据 Releases · kubernetes/dashboard 描述,针对 Kubernetes 1.18 我们使用最新、最适合的 v2.0.3 版本。

下载 recommended.yaml 文件(如果无法下载,使用 ./recommended.yaml 文件)

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml

第二步、调整部署文件(可选)

结合自身需求与环境,修改部署文件:
1)修改镜像地址,以使用私有镜像仓库中的镜像:这需要我们拉取目标镜像,创建镜像标签并推送似有仓库;然后,修改 YAML 文件以使用私有镜像;
2)修改命名空间位置,将其部署到自定义的命名空间;

第三步、应用部署文件

# kubectl apply -f dashboard.yaml
namespace/kubernetes-dashboard created
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-dashboard 命令空间

第四步、登录仪表盘

在新版本的 Kubernetes Dashboard 中,出于安全考虑,从 Dashboard 1.10.1 开始不再提供 SKIP 按钮,所以通过 Dashboard 集群操作时,需要先创建 TOKEN。或为 Dashboard 指定 –enable-skip-login 选项。我们选择 TOKEN 登录,而不再使用 SKIP 按钮。

获取访问使用的 TOKEN 参数:

secret=$(kubectl get -n kube-system serviceaccounts deployment-controller -o jsonpath='{.secrets[0].name}')
kubectl get -n kube-system secrets $secret -o jsonpath='{.data.token}' | base64 -d

我们使用 kubectl port-forward 转发 dashboard 的 Service 端口,以快速测试(后面将使用 Ingress 来暴露服务):

# kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard --address 0.0.0.0 50443:443
Forwarding from 0.0.0.0:50443 -> 8443

使用 Firefox 访问 https://<hostname>:50443 并输入 TOKEN 参数,以进入 Dashboard 界面。因为证书是自签名的,而 Chrome 的安全策略又不同,因此使用 Chrome 可能无法访问 Dashboard 界面(甚至没有继续访问按钮)。不过,这里仅是测试,后面将介绍如何处理这些问题。

通过 Ingress 暴露 Dashboard 服务

为了允许外部访问,我们需要通过 Ingress 暴露 Dashboard 服务,以允许外部访问。鉴于我们使用 Nginx Ingress Controller 组件,因此后面的特殊配置也将基于此(因为可能有些配置与 Nginx Ingress Controller 相关)。

默认情况 Dashboard 监听 HTTPS 协议,而默认 Ingress 使用 HTTP 协议来请求 Dashboard 服务,这就导致连接失败。

针对该问题,有以下解决方案:
1)使 Dashboard 监听 HTTP 80 端口,这样 Ingress 便能够使用 HTTP 请求 Dashboard 服务;
2)将 HTTPS 连接直通 Dashboard 容器(即使用 SSL Passthrough 特性,这也需要进行更多的配置);

方法一、使 Dashboard 监听 HTTP 80 端口(废弃)

该方法虽然简单,但也许会降低安全性,请根据自身的需求进行取舍。我们未采用该方案,该方案会降低安全性(其实问题不大),也非官方推荐做法,此外我们想试试更加复杂的做法(有的时候技术选型完全是按照负责人的个人喜好,我们总是能找到这样做的其他借口)。

官方已经提供 alternative.yaml 配置来监听 HTTP 协议(如果无法下载,使用 ./alternative.yaml 文件):

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/alternative.yaml
kubectl apply -f alternative.yaml

定义 Ingress 资源(这里我们仅演示监听 HTTP 的 Ingress 资源):

cat > dashboard-ingress.yaml <<EOF
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kubernetes-dashboard
spec:
  rules:
  - host: k8s-dashboard.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: kubernetes-dashboard
          servicePort: 80
EOF

kubectl apply -f dashboard-ingress.yaml

使用浏览器访问 http://k8s-dashboard.example.com 并输入 TOKEN 参数,以进入 Dashboard 界面。

方法二、将 HTTPS 连接直通 Dashboard 容器(废弃)

这是我们采用的方法,但是该方法更加复杂,需要添加的配置也比较多:
1)部署 Nginx Ingress Controller 组件。
1)需要配置 Nginx Ingress Controller 的 SSL Passthrough 特性;
2)需要修改 Dashboard 的 SSL 证书,而不是使用自签名证书;

这是我们目前采用的方法,需要进行以下操作:

1)目前(05/26/2019),由于 Nginx Ingress Controller 默认禁用 SSL 直通,所以要修改它的资源定义(Daemonset 或 Deployment),在容器启动参数中添加 --enable-ssl-passthrough 选项,以启用 SSL 直通。但是,这只是启用 SSL 直通功能,而进行 SSL 直通需要单独配置。
2)在 Dashboard 的 Ingress 定义中,添加 nginx.ingress.kubernetes.io/ssl-passthrough: true 注解,以允许 SSL 直通。
3)最后,配置 Dashboard 的 TLS 证书,否则浏览器访问时将提示证书不安全。修改 kubernetes-dashboard-certs 密钥,参考 Chrome NET ERR CERT INVALID 笔记。

方法三、通过 HTTPS 反响代理(折中方案)

这是我们目前(05/08/2021)正在使用的方案:

cat > dashboard-ingress.yaml <<EOF
---
apiVersion: extensions/v1beta1kind: Ingressmetadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  rules:
  - host: kube-dashboard.rivtower.xyz
    http:
      paths:
      - backend:
          serviceName: kubernetes-dashboard
          servicePort: 443
        path: /
  tls:
  - hosts:
    - kube-dashboard.rivtower.xyz
    secretName: dashboard-ingress-cert
EOF

kubectl apply -f dashboard-ingress.yaml

“折中”是因为后端的 Dashboard 仍然使用自签名证书,但是 Nginx Ingress 默认 nginx.ingress.kubernetes.io/proxy-ssl-verify 为 off,因此不会检查后端的 TLS 证书,所以也未出现任何错误。

注意事项:我们使用 cert-manager 进行证书 TLS 签发,所以这里需要根据需要进行修改。参考 Ingress 笔记,以获取 Ingress 配置 TLS 的方法。

相关链接

Kubernetes/TAKS/Web UI (Dashboard)
GitHub/kubernetes/dashboard/docs/user/access-control/creating-sample-user.md

参考文献

GitHub/helm/charts/stable/kubernetes-dashboard
GitHub/kubernetes/dashboard/v2.0.0-beta4
NGINX Ingress Controller/Command line arguments
NGINX Ingress Controller/Annotations/SSL Passthrough
SKIP button in kubernetes dashboard is missing #703
How to sign in kubernetes dashboard? – Stack Overflow
How to expose your Kubernetes Dashboard with cert-manager | by Valerio Coltrè | ITNEXT
Annotations – NGINX Ingress Controller
https backends’ certificates are not verified · Issue #4503 · kubernetes/ingress-nginx
Exposing the Kubernetes Dashboard with an Ingress | Jonathan Gazeley