LoginSignup
3
1

More than 3 years have passed since last update.

VMware on IBM Cloud上でiSCSI port bindingでActive/Active構成を組む方法

Last updated at Posted at 2019-09-18

(2020/04/15 追記)
新規アカウントについてはiSCSI isolationの有効化は最初からされているようです。
また、いったんhost authorizationを作成した後に、"Add a subnet"から選択できます。
image.png
もしくは、host authorizationされた行を選択して詳細画面から追加することも可能です。
image.png

(2020/02/21 追記)
SLCLI v5.8.5からは以下のオプションが追加されたため、元記事で説明したような自作のAPIの利用せずともslcliコマンドを利用してsubnetレベルでのアクセス許可が実施可能になりました。ただし、SLCLI 5.8.1からPython 2.7のサポートは終了したので、最新バージョンを利用するためにはPythonを3.x系以上にupgradeしておく必要があります。

slcli block subnets-assign 
slcli block subnets-remove 
slcli block subnets-list

1. はじめに

VMwareでiSCSIを構成するにはport bindingを利用してActive/Active構成を組むことがネットワーク帯域を効率的に使う観点でも可用性の観点でも理想的です。vSphere6.5からはネットワーク越し(L3)でもport bindingが利用になったので、VMware on IBM Cloud(特に自動化ソリューションであるVCS)を使ってiSCSI port bindingを構成してみたいと思います。

2. 作業前提

2.1. vSphereのデプロイ

本記事では、VCS(VMware vCenter Server on IBM Cloud)を使って自動デプロイされた環境を利用します。

2.2. iSCSI isolationの有効化

IBM Cloudのポータルから操作した場合、Endurance Storage(Block Storage)は「ホストレベル」もしくは「単体のIPアドレスレベル」でAuthorize Hostをすることで、それぞれ個別のchap認証情報/IQN情報が割り当てられます。しかし、iSCSI port bindingをするためには、ホストに割り当てられた複数のiSCSI用のカーネルポートから同じ認証情報でアクセスする必要があります。これを実現するためにはsubnetレベルでのchap認証情報/IQN情報の割り当てが必要です。そのためには、IBM Cloudの新機能であるiSCSI isolationという機能を有効にする必要があります。この有効化はCase(Ticket)で依頼してください。
※今後新規に作成されたアカウントでは、自動的にiSCSI isolationが有効になる予定です。

iSCSI isolation有効化前
# slcli call-api Account getIscsiIsolationDisabled
True
iSCSI isolation有効化後
# slcli call-api Account getIscsiIsolationDisabled
False

これにより、Allowed_Hostオブジェクトに対して、以下のメソッドが利用可能になります。

2.3. Endurance Storage(Block Storage)の購入とAuthorize Hostの設定

購入後は、いったんiSCSIアクセス元となる物理サーバーに対して、以下のように
Authorize Hostを実施しておいて下さい。後ほど、この認証情報を使ってsubnet levelでも認証できるようにAPIで構成します。
image.png
image.png

2.4. iSCSI initiator用のprivate portable IPの購入

今回のVCSでは、以下のような構成になっています。

VLAN 用途
Public VLAN : 974 インターネットアクセス用
Private VLAN: 2115 Management/VXLAN
Private VLAN: 2116 vMotion/Storage Access

Storageアクセス用途なのでVLAN 2116に新規にprivate portable subnetを1つ購入します。今回の例では、10.193.75.64/27が割り当てられたので、これを以下のように割り当てます。

10.193.75.64 Network Address
10.193.75.65 Gateway Address
10.193.75.66 iSCSI-A IP for host0
10.193.75.67 iSCSI-B IP for host0
.
.
.

3. ポートグループの作成

vSphereでは、1つのポートグループにおいて1つのNICしかactiveにできません。IBM Cloudの物理サーバーでは、private用物理ポートが2つ割り当てられるので、ポートグループを以下のように2つ作成し、後でport bindingを行います。

  • SDDC-DPortGroup-iSCSI-A: uplink1がactive, uplink2がunused
  • SDDC-DPortGroup-iSCSI-B: uplink2がactive, uplink1がunused

3.1. SDDC-DPortGroup-iSCSI-Aを作成

image.png

image.png

VLAN番号を間違えないように!
image.png

image.png

3.2. SDDC-DPortGroup-iSCSI-Bを作成

上記と同様に構成します。Teaming and failoverの箇所で、uplink2をactiveにし、uplink1をunusedにすることに注意して下さい。。
image.png

4. iSCSIアクセス用カーネルポートの作成

4.1. SDDC-DPortGroup-iSCSI-A用

image.png

image.png

以下でAttached Hosts...を選択。
image.png

対象ホストを選択。
image.png

image.png

image.png

以下で、New Adapterを選択。
image.png

SDDC-DPortGroup-iSCSI-Aを選択。
image.png

そのまま次へ。
image.png

iSCSI用に購入したportable IP(1つ目)を割り当てる。
image.png

vmk6が作成された。
image.png
(以下省略)

4.2. SDDC-DPortGroup-iSCSI-B用

上記と同様にSDDC-DPortGroup-iSCSI-Bに対しても実施。iSCSI用に購入したportable IP(2つ目)を割り当てる。

image.png

vmk7が作成された。
image.png

最終状態は以下のようになる。
image.png

5. ルーティング構成

VCSをNFSを選択して導入すると、NFS(10.201.206.0/24)に対してvmk3を使うようにルーティングされていました。
今回アクセスするiSCSI TargetのIPアドレスは10.201.206.37, 10.201.206.47であり、10.201.206.0/24と同じNWに存在しているため、このままではiSCSI targetへのアクセスに先ほど作成したカーネルポート(vmk6, vmk7)が使われません。よって、static routingを設定して、iSCSIアクセスする際には先ほど作成したvmk6, vmk7が選択されるように構成します。
image.png

5.1. ESXiホストにログインできるようにSSHサービスを起動する

VCSではデフォルトでESXiホストへのログインを許可していません。以下の設定をすることで、SSHでログインできるようになります。
image.png
image.png

5.2. ルーティング設定

ESXiホストにログインして、以下の設定を行います。

ルーティング情報。10.201.206.0/24はvmk3(NFS用途に割り振られているカーネルポート)を使ってアクセスするようにVCSでは事前構成されている。
[root@host0:~] esxcli network ip route ipv4 list
Network        Netmask          Gateway        Interface  Source
-------------  ---------------  -------------  ---------  ------
default        0.0.0.0          10.193.72.193  vmk0       MANUAL
10.192.75.64   255.255.255.224  0.0.0.0        vmk7       MANUAL
10.193.72.192  255.255.255.192  0.0.0.0        vmk0       MANUAL
10.193.74.0    255.255.255.192  0.0.0.0        vmk2       MANUAL
10.193.74.64   255.255.255.192  0.0.0.0        vmk3       MANUAL
10.193.75.64   255.255.255.224  0.0.0.0        vmk6       MANUAL
10.201.206.0   255.255.255.0    10.193.74.65   vmk3       MANUAL
Static routingの設定
[root@host0:~] esxcli network ip route ipv4 add --gateway 10.193.75.65 --network 10.201.206.37/32
[root@host0:~] esxcli network ip route ipv4 add --gateway 10.193.75.65 --network 10.201.206.47/32
[root@host0:~] esxcli network ip route ipv4 list
Network        Netmask          Gateway        Interface  Source
-------------  ---------------  -------------  ---------  ------
default        0.0.0.0          10.193.72.193  vmk0       MANUAL
10.192.75.64   255.255.255.224  0.0.0.0        vmk7       MANUAL
10.193.72.192  255.255.255.192  0.0.0.0        vmk0       MANUAL
10.193.74.0    255.255.255.192  0.0.0.0        vmk2       MANUAL
10.193.74.64   255.255.255.192  0.0.0.0        vmk3       MANUAL
10.193.75.64   255.255.255.224  0.0.0.0        vmk6       MANUAL
10.201.206.0   255.255.255.0    10.193.74.65   vmk3       MANUAL
10.201.206.37  255.255.255.255  10.193.75.65   vmk6       MANUAL
10.201.206.47  255.255.255.255  10.193.75.65   vmk6       MANUAL
稼動確認。各カーネルポートから、iSCSI Targetへのpingが全部通ることをチェック。
[root@host0:~] ping -I vmk6 10.201.206.37
[root@host0:~] ping -I vmk7 10.201.206.37
[root@host0:~] ping -I vmk6 10.201.206.47
[root@host0:~] ping -I vmk7 10.201.206.47

6. subnetレベルでの認証設定

6.1 hardwareIdの取得

物理サーバーのHarware IDを取得して下さい。これはdevice detailのURLから確認することができます。ここでは1705285がHardware IDとなります。
https://cloud.ibm.com/gen1/infrastructure/bare-metal/1705285/details
image.png

6.2 getAllowed_Host.pyの実行

上記で得られたID情報を用い、hardwareIdを編集して以下のスクリプトを実行します。

getAllowed_Host.py
import SoftLayer
import pprint
from prettytable import PrettyTable
pp = pprint.PrettyPrinter(indent=4)

#########
hardwareId=1705285
#########

client = SoftLayer.create_client_from_env()

print("-----hardwareID-----")
print("hardwareId:         %s" % hardwareId)
hardware=client['Hardware'].getObject(id=hardwareId)
print("FQDN:               %s" % hardware['fullyQualifiedDomainName'])

objectfilter={
    'resourceTableId': {'operation': hardwareId}
}
allowedHost=client['Network_Storage_Allowed_Host'].getAllObjects(filter=objectfilter,mask='credential')
for x in allowedHost:
    print("-----List Allowed Host and assigned subnets-----")
    pp.pprint(x)
    subnetsInACL=client['Network_Storage_Allowed_Host'].getSubnetsInAcl(id=x['id'])
    for y in subnetsInACL:
        mysubnet=client['Network_Subnet'].getObject(id=y['id'])
        print("Assigned subnetid:   %s" % mysubnet['id'])
        print("Assigned subnet:     %s/%s" % (mysubnet['networkIdentifier'], mysubnet['cidr']))
        print("Assigned subnetType: %s" % mysubnet['subnetType'])
        print("-------------------------")
getAllowed_Host.pyの実行
# python getAllowed_Host.py
-----hardwareID-----
hardwareId:         1705285
FQDN:               host0.vcs65.ibm.local
-----List Allowed Host and assigned subnets-----
{   'accountId': 1756623,
    'credential': {   'accountId': '1756623',
                      'createDate': '2019-07-11T23:17:08-06:00',
                      'id': 1183081,
                      'modifyDate': '2019-07-12T00:59:03-06:00',
                      'nasCredentialTypeId': 2,
                      'password': 'xxxxxxxxxxxxx',
                      'username': 'IBM02SU1756623-H1705285'},
    'credentialId': 1183081,
    'id': 1417377,
    'name': 'iqn.2019-07.com.ibm:ibm02su1756623-h1705285',
    'resourceTableId': 1705285,
    'resourceTableName': 'HARDWARE'}

これにより、前提2.3で設定したAuthorized Hostの情報が得られます。上記の1417377がallowedHostのIDです。

6.3 subnetレベル認証をするsubnetのIDを取得

10.193.75.64/27を今回subnetレベル認証を行います。2149667が該当subnetのIDだとわかります。
https://cloud.ibm.com/classic/network/subnets/2149667
image.png

6.4 setAllowed_Host.pyの実行

allowedHostIDallowedSubnetIDを編集して、以下のスクリプトを実行します。

setAllowed_Host.py
import SoftLayer

####
allowedHostID=1417377
allowedSubnetID=2149667
####

subnetIDs=[]
subnetIDs.append(allowedSubnetID)
print("allowedHostID : " +  str(allowedHostID))
print("subnetIDs     : " +  str(subnetIDs))
client = SoftLayer.create_client_from_env()
subnetsInACL=client['Network_Storage_Allowed_Host'].assignSubnetsToAcl(subnetIDs,id=allowedHostID)
print(subnetsInACL)

6.5 設定の確認

再度、getAllowed_Host.pyを実行します。Assigned subnetidなどが出力されていたら成功です。

# python getAllowed_Host.py
-----hardwareID-----
hardwareId:         1705285
FQDN:               host0.vcs65.ibm.local
-----List Allowed Host and assigned subnets-----
{   'accountId': 1756623,
    'credential': {   'accountId': '1756623',
                      'createDate': '2019-07-11T23:17:08-06:00',
                      'id': 1183081,
                      'modifyDate': '2019-07-12T00:59:03-06:00',
                      'nasCredentialTypeId': 2,
                      'password': 'xxxxxxxxxxxxx',
                      'username': 'IBM02SU1756623-H1705285'},
    'credentialId': 1183081,
    'id': 1417377,
    'name': 'iqn.2019-07.com.ibm:ibm02su1756623-h1705285',
    'resourceTableId': 1705285,
    'resourceTableName': 'HARDWARE'}
Assigned subnetid:   2149667
Assigned subnet:     10.193.75.64/27
Assigned subnetType: SECONDARY_ON_VLAN
-------------------------

7. Port Binding設定

7.1. iSCSI Software Adapterの作成

image.png

image.png

7.2 iSCSI Nameの設定

image.png
image.png

7.3 Port Bindingの設定

image.png
image.png
構成のRescanをする
image.png

7.4. Targetの追加

image.png

1つ目のTargetを設定
image.png

2つ目のTargetを設定
image.png

この後、再度Rescanを実施する

7.5 結果の確認

image.png

image.png

以下のように、4つのパスが生成されている。
image.png

8. IOPS limitの構成

VCSを利用しているので、自動的にIBM CloudでのBest Practiceのパラメーターが設定されています。

これに加えて、今回はiSCSIを利用しているため、IOPS limitを1に設定することが推奨されています。これにより、I/O操作が1回発行されるごとに別のパスを利用するようになります。
https://kb.vmware.com/s/article/2069356

[root@host0:~] esxcli storage nmp device list|grep "NETAPP iSCSI Disk" -B 2 -A 8

naa.600a09803830475a37244d4863685345
   Device Display Name: NETAPP iSCSI Disk (naa.600a09803830475a37244d4863685345)
   Storage Array Type: VMW_SATP_ALUA
   Storage Array Type Device Config: {implicit_support=on; explicit_support=off; explicit_allow=on; alua_followover=on; action_OnRetryErrors=off; {TPG_id=1001,TPG_state=AO}{TPG_id=1000,TPG_state=ANO}}
   Path Selection Policy: VMW_PSP_RR
   Path Selection Policy Device Config: {policy=rr,iops=1000,bytes=10485760,useANO=0; lastPathIndex=1: NumIOsPending=0,numBytesPending=0}
   Path Selection Policy Device Custom Config:
   Working Paths: vmhba64:C3:T0:L0, vmhba64:C2:T0:L0
   Is USB: false

[root@host0:~] esxcli storage nmp psp roundrobin deviceconfig set --type=iops --iops=1 --device=naa.600a09803830475a37244d4863685345

[root@host0:~] esxcli storage nmp device list|grep "NETAPP iSCSI Disk" -B 2 -A 8

naa.600a09803830475a37244d4863685345
   Device Display Name: NETAPP iSCSI Disk (naa.600a09803830475a37244d4863685345)
   Storage Array Type: VMW_SATP_ALUA
   Storage Array Type Device Config: {implicit_support=on; explicit_support=off; explicit_allow=on; alua_followover=on; action_OnRetryErrors=off; {TPG_id=1001,TPG_state=AO}{TPG_id=1000,TPG_state=ANO}}
   Path Selection Policy: VMW_PSP_RR
   Path Selection Policy Device Config: {policy=iops,iops=1,bytes=10485760,useANO=0; lastPathIndex=1: NumIOsPending=0,numBytesPending=0}
   Path Selection Policy Device Custom Config:
   Working Paths: vmhba64:C3:T0:L0, vmhba64:C2:T0:L0
   Is USB: false

9. vmfsへのフォーマット

New Datstore...を選択
image.png
image.png
image.png
image.png
image.png
image.png

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1