搭建高可用K3S集群
摘要
集群规划
- MySQL,LB,Rancher UI单独部署
- 两个master节点,实现最基本的
K3S-Server
冗余 - 两个worker节点,通过LB 接入master节点
数据库也可以做HA
LB 只需要支持4层负载均衡,此处使用nginx
服务器 | 用途 | 配置 | IP |
---|---|---|---|
k3s-lb | LB/Rancher UI/MySQL | 2C4G | 10.11.12.100 |
k3s-m1 | K3S-Server(master 节点) | 1C2G | 10.11.12.101 |
k3s-m2 | K3S-Server(master 节点) | 1C2G | 10.11.12.102 |
k3s-worker1 | K3S-Agent(worker 节点) | 2C2G | 10.11.12.103 |
k3s-worker2 | K3S-Agent(worker 节点) | 2C2G | 10.11.12.104 |
- 操作系统:
CentOS 7.6
,Alpine 3.12
也实验通过- Docker Version: 19.03.9
架构图
高可用架构图
对比一下单机版架构图
OS 准备
全新系统,主要是安装
docker
,并配置加速镜像,以及一些内核参数优化。
在各个节点建立自定义账户,使其可以用命令操作docker,并加入sudo
1 | useradd <user_name> |
visudo
,添加
1 | k3s ALL=(ALL) ALL |
登录每一个服务器,修改对应的机器名
1 | sudo hostnamectl --static set-hostname k3s-lb && sudo hostnamectl set-hostname k3s-lb |
节点安装配置
k3s-lb
安装MySQL(已有MySQL可忽略)
1 | docker run -d \ |
安装 Rancher UI
1 | docker run -d \ |
与 2.4.x 或之前的版本相比,使用docker run
命令安装 Rancher 2.5.x 时,需要添加--privileged
标志变量,启用特权模式安装 Rancher。
你需要记下这个容器的运行参数,升级的时候还会用到(如果忘记,可以
docker inspect rancher-server
查看)。
安装Nginx(略)
注意:编译时需要添加stream模块
配置 nginx ,添加stream配置
1 | events { |
k3s-m1 & k3s-m2
配置 host (/etc/hosts
)
1 | echo "10.11.12.100 k3s-mysql-server" >> /etc/hosts |
安装K3S-Server,使用开始创建的用户运行(不要使用root用户执行)
最简单的方式
1 | sudo curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - server \ |
高级玩法
INSTALL_K3S_VERSION=v1.18.9+k3s1
从 Github 下载 K3s 的版本。如果没有指定,将尝试从”stable”频道下载。INSTALL_K3S_EXEC='args'
为 k3s 提供其他参数。
1 | # 定义安装参数 |
执行命令后,使用
kubectl get nodes
查看状态,如果成功能看到两个节点
如需重新安装可以卸载脚本/usr/local/bin/k3s-uninstall.sh
k3s-worker1 & k3s-worker2
先登录任意一个master节点,查看node-token
1 | sudo cat /var/lib/rancher/k3s/server/node-token |
在worker节点上执行,使用开始创建的用户(不要使用root用户执行)
1 | export K3S_TOKEN={node-token的内容} |
执行命令后,在master节点使用
kubectl get nodes
查看状态,如果成功能看到新的节点如需重新安装可以卸载脚本
/usr/local/bin/k3s-agent-uninstall.sh
配置kubectl
k3s安装时已自动安装kubectl命令行工具
因为使用的是 k3s 集群需要指定kubeconfig
的位置或者将文件复制到~/.kube/config
1 | export KUBECONFIG=/etc/rancher/k3s/k3s.yaml |
Helm配置
Helm 是 kubernetes 非常好用的软件管理工具
本次安装 helm3
使用官方提供的脚本一键安装
1 | curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 |
手动下载安装
从官网下载最新版本的二进制安装包到本地(推荐用迅雷下载后上传服务器)
1 | curl -O https://get.helm.sh/helm-v3.3.4-linux-amd64.tar.gz |
验证
1 | helm version |
测试一下,创建一个Chart
1 | helm create hello-helm |
为了测试方便,我们把 Service 的类型改成 NodePort。安装一下这个 Chart 。在 Helm 2 中,如果没有指定 release 的名称,则会自动随机生成一个名称。但是在 Helm 3 中,则必须主动指定名称,或者增加--generate-name
的参数。
1 | helm install ./hello-helm --generate-name |
等到 Pod 创建完成后,我们可以根据创建的 Service 的 NodePort 来访问该服务了,然后在浏览器中 打开 http://10.11.12.101:49641
集群导入
为了方便使用,可用rancher管理面板来简化集群管理工作
打开Rancher UI (https://10.11.12.100:8443
),选择导入集群,我们会得到导入K3S集群所需的命令,请保存好第三条命令以备后用。 为什么不是第二条?因为目前访问HTTPS API使用的是自签证书,直接用第二条会产生证书不信任的报错。复制生成的命令,在其中一台master 节点上执行即可。
证书过期问题
在证书有效期小于90天时,K3S会自动进行续期。
Certificates rotate automatically if they are <90 days from expiration when k3s is started. This has been the case since v0.10: #805
As long as you are patching and restarting your k3s infrastructure at least every couple months, you shouldn’t run into expired certificates.
升级
节点(K3S-Server
,K3S-Agent
)支持手动升级和自动升级,更换版本号,使用相同的参数再次执行安装脚本即可
Rancher UI升级(就是那个rancher/rancher
的容器),重新拉取新版本镜像版本即可,最好先备份
1 | # 停止容器 |
参考 https://rancher.com/docs/rancher/v2.x/en/upgrades/upgrades/single-node/