K3s 学习(一)高可用模式在 CentOS7 服务器上构建第一组 server + agent 节点

之前是在一台 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 作为管理界面。