之前是在一台 2H4G 服务器上用 Screen 跑多个项目,明明睡前看都是运行的好好的,早上起来检查却总有 1、2 个被 Kill 掉了,属实心累,正巧腾讯云送了老用户一年 2H4G 的服务器,带上学生机组个集群,后面再把项目都做成 Docker 运行应该就能保证稳定性了。
本次用来构建集群的服务器共有 4 台,另有 1 台用作面板安装。为什么不将面板部署到节点服务器是因为 K3s 安装时默认会安装 Ingress 做负载均衡,它会监听 80 和 443 端口并在 Nginx 之前就处理请求并返回“404 Page not found”,甚是烦人索性抽离出来,同时注意 Rancher 需要最小 2H4G 的配置来允许,不然会频繁 CPU 占用 100% 并出现 503 错误。
因为使用了外置数据库的原因,K3s server 节点不再需要安装 3 台(3 台的限制是为了保证内置数据库同步并推举出主节点),但是我还是习惯安装三台。
注:服务器间均通过内网建立连接。

开始安装前,我强烈建议您在安全组和防火墙处开放全部端口,K3s 的官方文档都结构混乱,您很难排查端口相关的错误。在后期全部安装完毕后您再进行针对性关闭危险端口也不迟!
1、准备外部数据库连接
我这里使用的外置的 MySQL 数据库,编辑环境变量以添加 server 用的数据库连接:
vi /etc/profile
...
# 在最末尾添加数据库连接
# 自行替换数据库连接参数
# MySQL
export K3S_DATASTORE_ENDPOINT="mysql://$username:[email protected](127.0.0.1:3306)/$database"
# PostgreSQL
export K3S_DATASTORE_ENDPOINT="postgres://$username:[email protected]:5432/$database?sslmode=disable"
# 使环境变量生效
source /etc/profile
PostgreSQL 连接不禁用 SSL 连接的话后续安装并启动 K3s 时会报以下错误:
... ... -- Unit k3s.service has begun starting up. Sep 27 20:46:52 VM-9-9-centos sh[5029]: + /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service Sep 27 20:46:52 VM-9-9-centos sh[5029]: Failed to get unit file state for nm-cloud-setup.service: No such file or directory Sep 27 20:46:52 VM-9-9-centos k3s[5036]: time="2021-09-27T20:46:52.707510605+08:00" level=info msg="Starting k3s v1.21.4+k3s1 (3e250fdb)" Sep 27 20:46:52 VM-9-9-centos k3s[5036]: time="2021-09-27T20:46:52.714638844+08:00" level=fatal msg="starting kubernetes: preparing server: creating storage endpoint: building kine: pq: SSL is not enabled on the server" Sep 27 20:46:52 VM-9-9-centos systemd[1]: k3s.service: main process exited, code=exited, status=1/FAILURE Sep 27 20:46:52 VM-9-9-centos systemd[1]: Failed to start Lightweight Kubernetes. -- Subject: Unit k3s.service has failed -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-deve ... ...
2、安装 server 节点
在设置好数据库连接环境变量之后开始安装,使用官方提供的脚本:
注:这里安装时会自动读取环境中和 K3s 有关的变量,因此不再需要指定数据库连接。
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.20.8+k3s1 sh -s - server
境内服务器使用 cnrancher.com 的源
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_VERSION=v1.20.8+k3s1 sh -s - server
安装完后查看节点:
k3s kubectl get nodes
出现以下信息则说明安装完成。
NAME STATUS ROLES AGE VERSION vm-9-9-centos Ready control-plane,master 18m v1.21.4+k3s1
获取以下 node-token 方便之后部署其他节点:
cat /var/lib/rancher/k3s/server/node-token
K1082501c0eaxxxxxxxx77059a4fff524xxx589b9::server:1f2d8a3xxxxx7a1e2e4xxx60
副 server 节点的安装不仅需要使用同一个数据库,还需要配置 node-token:
# K3s server 用 MySQL 数据库连接 export K3S_DATASTORE_ENDPOINT="mysql://$username:[email protected](127.0.0.1:3306)/$database" # 主节点的 Token export K3S_TOKEN="K1082501c0eaxxxxxxxx77059a4fff524xxx589b9::server:1f2d8a3xxxxx7a1e2e4xxx60"
3、安装 agent 节点
仍然是先配置环境变量:
vi /etc/profile
注意:agent 节点的环境变量中不需要配置数据库的连接信息!
...
# 在最末尾添加 server 节点的 node-token
export K3S_TOKEN="K1082501c0eaxxxxxxxx77059a4fff524xxx589b9::server:1f2d8a3xxxxx7a1e2e4xxx60"
# server 节点的地址,端口默认为 6443
# 必须使用 HTTPS 协议:Only https:// URLs are supported for K3S_URL ip address
export K3S_URL="https://10.0.12.0:6443"
# 使环境变量生效
source /etc/profile
使用和 server 一样的脚本进行安装,但是设置了 K3S_URL 这个环境变量,因此默认选择为安装 agent 程序:
# agent 节点安装
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.20.8+k3s1 sh -
境内服务器使用 cnrancher.com 的源
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_VERSION=v1.20.8+k3s1 sh -
安装完成后理论上会自己启动,这时回 server 节点再检查下总节点个数就能看到新的 agent 节点了:
[[email protected] CA]# kubectl get nodes NAME STATUS ROLES AGE VERSION vm-9-8-centos Ready <none> 3m18s v1.21.4+k3s1 vm-9-9-centos Ready control-plane,master 10h v1.21.4+k3s1
4、节点卸载
server 节点
/usr/local/bin/k3s-uninstall.sh
agent 节点
/usr/local/bin/k3s-agent-uninstall.sh
注意:卸载完之后清理残留以防止重装后出现“Unable to connect to the server: x509: certificate signed by unknown authority”的错误,如果出现的话请卸载、清理并重装以尝试解决!
rm -rf $HOME/.kube
5、一些可能用的到指令
节点状态查看:
kubectl describe node $hostname
本章结束,下章安装 Rancher Labs 作为管理界面。