简便搭建 K8S 多集群多节点本地开发环境
前⾔
最近数据部上云的项⽬进⾏的如⽕如荼,我们整个部⻔都在“架构标准化”的⽅向上昂⾸阔步。
⼤约2年前,我便有过使⽤ k3s 搭建 k8s 集群的经历,简单与佳佳⼤哥交流之后,决定在这⾥以残墨重拾往昔旧时光,给⼤家分享⼀下如何在本地搭建 K8S 多集群多节点开发环境。
前排提醒:本⽂⾮⼊⻔性质⽂章,⽽是经验分享;阅读本⽂章之前,希望您已经对 k8s 有所了解,⾄少了解各个层级、组件关系。ღ( ´・ᴗ・` )⽐⼼。
各⽅案对⽐
1. 常⻅⽅案及其简介
市⾯上本地 k8s 构建⽅案还是不少的,经过简单的调研与使⽤,各个⽅案⼤致特性如下:
docker desktop
是的你没看错,平常我们在 Mac 开发机上安装的 docker 桌⾯版中,含有⼀个开启 k8s 的按钮,直接选上就可以使⽤。缺点也很明显,它是个单集群单节点的架构,并且运⾏的完整版 k8s 占⽤资源相对较⼤,让本就不富裕的开发机雪上加霜。minikube
相⽐起 docker desktop 的原⽣ k8s,这算得上是⼀个轻量级的 k8s 环境了。⽀持通过 docker 或vmware、virtualbox、hyperv等虚拟机来构建节点。但是只⽀持单集群。kind
这也是⼀套通过 docker 或 containerd 构建集群的⽅案,⽀持多集群、⽀持多节点,是个不错的选择。早期 Apple M1 芯⽚的机器直接采⽤官⽅的脚本进⾏安装时会出错,后⾯官⽅已经解决。K3d/k3s
K3s 为轻量级 k8s 发⾏版,k3d 为 docker 化运⾏ k3s 的⼯具。k3s is 5 less then k8s,直接翻译过来就是k3s⽐k8s少了5个字符,作为⼀个轻量化的发⾏版,k3s 砍掉了 k8s 中的过时功能、⾮默认功能、Alpha 功能以及内置的云提供商插件,使⽤内嵌轻量级数据库 SQLite 作为默认数据存储替代 etcd,所有Kubernetes 控制平⾯组件如 api-server、scheduler 等封装成为⼀个精简⼆进制程序,控制平⾯只需要⼀个进程即可运⾏。
2. k3d/k3s 优势
相⽐起其他⽅案,k3d/k3s 的优势集中在以下⼏点
k3s 为经过 CNCF 验证的轻量级发⾏版
占⽤资源少:k3s默认使⽤containerd(Server节点,不可更改)作为容器运⾏时,不再需要中间层的Docker Engine,占⽤资源更少
部署简单:对环境依赖少,可离线也可在线部署(不过国内的⽹络环境不推荐在线部署),离线部署时,只需要下载⼀个⼤约60MB的⼆进制⽂件和⼀个200MB不到的离线镜像包,启动k3s节点⼏乎是秒级的。
⽀持单机多集群
⽀持单机多节点
⽀持 Apple M1 芯⽚ (⼤雾)
搭建⽅法
1. docker 环境安装
由于 k3d 是将 docker 的⼀个容器作为节点(Node),因此在安装 k3d 之前,需要事先把 docker 环境准备好。安装 docker 的具体⽅法这⾥不做过多赘述,可以直接通过以下链接访问官⽹,下载对应版本的 docker desktop 安装包后双击安装即可。
官⽹地址:
使⽤ Apple M1 芯⽚的同学,注意下载“Mac with Apple Chip”版本
2. k3d / k3s 安装
k3d 的安装⾮常⽅便,我这⾥使⽤了官⽅的⼀键安装脚本,具体如下:
curl -s https://raw.githubusercontent.com/rancher/k3d/main/install.sh| bash
安装完成后,可以使⽤以下命令验证⼀下安装结果:
➜ k3d --version
k3d version v5.0.0
k3s version v1.21.5-k3s1 (default)
3. kubectl 安装
kubectl 是 k8s 集群的命令⾏⼯具。我们可以使⽤ kubectl 进⾏应⽤的部署、集群资源的查看与管理。对于
Mac ⽤户⽽⾔,可以直接通过 homebrew 进⾏安装:
Windows 系统可以直接下载官⽅的 exe 可执⾏⽂件来运⾏,具体地址:
https://dl.k8s.io/release/v1.23.0/bin/windows/amd64/kubectl.exe
其他安装⽅法参⻅官⽹:Install Tools | Kubernetes(https://kubernetes.io/docs/tasks/tools/)
简单使⽤
1. 创建 k3d 集群
如果是创建单节点集群,执⾏以下命令即可:
k3d cluster create [集群名称]
如果需要多个节点,可以通过以下⽅式调整 server 和 agent 数量:
k3d cluster create [集群名称] --servers 3 --agents 2
创建完成后,可以执⾏ k3d cluster list 查看集群列表,执⾏ k3d node list 查看当前的节点数。
在这⾥,我创建了两个集群作为演示,具体如下:
# 创建单节点不同集群
k3d cluster create RytiaDev
# 创建⼀个 1 server 2 agents 的集群
k3d cluster create WikiDemo --servers 1 --agents 2
创建结果:
2. 配置 kubectl ⼯具
集群创建完成后,可以使⽤ kubectl cluster-info 命令查看集群的信息。
PS:在必要情况下(如连接过其他k8s集群,或者使⽤⽤过其他 k8s 安装⼯具),我们可以⼿动将 k3d 集群的配置覆盖⼀下:
k3s kubeconfig get [集群名称] > ~/.kube/config
3. 测试使⽤(安装 Dashboard )
完成上⾯两个步骤后,k8s(k3s) 集群便已经可以正常使⽤了。
这⾥以官⽅的 Kubernetes Dashboard 为例,在刚刚创建好的集群中部署⼀个应⽤,以验证它是否已就绪。
正如你所感知到的⼀样,在 k8s 上部署应⽤只需要⼀条命令:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml执⾏完成之后,可以看到它已经⾃动拉起了 2 个 Pod,并创建了 2 个服务(Service),如图:
官⽅的 Kubernetes Dashboard 创建出来的服务默认为 ClusterIP 类型,⽆法直接通过外⽹访问,需要使⽤代理的⽅式,这⾥直接执⾏ kubectl proxy 命令即可开启监听,默认监听地址为:127.0.0.1:8001。
此时打开浏览器访问 http://127.0.0.1:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ 得到登录⻚⾯如下:
登录⽅式这⾥以 Token 为例,配置授权如下:
# 创建⽤户,其中⽤户名为 rytia
kubectl create serviceaccount rytia -n kubernetes-dashboard
# 绑定 rytia ⽤户⾄ cluster-admin ⻆⾊
kubectl create rolebinding rytia-admin -n kubernetes-dashboard --
clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:rytia
# 获取 token
kubectl describe secret -n kubernetes-dashboard
进⼊⾯板后如图所示:
4. 多集群切换
kubectl 中执⾏的操作(或者说操作的上下⽂)总是对应着其中⼀个⽬标集群的。如果我们有多个集群的话,合理的做法是添加多个 context 到配置⽂件中,需要切换集群时修改 kubeconfig 中的 current-context 配置项,如图所示:
⽽在本地开发环境中,为了便利,我这⾥的做法是直接把 k3d 对应集群的配置覆盖写⼊到当前⽤户的配置中,命令和上述第 2 ⼩点⼀致,⼤家也可以参考以下,但强烈不建议在⽣产环境中运⽤:
k3s kubeconfig get [集群名称] > ~/.kube/config
5. 伸缩节点
这⾥以往 RytiaDev 集群中增加⼀个新的节点为例,实操如下:
k3d node create RytiaDev-new-c RytiaDev
执⾏结果如上图所示,在 Kubernetes Dashboard 中可以看到 Node 中多了⼀个刚刚创建的“k3d-rytiadev-new-0”节点:在确保节点已经通过 k3d 创建好了的情况下,也可以直接 kubectl ⼯具进⾏集群节点的添加与删除,与常规集群⼀致。
后记
k8s 的“乐趣”在于容器的编排,本⽂只是介绍了使⽤ k3d 、 k3s 本地搭建 k8s 集群、并通过 kubectl 进⾏管理的⼀种⽅式,在我看来,⽐较合适的应⽤场景是:
1. 本地需要测试或验证多集群、多节点的场景:如异地多活、MHA 测试、Node 级别⽇志收集、故障演练等
2. 对开发环境整洁度有⾼要求有“洁癖”的患者(例如笔者本⼈)。这套⽅案可以将所有的东⻄都丢在⼏个docker 容器内,测试完成后直接删除整个集群即可,明⾯上不会对开发机本身做过多的变动,减少后期维护的⼼智负担
同时在这⾥提出⼏个⼩⼩的建议:
1. 如果是⼊⻔级⽤户,仅仅想要本地试玩⼀下 k8s,建议使⽤ docker desktop ⾃带的单集群-单节点版即可,安装极其简单,并且能够满⾜ 80% 以上的场景
2. 如果是需要搭建⽣产环境 / 测试环境,请直接联系 SRE 侧的⼤⼤们,按照数据部 Web 标准化环境进⾏处理,切莫另起炉灶
另外本⽂有⼀定的阅读⻔槛,对于没有过使⽤ k8s 部署应⽤(或者没有接触过 TKE、EKS 等云产品)的读者稍微晦涩难懂,希望对⼤家有所帮助。
由于本人才学疏浅,文章难免会出现疏漏的地方,还请各位前辈不吝赐教。
参考资料
http://dockone.io/article/9384
https://www.cnblogs.com/wukc/p/14788772.html