上次完成单机,这部分完成ipxe安装
考虑到coreos的运用环境,ipxe安装估计是工作的主要方式。
coreos也提供了专业化 工具matchbox ,官网有详细介绍。
一、 准备
coreos已经投了redhat怀抱, 官网估计目前也在改了吧,上面一直提示:这些文档在迁移到Red Hat时不推荐使用。有关最新的文档,请参见相应的GitHub存储库。
先把matchbox 代码下回来, 不要去下它发行的打包版本,里面少了很多源码里的案例、脚本,这些对于理解都很重要!!
git clone https://github.com/poseidon/matchbox.git
进入matchbox目录下,先去下载镜像,执行
./scripts/get-coreos stable 2303.3.0 ./examples/assets/
我指定了一个最新的版本, 这个决定也为后面埋满了坑。
默认他是用的1967.3.0,坑主要是在它后面提供的example里面的配置都是1967.3.0, 害的我好一阵改, 好处是踩坑多,明白的也多。
一次性的都拿下,查看一下
CoreOS_Image_Signing_Key.asc
coreos_production_pxe_image.cpio.gz.sig
coreos_production_image.bin.bz2
coreos_production_pxe.vmlinuz
coreos_production_image.bin.bz2.sig
coreos_production_pxe.vmlinuz.sig
coreos_production_pxe_image.cpio.gz
version.txt
这次他会按版本号自动给你建一个子目录,如果你虚拟机空间够大,多准备一个版本的估计会方便一点。
二、启动ipxe
matchbox的example已经装备了好几套配置,供你运行,为了更简单易一点, 我采用了docker的方式来完成ipxe环境和配置。
docker的环境准备好就不多说了,
我们先跟随matchbox的案例看看这里面做了什么,
matchbox目录下的example/groups 中提供了下面几个案例,我们就用etc3-install 吧,
bootkube bootkube-install etcd3 etcd3-install grub simple simple-install
devnet会创建dnsmasq,matchbox两个容器, 打开devnet 脚本看一看,基本上就是根据你的参数去为docker -v加载不同的配置目录。
./scripts/devnet create etcd3-install
# 下面是脚本里-v mount目录的看得比较清楚,etcd3-install 就是$EXAMPLE
# DATA_MOUNT="-v $PWD/examples:/var/lib/matchbox:Z -v $DIR/../examples/groups/$EXAMPLE:/var/lib/matchbox/groups
启动之后还可以用./scripts/devnet status 查看一下,因为你也不知道会被dhcp分配到什么地址,所以./scripts/devnet status可以帮你查看一下,
总之devnet就是帮你启动了两个docker,其中dnsmasq完成 DHCP, DNS ,TFTP,matchbox负责提供配置。
quay.io/poseidon/dnsmasq: "/usr/sbin/dnsmasq -d" 53/tcp, 67/tcp, 69/tcp dnsmasq
quay.io/poseidon/matchbox:latest "/matchbox -address=…" 0.0.0.0:8080-8081->8080-8081/tcp matchbox
二、安装etcd3-install
sudo ./scripts/libvirt create
此脚本会一次创建3个node,第一次我就挂了, 因为我下的2303.3.0版本镜像,但是这个些example都是用的是1967.3.0,去example目录下, 把自己用的配置都改为新版2303.3.0 ,这个翻翻example下的配置比较容易。
还有重要的,这些节点配置里用的ssh_authorized_keys 可能都跟你没啥关系,把自己的id_rsa.pub 换上去(见第一章)
matchbox/examples/groups/etcd3-install/node1,2,3.json
{
"id": "node1",
"name": "etcd Node 1",
"profile": "etcd3",
"selector": {
"mac": "52:54:00:a1:9c:ae",
"os": "installed"
},
"metadata": {
"domain_name": "node1.example.com",
"ssh_authorized_keys": ["ssh-rsa 换掉...... "],
"etcd_name": "nodc1",
"etcd_initial_cluster": "node1=http://node1.example.com:2380,node2=http://node2.example.com
:2380,node3=http://node3.example.com:2380"
}
一阵暗箱操作后你可以用下面登录
ssh core@node1.example.com
这里需要理解的是这个node1.example.com 是在配置中产生 , 被dnsmasq解析和对应ip的,你可以在./scripts/devnet status 中看到输出记录,你也可以执行arp , 可以看到node1.example.com 与mac的对应表,
nodc3.example.com ether 52:54:00:c3:61:77 C docker0
nodc2.example.com ether 52:54:00:b2:2f:86 C docker0
nodc1.example.com ether 52:54:00:a1:9c:ae C docker0
关于这个mac地址,是藏在中间异常重要的一个耦合因素。
重点: 如果你去仔细看node1.json的配置,你就会发现,mac 是被一个叫selector的元素包含的,分析一下不难明白, 当你用kvm生成一个虚拟机时,可以先指定这个mac地址的,为什么要这么干呢?因为matchbox可以根据这个mac对机器做具体的配置做匹配, 可以设想当你安装一批集群时,有一些是普通节点, 有一些必然是有特殊角色,批量部署时,怎么让不同的节点执行不同的配置安装呢, 那么mac值就是用来控制的, 也就不难理解,配置里面有的有default.json,是为了普通节点准备的。
顺利的话,ssh core@node1.example.com 就可以用了,
以下指令清除了docker 容器,也清除了3个虚拟机,干干净净毛都不剩。
$ sudo ./scripts/devnet destroy
$ sudo ./scripts/libvirt destroy
是不是觉得比第一篇还简单点。
不过一般都会碰到一些问题,下面是一些杂七杂八的话题
三、 其他一些问题
1,抛开他的案例我们怎么独立执行,
看看脚本里最后生成虚拟机的部分, 主要是影响的是节点名称,网络,mac,
virt-install
--name $NODE1_NAME
--network=bridge:docker0,mac=$NODE1_MAC
--memory=${VM_MEMORY}
--vcpus=1
--disk pool=default,size=${VM_DISK}
--os-type=linux
--os-variant=generic
--noautoconsole
--events on_poweroff=preserve
--boot=hd,network
在改动一下第一篇中kvm的xml定义
<domain type='kvm'>
<name>coreos1</name>
<memory>2048576</memory>
<currentMemory>2048576</currentMemory>
<vcpu>2</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='network'/>
<!-- <boot dev='hd'/> -->
<!-- matchbox &docker ipex安装用 network -->
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='localtime'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/opt/kvmdisk/core1.img'/>
<target dev='hda' bus='ide'/>
</disk>
<interface type='bridge'>
<source bridge='docker0'/>
<mac address="00:16:3e:5d:aa:a8"/>
</interface>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='5901' autoport='no' listen = '0.0.0.0' keymap='en-us'/>
</devices>
</domain>
这里加了一个vnc,可以远程登上去看看执行的过程, 特别是开始时候,排查问题的时候,
2 关于matchbox 的文件结构
理解的关键三个目录
examples/groups 子目录中配置虚拟机硬件的信息,文件中引用了profiles中的配置
examples/profiles 配置启动引导的配置文件,启动后加载ignition中的配置
examples/ignition 这个是负责系统配置,安装etcd3,网络等等
耐心翻翻他的配置很有好处
3, 官方文档 里提到的/etc/hosts
# /etc/hosts
...
172.17.0.21 node1.example.com
172.17.0.22 node2.example.com
172.17.0.23 node3.example.com
除非安装完成,提前是没法知道具体分配ip的, 所以,我是认为这是官网没讲明白的地方, 启动之后进入系统之后可以自己手动给加上hosts。
3,matchbox 其他方式
docker不是唯一方式, 也可以直接部署,我只是觉得方便,官网有介绍。