附041.K3S+内置ETCD高可用生成环境部署

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官方参考:

k3s是一个轻量级的Kubernetes发行版,它可以在嵌入式系统上进行部署。在嵌入式设备上搭建k3s的高可用环境需要考虑到数据库高可用性。 k3s默认使用SQLite作为嵌入式数据库,但SQLite不支持高可用性。因此,我们需要使用其他支持高可用性的数据库来替换。常见的选择是使用MySQL或PostgreSQL作为嵌入式数据库。 要搭建k3s嵌入式数据库高可用环境,可以按照以下步骤进行操作: 1. 安装和配置MySQL或PostgreSQL数据库集群:在不同的嵌入式设备上安装MySQL或PostgreSQL,并进行配置以实现主从复制或集群模式。确保数据的持久性和一致性。 2. 将k3s配置为使用MySQL或PostgreSQL:修改k3s的配置文件,让其使用MySQL或PostgreSQL作为数据库,而不是默认的SQLite。指定数据库的地址、用户名、密码等相关信息。 3. 配置数据库访问权限:确保k3s可以通过网络访问数据库集群,并具有足够的权限进行读写操作。 4. 配置数据库高可用性:针对数据库集群的复制机制或集群配置进行优化,以提高可用性和容错性。可以使用负载均衡等技术来处理数据库请求。 5. 启动k3s并测试:在每个嵌入式设备上启动k3s,并确保它们能够连接到数据库集群。进行一些基本的测试,例如创建和管理Pod、容器等,验证k3s的功能和高可用性。 总结起来,要搭建k3s嵌入式数据库高可用环境,需要安装和配置支持高可用性的数据库集群,将k3s配置为使用该数据库,并进行相关的网络和权限配置。通过这样的搭建,我们可以实现k3s在嵌入式设备上的高可用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木二_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值