搬砖小抄

搭建高可用k3s集群

字数统计: 1.5k阅读时长: 7 min
2020/03/29 Share

以下是官方对K3S的介绍

轻量级Kubernetes发行版。易于安装,内存减半,所有二进制文件不到40mb。

适用于:

  • 边缘计算-Edge
  • 物联网-IoT
  • CI
  • ARM
  • Situations where a PhD in k8s clusterology is infeasible

效果演示

1. 集群规划规划

  • 数据库,LB,管理端UI单独部署
  • 两个master节点,实现最基本的K3S-SERVER冗余
  • 两个worker节点,通过LB 接入master节点

数据库也需要做HA,不过这个和K3S集群没有什么关系,此处略过。
LB 只需要支持4层负载均衡,此处使用nginx

服务器 用途 配置 IP
k3s-lb LB/管理端UI/数据库 2C4G 10.11.12.201
k3s-m1 K3S-SERVER(master 节点) 1C2G 10.11.12.171
k3s-m2 K3S-SERVER(master 节点) 1C2G 10.11.12.172
k3s-worker1 K3S-AGENT(worker 节点) 2C2G 10.11.12.181
k3s-worker2 K3S-AGENT(worker 节点) 2C2G 10.11.12.182
  • 操作系统:CentOS 7.6
  • docker 引擎: 19

架构图

对比一下单机版架构图

2. OS 准备

虚拟机模版 : https://tc5.us/file/22536368-427852352 ,已经装好docker等必要软件,本文按照这个环境进行集群搭建。

如果全新系统,主要是安装docker,并配置加速镜像,以及一些内核参数优化。

登录每一个服务器,修改对应的机器名

1
2
3
4
5
sudo hostnamectl  --static set-hostname  k3s-lb && sudo hostnamectl  set-hostname  k3s-lb
sudo hostnamectl --static set-hostname k3s-m1 && sudo hostnamectl set-hostname k3s-m1
sudo hostnamectl --static set-hostname k3s-m2 && sudo hostnamectl set-hostname k3s-m2
sudo hostnamectl --static set-hostname k3s-worker1 && sudo hostnamectl set-hostname k3s-worker1
sudo hostnamectl --static set-hostname k3s-worker2 && sudo hostnamectl set-hostname k3s-worker2

登录每一个服务器,修改对应的IP( /etc/sysconfig/network-scripts/ifcfg-ens33 )

其他可选系统配置

  • 创建swap分区
  • 开启内核user_namespace支持
  • 设置docker私服
  • SSH空闲连接时间
  • 安装nfs-utils ,没有安装这个会导致无法挂载NFS 类型的PV

3. 节点安装配置

3.1 k3s-lb

安装MySQL

1
2
3
4
5
6
7
8
9
docker run -d  \
--name k3s-mysql \
--restart=always \
-v /opt/k3s-cluster/mysql/conf:/etc/mysql/conf.d \
-v /opt/k3s-cluster/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-p 3306:3306 \
mysql:5.7.29 \
--default-time-zone=+8:00

安装 rancher ui

1
2
3
4
5
6
docker run -d \
--restart=unless-stopped \
--name rancher-server \
-v /opt/rancher-server/var/lib/rancher/:/var/lib/rancher/ \
-p 10443:443 \
rancher/rancher:stable

你需要记下这个容器的运行参数,升级的时候还会用到(如果忘记,可以docker inspect rancher-server查看)。

访问地址 http://10.11.12.201:10443

配置nginx(/etc/nginx/nginx.conf),添加stream配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
events {
# ....
}
http {
# ...
}
# 新加的部分
stream {
upstream k3s {
server 10.11.12.171:6443;
server 10.11.12.172:6443;
}

server {
listen 6443;
proxy_pass k3s;
}
}

3.2 k3s-m1 & k3s-m2

设置host映射(/etc/hosts)

1
10.11.12.201 k3s-mysql-server

安装K3S-SERVER(不要使用root用户执行)

1
2
3
4
5
# 定义安装参数	
export INSTALL_K3S_VERSION=v1.17.3-k3s1
export INSTALL_K3S_EXEC="--datastore-endpoint=mysql://root:root@tcp(k3s-mysql-server:3306)/k3s --docker --kube-apiserver-arg service-node-port-range=1-65000 --no-deploy traefik --write-kubeconfig ~/.kube/config --write-kubeconfig-mode 666"
# 安装
curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

执行命令后,使用kubectl get nodes查看状态,如果成功能看到两个节点

如需重新安装可以卸载脚本 /usr/local/bin/k3s-uninstall.sh

3.3 k3s-worker1 & k3s-worker2

先登录任意一个master节点,查看node-token

1
sudo cat /var/lib/rancher/k3s/server/node-token

在worker节点上执行(不要使用root用户执行)

1
2
3
4
5
6
7
export K3S_TOKEN={node-token的内容}
export INSTALL_K3S_VERSION=v1.17.3-k3s1
# LB的地址
export K3S_URL=https://10.11.12.201:6443
export INSTALL_K3S_EXEC="--docker --kube-apiserver-arg service-node-port-range=1-65000 --no-deploy traefik --write-kubeconfig ~/.kube/config --write-kubeconfig-mode 666"
# 安装
curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

执行命令后,在master节点使用kubectl get nodes查看状态,如果成功能看到新的节点

如需重新安装可以卸载脚本 /usr/local/bin/k3s-agent-uninstall.sh

3.4 集群导入

为了方便使用,可用rancher管理面板来简化集群管理工作

打开rancher ui (http://10.11.12.201:10443),选择导入集群,复制生成的命令,在其中一台master 节点上执行即可

参考资料

文档&视频

Rancher Docs

Spring Cloud & Kubernetes教程

K3S 入门到生产部署

docker 安装脚本

来自 http://pigx.vip/docker_install.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/sh
set -e
# 在线安装脚本

# 一般不建议安装swap 系统内存小的时候没有swap会卡死
if [ ! -f "/var/swap" ];then
echo "create swap"
fallocate -l 4G /var/swap
mkswap /var/swap
mkswap -f /var/swap
swapon /var/swap
echo "/var/swap swap swap defaults 0 0" >> /etc/fstab
fi

# 判断是否安装 docker
if [ `command -v docker` ];then
echo 'docker has installed'
else
echo 'install docker'
curl https://download.daocloud.io/docker/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
yum -y install https://download.daocloud.io/docker/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
curl -fsSL https://get.daocloud.io/docker | bash -s docker --mirror Aliyun
# centos7 的内核经过 k3s 检查都有这个问题
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
fi
# 添加加速源
sudo mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors":["https://3wzyb32e.mirror.aliyuncs.com"],"insecure-registries":["172.17.0.111"]}
EOF
# 启动
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker

echo 'finish'

证书过期问题

在证书有效期小于90天时,K3S会自动进行续期。

参考 工单 #1621

升级

节点(K3S-SERVER,K3S-AGENT)支持手动升级和自动升级,更换版本号,使用相同的参数再次执行安装脚本即可

参考 https://rancher.com/docs/k3s/latest/en/upgrades/

管理面板升级(就是那个rancher/rancher的容器),重新拉取新版本镜像版本即可,最好先备份

1
2
3
4
5
6
7
8
# 停止容器
docker stop rancher-server
# 备份数据
docker create --volumes-from rancher-server --name rancher-data rancher/rancher:stable
docker run --volumes-from rancher-data -v $PWD:/backup busybox tar zcvf /backup/rancher-data-backup-<RANCHER_VERSION>-<DATE>.tar.gz /var/lib/rancher
# 重新拉取镜像
docker pull rancher/rancher:stable
# 然后使用之前相同参数,重新 docker run

参考 https://rancher.com/docs/rancher/v2.x/en/upgrades/upgrades/single-node/

CATALOG
  1. 1. 1. 集群规划规划
    1. 1.1. 架构图
  2. 2. 2. OS 准备
  3. 3. 3. 节点安装配置
    1. 3.1. 3.1 k3s-lb
    2. 3.2. 3.2 k3s-m1 & k3s-m2
    3. 3.3. 3.3 k3s-worker1 & k3s-worker2
    4. 3.4. 3.4 集群导入
  4. 4. 参考资料
    1. 4.1. 文档&视频
    2. 4.2. docker 安装脚本
    3. 4.3. 证书过期问题
    4. 4.4. 升级