Tanzu Kubernetes Grid 1.3を使ってみた

vSphere 7.0U2でTanzu Kubernetes Grid ServiceでNSX-ALBに対応しましたが、その後リリースされたTanzu Kubernetes Grid(TKG) 1.3でも、Kubernetesクラスター向けのロードバランサーとしてNSX-ALBの利用が可能になったので、TKG 1.3でNSX-ALBを利用してみました。

## TKG 1.3 + NSX-ALBを利用するための要件

### Docker

ブートストラップノードとしてLinuxを利用しました。ブートストラップノードではkindを利用してManagement Clusterを作成するため、dockerがインストールされている必要があります。

### OVAのインポートとテンプレート化

VMwareが提供するTKG向けのOVAをvSphere環境にインポートして、テンプレート化しておきます。vSphere向けにはPhotonとUbuntuのテンプレートが提供されています。デフォルトではUbuntuが利用されますが、Photonのほうがサイズが小さいのでクラスタ作成を少しでも高速化したい場合は、Photonを利用するのが良いでしょう。Managemet Cluster向けにはv1.20.4が利用されます。

- photon-3-kube-v1.20.4-vmware.1-tkg.0-2326554155028348692.ova
- ubuntu-2004-kube-v1.20.4-vmware.1-tkg.0-16153464878630780629.ova

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27668/212bbe1e-ee90-c8d5-9a3d-be164d1d32b1.png)

### NSX-ALB Controllerとネットワーク

Kubernetesノードが接続されるネットワークと、NSX-ALBがロードバランサー用のVIPを利用するネットワークを分離する必要があります。Kubernetesノードが接続されるネットワークでは、ノードプロビジョニング時にDHCPサーバーが必要となります。

NSX-ALBはcontrollerの要件は[こちら(AKO : Avi Kubernetes Operator)](https://qiita.com/masanara/items/23fc3dfc5568356ca986#avi-controllerの準備)とほぼ同じです。

- Controller OVAのデプロイ
- CloudとしてvSphere環境を登録
    - IPAM Profileの作成してCloudに設定
    - Management NetworkでSEが利用するポートグループとIP Addressプールを指定
    - NetworksとしてVIPネットワーク用のポートグループにIP Adressプールを指定
- SANを指定してControllerの証明書を再作成

## Tanzu CLIのセットアップ

TKG 1.2まではtkgコマンドでManagement ClusterやTKCを作成していましたが、TKG 1.3からtanzuコマンドに変更されています。ブートストラップノードにtanzu CLIをインストールします。

```bash
$ cd $HOME
$ mkdir tanzu
$ tar xvf tanzu-cli-bundle-linux-amd64.tar -C tanzu/
$ cd tanzu/cli/
$ sudo install core/v1.3.0/tanzu-core-linux_amd64 /usr/local/bin/tanzu
```

tanzu CLIはプラグイン機構になっているので、tanzu-cli-bundleに含まれているプラグインを全て追加します。(プラグインの実体は```$HOME/tanzu/cli```配下にあります。)

```bash

```

## Management Clusterの準備

vSphere環境にManagement Clsuterを作成します。tanzuコマンドに```--ui```オプションを付けるとGUI経由で各種パラメータを入力することができますが、各種パラメータを設定ファイルとして作成し、Management Clusterを構築することも可能です。

### 設定ファイルの作成

Management Clusterを構築するために必要なパラメータを```management-cluster.yaml```として作成します。vCenterへのアクセス情報や、Management ClusterのAPIに利用するIPアドレス(```VSPHERE_CONTROL_PLANE_ENDPOINT```)を指定します。

```shell
#! ---------------------------------------------------------------------
#! Basic cluster creation configuration
#! ---------------------------------------------------------------------
CLUSTER_NAME: mgmt
CLUSTER_PLAN: dev
INFRASTRUCTURE_PROVIDER: vsphere
ENABLE_CEIP_PARTICIPATION: true
ENABLE_AUDIT_LOGGING: true
CLUSTER_CIDR: 100.96.0.0/11
SERVICE_CIDR: 100.64.0.0/13
#! ---------------------------------------------------------------------
#! vSphere configuration
#! ---------------------------------------------------------------------
VSPHERE_SERVER: vcenter.example.com
VSPHERE_USERNAME: administrator@vsphere.local
VSPHERE_PASSWORD: password
VSPHERE_DATACENTER: /Datacenter
VSPHERE_RESOURCE_POOL: /Datacenter/host/Cluster
VSPHERE_DATASTORE: /Datacenter/datastore/Datastore
VSPHERE_FOLDER: /Datacenter/vm
VSPHERE_NETWORK: wld
VSPHERE_CONTROL_PLANE_ENDPOINT: 192.168.15.100
VIP_NETWORK_INTERFACE: "eth0"
VSPHERE_SSH_AUTHORIZED_KEY: ssh-rsa AAAAB3NzaC....
VSPHERE_STORAGE_POLICY_ID: "tkg"
VSPHERE_INSECURE: true
DEPLOY_TKG_ON_VSPHERE7: true
ENABLE_TKGS_ON_VSPHERE7: false
#! ---------------------------------------------------------------------
#! Node configuration
#! ---------------------------------------------------------------------
SIZE: small
OS_NAME: "photon"
#! ---------------------------------------------------------------------
#! Machine Health Check configuration
#! ---------------------------------------------------------------------
ENABLE_MHC: true
MHC_UNKNOWN_STATUS_TIMEOUT: 5m
MHC_FALSE_STATUS_TIMEOUT: 12m
```

クラスターに対する認証にPinnipedを利用する場合、OIDCもしくはLDAPの設定を指定します。以下はLDAPの設定例です。(LDAP_HOSTへの接続はLDAPSが利用されます。)

```bash
#! ---------------------------------------------------------------------
#! Identity management configuration
#! ---------------------------------------------------------------------
IDENTITY_MANAGEMENT_TYPE: "ldap"
LDAP_BIND_DN: "administrator@example.com"
LDAP_BIND_PASSWORD: "password"
LDAP_HOST: 10.44.59.1:686
LDAP_USER_SEARCH_BASE_DN: cn=users,dc=example,dc=com
LDAP_USER_SEARCH_FILTER:
LDAP_USER_SEARCH_USERNAME: sAMAccountName
LDAP_USER_SEARCH_ID_ATTRIBUTE: sAMAccountName
LDAP_USER_SEARCH_EMAIL_ATTRIBUTE: mail
LDAP_USER_SEARCH_NAME_ATTRIBUTE: cn
LDAP_GROUP_SEARCH_BASE_DN: cn=users,dc=example,dc=com
LDAP_GROUP_SEARCH_FILTER:
LDAP_GROUP_SEARCH_USER_ATTRIBUTE: dn
LDAP_GROUP_SEARCH_GROUP_ATTRIBUTE:
LDAP_GROUP_SEARCH_NAME_ATTRIBUTE: cn
```

NSX-ALBを利用するためにNSX-ALBのControllerへの接続情報やポートグループを指定します。```AVI_CA_DATA_B64```の値にはControllerの証明書をbase64エンコードしたものを設定します。この証明書は```AVI_CONTROLLER```の値がSAN(Subject Alternative Name)として指定されている必要があります。

```bash
#! ---------------------------------------------------------------------
#! NSX Advanced Load Balancer configuration
#! ---------------------------------------------------------------------
AVI_ENABLE: true
AVI_NAMESPACE: "tkg-system-networking"
AVI_DISABLE_INGRESS_CLASS: true
AVI_AKO_IMAGE_PULL_POLICY: IfNotPresent
AVI_ADMIN_CREDENTIAL_NAME: avi-controller-credentials
AVI_CA_NAME: avi-controller-ca
AVI_CONTROLLER: 192.168.11.2
AVI_USERNAME: "admin"
AVI_PASSWORD: "password"
AVI_CLOUD_NAME: "Default-Cloud"
AVI_SERVICE_ENGINE_GROUP: "Default-Group"
AVI_DATA_NETWORK: "wld"
AVI_DATA_NETWORK_CIDR: "192.168.15.0/24"
AVI_CA_DATA_B64: "...."
AVI_LABELS: ""
```

### Management Clusterの作成

上記設定ファイル(management-cluster.yaml)を指定して、```tanzu management-cluster create```コマンドを利用してクラスターを作成します。このときtanzuコマンドを実行したノードのdockerでkindを利用してManagement Clusterが構成されます。

```bash
$ tanzu management-cluster create -f management-cluster.yaml

Validating the pre-requisites...

vSphere 7.0 Environment Detected.

You have connected to a vSphere 7.0 environment which does not have vSphere with Tanzu enabled. vSphere with Tanzu includes
an integrated Tanzu Kubernetes Grid Service which turns a vSphere cluster into a platform for running Kubernetes workloads in dedicated
resource pools. Configuring Tanzu Kubernetes Grid Service is done through vSphere HTML5 client.

Tanzu Kubernetes Grid Service is the preferred way to consume Tanzu Kubernetes Grid in vSphere 7.0 environments. Alternatively you may
deploy a non-integrated Tanzu Kubernetes Grid instance on vSphere 7.0.
Deploying TKG management cluster on vSphere 7.0 ...

Setting up management cluster...
Validating configuration...
Using infrastructure provider vsphere:v0.7.6
Generating cluster configuration...
Setting up bootstrapper...
Bootstrapper created. Kubeconfig: /home/nos/.kube-tkg/tmp/config_fw3lW624
Installing providers on bootstrapper...
Fetching providers
Installing cert-manager Version="v0.16.1"
Waiting for cert-manager to be available...
Installing Provider="cluster-api" Version="v0.3.14" TargetNamespace="capi-system"
Installing Provider="bootstrap-kubeadm" Version="v0.3.14" TargetNamespace="capi-kubeadm-bootstrap-system"
Installing Provider="control-plane-kubeadm" Version="v0.3.14" TargetNamespace="capi-kubeadm-control-plane-system"
Installing Provider="infrastructure-vsphere" Version="v0.7.6" TargetNamespace="capv-system"
Start creating management cluster...
Saving management cluster kubeconfig into /home/nos/.kube/config
Installing providers on management cluster...
Fetching providers
Installing cert-manager Version="v0.16.1"
Waiting for cert-manager to be available...
Installing Provider="cluster-api" Version="v0.3.14" TargetNamespace="capi-system"
Installing Provider="bootstrap-kubeadm" Version="v0.3.14" TargetNamespace="capi-kubeadm-bootstrap-system"
Installing Provider="control-plane-kubeadm" Version="v0.3.14" TargetNamespace="capi-kubeadm-control-plane-system"
Installing Provider="infrastructure-vsphere" Version="v0.7.6" TargetNamespace="capv-system"
Waiting for the management cluster to get ready for move...
Waiting for addons installation...
Moving all Cluster API objects from bootstrap cluster to management cluster...
Performing move...
Discovering Cluster API objects
Moving Cluster API objects Clusters=1
Creating objects in the target cluster
Deleting objects from the source cluster
Context set for management cluster mgmt as 'mgmt-admin@mgmt'.

Management cluster created!


You can now create your first workload cluster by running the following:

  tanzu cluster create [name] -f [file]
```

### Management Clusterの状態確認

vCenter上にはManagement ClusterのVMが作成されています。```OS_NAME: "photon"```としたので、Management ClusterはPhotonイメージを利用して作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27668/0704a707-ca64-6285-ce5a-a8996bf140f0.png)

```SIZE: small```としたので、MasterとWorkerがそれぞれ1台で構成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27668/c0bd6600-729b-be8a-dc76-6b3e4bdc87e4.png)

tanzu CLIでManagement Clusterの状態を確認することが可能です。

```bash
$ tanzu management-cluster get
  NAME  NAMESPACE   STATUS   CONTROLPLANE  WORKERS  KUBERNETES        ROLES
  mgmt  tkg-system  running  1/1           1/1      v1.20.4+vmware.1  management


Details:

NAME                                                     READY  SEVERITY  REASON                           SINCE  MESSAGE
/mgmt                                                    True                                              4s
├─ClusterInfrastructure - VSphereCluster/mgmt            True                                              9s
├─ControlPlane - KubeadmControlPlane/mgmt-control-plane  True                                              4s
│ └─Machine/mgmt-control-plane-4dcbv                     True                                              6s
└─Workers
  └─MachineDeployment/mgmt-md-0
    └─Machine/mgmt-md-0-7d4759ff6-zzdfk                  False  Info      WaitingForClusterInfrastructure  9s


Providers:

  NAMESPACE                          NAME                    TYPE                    PROVIDERNAME  VERSION  WATCHNAMESPACE
  capi-kubeadm-bootstrap-system      bootstrap-kubeadm       BootstrapProvider       kubeadm       v0.3.14
  capi-kubeadm-control-plane-system  control-plane-kubeadm   ControlPlaneProvider    kubeadm       v0.3.14
  capi-system                        cluster-api             CoreProvider            cluster-api   v0.3.14
  capv-system                        infrastructure-vsphere  InfrastructureProvider  vsphere       v0.7.6
```

Management Cluster用のContextを指定してManagement Clusterを確認します。

```bash
$ kubectl config use-context mgmt-admin@mgmt
Switched to context "mgmt-admin@mgmt".
$ kubectl get node -o wide
NAME                        STATUS   ROLES                  AGE     VERSION            INTERNAL-IP      EXTERNAL-IP      OS-IMAGE                 KERNEL-VERSION   CONTAINER-RUNTIME
mgmt-control-plane-4dcbv    Ready    control-plane,master   8m29s   v1.20.4+vmware.1   192.168.11.111   192.168.11.111   VMware Photon OS/Linux   4.19.174-5.ph3   containerd://1.4.3
mgmt-md-0-7d4759ff6-zzdfk   Ready    <none>                 3m17s   v1.20.4+vmware.1   192.168.11.114   192.168.11.114   VMware Photon OS/Linux   4.19.174-5.ph3   containerd://1.4.3
```

Management Cluster内はCluster APIが構成され、NSX-ALBを利用するためのAKOや認証用のPinnipedなどが実行されています。

```bash
$ kubectl get pod -A
NAMESPACE                           NAME                                                             READY   STATUS      RESTARTS   AGE
capi-kubeadm-bootstrap-system       capi-kubeadm-bootstrap-controller-manager-5bdd64499b-4wmr9       2/2     Running     0          4m2s
capi-kubeadm-control-plane-system   capi-kubeadm-control-plane-controller-manager-7f89b8594d-pjhdr   2/2     Running     0          3m58s
capi-system                         capi-controller-manager-c4f5f9c76-sktgx                          2/2     Running     0          4m7s
capi-webhook-system                 capi-controller-manager-768b989cbc-msrsq                         2/2     Running     0          4m11s
capi-webhook-system                 capi-kubeadm-bootstrap-controller-manager-67444bbcc9-6dsr2       2/2     Running     0          4m5s
capi-webhook-system                 capi-kubeadm-control-plane-controller-manager-5466b4d4d6-62fs2   2/2     Running     0          4m
capi-webhook-system                 capv-controller-manager-7cb98c468d-xpj5d                         2/2     Running     0          3m55s
capv-system                         capv-controller-manager-767cc6b6bf-7brx4                         2/2     Running     0          3m51s
cert-manager                        cert-manager-6cbfc68c4b-2hnjp                                    1/1     Running     0          9m40s
cert-manager                        cert-manager-cainjector-796775c48f-vwqxd                         1/1     Running     0          9m40s
cert-manager                        cert-manager-webhook-7646d5bc94-sf527                            1/1     Running     0          9m40s
kube-system                         antrea-agent-lwksj                                               2/2     Running     0          9m22s
kube-system                         antrea-agent-zx5km                                               2/2     Running     0          5m12s
kube-system                         antrea-controller-58b6b4d7dc-cs6hq                               1/1     Running     0          9m22s
kube-system                         coredns-68d49685bd-6ck5s                                         1/1     Running     0          10m
kube-system                         coredns-68d49685bd-826zr                                         1/1     Running     0          10m
kube-system                         etcd-mgmt-control-plane-4dcbv                                    1/1     Running     0          10m
kube-system                         kube-apiserver-mgmt-control-plane-4dcbv                          1/1     Running     0          10m
kube-system                         kube-controller-manager-mgmt-control-plane-4dcbv                 1/1     Running     0          10m
kube-system                         kube-proxy-4lkmq                                                 1/1     Running     0          10m
kube-system                         kube-proxy-dgzb7                                                 1/1     Running     0          5m12s
kube-system                         kube-scheduler-mgmt-control-plane-4dcbv                          1/1     Running     0          10m
kube-system                         kube-vip-mgmt-control-plane-4dcbv                                1/1     Running     0          10m
kube-system                         metrics-server-8499864cb4-nq7tv                                  1/1     Running     0          2m
kube-system                         vsphere-cloud-controller-manager-ct26h                           1/1     Running     0          15s
kube-system                         vsphere-csi-controller-79485776c9-4dkgk                          5/5     Running     0          69s
kube-system                         vsphere-csi-node-5788m                                           3/3     Running     0          69s
kube-system                         vsphere-csi-node-jbz5q                                           3/3     Running     0          69s
pinniped-concierge                  pinniped-concierge-6d5d7b6cff-5nvlt                              1/1     Running     0          2m2s
pinniped-concierge                  pinniped-concierge-6d5d7b6cff-6l6dr                              1/1     Running     0          2m2s
pinniped-concierge                  pinniped-concierge-kube-cert-agent-d38c36a7                      1/1     Running     0          93s
pinniped-supervisor                 pinniped-post-deploy-job-ver-1-96kk8                             0/1     Completed   0          2m2s
pinniped-supervisor                 pinniped-supervisor-746695b648-k9clf                             1/1     Running     0          64s
pinniped-supervisor                 pinniped-supervisor-746695b648-m9c2s                             1/1     Running     0          64s
tanzu-system-auth                   dex-5db8466865-dzsq4                                             1/1     Running     0          58s
tkg-system-networking               ako-operator-controller-manager-7bf844694d-72b69                 2/2     Running     0          10m
tkg-system                          kapp-controller-5b845bdfdd-nxvrs                                 1/1     Running     0          10m
tkg-system                          tanzu-addons-controller-manager-6d56c59d4-h5hp6                  1/1     Running     6          9m25s
tkr-system                          tkr-controller-manager-f7bbb4bd4-8btc4                           1/1     Running     0          10m
```

## Tanzu Kubernetes Clusterの作成

### 設定ファイルの作成

Tanzu Kubernetes Clusterも設定ファイルに基づいて作成されます。(TKG 1.2まではtkg CLIの引数だけでクラスターを作成することが可能でしたが、TKG 1.3のtanzu CLIでは設定ファイルを利用してクラスターを作成する必要があります)設定ファイルはManagement Cluster向けのものと似ていますが、一部のパラメータはTKCに対応していません。([Tanzu CLI Configuration File Variable Reference](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.3/vmware-tanzu-kubernetes-grid-13/GUID-tanzu-config-reference.html))

Management Clusterと同じく、```VSPHERE_CONTROL_PLANE_ENDPOINT```に対してIPアドレスを指定します。このアドレスは[kube-vip](https://kube-vip.io)により利用され、Kubernetes APIのIPアドレスとして機能します。

```bash
#! ---------------------------------------------------------------------
#! Basic cluster creation configuration
#! ---------------------------------------------------------------------
CLUSTER_NAME: cl01
CLUSTER_PLAN: dev
INFRASTRUCTURE_PROVIDER: vsphere
ENABLE_CEIP_PARTICIPATION: true
ENABLE_AUDIT_LOGGING: true
CLUSTER_CIDR: 100.96.0.0/11
SERVICE_CIDR: 100.64.0.0/13
#! ---------------------------------------------------------------------
#! vSphere configuration
#! ---------------------------------------------------------------------
VSPHERE_SERVER: vcenter.example.com
VSPHERE_USERNAME: administrator@vsphere.local
VSPHERE_PASSWORD: password
VSPHERE_DATACENTER: /Datacenter
VSPHERE_RESOURCE_POOL: /Datacenter/host/Cluster
VSPHERE_DATASTORE: /Datacenter/datastore/Datastore
VSPHERE_FOLDER: /Datacenter/vm
VSPHERE_NETWORK: wld
VSPHERE_CONTROL_PLANE_ENDPOINT: 192.168.15.99
VIP_NETWORK_INTERFACE: "eth0"
VSPHERE_SSH_AUTHORIZED_KEY: ssh-rsa AAAAB3NzaC....
VSPHERE_STORAGE_POLICY_ID: "tkg"
VSPHERE_TLS_THUMBPRINT:
VSPHERE_INSECURE: true
DEPLOY_TKG_ON_VSPHERE7: true
ENABLE_TKGS_ON_VSPHERE7: false
#! ---------------------------------------------------------------------
#! Node configuration
#! ---------------------------------------------------------------------
SIZE: small
OS_NAME: "photon"
#! ---------------------------------------------------------------------
#! Machine Health Check configuration
#! ---------------------------------------------------------------------
ENABLE_MHC: true
MHC_UNKNOWN_STATUS_TIMEOUT: 5m
MHC_FALSE_STATUS_TIMEOUT: 12m
```

### Tanzu Kubernetes Clusterの作成

上記設定ファイル(c1.yaml)を指定して、```tanzu cluster create```コマンドを利用してTanzu Kubernetes Clusterを作成します。コマンドを実行すると、Management ClusterのCluster APIがvSphere上にKubernetesクラスターをプロビジョニングします。

```bash
$ tanzu cluster create cl1 -f cl1.yaml
Validating configuration...
Creating workload cluster 'cl1'...
Waiting for cluster to be initialized...
Waiting for cluster nodes to be available...
Waiting for addons installation...

Workload cluster 'cl1' created
$ tanzu cluster list
  NAME  NAMESPACE  STATUS   CONTROLPLANE  WORKERS  KUBERNETES        ROLES   PLAN
  cl1   default    running  1/1           1/1      v1.20.4+vmware.1  <none>  dev
$ tanzu cluster get cl1
  NAME  NAMESPACE  STATUS   CONTROLPLANE  WORKERS  KUBERNETES        ROLES
  cl1   default    running  1/1           1/1      v1.20.4+vmware.1  <none>
ℹ

Details:

NAME                                                    READY  SEVERITY  REASON  SINCE  MESSAGE
/cl1                                                    True                     10m
├─ClusterInfrastructure - VSphereCluster/cl1            True                     16m
├─ControlPlane - KubeadmControlPlane/cl1-control-plane  True                     10m
│ └─Machine/cl1-control-plane-ckctq                     True                     11m
└─Workers
  └─MachineDeployment/cl1-md-0
    └─Machine/cl1-md-0-76db8d75b7-bc2tk                 True                     4m43s
```

Tanzu Kubernetres Clusterを構成するControlPlane/Worker VMが作成されます。cl1.yamlでも```OS_NAME: "photon"```としたので、TKCもPhotonイメージを利用して作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27668/d38969c4-6b7a-c82d-4a67-a982d6c06305.png)


### Tanzu Kubernetes Clusterへの接続

```tanzu kubeconfig get CLUSTER_NAME --admin```コマンドで作成したTKCのkubeconfigをContextに追加することが可能です。追加したContextに切り替えてクラスターに接続します。

```bash
$ tanzu cluster kubeconfig get cl1 --admin
Credentials of workload cluster 'cl1' have been saved
You can now access the cluster by running 'kubectl config use-context cl1-admin@cl1'
$ kubectl config use-context cl1-admin@cl1
Switched to context "cl1-admin@cl1".
kubectl config use-context cl1-admin@cl1
Switched to context "cl1-admin@cl1".
$ kubectl get node -o wide
NAME                        STATUS   ROLES                  AGE   VERSION            INTERNAL-IP      EXTERNAL-IP      OS-IMAGE                 KERNEL-VERSION   CONTAINER-RUNTIME
mgmt-control-plane-4dcbv    Ready    control-plane,master   28m   v1.20.4+vmware.1   192.168.11.111   192.168.11.111   VMware Photon OS/Linux   4.19.174-5.ph3   containerd://1.4.3
mgmt-md-0-7d4759ff6-zzdfk   Ready    <none>                 22m   v1.20.4+vmware.1   192.168.11.114   192.168.11.114   VMware Photon OS/Linux   4.19.174-5.ph3   containerd://1.4.3
```

## Tanzu Kubernetes Clusterの利用

クラスターにDeploymentを作成し、LoadBalancer Serviceとして公開してみます。

```bash
$ kubectl create deploy nginx --image=nginxdemos/hello
deployment.apps/nginx created
$ kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE                        NOMINATED NODE   READINESS GATES
nginx-744698654f-k2wrv   1/1     Running   0          23s   100.96.1.6   cl1-md-0-76db8d75b7-bc2tk   <none>           <none>
$ kubectl expose deploy nginx --port=80 --type=LoadBalancer
service/nginx exposed
$ kubectl get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
kubernetes   ClusterIP      100.64.0.1      <none>         443/TCP        17m
nginx        LoadBalancer   100.65.79.125   192.168.15.1   80:31742/TCP   3s
```

LoadBalancer Serviceを作成したタイミングで、EXTERNAL-IPが割り当てられ、NSX-ALBで2台のSE(Service Engine)のプロビジョニングが開始されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27668/eba3b38f-663a-4464-e853-8e363a077cfe.png)

しばらくして、SEの作成が完了するとEXTERNAL-IP経由でPodにアクセスすることが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27668/b215d169-f421-38df-877a-ee40a145d549.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27668/cdb31355-b9a0-4df2-2890-3c423fe7551b.png)


## Pinnpiedによるログイン

ブートストラップノード以外からtanzu CLIを利用する場合、Pinnpiedを利用してOIDCもしくはLDAPユーザーでログインすることが可能です。ブートストラップノードから、Management ClusterとTKCに対して、ログインユーザー向けのClusterRoleBiindingを作成しておきます。

```bash
$ kubectl config use-context cl1-admin@cl1
Switched to context "cl1-admin@cl1".
$ kubectl create clusterrolebinding id-mgmt-rb --clusterrole cluster-admin --user masanara
clusterrolebinding.rbac.authorization.k8s.io/id-mgmt-rb created

$ kubectl config use-context mgmt-admin@mgmt
Switched to context "mgmt-admin@mgmt".
$ kubectl create clusterrolebinding id-mgmt-rb --clusterrole cluster-admin --user masanara
clusterrolebinding.rbac.authorization.k8s.io/id-mgmt-rb created
```

外部のホストにtanzu CLIとkubectlをインストールして、Management Clusterにアクセスしてみます。

```shell
C:\> tanzu login --endpoint "https://192.168.15.100:6443" --name tkg
```

```tanzu login```のエンドポイントとしてManagement ClusterのControl Planeアドレスを指定すると、Management ClsuterのDexにリダイレクトされ、LDAPの認証情報を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27668/baa7e9ac-5040-7707-64c7-db7254cf2ec5.png)


LDAPユーザー名・パスワードを入力し、「you have been logged in and may now close this tab」と表示されたらブラウザを閉じてコマンドプロンプトに戻ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27668/373eb69c-a564-b82b-7ff8-a2366336917f.png)

ログインが完了するため、クラスター一覧を確認できます。

```shell
C:\> tanzu login --endpoint "https://192.168.15.100:6443" --name tkg
✔  successfully logged in to management cluster using the kubeconfig tkg

C:\>tanzu cluster list
  NAME  NAMESPACE  STATUS   CONTROLPLANE  WORKERS  KUBERNETES        ROLES   PLAN
  cl1   default    running  1/1           1/1      v1.20.4+vmware.1  <none>  dev
```

クラスターのkubeconfigを取得し、Contextを切り替えるとTKCにアクセス可能です。

```bash
C:\>tanzu cluster kubeconfig get cl1
↳  You can now access the cluster by running 'kubectl config use-context tanzu-cli-cl1@cl1'

C:\>kubectl config use-context tanzu-cli-cl1@cl1
Switched to context "tanzu-cli-cl1@cl1".

C:\>kubectl get node
NAME                        STATUS   ROLES                  AGE   VERSION
cl1-control-plane-ckctq     Ready    control-plane,master   66m   v1.20.4+vmware.1
cl1-md-0-76db8d75b7-bc2tk   Ready    <none>                 61m   v1.20.4+vmware.1
```