vm.gowatana.jp

NEOにほんごVMware(仮)

VCF 5.2.1 で vSphere Supervisor を有効化してみる。Part-08:VKS クラスタへのアプリ展開(Guestbook)

VMware Cloud Foundation(VCF)5.2.1 に構築したスーパーバイザーに作成した vSphere Kubernetes Service(VKS)クラスタで、デモ アプリ(Guestbook)を起動してみます。

 

前回はこちら。

 

今回の内容です。

 

今回の環境

VCF 5.2.1 で展開したスーパーバイザー上に、下記のように VKS クラスタを作成してあります。

 

1. YAML ファイルの用意

VMware Validated Solutions の「Developer Ready Infrastructure for VMware Cloud Foundation」で紹介されている、「Guestbook」というアプリを起動してみます。

 

YAML ファイルをまとめておくディレクトリを作成します。

gowatana [ ~ ]$ mkdir guestbook

 

YAML ファイルを、テキスト エディタ(vi など)で作成します。

 

guestbook/mongo-deployment.yaml

  • MongoDB の Pod を起動する Deployment です。

gist.github.com

 

guestbook/mongo-service.yaml

  • フロントエンドから MongoDB にアクセスするための Serivce です。

gist.github.com

 

guestbook/frontend-deployment.yaml

  • PHP の Web アプリ(フロントエンド)の Pod を起動する Deployment です。
  • さりげなく google-samples のイメージがコメントアウトされています。そういえば Guestbook もけっこう歴史のあるデモ アプリのような・・・

gist.github.com

 

guestbook/frontend-service.yaml

  • Web ブラウザ(Kubernetes クラスタの外部)からフロントエンドに接続するための Service です。

gist.github.com

 

guestbook ディレクトリには、下記のように4つの YAML ファイルが配置されます。

gowatana [ ~ ]$ ls -1 guestbook/
frontend-deployment.yaml
frontend-service.yaml
mongo-deployment.yaml
mongo-service.yaml

 

なお、YAML の内容は、下記の guestbook.yml ように 1ファイルにまとめられます。

 

2. VKS クラスタへの接続

前回の投稿の手順で、kubectl で VKS クラスタに接続します。

 

VKS クラスタのノードです。

gowatana [ ~ ]$ kubectl get nodes
NAME                              STATUS   ROLES           AGE   VERSION
vks01-rl9vz-cswml                 Ready    control-plane   53m   v1.30.1+vmware.1-fips
vks01-workers-f6dz9-s9x86-vh22p   Ready    < none >          46m   v1.30.1+vmware.1-fips

 

この時点では、下記のように Namespace が作成されています。

gowatana [ ~ ]$ kubectl get ns
NAME                                 STATUS   AGE
default                              Active   55m
kube-node-lease                      Active   55m
kube-public                          Active   55m
kube-system                          Active   55m
secretgen-controller                 Active   51m
tkg-system                           Active   51m
velero-vsphere-plugin-backupdriver   Active   55m
vmware-system-antrea                 Active   51m
vmware-system-auth                   Active   51m
vmware-system-cloud-provider         Active   55m
vmware-system-csi                    Active   55m
vmware-system-tkg                    Active   55m

 

3. アプリ(Guestbook)の起動

Guestbook 関連のリソースを作成する Namespace を作成します。

gowatana [ ~ ]$ kubectl create ns app-ns-01
namespace/app-ns-01 created

 

Guestbook を構成する Pod を起動するために、Namespace のセキュリティ設定を緩和しておきます。

gowatana [ ~ ]$ kubectl label namespace app-ns-01 pod-security.kubernetes.io/enforce=baseline
namespace/app-ns-01 labeled

 

Namespace にラベルが追加されました。

gowatana [ ~ ]$ kubectl get ns app-ns-01 -o yaml | grep pod-security
    pod-security.kubernetes.io/enforce: baseline

 

MongoDB の Doployment を作成します。

gowatana [ ~ ]$ kubectl apply -f guestbook/mongo-deployment.yaml -n app-ns-01
deployment.apps/mongo created

 

下記のように、Deployment から Pod が起動されます。

gowatana [ ~ ]$ kubectl get all -n app-ns-01
NAME                         READY   STATUS    RESTARTS   AGE
pod/mongo-7c55f7b678-bp2dw   1/1     Running   0          77s

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mongo   1/1     1            1           77s

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/mongo-7c55f7b678   1         1         1       77s

 

MongoDB に接続する Service を作成します。

gowatana [ ~ ]$ kubectl apply -f guestbook/mongo-service.yaml -n app-ns-01
service/mongo created

 

Service が作成されました。Kubernetes クラスタ内部で通信する Service のため、NSX LB での IP アドレスは設定されません。(EXTERNAL-IP が none のまま)

gowatana [ ~ ]$ kubectl get service -n app-ns-01
NAME    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE
mongo   ClusterIP   172.16.45.13   <none>        27017/TCP   21s

 

フロントエンドの Deployment を作成します。

gowatana [ ~ ]$ kubectl apply -f guestbook/frontend-deployment.yaml -n app-ns-01
deployment.apps/frontend created

 

フロントエンドの Deployment から Pod が起動されました。

gowatana [ ~ ]$ kubectl get all -n app-ns-01
NAME                            READY   STATUS    RESTARTS   AGE
pod/frontend-64b557c8c7-5zpsv   1/1     Running   0          55s
pod/frontend-64b557c8c7-7wsmc   1/1     Running   0          55s
pod/frontend-64b557c8c7-hmc65   1/1     Running   0          55s
pod/mongo-7c55f7b678-bp2dw      1/1     Running   0          5m24s

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE
service/mongo   ClusterIP   172.16.45.13           27017/TCP   2m57s

NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/frontend   3/3     3            3           55s
deployment.apps/mongo      1/1     1            1           5m24s

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/frontend-64b557c8c7   3         3         3       55s
replicaset.apps/mongo-7c55f7b678      1         1         1       5m24s

 

フロントエンドの Service を作成します。

gowatana [ ~ ]$ kubectl apply -f guestbook/frontend-service.yaml -n app-ns-01
service/frontend created

 

Web ブラウザからフロントエンドに接続するための Service(TYPE が LoadBalancer) なので、NSX LB による IP アドレス(EXTERNAL-IP)が設定されました。

gowatana [ ~ ]$ kubectl get service -n app-ns-01
NAME       TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
frontend   LoadBalancer   172.16.35.246   192.168.82.4   80:30477/TCP   20s
mongo      ClusterIP      172.16.45.13    < none >         27017/TCP      5m10s

 

4. アプリ起動後の様子

Web ブラウザから、フロントエンドに設定された IP アドレス(192.168.82.4)にアクセスすると、Guestbook アプリの画面が表示できるはずです。

 

NSX Manager で、VKS クラスタを作成した vSphere 名前空間の名前が含まれるロード バランサの、仮想サーバ欄のリンク「2」を開いてみます。

 

フロントエンドの Service に設定された IP アドレス(192.168.82.4)が、NSX LB で設定されていることがわかります。

 

アプリ(Guestbook)の削除

ここまでに作成した Kubernetes リソースを作成する場合は、

gowatana [ ~ ]$ kubectl delete -f guestbook/ -n app-ns-01
deployment.apps "frontend" deleted
service "frontend" deleted
deployment.apps "mongo" deleted
service "mongo" deleted

 

これで、リソースがすべて削除されました。ちなみに、「kubectl delete ns app-ns-01」で一括削除もできます。

gowatana [ ~ ]$ kubectl get all -n app-ns-01
No resources found in app-ns-01 namespace.

 

つづく。