K3S概述
方案介绍
本方案主要规划如下:
- 采用Docker作为容器运行时;
- 采用全Server模式,所有节点均为Server(Server节点同时也是Agent);
- 采用K3S自带的内嵌式ETCD作为数据库;
- 使用HAProxy+KeepAlive对外提供APIServer的高可用(反向代理);
- 基于K3S自带的traefik提供ingress,实现外部对内的服务访问;
- 使用Longhorn实现集群的持久化存储;
- 额外部署helm,方便后期部署相关应用包;
- 额外部署kuboard,用于集群的图形化管理;
- 新增一个管理节点的脚本。
K3S介绍
K3S是一个轻量级Kubernetes发行版。易于安装,内存消耗低,所有二进制文件不到100mb。
适用于:
- 边缘计算-Edge
- 物联网-IoT
- CI
- ARM
- 嵌入K8S
K3S特点
k3s是完全兼容的Kubernetes发行版,有以下更改:
- 移除过时的功能、Alpha功能、非默认功能,这些功能在大多数Kubernetes集群中已不可用。
- 删除内置插件(比如云供应商插件和存储插件),可用外部插件程序替换。
- 使用基于SQLite3作为默认的数据存储。etcd3仍然可用,但并非默认项。
- 包含在一个简单的启动程序当中,可以处理复杂的TLS和其他选项。
- 几乎没有操作系统依赖性(仅需要健全的内核和cgroup挂载)。k3s软件包所需的依赖:
- containerd
- Flannel
- CoreDNS
- CNI
- 主机系统服务 (iptables, socat, etc)
KS3架构
server节点被定义为运行k3s server命令的主机(裸机或虚拟机)。worker节点被定义为运行k3s agent命令的主机。
常见的K3S高可用架构如下:
- 两个或更多server节点;
- 一个外部数据存储。
worker节点注册
worker节点通过k3s agent启动时发起的Websocket连接进行注册。
worker节点将使用节点集群密钥以及存储在/etc/rancher/node/password的节点随机密码向server注册。server将在单个节点的/var/lib/rancher/k3s/server/cred/node-passwd路径存储密码,后续任何操作都必须使用相同的密码。
如果删除了worker节点目录/etc/rancher/node,则应该为该worker节点重新创建密码文件,或者从服务器中删除该节点。
通过使用该–with-node-id标志启动K3s server或agent,可以将唯一的节点ID添加到hostname。
K3S部署
K3S部署规划
节点需求
所有节点不能具有相同的主机名。
如果节点具有相同的主机名,需要在运行K3S前修改主机名。或者通过–node-name或$K3S_NODE_NAME变量传递唯一的主机名称。
无负载最小配置:RAM: 512 MB,CPU: 1C。
k3s server需要6443端口可被节点访问,这些节点需要能够通过UDP 8472端口来相互访问组建Flannel VXLAN网络。
如果不使用Flannel VXLAN并提供自己的自定义CNI,则k3s不需要放行UDP 8472端口。
k3s使用反向隧道,以便worker建立与server的出站连接,并且所有kubelet流量都通过该隧道通信。
如果要使用metrics server,则需要在每个节点上放行10250端口。
节点规划
高可用架构一:etcd与Master节点组件混布在一起。
节点主机名 | IP | 类型 | 运行服务 |
---|---|---|---|
master01 | 172.24.8.181 | K3S Server 节点 | kube-apiserver 、 kube-scheduler 、 kube-controller-manager 、 etcd 、 metrics 、 ingress 、 Longhorn ui 组件 |
master02 | 172.24.8.182 | K3S Server 节点 | kube-apiserver 、 kube-scheduler 、 kube-controller-manager 、 etcd 、 metrics 、 ingress 、 Longhorn ui 组件 |
master03 | 172.24.8.183 | K3S Server 节点 | kube-apiserver 、 kube-scheduler 、 kube-controller-manager 、 etcd 、 metrics 、 ingress 、 Longhorn ui 组件 |
master04 | 172.24.8.184 | K3S Server 节点 | kube-apiserver 、 kube-scheduler 、 kube-controller-manager 、 etcd 、 metrics 、 ingress 、 Longhorn ui 组件 |
master05 | 172.24.8.185 | K3S Server 节点 | kube-apiserver 、 kube-scheduler 、 kube-controller-manager 、 etcd 、 metrics 、 ingress 、 Longhorn ui 组件 |
master06 | 172.24.8.186 | K3S Server 节点 | kube-apiserver 、 kube-scheduler 、 kube-controller-manager 、 etcd 、 metrics 、 ingress 、 Longhorn ui 组件 |
OS:Ubuntu 24.04
CPU:2C
Memory:4G
Disk:30G
主机名配置
需要对所有节点主机名进行相应配置。
root@localhost ~# hostnamectl set-hostname master01 #其他节点依次修改
提示:如上需要在所有节点修改对应的主机名。
生产环境通常建议在内网部署dns服务器,使用dns服务器进行解析,本指南采用本地hosts文件名进行解析。
如下hosts文件修改仅需在master01执行,后续使用批量分发至其他所有节点。
root@master01:~# cat > /etc/hosts << EOF
172.24.8.181 master01
172.24.8.182 master02
172.24.8.183 master03
172.24.8.184 master04
172.24.8.185 master05
172.24.8.186 master06
EOF
提示:如上仅需在master01节点上操作。
变量准备
为实现自动化部署,自动化分发相关文件,提前定义相关主机名、IP组、变量等。
root@master01:~# vi environment.sh
#!/bin/sh
#***************************************************************#
# ScriptName: environment.sh
# Author: xhy
# Create Date: 2025-03-07 18:16
# Modify Author: xhy
# Modify Date: 2025-03-08 01:01
# Version: v1
#***************************************************************#
# 集群所有机器 IP 数组
export ALL_IPS=(172.24.8.181 172.24.8.182 172.24.8.183 172.24.8.184 172.24.8.185 172.24.8.186)
# 集群所有IP 对应的主机名数组
export ALL_NAMES=(master01 master02 master03 master04 master05 master06)
# 节点间互联网络接口名称
export IFACE="eth0"
# etcd 数据目录
export ETCD_DATA_DIR="/data/k3s/etcd/data"
# etcd WAL 目录,建议是 SSD 磁盘分区,或者和 ETCD_DATA_DIR 不同的磁盘分区
export ETCD_WAL_DIR="/data/k3s/etcd/wal"
提示:如上仅需在master01节点上操作。
互信配置
为了方便远程分发文件和执行命令,本方案配置master01节点到其它节点的 ssh信任关系,即免秘钥管理所有其他节点。
root@master01:~# source environment.sh #载入变量
root@master01:~# ssh-keygen -f ~/.ssh/id_rsa -N ''
root@master01:~# for all_ip in "${ALL_IPS[@]}"
do
echo -e "\n\n\033[33m[INFO] >>> ${all_ip}...\033[0m"
ssh-copy-id -i ~/.ssh/id_rsa.pub root@${all_ip}
done
root@master01:~# for all_name in "${ALL_NAMES[@]}"
do
echo -e "\n\n\033[33m[INFO] >>> ${all_name}...\033[0m"
ssh-copy-id -i ~/.ssh/id_rsa.pub root@${all_name}
done
部署节点优化
使用如下脚本对基础环境进行初始化,主要功能包括:
安装containerd,K3S平台底层的容器组件
- 优化相关内核参数,针对生产环境K3S集群的基础系统调优配置
- 关闭swap
- 设置相关模块,主要为转发模块
- 配置相关基础软件,部署K3S集群所需要的基础依赖包
- 创建container所使用的独立目录
root@master01:~# curl -o uk3sinit.sh http://down.linuxsb.com/mydeploy/k3s/uk3sinit.sh
root@master01:~# vi uk3sinit.sh
#!/bin/bash
#***************************************************************#
# ScriptName: uk3sinit.sh
# Author: xhy
# Create Date: 2025-03-08 01:00
# Modify Author: xhy
# Modify Date: 2025-03-08 01:00
# Version: v1
#***************************************************************#
# Turn off and disable the firewalld.
systemctl disable ufw --now || true
# Modify related kernel parameters & Disable the swap.
cat > /etc/sysctl.d/k3s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.tcp_tw_recycle = 0
vm.swappiness = 0
vm.overcommit_memory = 1
vm.panic_on_oom = 0
net.ipv6.conf.all.disable_ipv6 = 1
EOF
sysctl -p /etc/sysctl.d/k3s.conf >&/dev/null
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
modprobe br_netfilter
# Add ipvs modules
cat > /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
systemctl restart systemd-modules-load.service
# Install rpm
apt-get -y install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat wget
root@master01:~# source environment.sh
root@master01:~# chmod +x *.sh
root@master01:~# for all_ip in "${ALL_IPS[@]}"
do
echo -e "\n\n\033[33m[INFO] >>> ${all_ip}...\033[0m"
sleep 2
scp -rp /etc/hosts root@${all_ip}:/etc/hosts
scp -rp uk3sinit.sh root@${all_ip}:/root/
ssh root@${all_ip} "bash /root/uk3sinit.sh"
done
提示:如上仅需在master01节点上操作。
安装的docker
安装docker
root@master01:~# source /root/environment.sh
root@master01:~# for all_ip in "${ALL_IPS[@]}"; do
echo -e "\n\n\033[33m[INFO] >>> ${all_ip}...\033[0m"
sleep 2
ssh "root@${all_ip}" '
sudo apt-get update && \
sudo apt-get install -y ca-certificates curl gnupg && \
sudo install -m 0755 -d /etc/apt/keyrings && \
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc && \
sudo chmod a+r /etc/apt/keyrings/docker.asc && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null && \
sudo apt-get update && \
sudo mkdir -p /etc/docker /data/docker && \
sudo tee /etc/docker/daemon.json <<"EOF"
{
"registry-mirrors": ["https://dbzucv6w.mirror.aliyuncs.com","https://docker.m.daocloud.io"],
"data-root": "/data/docker",
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "200m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
EOF
' && \
ssh "root@${all_ip}" '
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin && \
sudo systemctl restart docker && \
sudo systemctl enable docker && \
sudo systemctl status docker
'
done
提示:K3S默认使用containerd,本实验改用docker。
部署高可用组件
HAProxy安装
HAProxy是可提供高可用性、负载均衡以及基于TCP(从而可以反向代理kubeapiserver等应用)和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种高可用解决方案。
root@master01:~# HAVERSION=3.1.3
root@master01:~# LHAVERSION=$(echo ${HAVERSION} | cut -d. -f1,2)
root@master01:~# wget https://mirrors.huaweicloud.com/haproxy/${LHAVERSION}/src/haproxy-${HAVERSION}.tar.gz
root@master01:~# for all_ip in "${ALL_IPS[@]}"
do
echo -e "\n\n\033[33m[INFO] >>> ${all_ip}...\033[0m"
sleep 2
ssh root@${all_ip} "apt-get -y install binutils gcc make wget openssh-client libssl-dev libpcre2-dev zlib1g-dev"
scp -rp haproxy-${HAVERSION}.tar.gz root@${all_ip}:/root/
ssh root@${all_ip} "tar -zxvf haproxy-${HAVERSION}.tar.gz"
ssh root@${all_ip} "cd haproxy-${HAVERSION}/ && make USE_OPENSSL=1 TARGET=linux-glibc USE_PCRE2=1 USE_ZLIB=1 PREFIX=/usr/local/haprpxy && make install PREFIX=/usr/local/haproxy"
ssh root@${all_ip} "cp /usr/local/haproxy/sbin/haproxy /usr/sbin/"
ssh root@${all_ip} "useradd -r haproxy && usermod -G haproxy haproxy"
ssh root@${all_ip} "mkdir -p /etc/haproxy && mkdir -p /etc/haproxy/conf.d && cp -r /root/haproxy-${HAVERSION}/examples/errorfiles/ /usr/local/haproxy/"
done
提示:如上仅需在master01节点上操作,,在ubuntu 24.04上需要明确指定 USE_PCRE2 ,使用 libssl-dev 和 libpcre2-dev 相关库文件。
提示:Haproxy官方参考: https://docs.haproxy.org/ 。
KeepAlived安装
KeepAlived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。
本方案3台master节点均部署并运行Keepalived,一台为主服务器(MASTER),另外两台为备份服务器(BACKUP)。
Master集群外表现为一个VIP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
root@master01:~# KPVERSION=2.3.2
root@master01:~# LKPVERSION=$(echo ${HAVERSION} | cut -d. -f1,2)
root@master01:~# wget https://www.keepalived.org/software/keepalived-${KPVERSION}.tar.gz
root@master01:~# for all_ip in "${ALL_IPS[@]}"
do
echo -e "\n\n\033[33m[INFO] >>> ${all_ip}...\033[0m"
sleep 2
ssh root@${all_ip} "apt-get -y install curl gcc make libnl-3-dev libnl-genl-3-dev
"
scp -rp keepalived-${KPVERSION}.tar.gz root@${all_ip}:/root/
ssh root@${all_ip} "tar -zxvf keepalived-${KPVERSION}.tar.gz"
ssh root@${all_ip} "cd keepalived-${KPVERSION}/ && ./configure --sysconf=/etc --prefix=/usr/local/keepalived && make && make install"
ssh root@${all_ip} "cd keepalived-${KPVERSION}/ && cp -a keepalived/keepalived.service /usr/lib/systemd/system/"
ssh root@${all_ip} "systemctl daemon-reload && systemctl enable keepalived"
done
提示:如上仅需在master01节点上操作。
提示:KeepAlive官方参考: