k3s 集群搭建和使用

背景

最近应用写的差不多了,该要部署了,准备搞个 k8s 集群去部署,学习一下新技术。

集群选择

回想起之前搞 k8s 多节点部署的痛苦,用 kubeadm,配置半天,难得搞好了,启动集群还有同时启动多个虚拟机。然后访问应用还有各种要注意的点。

这次就轻松一点吧,只要能实现集群部署目的就可以了。

  • 首先,反正就在一台机器上面部署,搞多个虚拟机然后搞个“高可用”架构没啥意义,所以单机部署即可,也就是控制平面和工作节点都是同一台机器。

  • 然后是集群的发行版的选择,目前大概有这么几个选择

    • k8s
    • k3s
    • minikube
    • kind

    其中 kind 是在 docker 里面跑集群,由于不方便暴露服务(因为还要手动开放端口),所以先 pass 掉。

    其次,minikube,比 kind 好一点,但还是同样的原因,所以没有选择。

    然后是官方的 k8s 发行版,感觉啥都要手动来,其次有之前的心理阴影,所以最后选择了 k3s(主要是因为这玩意有个很好用的界面

集群搭建

我选择的方案是先搭建 k3s 平台,然后再在平台上面部署 rancher 平台。

k3s 搭建

这方面 官方文档 非常详细,文档有中文版本的,甚至安装源有专门的国内镜像,为 k3s 的团队点赞。

1
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

使用一行命令即可完成,安装非常迅速,不到一分钟服务就可用了。

rancher 部署

官方文档,这里使用 helm 部署,可能需要先安装一下 helm。

先安装依赖

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
helm repo add rancher-latest https://releases.rancher.com/server-charts/latest

kubectl create namespace cattle-system

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/<VERSION>/cert-manager.crds.yaml

helm repo add jetstack https://charts.jetstack.io

helm repo update

helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace

然后就可以部署 rancher

1
2
3
4
5
helm install rancher rancher-latest/rancher \
  --namespace cattle-system \
  --set hostname=<IP_OF_LINUX_NODE>.sslip.io \
  --set replicas=1 \
  --set bootstrapPassword=<PASSWORD_FOR_RANCHER_ADMIN>

记得要设置 hostname 为你将要访问的域名

访问 rancher 控制面板

访问之前 hostname 设置的地址,就可以打开控制面板了。

这里留意到,访问控制面板需要使用特定的域名,并且只绑定了默认的 80 和 443 端口,也就是说,在入口方面,集群有做一个根据请求的域名来路由到不同服务的功能。类似于 nginx 的反向代理,可以做到同一个 ip 地址,访问不同的域名返回不同的页面的。

Enjoy~~

碎碎念

起初是想部署在云上面的,想着用我买的垃圾的 99 一年的服务器做个控制平面,然后在家和在学校的电脑都做一个工作节点,统一在控制平面的管理下,并且相互备份,这样如果一边因为网络或者其他原因挂掉了,另一边也能补上。这样控制平面在云上,工作节点在本地,既保留了服务的高可用性,也充分利用了本地硬件的高性价比,算是个比较完美的方案。

然后现实很残酷,虽然文档上讲我的 2 核 2g 的垃圾满足 k3s 的最小需求,但是直接部署 k3s,cpu 直接接近 100%,然后硬盘也满载,估计是内存不足了,在狂刷交换文件了。也尝试过直接在 docker 里面部署 rancher,不过好像也是要部署一个 k3s 在容器里面,但 k3s 一直拉不起来,一直在不断重试,最后放弃掉这个方案了。

然后看了下给服务器加配置的价格,虽然 2 核 4g 也就两百块一年,估摸着就能跑集群了,甚至还能跑一点服务。但就凭我能不花钱就不花钱的精神,怎么能这么轻松的让云服务厂商把钱赚走了,所以加钱也是不可能滴。

如果不搞云,不搞公网访问,就自己一个人自己玩,着实没啥意思。所以还是用那个垃圾搞个了内网穿透。

就只用了学校里的一台机器,搭建了集群,然后对外提供服务。

内网穿透的方案选择上,就用了很熟悉的 frp,按照 frp 的 官方文档,很顺利的把 frp 注册成系统服务。

然后是外部的访问了,这边使用了 Caddy 做了前端,直接监听 80 和 443 端口,然后根据不同的路径转发到不同的后端上面去。

用 Caddy 主要用两点,一是希望不同的服务能够通过不同的域名访问,而不是通过 /<service>/api 这样的路径区分开来,这样以后有服务要迁移只需要改域名解析的地址就行了,不需要牵扯到原来的架构;二是需要 Caddy 提供的全自动的 Let’s Encrypt 证书续签功能,因为这一套下来搞的域名到好几层子域名了,好几个域,就算是通配符域名也不够用了,并且还要定期更新证书,每一两个月就搞一次,弄得人心烦意乱的。现在集群提供的 http 服务,通过 frp 加密中转到服务器,然后通关 Caddy 转发成 https 请求,也算是全程加密了。

目前整个系统也算是搭建好了,个人还是非常满意的,目前整个系统唯一的瓶颈就只有垃圾的 3m 的带宽限制了,不过经过测试,还是能跑到 300-400 左右的 QPS 的,大部分使用场景下都够用了。

在本地环境下,也做了一下极端测试,把 jmeter 的线程数拉到 4000,最多跑到了 1w-2w 的 QPS,当然了,这些都是没有数据库的情况下测出来的数据,绝大多数情况下,先遇到瓶颈的,肯定是数据库了。

Licensed under CC BY-NC-SA 4.0