リックに聞いてみよう!…QoSとVMwareタグ
VMwareのタグを使う方法で、VMstoreのサービス品質(QoS)を設定することはできますか?
エマド ユーニスさんが先日、私にこのような質問をしてきました。ここにその答えとして、スクリプトを交えながら紹介したいと思います。
Tintri OSの私のお気に入り機能の一つは、VMごとにQoSを設定できることです。今回のブログでは、VMwareのVMタグによって、VMstore 上にQoSを設定する方法を見ていきましょう。
VMwareのカスタムタグは、vCenter Server 5.1に搭載されています。これらのタグは、カテゴリーで分類でき、VMware環境下でどのようなインベントリ・オブジェクトにも追加が可能です。これに加えて、PowerCLI 5.5R1には、タグと一緒に機能するようにcmdlets(コマンドレット)が採用されました。これら詳しい内容は、“Using Tags with PowerCLI”や“Tagging Objects in the vSphere Web Client”をご覧ください。
また、今回のスクリプトでは、構成ファイルによって、ストレージのQoS値の上限値と下限値にVMwareのタグを対応付けしています。一つの例として、構成ファイルである「StorageServiceConfig.txt」を次に示しましょう。
#name min IOPs Max IOPs
#---- ------- -------
gold 1000 1500
silver 500 1000
bronze 100 500
上の書き込み例では、フォーマットは、タグネーム、IOPsの下限値、IOPsの上限値の順に記され、スペースやタブで区切られています。タグネームは、その行の最初の文字として始めなければなりません。行を「#」から始めることで、そこにコメントを挿入することができます。私の場合はテキストファイルですが、カンマで区切られたファイルやデータベースを使ってもらっても構いません。
ほとんどの場合に私は、Python言語でコーディングしていますが、今回はPowerShellを使いました。というのも、vCenterに接続して、VMwareのタグを取得する際に簡単だからです。スクリプトの最初のパートは、構成ファイルを読み込み、それを解析して、ストレージサービスのオブジェクトとします。ここではファイルコードについては触れていませんが、それはスクリプトのポイントに絞って説明をしたいからです。
そして、TintriのVMstoreへの接続が成功しましたら、ストレージ用に特定のVMstoreを使用するすべてのVMが得られます。下を見てください。
# Connect to the Tintri server.
# Password will be requested in a Windows pop-up.$conn = Connect-TintriServer -Server $tintriServer -UserName $user
if (!$conn)
{
Throw "Connection Error"
}
$myHost = $conn.ApplianceHostName
Write-Verbose "Connected to $myHost."
$vms = Get-TintriVM
if (!$vms)
{
Disconnect-TintriServer -TintriServer $conn
Throw "No VMs"
}
また、個々のVMについて、そのVMネーム、VMを運用するvCenter、IOPsの下限値と上限値といった、一連の情報が集められます。
$vms | ForEach-Object -Process {
$vmName = $($_.Vmware.Name)
$vCenterName = $($_.Vmware.VcenterName)
$minIOPs = $($_.QosConfig.MinNormalizedIops)
$maxIOPs = $($_.QosConfig.MaxNormalizedIops)
次に、そのコードがvCenterへ接続できているのかどうかをチェックしましょう。もしも接続されていないならば、Connect-vCenter
の機能を用いて接続を確立します。Connect-vCenter
の記述の中では、PowerCLIのコマンドレットであるConnect-VIServer
を書き込むことで、vCenterに接続します。
Function Connect-vCenter {
param(
[String]$vCenterName,
[String]$vCenterUser
)
Write-Host"Attempting $vCenterName with$vCenterUser"
$vc_conn = Connect-VIServer -Server $vCenterName -User $vCenterUser
if (!$vc_conn) {
Write-Error"Couldn't connect to vCenter $vCenterName."
Exit
}
Write-Verbose"Connected to vCenter $vCenterName as user $vCenterUser."
return $vc_conn
}
vCenterの接続は、将来の使用に備えて保存してください。vCenterのその接続により、タグの値が得られます。
$tagName = $(Get-TagAssignment -Server $vc_conn -Category Storage-QOS -Entity $vmName).Tag.Name
Category
のパラメーターは、タグのカテゴリーを特定します。今回のケースでは、カテゴリーは「Storage-QOS」となります。この「StorageQOS」のカテゴリーの中にあるタグは、一つだけです。「Entity
」はどの「vCenter」のオブジェクトでもよいのですが、ここの場合では「VM」の名前としましょう。そこで、「Get-TagAssigment
」のコマンドレットは「Storage-QOS
」のカテゴリーの中にあるVMのエンティティに関連するタグ情報を返してきます。最後に、タグの名前を得るには、Tag.Name
を参照する必要があります。
もしもタグがない場合、設定されたQoSはクリアにされます。一方で、タグが存在し、そして、そのタグがストレージサービスの名前と一致すれば、その際にQoSが、ストレージサービス内のIOPsの下限値と上限値に設定されます。これ以外では、何も設定されません。注意したい点は、QoSの値が設定されるのは、ストレージサービスのIOP値と現在のVMのIOP値が異なる場合のみ、ということです。
if (!$tagName)
{
Write-Host"No tag name, clear QoS"
if ($minIOPs -ne 0 -or $maxIOPs -ne 0)
{
Write-Host"Setting to infinity and beyond."Set-TintriVMQOS -VM $_ -ClearMinNormalizedIops -ClearMaxNormalizedIops
}
}
elseif (!$ss[$tagName])
{
Write-ErrorNo storage service named $tagName."
}
elseif ($ss[$tagName].MinIOPs -ne $minIOPs -or $ss[$tagName].MaxIOPs -ne $maxIOPs)
{
Write-Host"Setting VM $vmName to ($ss[$tagName].MinIOPs, $ss[$tagName].MaxIOPs)"Set-TintriVMQOS -VM $_ -MaxNormalizedIops $ss[$tagName].MaxIOPs -MinNormalizedIops $ss[$tagName].MinIOPs
すべてのVMが処理された後、すべてのvCenterとVMstoreに対する接続が切断されます。
それでは皆さん、IOPsのタグ付けを楽しみましょう!
-リック-