Dev > CaaS > Kubernetes > TKG > TCE > Docker
warning
この記事は2年以上前に更新されたものです。情報が古くなっている可能性があります。

Tanzu Community Edition (TCE) は Cluster API を使ってKubernetesクラスタを管理するソリューションである、
Tanzu Kubernetes Grid (TKG) のオープンソース版です。

TCEはTKGのupstream版という位置付けであり、例えるとFedoraとRed Hat Enterprise Linuxのような関係です。

TCEのデプロイ方法はTKGと同じであるManagement Cluster / Workload Cluster方式と、単一のクラスタだけ作成するStandalone Cluster方式を選べます。
対応しているIaaS ProviderはTKGと同じくvSphere、AWS、Azureに加えてDockerが追加されています。どの環境でも同じようにクラスタを管理できます。

Standalone ClusterをMacのDocker上で作成してもKindでクラスタを作成するのと大差がなくて面白くないので、
ここではDocker上でManagement Cluster / Workload Cluster方式を試します。

Management Clusterを作成する分、リソースを余分に消費しますが、TKGをIaaS上で構築する前にDockerで試したい場合などに有用です。

目次

Tanzu CLIのインストール

まずはTCE用のtanzu CLIをインストールします。TKGとは同梱されているプラグインが異なります。

Mac用のCLIをインストールします。

curl -sL https://github.com/vmware-tanzu/community-edition/releases/download/v0.9.1/tce-darwin-amd64-v0.9.1.tar.gz > ~/Downloads/tce-darwin-amd64-v0.9.1.tar.gz
tar xzvf ~/Downloads/tce-darwin-amd64-v0.9.1.tar.gz
cd tce-darwin-amd64-v0.9.1
./install.sh

バージョンを確認します。

$ tanzu version
version: v0.2.1
buildDate: 2021-09-29
sha: ceaa474

同梱されているプラグインリストは次の通りです。

$ tanzu plugin list
  NAME                LATEST VERSION  DESCRIPTION                                                        REPOSITORY  VERSION  STATUS         
  builder             v0.2.1          Build Tanzu components                                             core-admin  v0.2.1   installed      
  cluster             v0.2.1          Kubernetes cluster operations                                      core        v0.2.1   installed      
  codegen                             Tanzu code generation tool                                         core-admin           not installed  
  conformance         v0.9.0          Run Sonobuoy conformance tests against clusters                    tce         v0.9.1   installed      
  diagnostics         v0.9.0          Cluster diagnostics                                                tce         v0.9.1   installed      
  kubernetes-release  v0.2.1          Kubernetes release operations                                      core        v0.2.1   installed      
  login               v0.2.1          Login to the platform                                              core        v0.2.1   installed      
  management-cluster  v0.2.1          Kubernetes management cluster operations                           core        v0.2.1   installed      
  package             v0.2.1          Tanzu package management                                           core        v0.2.1   installed      
  pinniped-auth       v0.2.1          Pinniped authentication operations (usually not directly invoked)  core        v0.2.1   installed      
  standalone-cluster  v0.9.0          Create clusters without a dedicated management cluster             tce         v0.9.1   installed      
  test                                Test the CLI                                                       core-admin           not installed

REPOSITORY列が tce となっているものはTCEでのみ提供されているプラグインです。

Dockerの準備

ドキュメントは こちら
推奨されているDockerの最低リソースは以下の通りです。

  • 6 GB of RAM
  • 15 GB of local machine disk storage for images
  • 4 CPUs

今回は次の環境にインストールします。

image

必須ではありませんが、Docker上の既存のリソースを削除します。

docker kill $(docker ps -q)
docker system prune -a --volumes -f 

これも必須ではないですが、TCEでクラスタを作成する際に次のイメージのみDockerHubからpullします。
DockerHubのrate limitに引っかかる場合は、事前にこのイメージをpullしておくて余計なエラーに遭わなくて済みます。

docker pull kindest/haproxy:v20210715-a6da3463

Management Clusterの作成

まずはManagement Clusterを作成します。
tanzu management-cluster create --ui でWebブラウザで値を入力しながら作成できますが、Dockerの場合は特にパラメータの入力が不要なので、コマンドラインのみで作成します。

次のコマンドでManagement ClusterをDocker上に作成できます。

export MGMT_CLUSTER_NAME=salmon
tanzu management-cluster create -i docker --name ${MGMT_CLUSTER_NAME} -v 10 --plan dev --ceip-participation=false

完了するまで15分ほどかかりました。

次のコマンドで作成したManagement Clusterを確認できます。

$ tanzu management-cluster get
  NAME    NAMESPACE   STATUS   CONTROLPLANE  WORKERS  KUBERNETES        ROLES       
  salmon  tkg-system  running  1/1           1/1      v1.21.2+vmware.1  management  


Details:

NAME                                                       READY  SEVERITY  REASON  SINCE  MESSAGE
/salmon                                                    True                     19m           
├─ClusterInfrastructure - DockerCluster/salmon             True                     20m           
├─ControlPlane - KubeadmControlPlane/salmon-control-plane  True                     19m           
│ └─Machine/salmon-control-plane-f6mcc                     True                     19m           
└─Workers                                                                                         
  └─MachineDeployment/salmon-md-0                                                                 
    └─Machine/salmon-md-0-6d79b77757-kqssf                 True                     19m           


Providers:

  NAMESPACE                          NAME                   TYPE                    PROVIDERNAME  VERSION  WATCHNAMESPACE  
  capd-system                        infrastructure-docker  InfrastructureProvider  docker        v0.3.23                  
  capi-kubeadm-bootstrap-system      bootstrap-kubeadm      BootstrapProvider       kubeadm       v0.3.23                  
  capi-kubeadm-control-plane-system  control-plane-kubeadm  ControlPlaneProvider    kubeadm       v0.3.23                  
  capi-system                        cluster-api            CoreProvider            cluster-api   v0.3.23  

このManagement Clusterにアクセスするためのkubeconfigは次のコマンドで取得できます。

tanzu management-cluster kubeconfig get ${MGMT_CLUSTER_NAME} --admin
kubectl config use-context ${MGMT_CLUSTER_NAME}-admin@${MGMT_CLUSTER_NAME}

NodeとPodのリストを確認します。

$ kubectl get node -owide
NAME                           STATUS   ROLES                  AGE   VERSION                               INTERNAL-IP   EXTERNAL-IP   OS-IMAGE           KERNEL-VERSION     CONTAINER-RUNTIME
salmon-control-plane-f6mcc     Ready    control-plane,master   29m   v1.21.2+vmware.1-360497810732255795   172.18.0.4    <none>        Ubuntu 20.04 LTS   5.10.47-linuxkit   containerd://1.3.3-14-g449e9269
salmon-md-0-6d79b77757-kqssf   Ready    <none>                 28m   v1.21.2+vmware.1-360497810732255795   172.18.0.5    <none>        Ubuntu 20.04 LTS   5.10.47-linuxkit   containerd://1.3.3-14-g449e9269

$ kubectl get pod -A  
NAMESPACE                           NAME                                                             READY   STATUS    RESTARTS   AGE
capd-system                         capd-controller-manager-5885f59558-mkwnq                         2/2     Running   0          5m39s
capi-kubeadm-bootstrap-system       capi-kubeadm-bootstrap-controller-manager-6494884869-4rcb7       2/2     Running   0          7m1s
capi-kubeadm-control-plane-system   capi-kubeadm-control-plane-controller-manager-857d687b9d-jqcnw   2/2     Running   0          6m19s
capi-system                         capi-controller-manager-778bd4dfb9-s92qs                         2/2     Running   1          7m39s
capi-webhook-system                 capi-controller-manager-9995bdc94-9nwt8                          2/2     Running   0          8m4s
capi-webhook-system                 capi-kubeadm-bootstrap-controller-manager-68845b65f8-ndg2q       2/2     Running   0          7m27s
capi-webhook-system                 capi-kubeadm-control-plane-controller-manager-9847c6747-nnz2n    2/2     Running   0          6m48s
cert-manager                        cert-manager-77f6fb8fd5-r5hpn                                    1/1     Running   1          9m40s
cert-manager                        cert-manager-cainjector-6bd4cff7bb-2s7tb                         1/1     Running   1          9m41s
cert-manager                        cert-manager-webhook-fbfcb9d6c-7gvjp                             1/1     Running   0          9m39s
kube-system                         antrea-agent-2lhnn                                               2/2     Running   0          67s
kube-system                         antrea-agent-tkndc                                               2/2     Running   0          80s
kube-system                         antrea-controller-5d68c8db5-6xnbf                                1/1     Running   0          80s
kube-system                         coredns-8dcb5c56b-2qlpn                                          1/1     Running   0          10m
kube-system                         coredns-8dcb5c56b-9whg8                                          1/1     Running   0          10m
kube-system                         etcd-salmon-control-plane-f6mcc                                  1/1     Running   0          10m
kube-system                         kube-apiserver-salmon-control-plane-f6mcc                        1/1     Running   0          10m
kube-system                         kube-controller-manager-salmon-control-plane-f6mcc               1/1     Running   0          10m
kube-system                         kube-proxy-4r6dg                                                 1/1     Running   0          10m
kube-system                         kube-proxy-tzfxx                                                 1/1     Running   0          10m
kube-system                         kube-scheduler-salmon-control-plane-f6mcc                        1/1     Running   0          10m
kube-system                         metrics-server-774c86899d-r6b8x                                  1/1     Running   0          99s
tkg-system                          kapp-controller-6499b8866-xtcbr                                  1/1     Running   0          8m36s
tkg-system                          tanzu-addons-controller-manager-56754c6985-gn6p5                 1/1     Running   0          2m16s
tkg-system                          tanzu-capabilities-controller-manager-6ff97656b8-87jkh           1/1     Running   0          9m52s
tkr-system                          tkr-controller-manager-6bc455b5d4-xvnxx                          1/1     Running   0          9m1s

Workload Clusterの作成

次にWorkload Clusterを作成します。

次のコマンドでWorkload Clusterを作成できます。

export WORKLOAD_CLUSTER_NAME=ikra
tanzu cluster create ${WORKLOAD_CLUSTER_NAME} -v 10 --plan dev

完了するまで5分ほどかかりました。

次のコマンドで作成したWorkload Clusterを確認できます。

$ tanzu cluster get ikra
  NAME  NAMESPACE  STATUS   CONTROLPLANE  WORKERS  KUBERNETES        ROLES   
  ikra  default    running  1/1           1/1      v1.21.2+vmware.1  <none>  
ℹ  

Details:

NAME                                                     READY  SEVERITY  REASON  SINCE  MESSAGE
/ikra                                                    True                     44m           
├─ClusterInfrastructure - DockerCluster/ikra             True                     45m           
├─ControlPlane - KubeadmControlPlane/ikra-control-plane  True                     44m           
│ └─Machine/ikra-control-plane-xpnf2                     True                     44m           
└─Workers                                                                                       
  └─MachineDeployment/ikra-md-0                                                                 
    └─Machine/ikra-md-0-6b5984c77d-n7d8f                 True                     44m

次のコマンドでクラスタリストを確認できます。

$ tanzu cluster list --include-management-cluster
  NAME    NAMESPACE   STATUS   CONTROLPLANE  WORKERS  KUBERNETES        ROLES       PLAN  
  ikra    default     running  1/1           1/1      v1.21.2+vmware.1  <none>      dev   
  salmon  tkg-system  running  1/1           1/1      v1.21.2+vmware.1  management  dev   

これらのクラスタはManagement Clusterのリソースとして管理されています。machineリソースリストを確認します。

$ kubectl --context ${MGMT_CLUSTER_NAME}-admin@${MGMT_CLUSTER_NAME} get machine -A
NAMESPACE    NAME                           PROVIDERID                                PHASE     VERSION
default      ikra-control-plane-xpnf2       docker:////ikra-control-plane-xpnf2       Running   v1.21.2+vmware.1
default      ikra-md-0-6b5984c77d-n7d8f     docker:////ikra-md-0-6b5984c77d-n7d8f     Running   v1.21.2+vmware.1
tkg-system   salmon-control-plane-f6mcc     docker:////salmon-control-plane-f6mcc     Running   v1.21.2+vmware.1
tkg-system   salmon-md-0-6d79b77757-kqssf   docker:////salmon-md-0-6d79b77757-kqssf   Running   v1.21.2+vmware.1

このWorkload Clusterにアクセスするためのkubeconfigは次のコマンドで取得できます。

tanzu cluster kubeconfig get ${WORKLOAD_CLUSTER_NAME} --admin
kubectl config use-context ${WORKLOAD_CLUSTER_NAME}-admin@${WORKLOAD_CLUSTER_NAME}

NodeとPodのリストを確認します。

$ kubectl get node -owide
NAME                         STATUS   ROLES                  AGE     VERSION                               INTERNAL-IP   EXTERNAL-IP   OS-IMAGE           KERNEL-VERSION     CONTAINER-RUNTIME
ikra-control-plane-xpnf2     Ready    control-plane,master   3m55s   v1.21.2+vmware.1-360497810732255795   172.18.0.6    <none>        Ubuntu 20.04 LTS   5.10.47-linuxkit   containerd://1.3.3-14-g449e9269
ikra-md-0-6b5984c77d-n7d8f   Ready    <none>                 3m20s   v1.21.2+vmware.1-360497810732255795   172.18.0.7    <none>        Ubuntu 20.04 LTS   5.10.47-linuxkit   containerd://1.3.3-14-g449e9269

$ kubectl get pod -A
NAMESPACE     NAME                                                     READY   STATUS    RESTARTS   AGE
kube-system   antrea-agent-dtggt                                       2/2     Running   0          2m38s
kube-system   antrea-agent-qdt9c                                       2/2     Running   0          2m38s
kube-system   antrea-controller-55f7c855b9-6bzxf                       1/1     Running   0          2m38s
kube-system   coredns-8dcb5c56b-cnj6c                                  1/1     Running   0          3m51s
kube-system   coredns-8dcb5c56b-l2l2q                                  1/1     Running   0          3m51s
kube-system   etcd-ikra-control-plane-xpnf2                            1/1     Running   0          3m57s
kube-system   kube-apiserver-ikra-control-plane-xpnf2                  1/1     Running   0          3m57s
kube-system   kube-controller-manager-ikra-control-plane-xpnf2         1/1     Running   0          3m57s
kube-system   kube-proxy-5wlg6                                         1/1     Running   0          3m24s
kube-system   kube-proxy-ctp2r                                         1/1     Running   0          3m51s
kube-system   kube-scheduler-ikra-control-plane-xpnf2                  1/1     Running   0          3m57s
kube-system   metrics-server-58c8689755-pnlk7                          1/1     Running   0          2m43s
tkg-system    kapp-controller-69c645fd79-8hpzp                         1/1     Running   0          3m51s
tkg-system    tanzu-capabilities-controller-manager-6ff97656b8-tgc49   1/1     Running   0          3m51s

ちなみにDocker上には次のようなコンテナが起動しています。nodeごとに1コンテナと、controlplaneに対するロードバランサとしてHA Proxyがクラスタ毎に起動しています。

$ docker ps

CONTAINER ID   IMAGE                                                         COMMAND                  CREATED          STATUS          PORTS                                  NAMES
fca90c507e2e   projects.registry.vmware.com/tkg/kind/node:v1.21.2_vmware.1   "/usr/local/bin/entr…"   4 minutes ago    Up 4 minutes                                           ikra-md-0-6b5984c77d-n7d8f
5f5cdae7258e   projects.registry.vmware.com/tkg/kind/node:v1.21.2_vmware.1   "/usr/local/bin/entr…"   5 minutes ago    Up 5 minutes    45609/tcp, 127.0.0.1:45609->6443/tcp   ikra-control-plane-xpnf2
3f4d786b1253   kindest/haproxy:v20210715-a6da3463                            "haproxy -sf 7 -W -d…"   5 minutes ago    Up 5 minutes    40777/tcp, 0.0.0.0:40777->6443/tcp     ikra-lb
6cfbf47d8c00   projects.registry.vmware.com/tkg/kind/node:v1.21.2_vmware.1   "/usr/local/bin/entr…"   36 minutes ago   Up 36 minutes                                          salmon-md-0-6d79b77757-kqssf
265b2e0c5ca9   projects.registry.vmware.com/tkg/kind/node:v1.21.2_vmware.1   "/usr/local/bin/entr…"   38 minutes ago   Up 37 minutes   40041/tcp, 127.0.0.1:40041->6443/tcp   salmon-control-plane-f6mcc
90b5235ac3b7   kindest/haproxy:v20210715-a6da3463                            "haproxy -sf 7 -W -d…"   38 minutes ago   Up 38 minutes   41679/tcp, 0.0.0.0:41679->6443/tcp     salmon-lb

Packageの確認

TCEやTKGではCarvelの Packaging API を使って機能を追加できます。

初めから利用可能なPackageリストを次のコマンドで確認可能です。

$ tanzu package available list -A
/ Retrieving available packages... 
  NAME                                                DISPLAY-NAME                       SHORT-DESCRIPTION                                                                                                                                                                                       NAMESPACE   
  addons-manager.tanzu.vmware.com                     tanzu-addons-manager               This package provides TKG addons lifecycle management capabilities.                                                                                                                                     tkg-system  
  ako-operator.tanzu.vmware.com                       ako-operator                       NSX Advanced Load Balancer using ako-operator                                                                                                                                                           tkg-system  
  antrea.tanzu.vmware.com                             antrea                             networking and network security solution for containers                                                                                                                                                 tkg-system  
  calico.tanzu.vmware.com                             calico                             Networking and network security solution for containers.                                                                                                                                                tkg-system  
  kapp-controller.tanzu.vmware.com                    kapp-controller                    Kubernetes package manager                                                                                                                                                                              tkg-system  
  load-balancer-and-ingress-service.tanzu.vmware.com  load-balancer-and-ingress-service  Provides L4+L7 load balancing for TKG clusters running on vSphere                                                                                                                                       tkg-system  
  metrics-server.tanzu.vmware.com                     metrics-server                     Metrics Server is a scalable, efficient source of container resource metrics for Kubernetes built-in autoscaling pipelines.                                                                             tkg-system  
  pinniped.tanzu.vmware.com                           pinniped                           Pinniped provides identity services to Kubernetes.                                                                                                                                                      tkg-system  
  vsphere-cpi.tanzu.vmware.com                        vsphere-cpi                        The Cluster API brings declarative, Kubernetes-style APIs to cluster creation, configuration and management. Cluster API Provider for vSphere is a concrete implementation of Cluster API for vSphere.  tkg-system  
  vsphere-csi.tanzu.vmware.com                        vsphere-csi                        vSphere CSI provider                                                                                                                                                                                    tkg-system

このリストは kubectl get package -A でも確認できます。

既にインストールされているPackageリストは次のコマンドで確認できます。

$ tanzu package installed list -A
/ Retrieving installed packages... 
  NAME            PACKAGE-NAME                     PACKAGE-VERSION  STATUS               NAMESPACE   
  antrea          antrea.tanzu.vmware.com                           Reconcile succeeded  tkg-system  
  metrics-server  metrics-server.tanzu.vmware.com                   Reconcile succeeded  tkg-system 

このリストは kubectl get packageinstall -A でも確認できます。

TCEには TCE用のPackage がいくつか用意されています。

TCE用のPackageを利用可能にするために次のようにPackage Repositoryを追加します。

tanzu package repository add tce-repo \
  --url projects.registry.vmware.com/tce/main:0.9.1 \
  --namespace tanzu-package-repo-global

利用可能なPackage Repositoryリストを次のコマンド

$ tanzu package repository list -A
/ Retrieving repositories... 
  NAME        REPOSITORY                                                                  STATUS               DETAILS  NAMESPACE                  
  tce-repo    projects.registry.vmware.com/tce/main:0.9.1                                 Reconciling                   tanzu-package-repo-global  
  tanzu-core  projects.registry.vmware.com/tkg/packages/core/repo:v1.21.2_vmware.1-tkg.1  Reconcile succeeded           tkg-system   

このリストは kubectl get packagerepository -A でも確認できます。STATUS列が Reconcile succeeded になれば、RepositoryのPackage情報が取得できています。

再度、利用可能なPackageリストを確認するとTCE用のPackageが追加されていることがわかります。

$ tanzu package available list -A 
/ Retrieving available packages... 
  NAME                                                DISPLAY-NAME                       SHORT-DESCRIPTION                                                                                                                                                                                       NAMESPACE                  
  cert-manager.community.tanzu.vmware.com             cert-manager                       Certificate management                                                                                                                                                                                  tanzu-package-repo-global  
  contour.community.tanzu.vmware.com                  Contour                            An ingress controller                                                                                                                                                                                   tanzu-package-repo-global  
  external-dns.community.tanzu.vmware.com             external-dns                       This package provides DNS synchronization functionality.                                                                                                                                                tanzu-package-repo-global  
  fluent-bit.community.tanzu.vmware.com               fluent-bit                         Fluent Bit is a fast Log Processor and Forwarder                                                                                                                                                        tanzu-package-repo-global  
  gatekeeper.community.tanzu.vmware.com               gatekeeper                         policy management                                                                                                                                                                                       tanzu-package-repo-global  
  grafana.community.tanzu.vmware.com                  grafana                            Visualization and analytics software                                                                                                                                                                    tanzu-package-repo-global  
  harbor.community.tanzu.vmware.com                   Harbor                             OCI Registry                                                                                                                                                                                            tanzu-package-repo-global  
  knative-serving.community.tanzu.vmware.com          knative-serving                    Knative Serving builds on Kubernetes to support deploying and serving of applications and functions as serverless containers                                                                            tanzu-package-repo-global  
  local-path-storage.community.tanzu.vmware.com       local-path-storage                 This package provides local path node storage and primarily supports RWO AccessMode.                                                                                                                    tanzu-package-repo-global  
  multus-cni.community.tanzu.vmware.com               multus-cni                         This package provides the ability for enabling attaching multiple network interfaces to pods in Kubernetes                                                                                              tanzu-package-repo-global  
  prometheus.community.tanzu.vmware.com               prometheus                         A time series database for your metrics                                                                                                                                                                 tanzu-package-repo-global  
  velero.community.tanzu.vmware.com                   velero                             Disaster recovery capabilities                                                                                                                                                                          tanzu-package-repo-global  
  addons-manager.tanzu.vmware.com                     tanzu-addons-manager               This package provides TKG addons lifecycle management capabilities.                                                                                                                                     tkg-system                 
  ako-operator.tanzu.vmware.com                       ako-operator                       NSX Advanced Load Balancer using ako-operator                                                                                                                                                           tkg-system                 
  antrea.tanzu.vmware.com                             antrea                             networking and network security solution for containers                                                                                                                                                 tkg-system                 
  calico.tanzu.vmware.com                             calico                             Networking and network security solution for containers.                                                                                                                                                tkg-system                 
  kapp-controller.tanzu.vmware.com                    kapp-controller                    Kubernetes package manager                                                                                                                                                                              tkg-system                 
  load-balancer-and-ingress-service.tanzu.vmware.com  load-balancer-and-ingress-service  Provides L4+L7 load balancing for TKG clusters running on vSphere                                                                                                                                       tkg-system                 
  metrics-server.tanzu.vmware.com                     metrics-server                     Metrics Server is a scalable, efficient source of container resource metrics for Kubernetes built-in autoscaling pipelines.                                                                             tkg-system                 
  pinniped.tanzu.vmware.com                           pinniped                           Pinniped provides identity services to Kubernetes.                                                                                                                                                      tkg-system                 
  vsphere-cpi.tanzu.vmware.com                        vsphere-cpi                        The Cluster API brings declarative, Kubernetes-style APIs to cluster creation, configuration and management. Cluster API Provider for vSphere is a concrete implementation of Cluster API for vSphere.  tkg-system                 
  vsphere-csi.tanzu.vmware.com                        vsphere-csi                        vSphere CSI provider                                                                                                                                                                                    tkg-system 

Packageのインストール

試しに、一つPackageをインストールしてみます。次のコマンドで確認できるように、Docker Providerの場合はStorageClassが設定されていません。

$ kubectl get storageclass
No resources found

Docker Provider用に Local Path Storage Packageが用意されているので、これをインストールします。

ここではPackageリソースを管理するnamespaceとして tce-package-install namespaceを作成します。
次のコマンドでLocal Path Storage Packageをインストールします。

kubectl create ns tce-package-install
tanzu package install local-path-storage --package-name local-path-storage.community.tanzu.vmware.com -v 0.0.20 -n tce-package-install

次のコマンドでLocal Path Storage Packageがインストールされたことを確認します。

$ tanzu package installed list -A
/ Retrieving installed packages... 
  NAME                PACKAGE-NAME                                   PACKAGE-VERSION  STATUS               NAMESPACE            
  local-path-storage  local-path-storage.community.tanzu.vmware.com  0.0.20           Reconcile succeeded  tce-package-install  
  antrea              antrea.tanzu.vmware.com                                         Reconcile succeeded  tkg-system           
  metrics-server      metrics-server.tanzu.vmware.com                                 Reconcile succeeded  tkg-system 

Packageでインストールされるソフトウェアは Appリソース によってReconcileされます。
次のコマンドでAppリソースのリストを確認できます。

$ kubectl get app -A
NAMESPACE             NAME                 DESCRIPTION           SINCE-DEPLOY   AGE
tce-package-install   local-path-storage   Reconcile succeeded   3s             100s
tkg-system            antrea               Reconcile succeeded   11s            48m
tkg-system            metrics-server       Reconcile succeeded   5m22s          48m

次のコマンドでAppリソースでどのようなリソースが管理されているかを確認できます。

$ kubectl get app -n tce-package-install local-path-storage -oyaml
apiVersion: kappctrl.k14s.io/v1alpha1
kind: App
metadata:
  creationTimestamp: "2021-10-16T16:33:34Z"
  finalizers:
  - finalizers.kapp-ctrl.k14s.io/delete
  generation: 1
  name: local-path-storage
  namespace: tce-package-install
  ownerReferences:
  - apiVersion: packaging.carvel.dev/v1alpha1
    blockOwnerDeletion: true
    controller: true
    kind: PackageInstall
    name: local-path-storage
    uid: ad2f2ea2-7ba8-411f-ad79-10f87c31e420
  resourceVersion: "5371"
  uid: 149b915b-a9c3-4d53-9b16-a810f942674f
spec:
  deploy:
  - kapp: {}
  fetch:
  - imgpkgBundle:
      image: projects.registry.vmware.com/tce/local-path-storage@sha256:e0db08cc6e83efb1f772ab9714d78900b5634146c266954abc805461a005beb1
  serviceAccountName: local-path-storage-tce-package-install-sa
  template:
  - ytt:
      paths:
      - config/
  - kbld:
      paths:
      - '-'
      - .imgpkg/images.yml
status:
  conditions:
  - status: "True"
    type: ReconcileSucceeded
  consecutiveReconcileSuccesses: 3
  deploy:
    exitCode: 0
    finished: true
    startedAt: "2021-10-16T16:35:11Z"
    stdout: |-
      Target cluster 'https://100.64.0.1:443' (nodes: ikra-control-plane-xpnf2, 1+)
      04:35:11PM: info: Resources: Ignoring group version: schema.GroupVersionResource{Group:"stats.antrea.tanzu.vmware.com", Version:"v1alpha1", Resource:"antreanetworkpolicystats"}
      04:35:11PM: info: Resources: Ignoring group version: schema.GroupVersionResource{Group:"stats.antrea.tanzu.vmware.com", Version:"v1alpha1", Resource:"antreaclusternetworkpolicystats"}
      04:35:11PM: info: Resources: Ignoring group version: schema.GroupVersionResource{Group:"stats.antrea.tanzu.vmware.com", Version:"v1alpha1", Resource:"networkpolicystats"}
      Changes
      Namespace  Name  Kind  Conds.  Age  Op  Op st.  Wait to  Rs  Ri
      Op:      0 create, 0 delete, 0 update, 0 noop
      Wait to: 0 reconcile, 0 delete, 0 noop
      Succeeded
    updatedAt: "2021-10-16T16:35:11Z"
  fetch:
    exitCode: 0
    startedAt: "2021-10-16T16:35:05Z"
    stdout: |
      apiVersion: vendir.k14s.io/v1alpha1
      directories:
      - contents:
        - imgpkgBundle:
            image: projects.registry.vmware.com/tce/local-path-storage@sha256:e0db08cc6e83efb1f772ab9714d78900b5634146c266954abc805461a005beb1
          path: .
        path: "0"
      kind: LockConfig
    updatedAt: "2021-10-16T16:35:11Z"
  friendlyDescription: Reconcile succeeded
  inspect:
    exitCode: 0
    stdout: |-
      Target cluster 'https://100.64.0.1:443' (nodes: ikra-control-plane-xpnf2, 1+)
      04:35:11PM: info: Resources: Ignoring group version: schema.GroupVersionResource{Group:"stats.antrea.tanzu.vmware.com", Version:"v1alpha1", Resource:"antreaclusternetworkpolicystats"}
      04:35:11PM: info: Resources: Ignoring group version: schema.GroupVersionResource{Group:"stats.antrea.tanzu.vmware.com", Version:"v1alpha1", Resource:"networkpolicystats"}
      04:35:11PM: info: Resources: Ignoring group version: schema.GroupVersionResource{Group:"stats.antrea.tanzu.vmware.com", Version:"v1alpha1", Resource:"antreanetworkpolicystats"}
      Resources in app 'local-path-storage-ctrl'
      Namespace                 Name                                     Kind                Owner    Conds.  Rs  Ri  Age
      (cluster)                 local-path                               StorageClass        kapp     -       ok  -   1m
      ^                         local-path-provisioner-bind              ClusterRoleBinding  kapp     -       ok  -   1m
      ^                         local-path-provisioner-role              ClusterRole         kapp     -       ok  -   1m
      ^                         tanzu-local-path-storage                 Namespace           kapp     -       ok  -   1m
      tanzu-local-path-storage  local-path-config                        ConfigMap           kapp     -       ok  -   1m
      ^                         local-path-provisioner                   Deployment          kapp     2/2 t   ok  -   1m
      ^                         local-path-provisioner-6cdfc79dd5        ReplicaSet          cluster  -       ok  -   1m
      ^                         local-path-provisioner-6cdfc79dd5-bbb2k  Pod                 cluster  4/4 t   ok  -   1m
      ^                         local-path-provisioner-service-account   ServiceAccount      kapp     -       ok  -   1m
      Rs: Reconcile state
      Ri: Reconcile information
      9 resources
      Succeeded
    updatedAt: "2021-10-16T16:35:11Z"
  observedGeneration: 1
  template:
    exitCode: 0
    stderr: |
      resolve | final: rancher/local-path-provisioner:v0.0.20 -> projects.registry.vmware.com/tce/local-path-provisioner@sha256:6434e827349036958783c1f81b01838b5d7316c1275a25ba0f76ea7a89455231
    updatedAt: "2021-10-16T16:35:11Z"

上記の例ではマニフェストがimgpkgの bundle形式 で配布されています。
実際のマニフェスト(YAML)は次のコマンドでダウンロードできます。

imgpkg pull -b projects.registry.vmware.com/tce/local-path-storage@sha256:e0db08cc6e83efb1f772ab9714d78900b5634146c266954abc805461a005beb1 -o /tmp/local-path-storage

次のようなファイル群です。

$ find /tmp/local-path-storage 
/tmp/local-path-storage
/tmp/local-path-storage/kbld-config.yaml
/tmp/local-path-storage/.imgpkg
/tmp/local-path-storage/.imgpkg/images.yml
/tmp/local-path-storage/.imgpkg/bundle.yaml
/tmp/local-path-storage/config
/tmp/local-path-storage/config/overlays
/tmp/local-path-storage/config/overlays/overlay-storageclass.yaml
/tmp/local-path-storage/config/overlays/overlay-namespace.yaml
/tmp/local-path-storage/config/values.yaml
/tmp/local-path-storage/config/upstream
/tmp/local-path-storage/config/upstream/local-path-storage.yaml
/tmp/local-path-storage/config/upstream/local-path-storage.yaml/local-path-storage.yaml
/tmp/local-path-storage/vendir.lock.yml
/tmp/local-path-storage/vendir.yml

次のコマンドでlocal-path-provisionerが起動していることがわかります。

$ kubectl get -n tanzu-local-path-storage pod
NAME                                      READY   STATUS    RESTARTS   AGE
local-path-provisioner-6cdfc79dd5-bbb2k   1/1     Running   0          4m19s

また次のコマンドでStorageClassが設定されたこともわかります。

$ kubectl get storageclass                  
NAME                   PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-path (default)   rancher.io/local-path   Delete          WaitForFirstConsumer   false                  4m47s

アプリケーションのデプロイ

Workload Clusterにアプリケーションをデプロイしてみます。
その前に、Docker Providerの場合はデフォルトでType=LoadBalancerなServiceを利用できないので、
MetalLB をインストールします。

MetalLBのインストール

次のコマンドでMetalLBをインストールします。MetalLBのIPレンジはDockerのNetwork(172.18.0.0/16)の中から指定します。

METALLB_START_IP=172.18.0.200
METALLB_END_IP=172.18.0.254

mkdir -p metallb
curl -sL https://raw.githubusercontent.com/metallb/metallb/v0.10.3/manifests/namespace.yaml > metallb/namespace.yaml
curl -sL https://raw.githubusercontent.com/metallb/metallb/v0.10.3/manifests/metallb.yaml > metallb/metallb.yaml
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)" --dry-run=client -o yaml > metallb/secret.yaml

cat > metallb/configmap.yaml << EOF
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - ${METALLB_START_IP}-${METALLB_END_IP}
EOF
kubectl apply -f metallb/namespace.yaml -f metallb/metallb.yaml -f metallb/secret.yaml -f metallb/configmap.yaml

次のコマンドでMetalLBが起動していることを確認します。

$ kubectl get pod -n metallb-system -owide
NAME                         READY   STATUS    RESTARTS   AGE   IP           NODE                         NOMINATED NODE   READINESS GATES
controller-77c44876d-lcwb9   1/1     Running   0          18s   100.96.1.7   ikra-md-0-6b5984c77d-n7d8f   <none>           <none>
speaker-k9jwh                1/1     Running   0          18s   172.18.0.6   ikra-control-plane-xpnf2     <none>           <none>
speaker-kxlxs                1/1     Running   0          18s   172.18.0.7   ikra-md-0-6b5984c77d-n7d8f   <none>           <none>

Load Balancerの動作確認

次にサンプルアプリケーションをデプロイします。

kubectl create deployment demo --image=making/hello-world --dry-run=client -o=yaml > /tmp/deployment.yaml
echo --- >> /tmp/deployment.yaml
kubectl create service loadbalancer demo --tcp=80:8080 --dry-run=client -o=yaml >> /tmp/deployment.yaml
kubectl apply -f /tmp/deployment.yaml

次のコマンドでPodとServiceを確認します。ServiceのExternal IPにMetalLBに設定した範囲内のIPが設定されていることを確認してください。

$ kubectl get pod,svc -l app=demo
NAME                       READY   STATUS    RESTARTS   AGE
pod/demo-cfb66fb57-mmg4s   1/1     Running   0          4s

NAME           TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
service/demo   LoadBalancer   100.71.98.113   172.18.0.200   80:30071/TCP   4s

Macで試した時、DockerのNetwork(172.18.0.0/16)にはホスト側から直接アクセスできませんでした。Linuxでは直接アクセスできました。直接アクセスできないのは不便なので、kwt を使って
k8sクラスタ内へ直接アクセス可能にします。次のコマンドを別のターミナルで実行してください。

sudo -E kwt net start

kwtに関しては こちらの記事 も参照してください。なお、Windowsでは利用できません。
これでServiceのExternal IP(172.18.0.200)にアクセスできるようになります。次のコマンドでアプリケーションにアクセスしてくだbundleさい。

$ curl http://172.18.0.200   
Hello World!

確認が終わったらリソースを削除します。

kubectl delete -f /tmp/deployment.yaml 

Persistent Volumeの動作確認

次にPersistent Volumeを使ったアプリケーションを試します。
次のコマンドでPostgreSQLをインストールします。

cat <<EOF > /tmp/demo-db.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: demo-db
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1G
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-db
spec:
  selector:
    matchLabels:
      app: demo-db
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: demo-db
    spec:
      initContainers:
      - name: remove-lost-found
        image: busybox
        command:          
        - sh
        - -c
        - |
          rm -fr /var/lib/postgresql/data/lost+found
        volumeMounts:
        - name: demo-db
          mountPath: /var/lib/postgresql/data
      containers:
      - image: postgres:11
        name: postgres
        env:
        - name: POSTGRES_INITDB_ARGS
          value: "--encoding=UTF-8 --locale=C"
        - name: POSTGRES_DB
          valueFrom:
            secretKeyRef:
              name: demo-db
              key: postgres-db
        - name: POSTGRES_USER
          valueFrom:
            secretKeyRef:
              name: demo-db
              key: postgres-user
        - name: POSTGRES_PASSWORD
          valueFrom:
            secretKeyRef:
              name: demo-db
              key: postgres-password
        ports:
        - containerPort: 5432
          name: demo-db
        volumeMounts:
        - name: demo-db
          mountPath: /var/lib/postgresql/data
      volumes:
      - name: demo-db
        persistentVolumeClaim:
          claimName: demo-db
---
apiVersion: v1
kind: Service
metadata:
  name: demo-db
spec:
  ports:
  - port: 5432
  selector:
    app: demo-db
---
apiVersion: v1
kind: Secret
metadata:
  name: demo-db 
stringData:
  postgres-user: demo
  postgres-password: demo
  postgres-db: demo
EOF
kubectl apply -f /tmp/demo-db.yaml

次のコマンドを実行し、PostgreSQLが起動していること、PVが作成されていることを確認してください。

$ kubectl get pod,pv,pvc              
NAME                           READY   STATUS    RESTARTS   AGE
pod/demo-db-78c47d5589-4gxdf   1/1     Running   0          35s
pod/kwt-net                    1/1     Running   0          10h

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
persistentvolume/pvc-f48b28ca-363f-44b9-8e76-3086ee38ca1c   1G         RWO            Delete           Bound    default/demo-db   local-path              32s

NAME                            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/demo-db   Bound    pvc-f48b28ca-363f-44b9-8e76-3086ee38ca1c   1G         RWO            local-path     35s

kwtが起動している状態であれば、次のコマンドでPostgreSQLにアクセスできます。

$ PGPASSWORD=demo psql -h demo-db.default.svc.cluster.local -U demo demo

psql (13.4, server 11.13 (Debian 11.13-1.pgdg90+1))
Type "help" for help.

demo=# 

確認が終わったらリソースを削除します。

kubectl delete -f /tmp/demo-db.yaml 

Workload Clusterのスケールアウト

次のコマンドでWorkload Clusterを3台にスケールアウトします。

tanzu cluster scale ikra -w 3

次のコマンドでクラスタの情報を確認します。

$ tanzu cluster get ikra --show-group-members
  NAME  NAMESPACE  STATUS   CONTROLPLANE  WORKERS  KUBERNETES        ROLES   
  ikra  default    running  1/1           3/3      v1.21.2+vmware.1  <none>  
ℹ  

Details:

NAME                                                     READY  SEVERITY  REASON  SINCE  MESSAGE
/ikra                                                    True                     12h           
├─ClusterInfrastructure - DockerCluster/ikra             True                     12h           
├─ControlPlane - KubeadmControlPlane/ikra-control-plane  True                     12h           
│ └─Machine/ikra-control-plane-xpnf2                     True                     12h           
└─Workers                                                                                       
  └─MachineDeployment/ikra-md-0                                                                 
    ├─Machine/ikra-md-0-6b5984c77d-8scgf                 True                     89s           
    ├─Machine/ikra-md-0-6b5984c77d-n7d8f                 True                     12h           
    └─Machine/ikra-md-0-6b5984c77d-sht5z                 True                     88s 

Node一覧を確認します。

$ kubectl get node -o wide   
NAME                         STATUS   ROLES                  AGE   VERSION                               INTERNAL-IP   EXTERNAL-IP   OS-IMAGE           KERNEL-VERSION     CONTAINER-RUNTIME
ikra-control-plane-xpnf2     Ready    control-plane,master   12h   v1.21.2+vmware.1-360497810732255795   172.18.0.6    <none>        Ubuntu 20.04 LTS   5.10.47-linuxkit   containerd://1.3.3-14-g449e9269
ikra-md-0-6b5984c77d-8scgf   Ready    <none>                 29s   v1.21.2+vmware.1-360497810732255795   172.18.0.8    <none>        Ubuntu 20.04 LTS   5.10.47-linuxkit   containerd://1.3.3-14-g449e9269
ikra-md-0-6b5984c77d-n7d8f   Ready    <none>                 12h   v1.21.2+vmware.1-360497810732255795   172.18.0.7    <none>        Ubuntu 20.04 LTS   5.10.47-linuxkit   containerd://1.3.3-14-g449e9269
ikra-md-0-6b5984c77d-sht5z   Ready    <none>                 29s   v1.21.2+vmware.1-360497810732255795   172.18.0.9    <none>        Ubuntu 20.04 LTS   5.10.47-linuxkit   containerd://1.3.3-14-g449e9269

Workload Clusterの削除

検証が終われば、次のコマンドでWorkload Clusterを削除します。

tanzu cluster delete ikra -y

Management Clusterの削除

検証が終われば、次のコマンドでManagement Clusterを削除します。

tanzu management-cluster delete salmon -y

Tanzu Community EditionをDockerで試しました。
同じようにvSphere、AWS、Azureでもクラスタの管理ができます。もちろんIaaS固有のパラメータの設定は必要です。
Cluster APIをベースとしたオープンソースであり、フリーで利用可能なので、是非いろいろ試してみてください。
Tanzu Kubernetes Gridを使っている人も検証用の選択肢が増えて良いのではないでしょうか。

次の記事 ではこの環境にCert Manager, Contour, Prometheus, Grafana Packageをインストールします。

Found a mistake? Update the entry.
Share this article: