2022-11-15Kubernetes0
请注意,本文编写于 194 天前,最后修改于 187 天前,其中某些信息可能已经过时。

目录

通过 helm 安装 Kubernetes dashboard
1. 添加 kubernetes-dashboard helm package repo 到你本地
2. 把 package 拉取到本地,我们要细微修改一下
3. 先安装 ingress controller
3.先别着急安装 kubernetes-dashboard,我们还需要先预备好一个 ssl 证书
3.1 生成一个 ca 私钥
3.2 生成一个自签名证书,有效期 365 天
3.3 使用 kubectl 将证书安装到集群内
4. 修改 kubernetes-dashboard helm package
5. 修改本地的 hosts 文件让域名在本地生效
5. 获取访问 token
如果使用的是 bitnami 的 nginx ingress contrller 包

看完本文会得到什么

  1. 为集群安装 kubernetes-dashboard
  2. 为 kubernetes-dashboard 设置外网访问的域名
  3. 为 kubernetes-dashboard 配置 https 证书

通过 helm 安装 Kubernetes dashboard

helm 是所有 kubernetes 玩家必备的技能和工具,这个是毫无余地的选择,最强大的 Kubernetes 应用管理工具 helm 的官方文档一定要看-> https://helm.sh/docs/intro/quickstart/

而 kubernetes-dashboard 官方的 helm 文档是 -> https://artifacthub.io/packages/helm/k8s-dashboard/kubernetes-dashboard
https://artifacthub.io/packages/helm/k8s-dashboard/kubernetes-dashboard

1. 添加 kubernetes-dashboard helm package repo 到你本地

shell
$ helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/ 

2. 把 package 拉取到本地,我们要细微修改一下

警告

注意,官方文档会建议你直接安装

helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard

但是本文的步骤是为了让你从外网通过域名也能访问 kubernetes-dashboard,因此我们需要把 package 拉取到本地,稍作修改之后,再安装

拉取到本地

shell
$ helm pull kubernetes-dashboard/kubernetes-dashboard --untar

用 vscode 打开这个文件夹,你会看到如下文件结构

image.png

3. 先安装 ingress controller

这里我们选择 nginx ingress controller 作为前端代理,官方文档地址 -> https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-helm/

shell
$ helm repo add kubernetes-nginx https://kubernetes.github.io/ingress-nginx
$ helm pull kubernetes-nginx/ingress-nginx --untar
$ helm install kubernetes-nginx-ing-ctrl ./ingress-nginx/

3.先别着急安装 kubernetes-dashboard,我们还需要先预备好一个 ssl 证书

kubernetes-dashboard 强制了所有请求都必须走 443 加密端口,所以当我们把它暴露在外网的时候,我们需要生成一个 ssl 证书

注意

本小节的目标是生成一个自签名的证书,它仅仅是为了演示整个操作流程,如果您是打算用于生产环境,您需要阅读之前的文章nps 从零启动 - 3. 网站三要素:域名&nginx&HTTPS 证书

3.1 生成一个 ca 私钥

shell
$ openssl genrsa -out ca.key 2048

3.2 生成一个自签名证书,有效期 365 天

shell
$ openssl req -x509 \
  -new -nodes  \
  -days 365 \
  -key ca.key \
  -out ca.crt \
  -subj "/CN=kubernetes-dashboard.my-k8s-cluster.com"

3.3 使用 kubectl 将证书安装到集群内

shell
$ kubectl create secret tls kubernetes-dashboard-secret \
--key ca.key \
--cert ca.crt

执行之后会打印:

secret/kubernetes-dashboard-secret created

4. 修改 kubernetes-dashboard helm package

找到刚才 pull 到本地的包,修改 values.yaml

如下配置文件仅仅列出需要修改的内容

yaml
ingress:
  enabled: true
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
  className: "nginx"
protocolHttp: true
extraArgs:
  # - --enable-skip-login
  - --enable-insecure-login
  # - --system-banner="Welcome to Kubernetes"
hosts:
- kubernetes-dashboard.my-k8s-cluster.com
tls:
- secretName: kubernetes-dashboard-secret
  hosts:
    - kubernetes-dashboard.my-k8s-cluster.com

然后在 kubernetes-dashboard 的上一层文件夹执行

shell
$ helm install kubernetes-dashboard ./kubernetes-dashboard

5. 修改本地的 hosts 文件让域名在本地生效

shell
192.168.137.120 kubernetes-dashboard.my-k8s-cluster.com 

这个 ip 必须是你 nginx controller 被 load balance 分配的 IP ,因为我自建的集群使用的是 metallb 来实现负载均衡的,而我的 metallb 配置文件如下

yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.137.120-192.168.137.180
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: use-eth0
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool
  interfaces:
  - eth0

而我的 nginx controller 又是集群内第一个启用 type: LoadBalancer 的服务,所以它理所应当的得到了第一个分配的 IP -> 192.168.137.120

修改 hosts 文件之后就可以用浏览器打开: https://kubernetes-dashboard.my-k8s-cluster.com/

浏览器会提醒你这是不安全的自签名证书,没关系,忽略它,强制访问

image.png

5. 获取访问 token

获取 token 的官方教程在 -> https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md

简单点就是执行如下步骤,在 vscode 里创建文件 dashboard-adminuser.yaml

yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: default
---
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: default
---
shell
$ kubectl apply -f dashboard-adminuser.yaml

注意此处跟官方文档不一样,因为 helm 默认是安装到 default 命名空间下,所以我们创建 admin-user 也最好创建在同一个命名空间下,便于管理。

创建一个 token

shell
$ kubectl -n default create token admin-user --duration=24h
eyJhbGciOiJSUzI1NiIsImtpZCI6Il9kU3gzd1dvWW5XbFl1ZDhrWm93WUFfakVqNFZmUFdTVW9QaVBQcXUxT3cifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNjY4NDg4NjI5LCJpYXQiOjE2Njg0ODUwMjksImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0Iiwic2VydmljZWFjY291bnQiOnsibmFtZSI6ImFkbWluLXVzZXIiLCJ1aWQiOiJiMmQ3YTQ2OS1iZDM4LTQyOTUtOTkyOS0wYzk2NzQzOTdhY2UifX0sIm5iZiI6MTY2ODQ4NTAyOSwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6YWRtaW4tdXNlciJ9.iJgyToUzi-khspenJmWRqPzYsQecC0UglEwf7H68MqFkkHZhC_dWHg0pcXNU5VajJyQaAn0pzIr3-_SrT6iOu9k-nbnXdifY9QuIuIq1XIPORy3nW1pDWftdOjEB3YUiPGPXVd888rMLEzlFLJfaN7qnmfDaiLCx0cs6yj4gat4GWTPsIup_G2CS9coNGiI4XwrD8xfp1VUQhf9ephScAPYeToIrzKp3FXedv1NGa0fyYXZ4Odh1y5RjBUfrYOSCph4VQHTQmWszawXNJwusYz7uSpUI2G-xYbz3CfYCULnRdxz8UHyiCX6l1y8wE7i_6OXQgANcRcu-7jAKtVkfyA

把上述获取的 token 拷贝到网页中,就可以成功进入 kubernetes-dashboard 了

image.png

如果使用的是 bitnami 的 nginx ingress contrller 包

如果你使用的是 NGINX Ingress Controller packaged by Bitnami,那么上述的证书需要重新生成

shell
$ openssl genrsa -out ca.key 2048

$ openssl req -new -x509 -days 365 -key ca.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=Acme Root CA" -out ca.crt

$ openssl req -newkey rsa:2048 -nodes -keyout server.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=kubernetes-dashboard.my-k8s-cluster.com" -addext "subjectAltName = DNS:kubernetes-dashboard.my-k8s-cluster.com" -out server.csr

$ openssl x509 -req -extfile <(printf "subjectAltName=DNS:my-k8s-cluster.com,DNS:www.my-k8s-cluster.com") -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt

$ kubectl delete secret kubernetes-dashboard-secret

$ kubectl create secret tls kubernetes-dashboard-secret \
--key server.key \
--cert server.crt

再次修改 values.yaml

  hosts:
    - kubernetes-dashboard.my-k8s-cluster.com
  ## Kubernetes Dashboard Ingress TLS configuration
  ## Secrets must be manually created in the namespace
  ##
  tls:
    - secretName: kubernetes-dashboard-secret
      hosts:
        - kubernetes-dashboard.my-k8s-cluster.com