シングルノードで、ネストESXiもしないで、vSphere KubernetesとNSX-T

# TL;DR

ESXiが一つしかない、そんな環境でもNSX-TとvSphere k8s環境は構築可能です。
ただし、ノーサポート構成なので自己責任でお願いします。

# なんでこの発想になったのか

vSphere Kuberentes (aka TKG service)を試したい！
ところが、ドキュメントをみると、最低３台のESXiが必要だったりします。

https://docs.vmware.com/en/VMware-vSphere/7.0/vmware-vsphere-with-kubernetes/GUID-B1388E77-2EEC-41E2-8681-5AE549D50C77.html

これでは気軽にためせん。Nested ESXiも個人的に使いにくいので避けたい。
ということでどうにかできないかと調べ、実際にうごいたので、共有です。

# 動いたという証明

このとおり、vCenterに繋がるひとつのESXiだけで、NSX-TとvSphere k8sが動いています。

<img width="437" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/d9ae5f78-a02c-d56a-d1db-8b297aabb103.png">

# 気にしないといけないところ

ESXiがひとつしかない環境の場合、以下の点の注意が必要です。

• NSX ManagerとEdgeは非冗長構成
• NSX Edgeと、ホストのTEPの構成方法

1点目は自明なので、詳細は触れませんが、後半は後者について少しだけ触れます。

あとちなみにですが今回の手順では、k8sのコントロールノードにあたる、SupervisorClusterのControlノード数もデフォルトで３台作られれ、しかも全て同じESXi上で作られます。
これも英語のブログをみると、最小２台まで(1は不可）減らすことができるらしいです。本当に非力なサーバーは参考にしてください。

https://www.virtuallyghetto.com/2020/04/deploying-a-minimal-vsphere-with-kubernetes-environment.html

> Note: You can not set a value of 1 (I tried) and although this does work, the enablement of vSphere with Kubernetes never completes from my observation. I believe the reason for this is because there is a floating IP (FIP) which is used across the three Supervisor Control Plane VMs, that perhaps its unable to completely configure it and hence it just spins forever. It would have been nice to just only have a single Supervisor Control Plane VM.


# NSX EdgeとホストのTEPの構成

まず成功したとおっしゃっている英語サイト

https://www.viktorious.nl/2020/05/19/how-to-deploy-vsphere-7-with-kubernetes-on-a-single-not-nested-esxi-node/

ここのサイトをよんでいて、いまいちピンとこなかったのが、以下の箇所

> The essential thing here is that the TEP of your ESXi host is in a different VLAN than the TEP of the Edge Transport Node. This also means that encapsulated Geneve traffic must be routed between these VLANs. If you connect both TEPs to the same VLAN, you get some unexpected behaviour and the setup won’t work.

この点については、以下が一番クリアに説明していると思います。

https://spillthensxt.com/nsx-t-tep-ip-addressing/

まず以下が失敗構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/80dd6da4-7ad9-f93a-f6a5-f822f9c6edaa.png)

* Edgeとホストが同じN-VDSに所属
* VTEPからヘアピンして、内部のポートとVTEPを構成する方法が現在ないため、失敗するとのこと

では、どうするのかというと

修正案①；

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/5ed39a65-af84-7277-acda-e532147332ae.png)

* EdgeをそのホストのVSS/VDS上に構成する
* この構成の場合、N-VDSとは、イーサネットポートを共有できないので、もうひとセット接続されている必要あり
* 1 NICでは構成不可
* 2 NICは構成できるが、可用性の観点から非推奨（あと、vCenterにずっと怒られる）よって4 NICが推奨

修正案②：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/05ef4eb7-84e1-08d7-6e45-b97ecee12141.png)

* EdgeとホストのTEPを別のサブネットで構成する。こうすることで通信がヘアピンにならず、一度ホスト外に通信がでるようになる
* この場合、L3スイッチ側でルーティング正しく行われている必要ある
* さらにこのルーティングの際、スイッチ側でMTU 1600の通信を阻害してはいけない（超重要）

構成的により正しいのは②な気がしますが、今回私の環境ではL3スイッチにさわれないので、①を行います。
なお、2 NICしかない構成なので、さらに非推奨です。

# 環境

N-VDSとVDSは最終的な以下のような構成になりました。
**VDSを構成する場合、MTUサイズを1600にすることをわすれずに行ってください。**
さぐりさぐりでやったので、構成が綺麗ではない点ご容赦ください。

<img width="783" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/b73736d8-cbd4-dd3b-2035-c9a3e2bc95ea.png">


この図のどのVDSどのIPアドレスが繋がっているかは以下の通りです。

サブネット1 : マネジメント 10.197.35.0/24

|  IP  | 用途  | N-VDS/VDS |
| ---- | ---- | ---- |
|  10.197.35.1  |  GW  | N/A |
|  10.197.35.10  |  ESXi  | VSK_10.197.35(のVMKとして構築) |
|  10.197.35.11  |  vCenter  | VSK_10.197.35 |
|  10.197.35.14  |  NSX-T  | VSK_10.197.35 |
|  10.197.35.15  |  Edge Mgmt | **EDGE_10.197.35** |
|  10.197.35.150 - 153 | k8s controller | EDGE_10.197.35 |
|  10.197.35.201  |  ESXi TEP  | VSK_10.197.35 |
|  10.197.35.202  |  Edge TEP  | **EDGE_10.197.35** |

ポイントとして、`Edge Mgmt`と`Edge TEP`が他と同じ10.197.35.0/24のIPアドレスを持ちながら、別のVDSで構成されている点です。これは、前述の通り、こうしないとTEPの通信がおかしくなってしまいます。k8s controllerを`EDGE_10.197.35`で構成する理由は思い返せば全くなかったと思います。これは`VSK_10.197.35`でもよかったはず。

サブネット2 : 外部通信用 10.197.36.0/24

|  IP  | 用途  | N-VDS/VDS |
| ---- | ---- | ---- |
|  10.197.36.1  |  GW  | N/A |
|  10.197.36.3  |  EDGE Uplink(vlan trasport zone)  | EDGE_10.197.36 |
|  10.197.36.48/28 | k8s ingress | EDGE_10.197.36 |
|  10.197.36.64/28  | k8s egress  | EDGE_10.197.36 |

そして、今回はNorth-Southトラフィックを担うEdgeのvlan transport zoneの出口は、別サブネットにしています。
これに伴い、k8sのingress/egressもここに所属させています。 

正直見返したところ、これをわざわざ別のセグメントにする必要はなかったかなと思います。10.197.35.0/24のネットワークでまとめられたはずです。


# ネットワーク周りの構成方法

[マニュアル](https://docs.vmware.com/en/VMware-vSphere/7.0/vmware-vsphere-with-kubernetes/GUID-21ABC792-0A23-40EF-8D37-0367B483585E.html)が結構複雑なため、いったりきたりが必要できれいなログが残っていないのですが、要所要所の構成についての画面ショットを最後に紹介します。

## Edgeのノード追加時の注意

マニュアルの手順の[ここ](https://docs.vmware.com/en/VMware-vSphere/7.0/vmware-vsphere-with-kubernetes/GUID-78EE5008-747C-4D51-BEE3-3EEA0B91E32F.html)にあたります。

EdgeのマネジメントIPアドレスを構成するときの画面です。これは、Transport Zoneではなく、ただのマネジメントで使われるIPアドレスなので注意してください。Management Interfaceは`EDGE_10.197.35`を使います。技術的にはここだけに関しては`VDS_10.197.35`を使っても動いたかもしれないですが、試していないです。
<img width="890" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/27c6960f-a147-a5e7-b7c0-1ee46cdcd27b.png">


EdgeのTEPはノード追加時に、overlay transport zoneを作成するときに静的IPアドレスを指定して追加します。
<img width="974" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/8c88f401-7f42-d821-f9fb-cac727c57d4f.png">

さらに、この時UPLINKは`EDGE_10.197.35`を使います。くどいですが、`VSK_10.197.35`を選んでしまうと、TEPが構成されないです。

<img width="973" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/d58d06c7-1a5f-5db5-9e08-c31dcaaa1135.png">

そして、このあとvlan trasport zoneを構成するのですが、見逃してしまう`+New Node Switch`を押して、新しいスイッチとして定義します。 これは、North-South通信の出口である`EDGE_10.197.36`を指定します。
<img width="977" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/3436c6fd-cba6-ab24-069c-1b9600c0380c.png">

## Tier 0 gateway追加時の注意点

マニュアルの手順の[ここ](https://docs.vmware.com/en/VMware-vSphere/7.0/vmware-vsphere-with-kubernetes/GUID-EDD76432-7D6D-42FF-B84D-A534BB3960D0.html)と[ここ](https://docs.vmware.com/en/VMware-vSphere/7.0/vmware-vsphere-with-kubernetes/GUID-4D90216C-B3E3-4E4B-9123-75061AD77BED.html)にあたります。

マニュアルにあるとおり、まずはSegmentを作ります。この時Trasport ZoneはVLAN trasport zoneを指定します。私の構成では特にタギングなしで通信できるのでVLAN IDは`0`を指定します。その他はそこまで注意点はないです。
<img width="1766" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/8fca9f2a-60c8-df7c-de77-dfdd5c7ff953.png">

Tier 0 gatewayを作成する際には、上のSegmentを指定して、IPアドレスの指定、そしてBGPがない場合はそのIPアドレスから外部に通信が可能なデフォゲを追加します。

<img width="1213" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/11202a97-6076-fa38-8d0a-dc4e96f42b73.png">

## WorkloadをEnable時の注意点

マニュアルの[ここ](https://docs.vmware.com/en/VMware-vSphere/7.0/vmware-vsphere-with-kubernetes/GUID-287138F0-1FFD-4774-BBB9-A1FAB932D1C4.html)です。

ネットワーク構成時はまずマネジメント側のIPアドレス類を指定します。前にもかきましたが、`EDGE_10.197.35`で構成する理由は思い返せば全くなかったと思います。これは`VSK_10.197.35`でもよかったはず。

<img width="960" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/f30d63cb-74a7-f2d9-c60d-391e21872d40.png">

そして、スクロールダウンして、Workloadネットワークの箇所です。このIngressとEgressが最初さっぱりわからなかったのですが、要はLBで使用されるIPアドレスのことのようで、外部と通信可能なIPアドレス(10.197.36.0/24)の一部分をCIDR形式で指定すればよいらしいです。
<img width="960" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/d0f24685-5dfa-e132-2e03-5ee2c1a4add2.png">


## その他、注意点

vCenterのWorkloadを[Enableするとき](https://docs.vmware.com/en/VMware-vSphere/7.0/vmware-vsphere-with-kubernetes/GUID-287138F0-1FFD-4774-BBB9-A1FAB932D1C4.html)、Enableボタンがない、ということがあったりします。
その際は、慌てず、TroubleShootガイドにある、[前提条件確認ツール](https://docs.vmware.com/en/VMware-vSphere/7.0/vmware-vsphere-with-kubernetes/GUID-BDD233D8-6650-4103-A39E-7975CBE6E852.html)を使ってください。

筆者も同じことがおきて、数時間悩むはめになりました。ちなみにこのときのメッセージがこれ。

```
|---------|----------|----------------------------------------------------------------------------------------|
|cluster  |compatible|incompatibility_reasons                                                                 |
|---------|----------|----------------------------------------------------------------------------------------|
|domain-c8|False     |Failed to list all distributed switches in vCenter 2818b33a-d84d-42a5-840c-4dab2db9c7c1.|
|         |          |Cluster domain-c8 is missing compatible NSX-T VDS.                                      |
|---------|----------|----------------------------------------------------------------------------------------|
```
でこれのオチですが、NSXのCompute ManagersのEnable Trustを有効にすることをわすれたためでした（わかるかー）。
画面ショットのここです。
<img width="960" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/4fb16b8f-78f4-cb3b-71f2-4a44b276064e.png">

## 追記 2020/07/21

あとでわかったことなのですが、EdgeのサイズはLargeにしないとあとでこまります。
というのも、Guest ClusterをつくるLBがLargeにしないと、必要な個数がつくれないからです。

https://docs.vmware.com/en/VMware-NSX-T-Data-Center/2.4/administration/GUID-19B12230-8BF4-4AF7-9EB7-3701B0A0A439.html


# まとめ

ESXi一つでも、vSphere k8sを構成可能ですが、NSXが鬼門です。

個人的にはNSXを最初に触れた３年ほど前に比べるとかなり簡単になり、海外のブログも充実してきたと思います。コツさえつかめれば、そこまで難しくないはずなので、今後もこういった情報を発信をしたいと思います。