看到有k3d这么一个可以很方便地启动k3d集群的工具,就试了一下。
启动集群
首先安装k3d
wget -q -O - https://raw.githubusercontent.com/rancher/k3d/main/install.sh | bash
启动一个新的集群
k3d cluster create mycluster
集群启动成功后,设置 kubeconfig
k3d kubeconfig merge mycluster --kubeconfig-switch-context
用 kubectl cluster-info
你应该可以看到类似这样的结果
Kubernetes control plane is running at https://127.0.0.1:42889
CoreDNS is running at https://127.0.0.1:42889/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Metrics-server is running at https://127.0.0.1:42889/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy
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,非常方便。
将 kubernetes dashboard 仓库添加到 helm 中
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
将 kubernetes dashboard 用 fetch 下载到本地文件夹中
修改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/)
你应当看到如下登陆界面
我们创建一个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
将token base64解码后就是bearer token了
你可以用浏览器base64解码
atob("ZXlKaGJHY2lPaUpT...")
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.key
和tls.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.yaml
的service.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