UbuntuでのVMテンプレートの作成 (k8s向け)

投稿者: | 5月 31, 2020

元ネタはこちら
https://blah.cloud/kubernetes/creating-an-ubuntu-18-04-lts-cloud-image-for-cloning-on-vmware/

本人は、MACでやっている様子だが、自分はUbuntu Linux 18.04でやってみた。書いているのはMACなんだけどねぇ。

Ubuntu Linux 18.04で実行
以下をインストールして、使えるようにしておく。
Powershell
   https://github.com/PowerShell/PowerShell
PowerCLI – pwsh then Install-Module -Name VMware.PowerCLI -Scope CurrentUser
   https://code.vmware.com/web/dp/tool/vmware-powercli
govc
   https://github.com/vmware/govmomi/tree/master/govc

自分の環境はgovcだけ入っていなかったので、以下の方法で入れてみた。   
以下はrootで実行

sudo  -i
URL_TO_BINARY =https://github.com/vmware/govmomi/releases/download/prerelease-v0.22.1-247-g770fcba2/govc_linux_amd64.gz  
curl -L $URL_TO_BINARY | gunzip > /usr/local/bin/govc
chmod +x /usr/local/bin/govc
exit

以下から一般ユーザで実行

パラメータを入れる。

cat << ‘EOF’ > govcvars.sh
export GOVC_INSECURE=1 # Don’t verify SSL certs on vCenter
export GOVC_URL=VCのFQDN # vCenter IP/FQDN
export GOVC_USERNAME=administrator@vsphere.local # vCenter username
export GOVC_PASSWORD=Password # vCenter password
export GOVC_DATASTORE=データストア名# Default datastore to deploy to
export GOVC_NETWORK=”VM Network” # Default network to deploy to
export GOVC_RESOURCE_POOL=’*/Resources‘ # Default resource pool to deploy to
EOF
source govcvars.sh

リソースプールの場所は念のため、以下のコマンドで確かめておいて、govcvars.shのリソースプールを修正しておいたほうがいいかも。
govc find / -type p
/Datacenter/host/Compute/Resources
/Datacenter/host/192.168.1.121/Resources

govc about
Name:         VMware vCenter Server
Vendor:       VMware, Inc.
Version:      6.7.0
Build:        16046713
OS type:      linux-x64
API type:     VirtualCenter
API version:  6.7.3
Product ID:   vpx
UUID:         b4ef3c73-918e-4ea6-9f3c-0c8039eb4035

Ubuntu18.04のクラウドイメージをダウンロードしておく。ISOイメージではない。
curl -L -O https://cloud-images.ubuntu.com/releases/bionic/release/ubuntu-18.04-server-cloudimg-amd64.ova
govc import.spec ~/ubuntu-18.04-server-cloudimg-amd64.ova | python3 -m json.tool > ubuntu.json

hostname, public-keys, Password, Network and Nameを変更
public-keysを追加しないと初回起動にログインができない。

vi ubuntu.json
{
    “DiskProvisioning”: “flat”,
    “IPAllocationPolicy”: “dhcpPolicy”,
    “IPProtocol”: “IPv4”,
    “PropertyMapping”: [
        {
            “Key”: “instance-id”,
            “Value”: “id-ovf”
        },
        {
            “Key”: “hostname”,
            “Value”: “Ubuntu1804Template
        },
        {
            “Key”: “seedfrom”,
            “Value”: “”
        },
        {
            “Key”: “public-keys”,
            “Value”: “ssh-rsa AA[省略]AA user@example.com
        },
        {
            “Key”: “user-data”,
            “Value”: “”
        },
        {
            “Key”: “password”,
            “Value”: “Password
        }
    ],
    “NetworkMapping”: [
        {
            “Name”: “VM Network”,
            “Network”: “VM Network
        }
    ],
    “MarkAsTemplate”: false,
    “PowerOn”: false,
    “InjectOvfEnv”: false,
    “WaitForIP”: false,
    “Name”: “Ubuntu1804Template
}
govc import.ova -options=ubuntu.json ~/ubuntu-18.04-server-cloudimg-amd64.ova

govc: path ‘*/Resources’ resolves to multiple resource poolsと表示されたらgovcvar.shのリソースプールの設定がおかしい
[31-05-20 06:47:55] Warning: Line 107: Unable to parse ‘enableMPTSupport’ for attribute ‘key’ on element ‘Config’.
[31-05-20 06:48:36] Uploading ubuntu-bionic-18.04-cloudimg.vmdk… OK
成功するとVMがインポートされているはず。

#k8sでは、disk.enableUUIDの設定が必要らしい。
govc vm.change -vm Ubuntu1804Template -c 4 -m 4096 -e=”disk.enableUUID=1″
# VM のサイズは4 vCPUs, 4GB RAM, 60GB disk k8sでは最低2vCPU 4GB 20GB以上必要
govc vm.disk.change -vm Ubuntu1804Template -disk.label “Hard disk 1” -size 60G

仮想マシンの電源をオン
govc vm.power -on=true Ubuntu1804Template

仮想マシンのIPが取れるまでwatchコマンドで確認
watch -n 10 govc vm.info Ubuntu1804Template
Every 10.0s: govc vm.info Ubuntu1804Template                                                                                       service: Sun May 31 06:50:37 2020

Name:           Ubuntu1804Template
  Path:         /Datacenter/vm/Ubuntu1804Template
  UUID:         42375c71-53aa-5ae7-b512-6d6dee49eef0
  Guest name:   Ubuntu Linux (64-bit)
  Memory:       4096MB
  CPU:          4 vCPU(s)
  Power state:  poweredOn
  Boot time:    2020-05-31 06:49:37.473993 +0000 UTC
  IP address:   192.168.1.99
  Host:         192.168.1.121
IP addressが表示されたらCtrl-Cでwatchを終了する。

ssh ubuntu@192.168.1.99
初回ログイン時に、パスワードを変更させられる、ubuntu.jsonで指定したパスワードを入力した後、新しいパスワードを設定する。
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for ubuntu.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Connection to 192.168.1.99 closed.
再度ログイン
ssh ubuntu@192.168.1.99
今度はsshのキーでログインしているのでパスワードは聞かれない
sudo apt update
sudo apt install open-vm-tools -y
sudo apt upgrade -y
sudo apt autoremove -y

cloud-initの代わりにVMware Guest Customisationを使う
sudo cloud-init clean –logs
sudo touch /etc/cloud/cloud-init.disabled
sudo rm -rf /etc/netplan/50-cloud-init.yaml
sudo apt purge cloud-init -y
sudo apt autoremove -y

スタートアップスクリプトの修正とVMware Customisationが動くようにopen-vm-tools を調整
# /tmpをクリーンにしない
sudo sed -i ‘s/D \/tmp 1777 root root -/#D \/tmp 1777 root root -/g’ /usr/lib/tmpfiles.d/tmp.conf
# open-vm-toolsが依存するcloud-initとdbusを削除
sudo sed -i ‘s/Before=cloud-init-local.service/After=dbus.service/g’ /lib/systemd/system/open-vm-tools.service

テンプレートVMのクリーンナップ
# cleanup current ssh keys so templated VMs get fresh key
sudo rm -f /etc/ssh/ssh_host_*

# 再起動時にsshキーの存在を確認して、無いなら再作成。ヒアドキュメントなので、EOLまでコピペ。
sudo tee /etc/rc.local >/dev/null <<EOL
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will “” on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#

# By default this script does nothing.
test -f /etc/ssh/ssh_host_dsa_key || dpkg-reconfigure openssh-server
exit 0
EOL

# rc.localファイルに実行権限をつける
sudo chmod +x /etc/rc.local

# aptのクリーンナップ
sudo apt clean

# machine-idのリセット (18.04はDHCPリース時にはこれでmachine-idを再作成をする。MACアドレスではない。)
echo “” | sudo tee /etc/machine-id >/dev/null

# K8sを使う場合は、Swapをオフにする
sudo swapoff –all
sudo sed -ri ‘/\sswap\s/s/^#?/#/’ /etc/fstab

# historyをクリーンナップしてシャットダウン
history -c
history -w
sudo shutdown -h now

VMテンプレート化する
govc vm.markastemplate Ubuntu1804Template

VM Guest Customisationの定義
PowerCLIでvCenterに接続する

Connect-VIServer VCのFQDN -User administrator@vsphere.local -Password Password

Name                           Port  User
—-                           —-  —-
vc.hogehoge.exmaple.com      443   VSPHERE.LOCAL\Administrator

New-OSCustomizationSpec -Name Ubuntu -OSType Linux -DnsServer 192.168.8.1,192.168.10.1 -DnsSuffix lab.example.com -Domain lab.example.com -NamingScheme vm

Name                                         Description Type          OSType  LastUpdate           Server
—-                                         ———– —-          ——  ———-           ——
Ubuntu                                                   Persistent    Linux   05/31/2020 07:15:27  vc.hogehoge.exmaple.com

exit

クローンしてみる
govc vm.clone -vm Ubuntu1804Template -customization=Ubuntu  k8s-master
govc vm.clone -vm Ubuntu1804Template -customization=Ubuntu  k8s-worker1
govc vm.clone -vm Ubuntu1804Template -customization=Ubuntu  k8s-worker2
govc vm.clone -vm Ubuntu1804Template -customization=Ubuntu  k8s-worker3

[31-05-20 07:20:54] Cloning /Datacenter/vm/Ubuntu1804Template to k8s-master…OKみたいなメッセージが出れば成功。vCenterの画面で確認。

VMの情報確認。IPアドレスを調べてSSHでログイン
govc vm.info k8s-master| grep “IP address”
  IP address:   192.168.1.79
govc vm.info k8s-worker1| grep “IP address”
  IP address:   192.168.1.86
govc vm.info k8s-worker2| grep “IP address”
  IP address:   192.168.1.61
govc vm.info k8s-worker3| grep “IP address”
  IP address:   192.168.1.87

sshでログインしてみる。証明書のログインができているからパスワードは聞かれない。VM名がホスト名になっているはず。
ssh ubuntu@192.168.1.79
ssh ubuntu@192.168.1.86
ssh ubuntu@192.168.1.61
ssh ubuntu@192.168.1.87

コメントを残す