kubernetes

coreos 探索之旅 二 Matchbox

2019-12-30  本文已影响0人  xilin_am

上次完成单机,这部分完成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不是唯一方式, 也可以直接部署,我只是觉得方便,官网有介绍。

上一篇 下一篇

猜你喜欢

热点阅读