VMware Cloud Foundation(VCF)5.2.1 の SDDC Manager で、ネットワーク プールに残ってしまった IP アドレスを手動削除してみます。
今回の環境
障害で停止してしまった ESXi ホストを SDDC Manager から強制削除すると、ネットワーク プールの IP アドレスが解放されませんでした。(下記投稿のように)
少し前まで、この問題に対応する KB がリンク切れになっていたのですが、復旧してもらえたので実際に試してみます。旧 VMware KB#94984、Broadcom サイト移行後は KB#323682 です。
補足情報として、下記のブログが参考になります。
1. 現状の確認
ネットワーク プールの、使用中 IP アドレスを確認してみます。
1-1. SDDC Manager での確認
SDDC Manager の「管理」→「ネットワーク設定」→「ネットワーク プール」タブで、IP アドレスの使用状況を確認できます。
ネットワーク プール「vcf-m01-np01」の情報を確認すると、「プールあたりのホスト数」は「4」ですが、「使用済み IP アドレス」は「5」になっています。
「i」マークをクリックすると、IP アドレスを使用中のホスト名が確認できます。
1-2-A. REST API(curl)での確認
SDDC Manager の curl と jq を利用して、状況を確認してみます。SDDC Manager には、vcf ユーザーで SSH ログインしておきます。
まず、コマンドを実行しやすいように SDDC Manager のアドレスを変数に格納しておきます。これはホスト名 / FQDN でなく、IP アドレスでも構いません。
SDDCMGR=vcf-m01-sddc-01.c.go-lab.jp
SDDC Manager のトークンを取得して、「TOKEN」変数に格納しておきます。
TOKEN=$(curl -k -s \ --url "https://$SDDCMGR/v1/tokens" \ -X POST \ -H "Content-Type: application/json" \ -d '{"username": "Administrator@vsphere.local","password": "VMware1!VMware1!"}' | \ awk -F "\"" '{ print $4}' )
実際に実行すると、下記のようになります。ちなみに、echo $TOKEN を実行すると、長いトークン文字列が表示されます。
vcf@vcf-m01-sddc-01 [ ~ ]$ TOKEN=$(curl -k -s \ > --url "https://$SDDCMGR/v1/tokens" \ > -X POST \ > -H "Content-Type: application/json" \ > -d '{"username": "Administrator@vsphere.local","password": "VMware1!VMware1!"}' | \ > awk -F "\"" '{ print $4}' > ) vcf@vcf-m01-sddc-01 [ ~ ]$
ネットワーク プールの情報を確認します。
curl -k -s \ --url https://$SDDCMGR/v1/network-pools \ -X GET \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TOKEN" | \ jq -r '.elements[] | select(.name=="vcf-m01-np01")'
実際に実行すると、下記のようにネットワーク プールの情報が表示されます。
vcf@vcf-m01-sddc-01 [ ~ ]$ curl -k -s \ > --url https://$SDDCMGR/v1/network-pools \ > -X GET \ > -H "Content-Type: application/json" \ > -H "Authorization: Bearer $TOKEN" | \ > jq -r '.elements[] | select(.name=="vcf-m01-np01")' { "id": "be842c1b-b599-4edf-8e66-51982d454db1", "name": "vcf-m01-np01", "networks": [ { "id": "561ed1bc-e52b-43fb-bb7b-9c5c1f7648f1" }, { "id": "87531247-faf3-47ff-a9f1-8337c9529d64" } ] }
IP アドレスの情報を確認する準備として、ネットワーク プール ID を取得して「NPID」変数に格納しておきます。
NPID=$( curl -k -s \ --url https://$SDDCMGR/v1/network-pools \ -X GET \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TOKEN" | \ jq -r '.elements[] | select(.name=="vcf-m01-np01") | .id' )
実際に実行すると、下記のようにネットワーク プール ID を取得できます。
vcf@vcf-m01-sddc-01 [ ~ ]$ NPID=$( > curl -k -s \ > --url https://$SDDCMGR/v1/network-pools \ > -X GET \ > -H "Content-Type: application/json" \ > -H "Authorization: Bearer $TOKEN" | \ > jq -r '.elements[] | select(.name=="vcf-m01-np01") | .id' > ) vcf@vcf-m01-sddc-01 [ ~ ]$ echo $NPID be842c1b-b599-4edf-8e66-51982d454db1
IP アドレスの情報を確認します。
curl -k -s \ --url "https://$SDDCMGR/v1/network-pools/$NPID/networks" \ -X GET \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TOKEN" | \ jq -r .
実際に実行すると、下記のように IP アドレスの使用情報を確認できます。ここでのネットワークごとの id は、このあとの DB レコード更新で指定します。
vcf@vcf-m01-sddc-01 [ ~ ]$ curl -k -s \ > --url "https://$SDDCMGR/v1/network-pools/$NPID/networks" \ > -X GET \ > -H "Content-Type: application/json" \ > -H "Authorization: Bearer $TOKEN" | \ > jq -r . { "elements": [ { "id": "561ed1bc-e52b-43fb-bb7b-9c5c1f7648f1", "type": "VMOTION", "vlanId": 72, "mtu": 1500, "subnet": "192.168.72.0", "mask": "255.255.255.0", "gateway": "192.168.72.1", "ipPools": [ { "start": "192.168.72.111", "end": "192.168.72.114" }, { "start": "192.168.72.115", "end": "192.168.72.115" } ], "usedIps": [ "192.168.72.111", "192.168.72.112", "192.168.72.113", "192.168.72.114", "192.168.72.115" ] }, { "id": "87531247-faf3-47ff-a9f1-8337c9529d64", "type": "VSAN", "vlanId": 73, "mtu": 1500, "subnet": "192.168.73.0", "mask": "255.255.255.0", "gateway": "192.168.73.1", "ipPools": [ { "start": "192.168.73.111", "end": "192.168.73.114" }, { "start": "192.168.73.115", "end": "192.168.73.115" } ], "usedIps": [ "192.168.73.111", "192.168.73.112", "192.168.73.113", "192.168.73.114", "192.168.73.115" ] } ] }
1-2-B. PowerVCF での確認
PowerVCF で、curl と同様にネットワーク プールの情報(id など)を確認してみます。
PowerVCF のインストールについては下記をどうぞ。
まず、SDDC Manager のトークンを取得します。
PS> Request-VCFToken -fqdn vcf-m01-sddc-01.c.go-lab.jp -username administrator@vsphere.local -password "VMware1!VMware1!" Successfully Requested New API Token From SDDC Manager: vcf-m01-sddc-01.c.go-lab.jp
ネットワーク プール「vcf-m01-np01」を使用している ESXi ホストは、下記のように確認できます。
PS> Get-VCFHost | where {$_.networkpool.name -eq "vcf-m01-np01"} | Select fqdn | Sort-Object fqdn fqdn ---- vcf-m01-esxi-01.c.go-lab.jp vcf-m01-esxi-02.c.go-lab.jp vcf-m01-esxi-03.c.go-lab.jp vcf-m01-esxi-05.c.go-lab.jp
ホストに割り当てられている IP アドレスは、下記のように確認できます。
PS> Get-VCFHost | where {$_.networkpool.name -eq "vcf-m01-np01"} | select -ExpandProperty ipAddresses | Sort-Object type,ipAddress ipAddress type --------- ---- 192.168.71.111 MANAGEMENT 192.168.71.112 MANAGEMENT 192.168.71.113 MANAGEMENT 192.168.71.115 MANAGEMENT 192.168.72.111 VMOTION 192.168.72.112 VMOTION 192.168.72.113 VMOTION 192.168.72.115 VMOTION 192.168.73.111 VSAN 192.168.73.112 VSAN 192.168.73.113 VSAN 192.168.73.115 VSAN
ネットワーク プールの ID を確認します。
PS> Get-VCFNetworkPool -name vcf-m01-np01 | select id,name id name -- ---- be842c1b-b599-4edf-8e66-51982d454db1 vcf-m01-np01
ネットワーク プール ID をもとに、IP アドレス プールの情報を確認してみます。
PS> Get-VCFNetworkIPPool -id be842c1b-b599-4edf-8e66-51982d454db1 id : 561ed1bc-e52b-43fb-bb7b-9c5c1f7648f1 type : VMOTION vlanId : 72 mtu : 1500 subnet : 192.168.72.0 mask : 255.255.255.0 gateway : 192.168.72.1 ipPools : {@{start=192.168.72.111; end=192.168.72.114}, @{start=192.168.72.115; end=192.168.72.115}} usedIps : {192.168.72.111, 192.168.72.112, 192.168.72.113, 192.168.72.114…} id : 87531247-faf3-47ff-a9f1-8337c9529d64 type : VSAN vlanId : 73 mtu : 1500 subnet : 192.168.73.0 mask : 255.255.255.0 gateway : 192.168.73.1 ipPools : {@{start=192.168.73.111; end=192.168.73.114}, @{start=192.168.73.115; end=192.168.73.115}} usedIps : {192.168.73.111, 192.168.73.112, 192.168.73.113, 192.168.73.114…}
すでに ESXi ホストでは使用されていない「~.114」が、使用中の IP アドレス(usedIps)として残っています。
PS> Get-VCFNetworkIPPool -id be842c1b-b599-4edf-8e66-51982d454db1 | %{$_.id;$_.type;$_.usedIps;"--"} 561ed1bc-e52b-43fb-bb7b-9c5c1f7648f1 VMOTION 192.168.72.111 192.168.72.112 192.168.72.113 192.168.72.114 192.168.72.115 -- 87531247-faf3-47ff-a9f1-8337c9529d64 VSAN 192.168.73.111 192.168.73.112 192.168.73.113 192.168.73.114 192.168.73.115 --
2. ネットワーク プールの使用中 IP アドレス手動開放(DB 更新)
ネットワーク プールの IP アドレスを開放するには、SDDC Manager の DB(PostgreSQL)の更新が必要です。
2-1. DB 接続と確認
SDDC Manager に vcf ユーザーで SSH ログインして、root ユーザーにスイッチします。
vcf@vcf-m01-sddc-01 [ ~ ]$ su - Password: root@vcf-m01-sddc-01 [ ~ ]#
psql で、PostgreSQL の DB(platform)に接続します。
root@vcf-m01-sddc-01 [ ~ ]# psql -h localhost -U postgres -d platform psql (15.6) Type "help" for help. platform=#
更新対象のテーブルは「vcf_network」です。テーブル定義は下記のようになっており、 used_ip_addresses 列と、free_ip_addresses 列を更新します。
platform=# \d vcf_network Table "public.vcf_network" Column | Type | Collation | Nullable | Default ---------------------+------------------------+-----------+----------+--------- id | character varying(255) | | not null | creation_time | bigint | | not null | modification_time | bigint | | not null | free_ip_addresses | text | | | gateway | character varying(255) | | | ip_inclusion_ranges | text | | | mtu | integer | | not null | subnet | character varying(255) | | | subnet_mask | character varying(255) | | | type | character varying(255) | | | used_ip_addresses | text | | | vlan_id | integer | | not null | Indexes: "vcf_network_pkey" PRIMARY KEY, btree (id) platform=#
列の表示幅が広くなるので、見やすくするために、psql の「\x」コマンドで列を縦表示(Expanded display を有効)にしてきます。
platform=# \x Expanded display is on.
1つめのネットワークです。ここで指定している id は、事前に curl や PowerVCF で確認したものです。
platform=# select free_ip_addresses,used_ip_addresses from vcf_network where id='561ed1bc-e52b-43fb-bb7b-9c5c1f7648f1' ; -[ RECORD 1 ]-----+--------------------------------------------------------------------------------------- free_ip_addresses | used_ip_addresses | ["192.168.72.111","192.168.72.112","192.168.72.113","192.168.72.114","192.168.72.115"] platform=#
2つめのネットワークです。
platform=# select free_ip_addresses,used_ip_addresses from vcf_network where id='87531247-faf3-47ff-a9f1-8337c9529d64' ; -[ RECORD 1 ]-----+--------------------------------------------------------------------------------------- free_ip_addresses | used_ip_addresses | ["192.168.73.111","192.168.73.112","192.168.73.113","192.168.73.114","192.168.73.115"] platform=#
2-2. 使用中 IP アドレスの開放
下記の SQL を実行して、platform DB の vcf_network テーブルのデータを更新します。
- ネットワーク プールの各ネットワークで、使用中 IP アドレス(used_ip_addresses 列)と空き IP アドレス( free_ip_addresses 列)を更新します。
- id は、事前に curl や PowerVCF で確認しておきます。
ここからはネットワークの ID を使用しますが、curl や PowerVCF の実行が面倒な場合は、「select * from vcf_network;」でのテーブル全体表示でも確認できます。
192.168.72.0/24 の使用中 IP アドレスを更新する SQL です。
update vcf_network set used_ip_addresses='["192.168.72.111","192.168.72.112","192.168.72.113","192.168.72.115"]' where id='561ed1bc-e52b-43fb-bb7b-9c5c1f7648f1';
192.168.72.0/24 の空き IP アドレスを更新する SQL です。
update vcf_network set free_ip_addresses='["192.168.72.114"]' where id='561ed1bc-e52b-43fb-bb7b-9c5c1f7648f1';
192.168.73.0/24 の使用中 IP アドレスを更新する SQL です。
update vcf_network set used_ip_addresses='["192.168.73.111","192.168.73.112","192.168.73.113","192.168.73.115"]' where id='87531247-faf3-47ff-a9f1-8337c9529d64';
192.168.73.0/24 の空き IP アドレスを更新する SQL です。
update vcf_network set free_ip_addresses='["192.168.73.114"]' where id='87531247-faf3-47ff-a9f1-8337c9529d64';
実際に SQL を実行すると、下記のようになります。デフォルトでオート コミットなので、データは即時反映されます。
192.168.72.0/24 の更新です。
platform=# update vcf_network platform-# set used_ip_addresses='["192.168.72.111","192.168.72.112","192.168.72.113","192.168.72.115"]' platform-# where id='561ed1bc-e52b-43fb-bb7b-9c5c1f7648f1'; UPDATE 1 platform=# update vcf_network platform-# set free_ip_addresses='["192.168.72.114"]' platform-# where id='561ed1bc-e52b-43fb-bb7b-9c5c1f7648f1'; UPDATE 1 platform=# select free_ip_addresses,used_ip_addresses from vcf_network where id='561ed1bc-e52b-43fb-bb7b-9c5c1f7648f1'; -[ RECORD 1 ]-----+---------------------------------------------------------------------- free_ip_addresses | ["192.168.72.114"] used_ip_addresses | ["192.168.72.111","192.168.72.112","192.168.72.113","192.168.72.115"] platform=#
192.168.73.0/24 の更新です。
platform=# update vcf_network platform-# set used_ip_addresses='["192.168.73.111","192.168.73.112","192.168.73.113","192.168.73.115"]' platform-# where id='87531247-faf3-47ff-a9f1-8337c9529d64'; UPDATE 1 platform=# update vcf_network platform-# set free_ip_addresses='["192.168.73.114"]' platform-# where id='87531247-faf3-47ff-a9f1-8337c9529d64'; UPDATE 1 platform=# select free_ip_addresses,used_ip_addresses from vcf_network where id='87531247-faf3-47ff-a9f1-8337c9529d64'; -[ RECORD 1 ]-----+---------------------------------------------------------------------- free_ip_addresses | ["192.168.73.114"] used_ip_addresses | ["192.168.73.111","192.168.73.112","192.168.73.113","192.168.73.115"] platform=#
3. 使用中 IP アドレス解放後の様子
SDDC Manager でネットワーク プールの詳細情報を表示すると、IP アドレスが解放されたことが確認できます。
PowerVCF でも、下記のように IP アドレス(~.114)が解放されたことが確認できます。
PS> Request-VCFToken -fqdn vcf-m01-sddc-01.c.go-lab.jp -username administrator@vsphere.local -password "VMware1!VMware1!" Successfully Requested New API Token From SDDC Manager: vcf-m01-sddc-01.c.go-lab.jp PS> Get-VCFNetworkIPPool -id be842c1b-b599-4edf-8e66-51982d454db1 | %{$_.id;$_.type;$_.usedIps;"--"} 561ed1bc-e52b-43fb-bb7b-9c5c1f7648f1 VMOTION 192.168.72.111 192.168.72.112 192.168.72.113 192.168.72.115 -- 87531247-faf3-47ff-a9f1-8337c9529d64 VSAN 192.168.73.111 192.168.73.112 192.168.73.113 192.168.73.115 --
以上、SDDC Manager のネットワーク プールから IP アドレスを手動開放してみる話でした。