リックに聞いてみよう!…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のタグ付けを楽しみましょう!
-リック-