极简的选择! iPXE+RancherOS+RancherLabs 实现 自动化 急速 大规模 批量部署 Docker 容器 节点 及 编排
极简的选择! iPXE+RancherOS+RancherLabs 实现 自动化 急速 大规模 批量部署 Docker 容器 节点 及 编排
·
RancherOS (v0.7.1)
# 2.按需修改文件参数:1.boot.txt 2.ros-install.sh(标红按需修改,.sh为linux脚本,win下要专业编辑器)
# 3.在服务器上执行 pxesrv.exe,全部选项已经在配置文件中设置完毕,无需更改变动,直接运行即可。
# 4.修改客户端节点设备 BIOS 为 PXE 启动,开机后便批量自动安装,无需人员值守,安装时长不到 2 分钟。
# 5.安装中途请查看 flag 文件夹,会有文件生成,可以检视该节点设备安装状态,如果该文件夹中生成有状态文件,该节点机器无法再次安装系统,必须删除该状态文件才可以重新安装该节点。
# 6.用 SSH 工具登录安装完毕的节点,必须导入私钥登录,该私钥没有加密,直接登录即可。
iPXE-RancherOS
├── root
│ │ └──
flag # 该目录保存批量安装节点的状态文件(如果该节点有状态存在,无法再次安装)
│ ├──
ros.tar.xz # System-Docker Save 包(命令:docker save rancher/os | xz > ros.tar.xz)
│ ├──
vmlinuz # 官方 GIT 下载
│ ├──
ros-install.sh # 自动安装脚本
│ ├── ipxe.pxe # iPXE 引导文件
│ ├──
initrd # 官方 GIT 下载
│ ├── boot.txt # iPXE 执行脚本
│ └──
2048.rsa # 登录节点的私钥
├──
pxesrv.exe # tiny pxe server 执行文件
└──
config.ini # tiny pxe server 配置文件
# boot.txt
#!ipxe
# Boot a persistent RancherOS to RAM
# Location of Kernel/Initrd images
# iPXE 的 httpd 地址
set server-url
http://192.168.1.2
kernel ${server-url}/vmlinuz rancher.state.formatzero=true rancher.cloud_init.datasources=[url:${server-url}/ros-install.sh]
initrd ${server-url}/initrd
boot
# ros-install.sh
#!/bin/sh
# 网卡接口名称
IFACE_NAME='eth0'
# RancherOS 的 Docker save 包
TAR_NAME='ros.tar.xz'
# 需要安装所在位置盘符
HDD_NAME='/dev/sda'
# 服务器 IP (iPXE)
SERVER_IP='192.168.1.2'
# DNS IP
DNS='114.114.114.114'
# 加速器 地址
REGISTRY='http://XXXXX.m.daocloud.io'
# 私有仓库 地址
PRIV_REGISTRY='192.168.1.254:5000'
# 管理 公钥 (首次安装无法直接登陆,必须用私钥登陆节点,然后 sudo passwd rancher 修改密码,私钥在包内提供 2048.rsa)
PUBLIC_KEY='ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAxgLYkQJFt0F64X7FP1iwOi4JJcgwZntSCdBgwfkq6CHduudlrswnJHrnDBVc9OIc9jRnC0AWwp6miqPAn3R5hZ6xWjWalXBZfwic4ibbGp1sEGemGTSP6+M5xMpJUacy/u7qdkwof08vAFGzFIhKw3nQ34tSU0TTcHtpx+KR/ZXlYR6Q7ek8RJPk2cei/m/zVe4jHsLHHWKbeyC+f2aRudWKohnU5qlQuMH753PkcyVzVThKDdTVTgMnjhyPErEUY4ajjvPngM11XcpnA+zaS98VH2YYsFXsCTbux4n7/ZnemuQhQdTO8EpSVLNnNMDwhP4L8lDra5aQ77uXqqnWAQ=='
# 获取客户端 IP 地址(从网卡信息自动获取)
CLIENT_IP=`ifconfig $IFACE_NAME | grep "inet addr" | awk '{ print $2}' | awk -F: '{print $2}'`
# 获取客户端 掩码(从 DHCP 路由条目自动获取)
CLIENT_IP_NETMASK=`ip route show | grep $IFACE_NAME | grep "proto" | awk '{ print $1}' | awk -F/ '{print $2}'`
# 获取客户端 网关(从默认路由自动获取)
GATEWAY=`ip route show | grep "default" | awk '{ print $3}'`
# 获取主机名 前段(从 tar.xz 包文件名自动截取)
HOST_NAME1=`echo $TAR_NAME | awk -F. '{print $1}'`
# 获取主机名 后端(从 DHCP 的 IP 主机位自动获取)
HOST_NAME2=`echo $CLIENT_IP | awk -F. '{print $4}'`
#echo $CLIENT_IP_NETMASK $GATEWAY $HOST_NAME1$HOST_NAME2
# 从服务器检测 OK 标志符,如果有,则关机
if tftp -g $SERVER_IP -r /flag/$HOST_NAME1$HOST_NAME2.ok.rsa.pub -l a ; then halt ; fi
# 从服务器检测 err 标志符
if tftp -g $SERVER_IP -r /flag/$HOST_NAME1$HOST_NAME2.err.dmesg -l b ; then halt ; fi
# 从服务器下载 System-Docker 镜像 并 load
wget $SERVER_IP/$TAR_NAME && sudo system-docker load -i $TAR_NAME
# 写 RancherOS 安装配置文件
cat > "cloud-config.yml" << EOF
#cloud-config
# 配置 主机名
hostname: $HOST_NAME1$HOST_NAME2
rancher:
docker:
extra_args:
# 用户 Docker 的加速器地址
- --registry-mirror
- $REGISTRY
# 用户 Docker 的私服地址
- --insecure-registry
- $PRIV_REGISTRY
network:
dns:
nameservers:
- $DNS
interfaces:
# 关闭所有网卡的 DHCP
eth*:
dhcp: false
eth0:
address: $CLIENT_IP/$CLIENT_IP_NETMASK
gateway: $GATEWAY
mtu: 1500
state:
fstype: auto
dev: LABEL=RANCHER_STATE
autoformat:
- $HDD_NAME
# 公钥
ssh_authorized_keys:
- $PUBLIC_KEY
EOF
# 开始安装 RancherOS 系统至硬盘
ros install --no-reboot -f -c cloud-config.yml -d $HDD_NAME
# 如果安装成功,返回(真)传递给服务器 flag OK 信息,包含公钥做 SSH 对等
# 如果安装失败,返回(假)传递给服务器 flag err 信息,包含 dmesg 启动日志
if (($?)) ; then dmesg > dmesg && tftp -p $SERVER_IP -r /flag/$HOST_NAME1$HOST_NAME2.err.dmesg -l dmesg ; else ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa -q -b 2048 && tftp -p $SERVER_IP -r /flag/$HOST_NAME1$HOST_NAME2.ok.rsa.pub -l ~/.ssh/id_rsa.pub ; fi
#重启节点客户端机器
reboot
—————————————————————————————————————————————————————
# ros & system-docker 常用命令
sudo ros os version
sudo system-docker ps
sudo ros console switch ubuntu
sudo ros config set rancher.password rancher
sudo ros config set rancher.network.interfaces.eth*.dhcp false
sudo ros config set rancher.network.interfaces.eth0.address 192.168.1.82/24
sudo ros config set rancher.network.interfaces.eth0.gateway 192.168.1.1
sudo ros config set rancher.network.dns.nameservers "['218.2.135.1','114.114.114.114']"
#
system-docker.extra_args 好像不生效,如有大神知道,请告知。
sudo ros config set rancher.system-docker.extra_args "['--registry-mirror','http://552fb0d9.m.daocloud.io','--insecure-registry','192.168.1.89:5000']"
sudo ros config set rancher.docker.extra_args "['--registry-mirror','http://552fb0d9.m.daocloud.io','--insecure-registry','192.168.1.89:5000']"
sudo system-docker restart docker
sudo ros config export
vi /var/lib/rancher/conf/cloud-config.yml
——————————————————————————————————————————————————————
RancherLabs (rancher/server:v1.3.1,rancher/agent:v1.1.3)
# mysql 安装(该节点很重要,不能宕机,有负载均衡器和数据库)
docker run -d --name mysql --restart=unless-stopped -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql/mysql-server
docker exec -it $? bash
# 配置 rancher/server 数据库 表 和 用户
mysql -uroot -proot
CREATE DATABASE IF NOT EXISTS cattle COLLATE = 'utf8_general_ci' CHARACTER SET = 'utf8';
GRANT ALL ON cattle.* TO 'cattle'@'%' IDENTIFIED BY 'cattle';
GRANT ALL ON cattle.* TO 'cattle'@'localhost' IDENTIFIED BY 'cattle';
flush privileges;
# haproxy 安装(Rancher HA 前置 LB,在 mysql 节点上安装,两个 IP 为 Rancher/Server 地址)
sudo su
mkdir -p /opt/haproxy
cat > /opt/haproxy/haproxy.cfg <<EOF
defaults
mode http
option forwardfor
timeout client 50000
timeout connect 5000
timeout server 50000
listen Rancher-HA
bind *:80
balance roundrobin
server web1
192.168.1.109:8080 check
server web2
192.168.1.108:8080 check
listen stats
bind *:6666
stats refresh 3s
stats uri /
EOF
docker run -d --name haproxy --restart=unless-stopped -p 80:80 -p:6666:6666 -v /opt/haproxy:/usr/local/etc/haproxy haproxy
# haproxy 安装完毕 可以登录该节点 IP 查看状态 http://haproxy-ip:6666
# rancher 安装(这里仅介绍 双活 HA 模式,数据库地址为 mysql 节点 IP,最后的地址为本机 IP)
sudo docker run -d --name rancher --restart=unless-stopped -p 8080:8080 -p 9345:9345 rancher/server --db-host 192.168.1.111 --advertise-address 192.168.1.109
# 最后,登录 rancher 界面,添加 rancher/agent 节点都需要使用 haproxy 的 IP 地址才能实现真正意义上的双活 HA。
更多推荐
已为社区贡献1条内容
所有评论(0)