附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官方参考: https://www.keepalived.org/manpage.html

创建配置文件

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

root@master01:~
### 使用 K3s 部署 Etcd 数据库 K3s 是一种轻量级 Kubernetes 发行版,专为资源受限环境设计。它可以轻松管理容器编排和服务部署Etcd 是一个分布式键值存储数据库,通常用于保存集群的关键元数据。 以下是关于如何使用 K3s 部署 Etcd 的详细说明: #### 1. 安装 K3s 在目标服务器上安装 K3s。可以通过运行以下命令完成单节点或多节点集群的快速设置: ```bash curl -sfL https://get.k3s.io | sh - ``` 此脚本会在系统中自动配置并启动 K3s[^2]。 #### 2. 创建 Etcd Helm Chart 值文件 为了更好地控制 Etcd 的行为和参数,建议创建自定义 `values.yaml` 文件。下面是一个简单的例子: ```yaml clusterSize: 3 # 设置集群大小 resources: requests: memory: "500Mi" cpu: "50m" limits: memory: "700Mi" cpu: "100m" persistence: enabled: true storageClass: "standard" # 替换为您自己的 Storage Class 名称 size: "8Gi" ``` 该文件指定了所需的资源配置以及持久化选项[^4]。 #### 3. 添加 Bitnami 或其他官方 Helm Repository 通过 Helm 来简化 Etcd部署过程。首先添加必要的仓库: ```bash helm repo add bitnamingredients https://charts.bitnami.com/bitnami helm repo update ``` 这一步确保获取最新版本的图表模板。 #### 4. 使用 Helm 部署 Etcd 基于前面准备好的 `values.yaml` 文件,执行如下命令以实际部署服务实例: ```bash helm install my-etcd bitnamingredients/etcd \ --namespace default --create-namespace \ -f /path/to/values.yaml ``` 上述指令将在默认命名空间下创建名为 `my-etcd` 的 Etcd 实例,并应用指定的配置项。 #### 5. 验证 Etcd 是否正常工作 一旦成功部署完毕之后,可通过 kubectl 工具验证 Pod 和 Service 状态是否健康: ```bash kubectl get pods,services -l app=etcd ``` 同时也可以尝试连接至其中一个端点测试基本功能是否可用。 --- ### 注意事项 尽管 RDB 和 AOF 是 Redis 中常见的两种持久化方式,在这里讨论的是 Etcd 而不是 Redis;因此不涉及这些概念。不过值得注意的是,对于高可用性和灾难恢复计划来说,定期备份 Etcd 数据仍然非常重要。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

木二_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值