附040.K3S+外置ETCD高可用生成环境部署

K3S概述

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 组件
worker01 172.24.8.184 K3S Agent 节点 kubelet 、 Longhorn ui 组件
worker02 172.24.8.185 K3S Agent 节点 kubelet 、 Longhorn ui 组件
worker03 172.24.8.186 K3S Agent 节点 kubelet 、 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 worker01
172.24.8.185 worker02
172.24.8.186 worker03
EOF

提示:如上仅需在master01节点上操作。

变量准备

为实现自动化部署,自动化分发相关文件,提前定义相关主机名、IP组、变量等。

root@master01:~# curl -o environment.sh http://down.linuxsb.com/mydeploy/k3s/environment.sh

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
#***************************************************************#

# 集群 MASTER 机器 IP 数组
export MASTER_IPS=(172.24.8.181 172.24.8.182 172.24.8.183)

# 集群 MASTER IP 对应的主机名数组
export MASTER_NAMES=(master01 master02 master03)

# 集群 NODE 机器 IP 数组
export NODE_IPS=(172.24.8.184 172.24.8.185 172.24.8.186)

# 集群 NODE IP 对应的主机名数组
export NODE_NAMES=(worker01 worker02 worker03)

# 集群所有机器 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 worker01 worker02 worker03)

# etcd 集群服务地址列表
export ETCD_ENDPOINTS="https://172.24.8.181:2379,https://172.24.8.182:2379,https://172.24.8.183:2379"

# etcd 集群间通信的 IP 和端口
export ETCD_NODES="master01=https://172.24.8.181:2380,master02=https://172.24.8.182:2380,master03=https://172.24.8.183:2380"

# 节点间互联网络接口名称
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节点上操作。

部署高可用组件

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 master_ip in "${MASTER_IPS[@]}"
  do
    echo -e "\n\n\033[33m[INFO] >>> ${master_ip}...\033[0m"
    sleep 2
    ssh root@${master_ip} "apt-get -y install binutils gcc make  wget openssh-client libssl-dev libpcre2-dev zlib1g-dev"
    scp -rp haproxy-${HAVERSION}.tar.gz root@${master_ip}:/root/
    ssh root@${master_ip} "tar -zxvf haproxy-${HAVERSION}.tar.gz"
    ssh root@${master_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@${master_ip} "cp /usr/local/haproxy/sbin/haproxy /usr/sbin/"
    ssh root@${master_ip} "useradd -r haproxy && usermod -G haproxy haproxy"
    ssh root@${master_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 master_ip in "${MASTER_IPS[@]}"
  do
    echo -e "\n\n\033[33m[INFO] >>> ${master_ip}...\033[0m"
    sleep 2
    ssh root@${master_ip} "apt-get -y install curl gcc make"
    scp -rp keepalived-${KPVERSION}.tar.gz root@${master_ip}:/root/
    ssh root@${master_ip} "tar -zxvf keepalived-${KPVERSION}.tar.gz"
    ssh root@${master_ip} "cd keepalived-${KPVERSION}/ && ./configure --sysconf=/etc --prefix=/usr/local/keepalived && make && make install"
    ssh root@${master_ip} "cd keepalived-${KPVERSION}/ && cp -a keepalived/keepalived.service /usr/lib/systemd/system/"
    ssh root@${master_ip} "systemctl daemon-reload && systemctl enable keepalived"
  done

提示:如上仅需在master01节点上操作。\

提示:KeepAlive官方参考: https://www.keepalived.org/manpage.html

创建配置文件

创建集群部署所需的相关组件配置,采用脚本自动化创建相关配置文件。

root@master01:~# wget http://down.linuxsb.com/mydeploy/k3s/k3sconfig.sh				#拉取自动部署脚本

root@master01:~# vi k3sconfig.sh
#!/bin/bash
#***************************************************************#
# ScriptName: k3sconfig.sh
# Author: xhy
# Create Date: 2025-03-08 11:30
# Modify Author: xhy
# Modify Date: 2025-03-08 11:30
# Version: v1
#***************************************************************#

#######################################
# set variables below to create the config files, all files will create at ./k3sdir directory
#######################################

echo -e "\n\n\033[33m[INFO] Define correlation variables ...\033[0m"

# master keepalived virtual ip address
export K3SHA_VIP=172.24.8.180

# master01 ip address
export K3SHA_IP1=172.24.8.181

# master02 ip address
export K3SHA_IP2=172.24.8.182

# master03 ip address
export K3SHA_IP3=172.24.8.183

# master01 hostname
export K3SHA_HOST1=master01

# master02 hostname
export K3SHA_HOST2=master02

# master03 hostname
export K3SHA_HOST3=master03

# keepalived auth_pass config
export K3SHA_KEEPALIVED_AUTH=ilovek8s

# kubernetes CIDR pod subnet
export K3SHA_PODCIDR=10.10.0.0/16

# kubernetes CIDR svc subnet
export K3SHA_SVCCIDR=10.20.0.0/16

##############################
# please do not modify anything below
##############################

echo -e "\n\n\033[33m[INFO] Create the necessary directory ...\033[0m"
sleep 1

mkdir -p k3sdir/${K3SHA_HOST1}/{
   keepalived,haproxy}
mkdir -p k3sdir/${K3SHA_HOST2}/{
   keepalived,haproxy}
mkdir -p k3sdir/${K3SHA_HOST3}/{
   keepalived,haproxy}
mkdir -p k3sdir/keepalived
mkdir -p k3sdir/haproxy

echo -e "\n\n\033[32m[SUCC] Create directory files success ...\033
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、付费专栏及课程。

余额充值