(2020/04/15 追記)
新規アカウントについてはiSCSI isolationの有効化は最初からされているようです。
また、いったんhost authorizationを作成した後に、"Add a subnet"から選択できます。
もしくは、host authorizationされた行を選択して詳細画面から追加することも可能です。
(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が有効になる予定です。
# slcli call-api Account getIscsiIsolationDisabled
True
# slcli call-api Account getIscsiIsolationDisabled
False
これにより、Allowed_Host
オブジェクトに対して、以下のメソッドが利用可能になります。
- SoftLayer_Network_Storage_Allowed_Host::getSubnetsInAcl
- SoftLayer_Network_Storage_Allowed_Host::assignSubnetsToAcl
- SoftLayer_Network_Storage_Allowed_Host::removeSubnetsFromAcl
2.3. Endurance Storage(Block Storage)の購入とAuthorize Hostの設定
購入後は、いったんiSCSIアクセス元となる物理サーバーに対して、以下のように
Authorize Host
を実施しておいて下さい。後ほど、この認証情報を使ってsubnet levelでも認証できるようにAPIで構成します。
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を作成
3.2. SDDC-DPortGroup-iSCSI-Bを作成
上記と同様に構成します。Teaming and failoverの箇所で、uplink2をactiveにし、uplink1をunusedにすることに注意して下さい。。
4. iSCSIアクセス用カーネルポートの作成
4.1. SDDC-DPortGroup-iSCSI-A用
iSCSI用に購入したportable IP(1つ目)を割り当てる。
4.2. SDDC-DPortGroup-iSCSI-B用
上記と同様にSDDC-DPortGroup-iSCSI-Bに対しても実施。iSCSI用に購入したportable IP(2つ目)を割り当てる。
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が選択されるように構成します。
5.1. ESXiホストにログインできるようにSSHサービスを起動する
VCSではデフォルトでESXiホストへのログインを許可していません。以下の設定をすることで、SSHでログインできるようになります。
5.2. ルーティング設定
ESXiホストにログインして、以下の設定を行います。
[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
[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
[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
6.2 getAllowed_Host.pyの実行
上記で得られたID情報を用い、hardwareId
を編集して以下のスクリプトを実行します。
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("-------------------------")
# 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
6.4 setAllowed_Host.pyの実行
allowedHostID
とallowedSubnetID
を編集して、以下のスクリプトを実行します。
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の作成
7.2 iSCSI Nameの設定
7.3 Port Bindingの設定
7.4. Targetの追加
この後、再度Rescanを実施する
7.5 結果の確認
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