vm.gowatana.jp

NEOにほんごVMware(仮)

Tanzu Kubernetes Grid と NSX ALB でのラボ構築。

Tanzu Kubernetes Grid で NSX Advanced Load Balancer(NSX ALB)を利用するラボ環境を構築してみます。

 

今回の内容です。

 

今回の環境

利用するソフトウェアは下記です。

  • Tanzu Kubernetes Grid 1.6.1
  • NSX Advanced Load Balancer 22.1.2

 

NSX ALB は、事前に下記のように構築しておきます。

 

そして TKG は、下記の投稿で用意した TKG ラボ環境を利用します。今回は kube-vip のかわりに NSX ALB を選択して Management / Workload Cluster を作成します。

 

構築するラボのイメージ図です。

 

1. NSX ALB のコントローラ証明書 入れ替え

TKG から NSX ALB に接続する場合、NSX ALB のコントローラ 証明書に SAN(サブジェクトの別名)が必要ですが、デフォルトで生成される証明書には設定されていません。そこで、NSX ALB の Web UI でコントローラ証明書を作成して置き換えます。

 

1-1. コントローラ証明書の作成

「テンプレート」→「セキュリティ」→「SSL/TLS 証明書」を開いて、「作成」→「コントローラ証明書」をクリックします。

 

「全般」で、名前とタイプを入力して下にスクロールします。

  • 名前: cert_lab-avi-02.go-lab.jp
  • タイプ: 自己尾署名済み

 

証明書のフィールドを入力して、さらに下にスクロールします。ちなみにここでいくつかフィールドを入力していますが、実際は「共通名」以外はデフォルトのままでも大丈夫です。

  • 共通名: lab-avi-02.go-lab.jp

 

「サブジェクトの別名 (SAN)」で「追加」をクリックして、NSX ALB Controller VM の FQDN と IP アドレスを入力して、「保存」をクリックします。すでに「共通名」で FQDN を入力している場合でも、ここであらためて FQDN の入力が必要です。

  • lab-avi-02.go-lab.jp(FQDN)
  • 192.168.10.62

 

これでコントローラ証明書が作成されました。

 

1-2. コントローラ証明書の置き換え

「管理」→「設定」→「アクセス設定」を開いて、編集ボタンをクリックします。

 

「SSL/TLS 証明書」で、もともと設定されている2件を削除して、作成したコントローラ証明書を選択して「保存」をクリックします。

  • SSL/TLS 証明書: cert_lab-avi-02.go-lab.jp


設定が保存されてから Web ブラウザを更新すると証明書エラーの画面になるので、初回アクセス時と同様にエラーを無視してページを開きます。

 

Web ブラウザで、証明書の情報を確認してみます。

 

証明書が入れ替えられたことが確認できます。

 

2. NSX ALB 側でのデプロイ準備

構築済みの NSX ALB の Web UI にログインして、この TKG むけの設定を追加します。

 

2-1. DHCP ネットワークの設定

TKG では、Kubernetes ノード仮想マシンに DHCP で IP アドレスを設定します。そこで、NSX ALB が DHCP ネットワークのポートグループを利用できるように設定します。ついでに、今回は NSX ALB Service Engine の Kubernetes ノード仮想マシン側のインターフェースでも DHCP を利用します。

「インフラストラクチャ」→「クラウド リソース」→「ネットワーク」を開いて、DHCP が利用できるようになっているネットワークのポートグループの編集ボタンをクリックします。

 

「DHCP が有効」のチェックをオンにして、「サブネットの追加」をクリックします。

 

ネットワーク アドレスを入力して、「保存」をクリックします。

  • IP サブネット: 192.168.11.0/24

 

ひとつ前の画面に戻るので、IP サブネットのタイプが「構成済み」になったことを確認して「保存」をクリックします。

 

これで「構成されたサブネット」にネットワーク アドレスが表示されるようになります。

 

2-2. IPAM プロファイルの準備

NSX ALB の Default-Cloud に、VIP を配置するネットワークの IPAM プロファイルを設定します。この手順で選択するネットワーク(ポートグループ)では、以前の NSX ALB 環境構築で IP プールを設定ずみです。

  • ネットワーク: 192.168.61.0/24
  • ポートグループ: dvpg-0061-avi-01

 

IPAM プロファイルの作成

「テンプレート」→「プロファイル」→「IP アドレス管理 / DNS プロファイル」を開いて、「作成」→「IP アドレス管理プロファイル」をクリックします。

 

プロファイルのパラメータを入力して、「保存」をクリックします。

  • 名前: ipam-profile-61
  • クラウド: Default-Cloud
  • ネットワーク:「追加」をクリックして「dvpg-0061-avi-01」を選択。

 

IPAM プロファイルの割り当て

Default-Cloud に、IPAM プロファイルを割り当てます。

「インフラストラクチャ」→「クラウド」を開いて、「Default-Cloud」の編集ボタンをクリックします。

 

IPAM プロファイルを選択して、「保存」をクリックします。

  • IP アドレス管理プロファイル: ipam-profile-61

 

2-3. スタティック ルートの追加

VIP ネットワークのスタティック ルートを追加しておきます。

「インフラストラクチャ」→「クラウド リソース」→「VRF コンテキスト」を開いて、「global」の編集ボタンをクリックします。

 

サブネットの「追加」をクリックして、スタティック ルートを入力して「保存」をクリックします。

  • ゲートウェイ サブネット: 0.0.0.0/0
  • ネクスト ホップ: 192.168.61.1

 

2-4. ダミー Virtual Service の作成

NSX ALB では、Virtual Service を作成することで自動的に Service Engine VM がデプロイされるのですが、TKG での Kubernetes クラスタ作成は、時間がかかるとタイムアウトで失敗してしまうことがあります。

そこで、あえて事前に何か Virtual Service を作成して Service Engine VM を事前デプロイしておきます。

適当な Virtual Service を作成してしばらく待ち、「インフラストラクチャ」→「クラウド リソース」→「サービス エンジン」画面などで、Service Engine VM がデプロイされたことを確認しておきます。

 

2. TKG Management Cluster の作成

TKG の Management Cluster を作成します。

まず、今回の Management Cluster と Workload Cluster の仮想マシンをデプロイする仮想マシン フォルダを作成しておきます。

 

TKG の Bootstrap マシンで、下記の手順(kube-vip を選択)と同様に「tanzu management-cluster create」または「tanzu mc create」コマンドを実行てウィザードを進めます。

 

Management Cluster を作成します。

demo-01 [ ~ ]$ tanzu mc create --ui --bind=0.0.0.0:8080 --browser=none

 

ここでは、kube-vip の場合と異なる部分を説明します。

 

Wizard: 2. Cluster Settings

Control Plane の Endpoint Proider として、kube-vip のかわりに NSX ALB を選択します。

  • CONTROL PLANE ENDPOINT PROVIDER として、「NSX Advanced Load Balancer」を選択します。
  • CONTROL PLANE ENDPOINT の IP アドレスは、kube-vip 選択時とは異なり、空欄のままでも進めるようになります。


Wizard: 3. VMware NSX Advanced Load Balancer

この画面は、kube-vip 選択時とは異なり入力必須になります。

  • CONTROLLER HOST: NSX ALB Controller VM のアドレスを入力します。ラボ用途であれば、NSX ALB Controller のクラスタの VIP は設定していなくても TKG では利用できます。
  • USERNAME: admin など
  • PASSWORD
  • CONTROLLER CERTIFICATE AUTHORHITY: 先ほど作成したコントローラ証明書のテキストを入力します。

ここまでを入力したら、「VERIFY CREDENTIALS」をクリックします。

 

ここで入力するコントローラ証明書のテキストについては、NSX ALB の Web UI から取得します。

「テンプレート」→「セキュリティ」→「SSL/TLS 証明書」を開き、さきほど作成したコントローラ証明書の「↓」ボタンをクリックします。

 

「証明書」→「クリップボードにコピー」ボタンをクリックすると証明書のテキストをコピーできるので、TKG のウィザードにペーストします。

 

「VERIFY CREDENTIALS」のクリックによる確認が通ると、CLOUD NAME で NSX ALB の 「Default-Cloud」が選択できるようになります。そのまま、(ここで作成するのは Management Cluster ですが)Workload Cluster と Management Cluster のパラメータを入力します。

今回は、ここで指定するすべての VIP アドレスを同じネットワークに配置します。

 

Workload Cluster

  • SERVICE_ENGINE_GROUP: Default-Group
  • WORKLOAD CLUSTER - CONTROL PLANE VIP NETWORK NAME: dvpg-0061-avi-01
  • WORKLOAD CLUSTER CONTROL PLANE VIP NETWORK CIDR: 192.168.61.0/24
  • WORKLOAD CLUSTER - VIP NETWORK NAME: dvpg-0061-avi-01
  • WORKLOAD CLUSTER VIP NETWORK CIDR: 192.168.61.0/24

Management Cluster

  • MANAGEMENT CLUSTER - SERVICE ENGINE GROUP: Default-Group
  • MANAGEMENT CLUSTER - CONTROL PLANE VIP NETWORK NAME: dvpg-0061-avi-01
  • MANAGEMENT CLUSTER CONTROL PLANE VIP NETWORK CIDR: 192.168.61.0/24
  • MANAGEMENT CLUSTER - VIP NETWORK NAME: dvpg-0061-avi-01
  • MANAGEMENT CLUSTER VIP NETWORK CIDR: 192.168.61.0/24

下記のようにパラメータを入力したら、さらに画面下にスクロールします。

 

そして「NEXT」をクリックして、「4. Metadata」画面に進みます。

 

YAML ファイルの取得

ウィザードを進めて「REVIEW CONFIGURATION」をクリックします

 

その直後に表示される設定確認画面の末尾にある、「EXPORT COFIGURATION」をクリックしてここまでの入力から生成された YAML ファイルを保存しておきます。

このファイルを「tanzu mc create」の「-f」オプションで指定することで、CLI から Management Cluster を作成できるようになります。

そして、「DEPLOY MANAGEMENT CLUSTER」をクリックすると、クラスタの作成処理が開始されます。

 

tanzu mc create でのタイムアウト時間指定

本来であれば、このまま Management Cluster が作成できます。しかし、仮想マシンのクローンなどで時間がかかると、クラスタの作成が失敗になることがあります。

 

例えば、下記のようにエラーが出力されたりします。

unable to set up management cluster, : unable to initialize providers on management cluster: timed out waiting for the condition, this can be possible because of the outbound connectivity issue. Please check deployed nodes for outbound connectivity.

 

エラーによって中断されてしまった場合、作成途中のまま残された Management Cluster は下記のコマンドなどで削除します。

demo-01 [ ~ ]$ tanzu mc delete -y

 

この場合、さきほど「EXPORT COFIGURATION」ボタンでダウンロードした YAML ファイル(tkg16mc02.yml として保存)を指定しておき、あらためて Tanzu CLI から作成することもできます。このとき、作成された YAML ファイルに「DEPLOY_TKG_ON_VSPHERE7: "true"」を追記しておくと、vSphere 7 へのデプロイを確認するメッセージをスキップできます。

ついでに、「--timeout」でタイムアウトを長め(デフォルトは 30m)に指定しておきます。

demo-01 [ ~ ]$ tanzu mc create -f tkg16mc02.yml --timeout=60m

 

3. TKG Workload Cluster の作成

 Management Cluster(tkg16mc02)を定義した YAML ファイルをもとに、Workload Cluster(tkg16wc02)の YAML ファイルを作成します。ここでは sed を利用して YAML 内のクラスタ名を書き換えます。

tkg16mc02 → tkg16wc02

demo-01 [ ~ ]$ cat tkg16mc02.yml | sed s/tkg16mc02/tkg16wc02/g > tkg16wc02.yml

 

ファイルの差分です。

demo-01 [ ~ ]$ diff tkg16mc02.yml tkg16wc02.yml
21c21
< CLUSTER_NAME: tkg16mc02
---
> CLUSTER_NAME: tkg16wc02
61c61
< VSPHERE_FOLDER: /infra-dc-01/vm/05-Lab-k8s/k8s_lab-tkg-02_demo-01/vm_tkg16mc02
---
> VSPHERE_FOLDER: /infra-dc-01/vm/05-Lab-k8s/k8s_lab-tkg-02_demo-01/vm_tkg16wc02

 

Workload Cluster を作成します。

demo-01 [ ~ ]$ tanzu cluster create -f tkg16wc02.yml

 

しばらく待つと Kubernetes クラスタが作成されます。

demo-01 [ ~ ]$ tanzu cluster list --include-management-cluster
  NAME       NAMESPACE   STATUS   CONTROLPLANE  WORKERS  KUBERNETES         ROLES       PLAN  TKR
  tkg16wc02  default     running  1/1           1/1      v1.23.10+vmware.1  <none>      dev   v1.23.10---vmware.1-tkg.1
  tkg16mc02  tkg-system  running  1/1           1/1      v1.23.10+vmware.1  management  dev   v1.23.10---vmware.1-tkg.1

 

kubeconfig を取得します。

demo-01 [ ~ ]$ tanzu cluster kubeconfig get tkg16wc02 --admin
Credentials of cluster 'tkg16wc02' have been saved
You can now access the cluster by running 'kubectl config use-context tkg16wc02-admin@tkg16wc02'

 

コンテキストを切り替えます。

demo-01 [ ~ ]$ kubectl config use-context tkg16wc02-admin@tkg16wc02
Switched to context "tkg16wc02-admin@tkg16wc02"

 

Workload Cluster に接続できるようになりました。

demo-01 [ ~ ]$ kubectl get nodes
NAME                             STATUS   ROLES                  AGE     VERSION
tkg16wc02-control-plane-26h4f    Ready    control-plane,master   5h35m   v1.23.10+vmware.1
tkg16wc02-md-0-7c9498c97-tfgct   Ready    <none>                 5h29m   v1.23.10+vmware.1

 

NSX ALB を操作する AKO(Avi Kubernetes Operator)がインストールされています。

demo-01 [ ~ ]$ kubectl api-resources --api-group=ako.vmware.com
NAME                    SHORTNAMES    APIVERSION                NAMESPACED   KIND
aviinfrasettings                      ako.vmware.com/v1alpha1   false        AviInfraSetting
hostrules               hostrule,hr   ako.vmware.com/v1alpha1   true         HostRule
httprules               httprule      ako.vmware.com/v1alpha1   true         HTTPRule
multiclusteringresses   mci           ako.vmware.com/v1alpha1   true         MultiClusterIngress
serviceimports          si            ako.vmware.com/v1alpha1   true         ServiceImport
demo-01 [ ~ ]$ kubectl -n avi-system get pods
NAME    READY   STATUS    RESTARTS   AGE
ako-0   1/1     Running   0          5h35m

 

Pod を起動してみます。

demo-01 [ ~ ]$ kubectl run hello --image=gcr.io/google-samples/node-hello:1.0
pod/hello created
demo-01 [ ~ ]$ kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
hello   1/1     Running   0          4m20s

 

そして、LoadBalancer Service を作成します。例では、VIP アドレスが 192.168.61.220 になりました。

demo-01 [ ~ ]$ kubectl expose pod hello --type=LoadBalancer --port=80 --target-port=8080
service/hello exposed
demo-01 [ ~ ]$ kubectl get service hello
NAME    TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
hello   LoadBalancer   100.70.94.41   192.168.61.220   80:30120/TCP   14s

 

下記のように、VIP 経由でコンテナにアクセスできるようになりました。

demo-01 [ ~ ]$ curl -s http://192.168.61.220:80 | more
Hello Kubernetes!

 

NSX ALB の Web UI でも LoadBalancer Service に対応する Virtual Service(VIP が 192.168.61.220)が確認できます。

 

以上、TKG + NSX ALB のラボ構築でした。