352 lines
7.7 KiB
Bash
352 lines
7.7 KiB
Bash
#!/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 配置完成" |