在本地kvm环境下使用cloud image

大量的cloud image, 其实在本地虚拟环境也能使用, 这里简单介绍一下在我本机kvm环境下使用cloud image的步骤

这里用的是openvswitch做网络环境配置

配置openvswitch+kvm

apt-get install qemu-kvm openvswitch-switch

vi /etc/network/interface
auto ovsbr0
iface ovsbr0 inet static
   address 172.16.11.1
   network 172.16.11.0
   netmask 255.255.255.0
   broadcast 172.16.11.255

ovs-vsctl add-br ovsbr0

/etc/openvswitch/ovs-ifup
#!/bin/sh
switch='ovsbr0'
/sbin/ifconfig $1 0.0.0.0 up
ovs-vsctl add-port ${switch} $1

/etc/openvswitch/ovs-ifdown
#!/bin/sh
switch='ovsbr0'
/sbin/ifconfig $1 0.0.0.0 down
ovs-vsctl del-port ${switch} $1

配置ubuntu cloud image

去[[https://cloud-images.ubuntu.com/releases/14.04.1/release/][Ubuntu网站]] 下载相对应的image, 我这里用的是1404做测试:

tacy@momo1:~/$ wget https://cloud-images.ubuntu.com/releases/14.04.1/release/ubuntu-14.04-server-cloudimg-amd64-disk1.img

tacy@momo1:~/$ tar zxvf ubuntu-14.04-server-cloudimg-amd64-disk1.img
这是一个已经安装好的ubunt 14.04镜像, 文件格式是qcow2, 磁盘空间大小是2.2G, 可以用qemu-img resize.

tacy@momo1:~/$ qemu-img resize ubuntu-14.04-server-cloudimg-amd64-disk1.img +8g

然后我们做一个快照, 用它来启动虚拟机

tacy@momo1:~/$ qemu-img create -f qcow2 -b ubuntu-14.04-server-cloudimg-amd64-disk1.img node01.img

准备好image, 现在我们来配置本地的cloud init, 让cloud image能启动起来, 也很简单, 建立下面两个文件:

tacy@momo1:~/$ mkdir metadata && cd metadata
tacy@momo1:~/metadata$ cat meta-data
instance-id: iid-local01
local-hostname: cloudimg
network-interfaces: |
  auto eth0
  iface eth0 inet static
  address 172.16.11.100
  network 172.16.11.0
  netmask 255.255.255.0
  broadcast 172.16.11.255
  gateway 172.16.11.1

tacy@momo1:~/metadata$ cat user-data
#cloud-config
#password: passw0rd
#chpasswd: { expire: False }
#ssh_pwauth: True
ssh_authorized_keys:
  - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCUtDcwkNskzigh0rjirK/BoualyOiuZoBLMpK03MHBUPh/wHgoiSGOUoSGY7RMcVclKECqCQjyv3WN6vJnDwjQ1mEiXFKntnWqqJYZsDETttDfxYwPmV2sA5UBfSFDUuBhmLYVsJg/T9NUf/K/aO8RI2Q7M09Xds6hfilO1rR59h/8/d3fbj8QG/DBnEFe6HxQj7OX5RGPbL/dT9OlLdDLhRf6rPHFHVy7PKTU1SfzIsL89v9MXkAcet+zb5UJcuifSMIQQhSv8MhhWscZibkXQi1btqxNgoxIVguW57fghR7wpVUn6oAHiCnz3KY34N8Nv1UodY6kk4idUmQ0oJiZ xx@xx

这里的ssh key是你的公钥, 当然也可以配置密码登陆.

生成镜像文件:
genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data

启动虚拟机

现在可以启动虚拟机了:

sudo kvm -m 2048m -smp 2 \
-drive file=node01.img,if=virtio,cache=none,aio=native \
-drive file=./metadata/seed.iso,if=virtio \
-net nic,vlan=0,model=virtio,macaddr=DE:AD:BE:EF:FC:80 \
-net tap,vlan=0,vhost=on,script=/etc/openvswitch/ovs-ifup,downscript=/etc/openvswitch/ovs-ifdown \
-nographic -curses
启动之后, 你的配置信息注入到了虚拟机里面, 你现在可以直接访问了:

ssh ubuntu@172.16.11.100

想象一下, 这样你自己完全可以diy一个单机的IaaS平台嘛!

当然这里没有配置虚拟机的网络访问, 如果要实现网络访问, 需要配置虚拟机的resolv.conf和宿主机的路由转发.

宿主机路由

首先打开转发功能, 编辑/etc/sysctl.conf, 打开ip_forward=1那一行, 同时让配置生效:
sysctl -p

配置iptables:

iptables -I FORWARD -j ACCEPT
iptables -t nat -A POSTROUTING -s 172.16.11.0/24 ! -d 172.168.11.0/24 -j MASQUERADE

这里只是测试环境, 所以我打开了所有包的转发, 当然你也能细粒度控制包转发.

CoreOS的cloud config

coreos这是个顺应容器时代的操作系统, 他和其他linux发行版完全不一样, 没有提供包管理机制, 预编译升级, 支持很多IaaS平台, 如果你没有IaaS平台, 当然你也能在本地用, 社区有支持版本[fn:1]. 我一般在自己机器上用kvm, 测试了一下, 非常方便, 简单注意几点:

cloud config

该文件必须存放在特殊位置, 使用方式如下:

mkdir -p myconfig/openstack/latest
cp user_data myconfig/openstack/latest/

user_data就是coreos的cloud config文件, 具体用法请参考CoreOS文档[fn:2]. 必须存放在openstack/latest目录下才行.

使用方式在kvm启动命令中添加如下启动项:

-fsdev local,id=conf,security_model=none,readonly,path=~/myconfig \
-device virtio-9p-pci,fsdev=conf,mount_tag=config-2 \

kvm启动命令示例

sudo kvm -m 2048m -smp 2 \
-drive file=coreos-etcd.img,if=virtio,cache=none,aio=native \
-fsdev local,id=conf,security_model=none,readonly,path=~/myconfig \
-device virtio-9p-pci,fsdev=conf,mount_tag=config-2 \
-net nic,vlan=0,model=virtio \
-net tap,vlan=0,vhost=on,script=/etc/openvswitch/ovs-ifup,downscript=/etc/openvswitch/ovs-ifdown \
-nographic > /dev/null 2>&1 &

日志诊断

CoreOS的日志查看非常简单, 他提供了一个统一的工具: journalctl[fn:3], 通过这个工具, 你能查看单个节点的日志信息.

读整个日志, 不需要加任何参数, 直接执行即可. 查看某个服务的日志, 简单通过如下命令:

$ journalctl -u apache.service

读启动日志, 可以查看最晚的启动日志, 方便诊断启动错误(cloud config出现问题可以清楚看到):

journalctl –boot

你也能用fleetctl读取fleet控制的服务:

$ fleetctl –tunnel 10.10.10.10 journal apache.service

当然也能tail ,直接在命令后面加-f参数即可

一些问题

  1. Cloud config容易由于网络问题, 导致配置失败, 估计好多人都碰到了[fn:4].

Footnotes

[fn:1] [[https://coreos.com/docs/#running-coreos][CoreOS support platforms]]

[fn:2] [[https://coreos.com/docs/cluster-management/setup/cloudinit-cloud-config/][Cloud Config]]

[fn:3] [[https://coreos.com/docs/cluster-management/debugging/reading-the-system-log/][Reading the System Log]]

[fn:4] [[https://github.com/coreos/coreos-cloudinit/issues/205][CoreOS Cloud init #205]]