看完本文会得到什么
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
shell$ helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
警告
注意,官方文档会建议你直接安装
helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard
但是本文的步骤是为了让你从外网通过域名也能访问 kubernetes-dashboard,因此我们需要把 package 拉取到本地,稍作修改之后,再安装
拉取到本地
shell$ helm pull kubernetes-dashboard/kubernetes-dashboard --untar
用 vscode 打开这个文件夹,你会看到如下文件结构
这里我们选择 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/
kubernetes-dashboard 强制了所有请求都必须走 443 加密端口,所以当我们把它暴露在外网的时候,我们需要生成一个 ssl 证书
注意
本小节的目标是生成一个自签名的证书,它仅仅是为了演示整个操作流程,如果您是打算用于生产环境,您需要阅读之前的文章nps 从零启动 - 3. 网站三要素:域名&nginx&HTTPS 证书
shell$ openssl genrsa -out ca.key 2048
shell$ openssl req -x509 \ -new -nodes \ -days 365 \ -key ca.key \ -out ca.crt \ -subj "/CN=kubernetes-dashboard.my-k8s-cluster.com"
shell$ kubectl create secret tls kubernetes-dashboard-secret \ --key ca.key \ --cert ca.crt
执行之后会打印:
secret/kubernetes-dashboard-secret created
找到刚才 pull 到本地的包,修改 values.yaml
如下配置文件仅仅列出需要修改的内容
yamlingress: 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
shell192.168.137.120 kubernetes-dashboard.my-k8s-cluster.com
这个 ip 必须是你 nginx controller 被 load balance 分配的 IP ,因为我自建的集群使用的是 metallb 来实现负载均衡的,而我的 metallb 配置文件如下
yamlapiVersion: 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/
浏览器会提醒你这是不安全的自签名证书,没关系,忽略它,强制访问
获取 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 了
如果你使用的是 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