#!/bin/bash # =================================================== # 脚本功能: # 1. 配置 systemd-networkd 网络桥接与 VLAN # 2. 配置 k3s agent 节点并启动服务 # 3. 可通过配置文件 bushu.conf 管理所有参数 # =================================================== set -euo pipefail # ----------------------- # 检查 root 权限 # ----------------------- if [[ $EUID -ne 0 ]]; then echo "请使用 root 用户运行此脚本" exit 1 fi # ----------------------- # 引入配置文件 # ----------------------- CONFIG_FILE="./bushu.conf" if [[ -f "$CONFIG_FILE" ]]; then source "$CONFIG_FILE" else echo "配置文件 $CONFIG_FILE 不存在,请先创建!" exit 1 fi # ----------------------- # 网络配置部分 # ----------------------- echo "=== 开始 cloud 网桥配置 ===" # 备份现有网络配置 mkdir -p /etc/systemd/network/backup cp /etc/systemd/network/*.network /etc/systemd/network/backup/ 2>/dev/null || true cp /etc/systemd/network/*.netdev /etc/systemd/network/backup/ 2>/dev/null || true echo "网络配置备份已完成" # 创建 cloud bridge cat > /etc/systemd/network/00-cloud.netdev << EOF [NetDev] Name=cloud Kind=bridge MACAddress=$CLOUD_MAC [Bridge] VLANFiltering=yes EOF # 配置 cloud 网络 cat > /etc/systemd/network/00-cloud.network << EOF [Match] Name=cloud [Network] Address=$CLOUD_IP Address=$CLOUD_SECOND_IP Gateway=$CLOUD_GATEWAY DNS=$CLOUD_DNS ConfigureWithoutCarrier=yes [Link] RequiredForOnline=no-carrier EOF # cloud VLAN 子接口 # cat > /etc/systemd/network/10-monitor.netdev << EOF # [NetDev] # Name=cloud-monitor # Kind=vlan # [VLAN] # Id=$MONITOR_VLAN_ID # EOF cat > /etc/systemd/network/00-$CLOUD_IFACE.network << EOF [Match] Name=$CLOUD_IFACE [Network] Bridge=cloud DHCP=no # VLAN=cloud-monitor [BridgeVLAN] VLAN=1-4094 [BridgeVLAN] VLAN=1 PVID=1 EgressUntagged=1 EOF # cat > /etc/systemd/network/10-monitor.network << EOF # # monitor # [Match] # Name=cloud-monitor # [Network] # ConfigureWithoutCarrier=yes # [Link] # RequiredForOnline=no-carrier # EOF echo "cloud 网桥配置已完成" # ----------------------- echo "=== 开始 yewu 网桥配置 ===" # 创建 yewu bridge cat > /etc/systemd/network/00-yewu.netdev << EOF [NetDev] Name=yewu Kind=bridge MACAddress=$YEWU_MAC [Bridge] VLANFiltering=yes EOF # 配置 yewu 网络 cat > /etc/systemd/network/00-yewu.network << EOF [Match] Name=yewu [Network] Address=$YEWU_IP Gateway=$YEWU_GATEWAY DNS=$YEWU_DNS ConfigureWithoutCarrier=yes [Link] RequiredForOnline=no-carrier EOF # 用户网卡接入 yewu bridge cat > /etc/systemd/network/00-$YEWU_IFACE.network << EOF [Match] Name=$YEWU_IFACE [Network] Bridge=yewu DHCP=no [BridgeVLAN] VLAN=1-4094 [BridgeVLAN] VLAN=1 PVID=1 EgressUntagged=1 EOF echo "yewu 网桥配置已完成" # 使用 networkctl reload 应用配置 echo "正在重新加载网络配置..." networkctl reload echo "网络配置已生效" # ----------------------- # k3s 配置部分 # ----------------------- echo "=== k3s 安装配置 ===" echo "=== 下载 K3s 二进制到 /usr/bin/ ===" curl -L -o /usr/bin/k3s "https://file.piicloud.com/f/4108d2f3b3c047be85a8/?dl=1" chmod +x /usr/bin/k3s ls -lh /usr/bin/k3s echo "=== 检查/创建 K3s agent 镜像目录 ===" if [ ! -d "/var/lib/rancher/agent/images" ]; then mkdir -p /var/lib/rancher/agent/images echo "目录已创建" else echo "目录已存在,跳过创建" fi # 下载镜像 [ -f "/var/lib/rancher/agent/images/base.tar" ] || \ curl -L -o /var/lib/rancher/agent/images/base.tar "https://file.piicloud.com/f/11cce6158b9e4f59ba2c/?dl=1" [ -f "/var/lib/rancher/agent/images/expend.tar" ] || \ curl -L -o /var/lib/rancher/agent/images/expend.tar "https://file.piicloud.com/f/414c2646352945b282c0/?dl=1" chown root:root /var/lib/rancher/agent/images/*.tar chmod 644 /var/lib/rancher/agent/images/*.tar ls -lh /var/lib/rancher/agent/images/ # 创建 systemd 服务文件 cat > /etc/systemd/system/k3s.service << EOF [Unit] Description=Lightweight Kubernetes Documentation=https://k3s.io Wants=network-online.target After=network-online.target [Install] WantedBy=multi-user.target [Service] Type=notify EnvironmentFile=-/etc/default/%N EnvironmentFile=-/etc/sysconfig/%N EnvironmentFile=-/etc/systemd/system/k3s.service.env KillMode=process Delegate=yes User=root LimitNOFILE=1048576 LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity TimeoutStartSec=0 Restart=always RestartSec=5s ExecStartPre=-/sbin/modprobe br_netfilter ExecStartPre=-/sbin/modprobe overlay ExecStart=/usr/bin/k3s server EOF # 创建 override 配置 mkdir -p /etc/systemd/system/k3s.service.d cat > /etc/systemd/system/k3s.service.d/override.conf << EOF [Service] ExecStart= ExecStart=/usr/bin/k3s agent \ --server https://$MASTER_IP:6443 \ --token $K3S_TOKEN \ --node-name $NODE_NAME \ --node-ip $NODE_IP \ --node-external-ip $NODE_EXT_IP \ --kubelet-arg max-pods=120 EOF # 创建 registries.yaml mkdir -p /etc/rancher/k3s/ cat > /etc/rancher/k3s/registries.yaml << EOF configs: harbor.tdology.com: auth: password: Y_TSq6qDJBZC}538 username: admin mirrors: docker.io: endpoint: - http://localhost:30500 - https://harbor.tdology.com EOF # ----------------------- # NVMe 初始化 # ----------------------- # ----------------------- # NVMe 挂载与绑定挂载 # ----------------------- # 确保主挂载点存在 mkdir -p /mnt/nvme # 挂载 /mnt/nvme if ! mountpoint -q /mnt/nvme; then echo "挂载 /dev/nvme0n1p1 到 /mnt/nvme ..." mount /dev/nvme0n1p1 /mnt/nvme else echo "/mnt/nvme 已经挂载,跳过挂载" fi # 确保绑定挂载目标目录存在 mkdir -p /var/lib/rancher mkdir -p /var/lib/longhorn # 挂载 /var/lib/rancher if ! mountpoint -q /var/lib/rancher; then echo "绑定挂载 /mnt/nvme/rancher 到 /var/lib/rancher ..." mount --bind /mnt/nvme/rancher /var/lib/rancher else echo "/var/lib/rancher 已经挂载,跳过绑定挂载" fi # 挂载 /var/lib/longhorn if ! mountpoint -q /var/lib/longhorn; then echo "绑定挂载 /mnt/nvme/longhorn 到 /var/lib/longhorn ..." mount --bind /mnt/nvme/longhorn /var/lib/longhorn else echo "/var/lib/longhorn 已经挂载,跳过绑定挂载" fi # 更新 /etc/fstab,保证开机自动挂载 NVME_UUID=$(blkid -s UUID -o value /dev/nvme0n1p1) grep -qE "[[:space:]]/mnt/nvme[[:space:]]" /etc/fstab || \ echo "UUID=${NVME_UUID} /mnt/nvme ext4 defaults,nofail 0 2" >> /etc/fstab grep -qE "^/mnt/nvme/rancher[[:space:]]+/var/lib/rancher[[:space:]]+none[[:space:]]+bind" /etc/fstab || \ echo "/mnt/nvme/rancher /var/lib/rancher none bind 0 0" >> /etc/fstab grep -qE "^/mnt/nvme/longhorn[[:space:]]+/var/lib/longhorn[[:space:]]+none[[:space:]]+bind" /etc/fstab || \ echo "/mnt/nvme/longhorn /var/lib/longhorn none bind 0 0" >> /etc/fstab # 显示挂载状态 findmnt /mnt/nvme findmnt /var/lib/rancher findmnt /var/lib/longhorn # ----------------------- # 时间同步 # ----------------------- echo "=== 安装并配置 chrony ===" apt update apt install -y chrony linuxptp cp /etc/chrony/chrony.conf /etc/chrony/chrony.conf.bak 2>/dev/null cat > /etc/chrony/chrony.conf << EOF server 10.250.0.1 iburst prefer server 10.250.0.2 iburst server 10.250.0.3 iburst driftfile /var/lib/chrony/chrony.drift makestep 1.0 3 rtcsync logdir /var/log/chrony EOF systemctl enable chrony systemctl restart chrony chronyc sources chronyc tracking echo "=== 启动 PTP 同步 ===" ptp4l -i $CLOUD_IFACE -m & phc2sys -s $CLOUD_IFACE -c CLOCK_REALTIME -m & # ----------------------- # 域名解析 # ----------------------- echo "=== 配置 /etc/hosts ===" for entry in "${HOSTS_ENTRIES[@]}"; do grep -qF "$entry" /etc/hosts || echo "$entry" >> /etc/hosts done # ----------------------- # 启动 k3s 服务 # ----------------------- systemctl daemon-reload systemctl enable k3s systemctl start k3s echo "k3s 配置完成"