vm.gowatana.jp

NEOにほんごVMware(仮)

SDDC Manager のネットワーク プールから IP アドレスを手動開放してみる。

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 アドレスを手動開放してみる話でした。