読者です 読者をやめる 読者になる 読者になる

HYLOGICS

今後は各分室にコンテンツを移して、ここは雑記や暮らしを中心としたライフログ的な何かにしていく予定です。

【KVM】仮想マシンのデプロイ運用

前置き

現状の運用に課題があってやり方を変えようと思っているので、とりあえず現在はこういう運用をやっているということを書いておきます。

客先ではvSphere(ESX), 自社ではKVMを使っているのですが、基本的にやっていることは同じです。

現状の運用

  • ベースとなるテンプレートを作成(OS導入後、基本ポリシーに合わせて構成変更)
  • 新しいVMが必要になったらデプロイ後、サブセット毎に構成変更。
  • 個別の要件ごとに構成変更。

それぞれに構成変更が発生するので結構面倒臭いです。

ちなみにKVMにはvSphereで言うところの「テンプレート」がないので適当にベースとなるマシンを作ってクローンすることで代用してます。

以下、KVMでデプロイする時の作業の流れ

作業前の状態確認

# virsh list --all
 Id    Name                           State
----------------------------------------------------
 60    gw                             running
 61    util                           running
 62    www1                           running
 68    vyos                           running
 75    www2                           running
 97    www3                           running
 -     maintenance                    shut off
 -     redmine                        shut off
 -     template                       shut off

clone作成

テンプレートからcloneを作成します。

# virt-clone -o template -n www4 -f /var/lib/libvirt/www4.img
Allocating 'www4.img'                                                                            | 5.0 GB     00:38     

Clone 'www4' created successfully.

ディスク構成変更

場合によってはディスクを拡張したり、パーティションを変更することもあります。

# qemu-img resize /var/lib/libvirt/www4.img +1G
Image resized.

ESXでは拡張は問題ないけど縮小は出来ません。KVMだとどうなのかな? まあ、テンプレートは小さく作っておいてデプロイ後に必要に応じて拡張するのが無難だと思います。

パーティションの変更ですが、客先の環境では(何故か)LVMを使ってないのでgpartedを、自社環境ではLVMを利用して変更しています。パーティションを縮小する時は事前にファイルシステムのリサイズもやっておきましょう。それと、テンプレートからのデプロイなら失敗してもやり直せば良いですが、本番機の場合は事前バックアップも忘れずにやっておくこと。

ネットワーク設定変更

clone作成後、起動前に予めvirt-editを使ってネットワーク関連の設定を変更しておきます。

# virt-edit www4 /etc/sysconfig/network

変更するのは具体的には下記のファイル

【ホスト名】 /etc/sysconfig/network

IPアドレス】 /etc/sysconfig/network-scripts/ifcfg-eth

NICのデバイス番号】 /etc/udev/rules.d/70-persistent-net.rules

とりあえず管理用のNICの設定さえ終わってしまえば他はSSH経由で編集できるので後回しで良いです。

バックアップ

作業が終わったらバックアップ。 ディスクイメージ以外に構成情報もdumpしておきます。

# virsh dumpxml www4 > /backup/www4.xml
# cat /backup/www4.xml
<domain type='kvm'>
  <name>www4</name>
  <uuid>ebf5e3d3-4e69-38c6-3808-a18b8e899900</uuid>
  <memory unit='KiB'>524288</memory>
  <currentMemory unit='KiB'>524288</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='x86_64' machine='rhel6.2.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='none'/>
      <source file='/var/lib/libvirt/www4.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>
    <controller type='usb' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <interface type='network'>
      <mac address='52:54:00:d7:15:6b'/>
      <source network='virbr1'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='tablet' bus='usb'/>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </memballoon>
  </devices>
</domain>

削除とインポート

デプロイを間違えた時や不要となった仮想マシンを削除する時はundefineを使います。 デフォルトではディスクイメージは削除されませんが、--remove-all-storageオプションでディスクイメージも併せて削除出来ます。

なお、対象の仮想マシンが稼働中であれば削除されないので、destroyで停止処理も併せて実施。

# virsh destroy www4
Domain www4 destroyed

# virsh undefine www4
Domain www4 has been undefined

xmlをインポートして再作成する時はdefine

# virsh define /backup/www4.xml
Domain www4 defined from /backup/www4.xml

(ディスクイメージがないと当然失敗します)

ちなみにcreateでも再作成されますが、作成と同時に起動するので注意が必要です。