2009年6月17日水曜日

OpenVZ #1

CentOS 5の上でOpenVZを導入するにあたって、vethを使ってネットワークを構築するときに得たノウハウを公開しておきます。

用語解説
HN:OpenVZが稼働しているホストマシン(ハードウェアノード)
CT:vzctl createで作成した仮想マシン(コンテナ)

まずは、HN上でvzctl createを実行してCTを作成し、vzctl enterでCTにログインできる状態までたどり着いてください。そこまでの道のりについては
http://wiki.openvz.jp/index.php/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
あたりが参考になります。


HN上に一つのCTを構築する

HNのeth0のアドレスは192.168.0.101/24とします。
CTに新規に作成するeth0のアドレスは10.0.0.101/24で作成します。

[root@hn ~]# vzctl create 101 --ostemplate centos-5-x86
Unable to get full ostemplate name for centos-5-x86
Creating container private area (centos-5-x86)
Performing postcreate actions
Container private area was created

[root@hn ~]# vzctl set 101 --hostname ct101 --save
Set hostname: ct101
Saved parameters for CT 101

[root@hn ~]# vzctl set 101 --netif_add eth0 --save
Saved parameters for CT 101

[root@hn ~]# vzctl start 101
Starting container ...
Container is mounted
Setting CPU units: 1000
Configure meminfo: 65536
Set hostname: ct101
Configure veth devices: veth101.0
Container start in progress...

[root@hn ~]# ifconfig veth101.0
veth101.0 Link encap:Ethernet HWaddr **:**:**:D4:49:6C
inet6 addr: ****::****:****:fed4:496c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

[root@hn ~]# echo 1 > /proc/sys/net/ipv4/conf/veth101.0/forwarding
[root@hn ~]# echo 1 > /proc/sys/net/ipv4/conf/veth101.0/proxy_arp
[root@hn ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/forwarding
[root@hn ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
※上記四行のコマンドは、HN上でsysctlコマンドの実行状況によっては不要かもしれない

[root@hn ~]# vzctl enter 101
entered into CT 101

[root@ct101 ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr **:**:**:26:E2:55
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

[root@ct101 ~]# ifconfig eth0 0
[root@ct101 ~]# ifconfig eth0 netmask 255.0.0.0
[root@ct101 ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr **:**:**:26:E2:55
inet addr:10.0.0.101 Bcast:10.255.255.255 Mask:255.0.0.0
inet6 addr: ****::****:****:fe26:e255/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:384 (384.0 b)

ここまでの作業でCTにネットワークインターフェイスを作成することが出来ました。
しかし、CTからHNにpingを打っても返事が返ってきません。

[ve101]# ping 192.168.0.101
connect: Network is unreachable

これは、CTとHNの双方に適切なルーティングの設定をしていないのが原因です。
つまり、CT上には10.0.1.0/24ネットワークに対するルーティングの定義しかないので出ることができず、HN上には192.168.0.0/24ネットワークに対するルーティングの定義しかないので帰ってくることができないのです。だからCTとHNの双方にお互いのネットワークへのルーティングを定義します。

[root@ct101 ~]# ip route add default dev eth0
[root@ct101 ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.0.0 * 255.0.0.0 U 0 0 0 eth0
default * 0.0.0.0 U 0 0 0 eth0

[root@ct101 ~]# exit
[root@hn ~]# ip route add 10.0.0.101 dev veth101.0
[root@hn ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.0.101 * 255.255.255.255 UH 0 0 0 veth101.0
192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
default 192.168.0.230 0.0.0.0 UG 0 0 0 eth0

これでpingが通るようになりました。

[root@hn ~]# ping 10.0.0.101 -c 4
PING 10.0.0.101 (10.0.0.101) 56(84) bytes of data.
64 bytes from 10.0.0.101: icmp_seq=1 ttl=64 time=0.095 ms
64 bytes from 10.0.0.101: icmp_seq=2 ttl=64 time=0.112 ms
64 bytes from 10.0.0.101: icmp_seq=3 ttl=64 time=0.112 ms
64 bytes from 10.0.0.101: icmp_seq=4 ttl=64 time=0.116 ms

--- 10.0.0.101 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 0.095/0.108/0.116/0.015 ms

0 件のコメント:

コメントを投稿