看到有k3d这么一个可以很方便地启动k3d集群的工具,就试了一下。

启动集群

首先安装k3d

  1. wget -q -O - https://raw.githubusercontent.com/rancher/k3d/main/install.sh | bash

启动一个新的集群

  1. k3d cluster create mycluster

集群启动成功后,设置 kubeconfig

  1. k3d kubeconfig merge mycluster --kubeconfig-switch-context

kubectl cluster-info 你应该可以看到类似这样的结果

  1. Kubernetes control plane is running at https://127.0.0.1:42889
  2. CoreDNS is running at https://127.0.0.1:42889/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
  3. Metrics-server is running at https://127.0.0.1:42889/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy
  4. To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

k3d会为你创建两个容器

$ docker ps --filter="label=app=k3d"
CONTAINER ID   IMAGE                      COMMAND                  CREATED        STATUS       PORTS                             NAMES
e2a069f9bf7b   rancher/k3d-proxy:v4.4.7   "/bin/sh -c nginx-pr…"   21 hours ago   Up 2 hours   80/tcp, 0.0.0.0:42889->6443/tcp   k3d-mycluster-serverlb
7114e47fcdef   rancher/k3s:v1.21.2-k3s1   "/bin/k3s server --t…"   21 hours ago   Up 2 hours                                     k3d-mycluster-server-0

安装 dashboard

使用helm安装dashboard
推荐用 vs code 的 kubernetes 插件操作 k8s,非常方便。
image.png
将 kubernetes dashboard 仓库添加到 helm 中

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

将 kubernetes dashboard 用 fetch 下载到本地文件夹中
image.png
修改values.yaml

protocolHttp: true
extraArgs:
  - --enable-skip-login
  - --enable-insecure-login
  - --system-banner="Welcome to Kubernetes"

将namespace切换为default
使用helm安装

helm install kubernetes-dashboard ./kubernetes-dashboard/

应当会看到如下提示

export POD_NAME=$(kubectl get pods -n default -l "app.kubernetes.io/name=kubernetes-dashboard,app.kubernetes.io/instance=kubernetes-dashboard" -o jsonpath="{.items[0].metadata.name}")
echo http://127.0.0.1:9090/
kubectl -n default port-forward $POD_NAME 9090:9090

9090端口是dashboard 提供 http服务的端口, 8443是dashboard提供https服务的端口
9090:9090的格式为host:pod
打开 [http://127.0.0.1:9090/](http://127.0.0.1:9090/) 你应当看到如下登陆界面
127.0.0.1_9091_.png
我们创建一个Service Account,借用cluster-admin的权限

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

创建成功后,会多出一个secret
image.png
将token base64解码后就是bearer token了
image.png
你可以用浏览器base64解码

atob("ZXlKaGJHY2lPaUpT...")

登陆成功后就可以看到美观的Dashboard界面啦
127.0.0.1_9091_ (1).png

Dashboard证书配置

按照helm的默认配置,dashboard的页面是完全打不开的,因为默认配置是自动生成一个完全没有subject的自签名证书,会被Chrome直接拒绝。所以要么用 protocolHttp: true 关闭 https,要么给 Kubernetes Dashboard 分配一个证书。
Dashboard的证书放在 kubernetes-dashboard-certs 这个secret中。
修改dashboard 的helm charts中的values.yaml

extraArgs:
  - --tls-cert-file=tls.crt
  - --tls-key-file=tls.key

:::warning 不要加/certs前缀 ::: 创建一个文件夹 tls ,在文件夹中放 tls.keytls.crt分别是证书的私钥和证书本身。
创建一个Secret 用来存放证书,secret 名称为 kcert。

kubectl create secret generic kcert --from-file=./tls

在Deployment kubernetes-dashboard中,添加一个Volume

volumes:
- name: kcert
  secret:
    secretName: kcert

再修改VolumeMounts,将这个kcert volume 挂载到 /certs文件夹

volumeMounts:
- mountPath: /certs
  name: kcert

最后apply一下就大功告成啦。
kubectl port-forward pods/kubernetes-dashboard-75567d956-jstkb 8443:8443 -n default
打开网页 https://127.0.01:8443 就可以看到页面了。

Dashboard Ingress 配置

k3d默认的ingress controller是traefik
我预先创建了一个证书secret kcert

kubectl create secret tls kcert --cert tls.crt --key tls.key -n default

将kubernetes dashboard的values.yamlservice.externalPort修改为9090,因为Service的端口要与pod的端口保持一致(否则traefik不会生效,不知是否是bug)

service:
  type: ClusterIP
  externalPort: 9090

修改ingress部分enabled和tls字段

ingress:
  enabled: true
  tls:
    - secretName: kcert

tls 字段接受一个hosts数组

tls:
  - secretName: kc
    hosts:
      - www.baidu.com

允许用户为不同的域名配置不同的证书。我用了通配符证书,因此就略去这个字段。

参考文献

[1]: k3d项目主页:https://k3d.io/
[2]: Create Sample User https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md
[3]: dashboard的helm主页 https://artifacthub.io/packages/helm/k8s-dashboard/kubernetes-dashboard
[4]: https://github.com/kubernetes/dashboard/blob/master/docs/user/installation.md#recommended-setup