Tanzu CE su MAC OS X

Tanzu CE on Mac VMware Tanzu e' una piattaforma Kubernetes completa e semplice da utilizzare. VMware Tanzu Community Edition e' la versione Open Source disponibile anche su Mac OSX: questa paginetta cerca di descrivere questa importante e recente tecnologia su MacOS!

La tecnologia dei container consente di eseguire immagini di applicazioni utilizzando un'interfaccia virtuale al sistema operativo chiamata Container. In questo modo l'applicazione pensa di avere un sistema operativo dedicato ma in realta' sfrutta quello della macchina ospite. Rispetto alla virtualizzazione le immagini sono piu' ridotte in dimensioni e richiedono risorse piu' limitate. Vi sono diversi tecnologie che implementano i container e sicuramente la piu' nota e' Docker che ho gia' descritto su Mac in questa paginetta. Un'applicazione complessa puo' richiedere decine di componenti con legami complessi tra loro. Inoltre puo' essere necessario scalare a seconda delle richieste e fornire una soluzione distribuita in alta affidabilita'. Kubernetes entra in gioco quando si vogliono orchestrare ambienti di questo tipo.

VMware Tanzu e' una piattaforma Kubernetes sviluppata da VMware che oltre ad ospitare cluster K8s su vSphere in modo nativo consente anche di gestire anche cluster su cloud provider esterni.
VMware Tanzu Community Edition e' la versione Open Source, completa, basata sugli stessi codice sorgente e completamente gratuita, che descriveremo in questa paginetta.

Installazione

L'installazione di Tanzu CE su Mac e' particolarmente semplice utilizzando Homebrew:

$ brew install vmware-tanzu/tanzu/tanzu-community-edition
...
==> Downloading https://github.com/vmware-tanzu/community-edition/releases/download/v0.12.1/tce-darwin-amd64-v0.12.1.tar.gz

==> Installing tanzu-community-edition from vmware-tanzu/tanzu
==> Thanks for installing Tanzu Community Edition!
==> The Tanzu CLI has been installed on your system
==> 
==> ******************************************************************************
==> * To initialize all plugins required by Tanzu Community Edition, an additional
==> * step is required. To complete the installation, please run the following
==> * shell script:
==> *
==> * /usr/local/Cellar/tanzu-community-edition/v0.12.1/libexec/configure-tce.sh
==> *
==> ******************************************************************************
==> * To cleanup and remove Tanzu Community Edition from your system, run the
==> * following script:
==> /usr/local/Cellar/tanzu-community-edition/v0.12.1/libexec/uninstall.sh
๐Ÿบ  /usr/local/Cellar/tanzu-community-edition/v0.12.1: 31 files, 1GB, built in 15 seconds
...

Ora basta lanciare lo script indicato...

% /usr/local/Cellar/tanzu-community-edition/v0.12.1/libexec/configure-tce.sh
MY_DIR: /usr/local/Cellar/tanzu-community-edition/v0.12.1/libexec
/Users/myuser/Library/Application Support
Removing old plugin cache from /Users/myuser/.cache/tanzu/catalog.yaml
Checking for required plugins...
Installing plugin 'apps:v0.6.0'
Installing plugin 'builder:v0.11.4'
Installing plugin 'cluster:v0.11.4'
Installing plugin 'codegen:v0.11.4'
Installing plugin 'conformance:v0.12.1'
Installing plugin 'diagnostics:v0.12.1'
Installing plugin 'kubernetes-release:v0.11.4'
Installing plugin 'login:v0.11.4'
Installing plugin 'management-cluster:v0.11.4'
Installing plugin 'package:v0.11.4'
Installing plugin 'pinniped-auth:v0.11.4'
Installing plugin 'secret:v0.11.4'
Installing plugin 'unmanaged-cluster:v0.12.1'
Successfully installed all required plugins
โœ”  successfully initialized CLI 
Making a backup of your Kubernetes config files into /tmp

Gia' fatto!
E' ora possibile utilizzare Tanzu per creare un cluster Kubernetes.

Utilizzo

Per utilizzare Tanzu si utilizza una CLI ovvero un'interfaccia da linea di comando:

$ tanzu Tanzu CLI Usage: tanzu [command] Available command groups: Admin builder Build Tanzu components codegen Tanzu code generation tool Build apps Applications on Kubernetes ...

Nel seguito vedremo le caratteristiche di Tanzu con una serie di esempi di utilizzo.

Deploy Unmanaged Clusters

Come primo esempio iniziamo ad effettuare il deploy di un Unmanaged Clusters. Si tratta del tipo di cluster piu' semplice che utilizza un solo nodo locale ed e' adatto per un ambiente di sviluppo o di test. I suoi requisiti sono minimali ed e' il piu' veloce da installare.

% tanzu unmanaged-cluster create test01
๐Ÿ“ Created cluster directory
๐Ÿงฒ Resolving and checking Tanzu Kubernetes release (TKr) compatibility file
   projects.registry.vmware.com/tce/compatibility
   Compatibility file exists at /Users/myuser/.config/tanzu/tkg/unmanaged/compatibility/projects.registry.vmware.com_tce_compatibility_v9
๐Ÿ”ง Resolving TKr
   projects.registry.vmware.com/tce/tkr:v1.22.7-2
   TKr exists at /Users/myuser/.config/tanzu/tkg/unmanaged/bom/projects.registry.vmware.com_tce_tkr_v1.22.7-2
   Rendered Config: /Users/myuser/.config/tanzu/tkg/unmanaged/test01/config.yaml
   Bootstrap Logs: /Users/myuser/.config/tanzu/tkg/unmanaged/test01/bootstrap.log
๐Ÿ”ง Processing Tanzu Kubernetes Release
๐ŸŽจ Selected base image
   projects.registry.vmware.com/tce/kind:v1.22.7
๐Ÿ“ฆ Selected core package repository
   projects.registry.vmware.com/tce/repo-12:0.12.0
๐Ÿ“ฆ Selected additional package repositories
   projects.registry.vmware.com/tce/main:0.12.0
๐Ÿ“ฆ Selected kapp-controller image bundle
   projects.registry.vmware.com/tce/kapp-controller-multi-pkg:v0.30.1
๐Ÿš€ Creating cluster test01
   Cluster creation using kind!
   โค๏ธ  Checkout this awesome project at https://kind.sigs.k8s.io
   Base image downloaded             
   Cluster created                 
   To troubleshoot, use:

   kubectl ${COMMAND} --kubeconfig /Users/myuser/.config/tanzu/tkg/unmanaged/test01/kube.conf

๐Ÿ“ง Installing kapp-controller
   kapp-controller status: Running                    
๐Ÿ“ง Installing package repositories
   tkg-core-repository package repo status: Reconcile succeeded             
๐ŸŒ Installing CNI
   calico.community.tanzu.vmware.com:3.22.1
โœ… Cluster created
๐ŸŽฎ kubectl context set to test01

View available packages:
   tanzu package available list
View running pods:
   kubectl get po -A
Delete this cluster:
   tanzu unmanaged delete test01

Ora che il cluster e' installato e' possibile controllarne i componenti con:

% tanzu unmanaged-cluster list NAME PROVIDER STATUS test01 kind Running % kubectl get po -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-kube-controllers-7445f5f4d8-jjltv 1/1 Running 0 18h kube-system calico-node-zfw4b 1/1 Running 0 18h ... local-path-storage local-path-provisioner-74567d47b4-pn4m8 1/1 Running 0 18h tkg-system kapp-controller-779d9777dc-8vmgg 1/1 Running 0 18h % kubectl config view --minify apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://127.0.0.1:58859 name: kind-test01 ...

Naturalmente tutto sta girando su Docker:

% docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bb58ed99c46f projects.registry.vmware.com/tce/kind:v1.22.7 "/usr/local/bin/entrโ€ฆ" 19 hours ago Up 19 hours 127.0.0.1:58859->6443/tcp test01-control-plane

Installazione package

Innanzi tutto vediamo quali sono i repository disponibili:

tanzu package repository list tanzu package repository list --all-namespaces

Ora otteniamo l'elenco del pacchetti ed il dettagio delle versioni disponibili:

tanzu package available list tanzu package available list cert-manager.community.tanzu.vmware.com tanzu package available list grafana.community.tanzu.vmware.com

A questo punto possiamo eseguire l'installazione dei package:

tanzu package install cert-manager --package-name cert-manager.community.tanzu.vmware.com --version 1.8.0 tanzu package install grafana --package-name grafana.community.tanzu.vmware.com --version 7.5.11 tanzu package installed list

Deploy Managed Clusters

Un Managed Clusters e' un modello di deploy che prevede 1 cluster di management ed N workload cluster. Il management cluster fornisce l'interfaccia di Tanzu per la gestione, i workload cluster ospitano le applicazioni e vengono eseguiti sul provider scelto (vSphere, AWS, Azure, Docker).

Per avviare la creazione di un Managed Cluster basta il comando:
 tanzu management-cluster create --ui

Sul browser viene presentata la pagina http://127.0.0.1:8080/#/ui che permette la scelta del provider:

Tanzu CE Managed Cluster Installer

Ora la configurazione dipende dal provider scelto che richiede le relative credenziali...
Per il deploy inizialmente viene creato un cluster di boostrap locale Kind/Docker quindi il cluster di management viene migrato sul provider e questi si occupa di creare i workload clusters. Terminata questa fase il cluster di bootstrap locale viene cancellato e tutta la gestione si esegue sul cluster di management con Tanzu.

Un Managed Cluster e' molto piu' complesso di un Unmanaged Cluster che utilizza un solo root container. Anziche' su una sola macchina locale il control plane ed i worker nodes di tutti i cluster possono essere eseguiti su nodi diversi offrendo scalabilita' ed alta affidabilita'. La definizione dell'infrastruttura e' dichiarativa e quindi puo' adattarsi a configurazioni fisiche diverse.
Ad grande potere corrispondono grandi responsabilita'! Un Managed Cluster ospita tipicamente ambienti di produzione con specifici requisiti sulla continuta' operativa e l'alta affidabilita'.

Why Tanzu?

La tecnologia dei container consente un'evoluzione piu' rapida delle applicazioni e permette di distribuire il carico sia on-premises che su piattaforme in Cloud. Ma orientarsi tra le soluzioni disponibili non e' facile...

Cloud Native Computing Foundation trail map

[NdA CNCF Landscape]

VMware Tanzu Inoltre non e' facile mantenere ambienti in cui sono presenti decine di componenti diversi ciascuno in costante evoluzioni.

VMware Tanzu fornisce un ambiente ideale per chi dispone di un'infrastruttura VMware e vuole sfruttarla anche per ospitare applicazioni su container.
Con Tanzu e' possibile gestire ambienti ospitati su vSphere ma anche su AWS ed Azure fornendo per tutti un'interfaccia di gestione comune basata su standard riconosciuti.

Tanzu Mission Control

Tanzu Mission Control

La versione Tanzu CE e' adatta ad ambienti di sviluppo o test e consente a chiunque di avvicinarsi al prodotto ma e' comunque una versione completa con tutti i componenti necessari per gestire i cluster K8s.

Architettura su Mac OSX

In questo capitolo esamineremo gli aspetti piu' tecnici ed architetturali del delployment su MacOS.
Sono tre i componenti da analizzare: Docker, Kubernetes e Tanzu.

Le applicazioni come immagini in un container girano su tutte le piattaforme nello stesso identico modo. Ma Docker ha implementazioni differenti su Linux rispetto a MS-Windows e Mac OSX. Su Mac OSX viene utilizzata una VM su cui a sua volta vengono eseguiti i container.

Kubernetes esegue i workload applicativi allocando i Container nei Pod perche' siano eseguiti sui Nodi. I Nodi possono essere macchine fisiche o virtuali. Ogni nodo e' gestito da un Control Plane che contiene i vari servizi per eseguire i Pod. In un cluster K8s tipicamente sono presenti piu' nodi... ma in questo caso abbiamo un solo nodo che ospita tutto: control plane e workload

Tanzu Community Edition supporta due differenti cluster provider per gli unmanaged clusters: Kind and minikube. Kind (Kubernetes-in-Docker) e' il provider di default e non richiede nulla se non l'installazione di Docker. Minikube e' un provider alternativo che pero' va installato a parte.
Tanzu CE fornisce un una serie di packages gia' integrati. Per un unmanaged cluster questi sono disponibili in automatico L'elenco aggiornato si trova sulla documentazione ufficiale.
Per eseguire i cluster viene utilizzata un'immagine di oltre 1GB: questo richiede un certo tempo per il primo avvio.

Nelle righe successive guarderemo dentro i componenti dell'architettura mentre e' attivo l'Unmanaged Cluster di esempio partendo dal basso, ovvero dai processi di sistema, poi con Docker, quindi con i comandi Kubernetes ed infine con Tanzu.

% pstree Docker_PID -+= 53007 myuser /Applications/Docker.app/Contents/MacOS/Docker |-+= 53008 myuser /Applications/Docker.app/Contents/MacOS/com.docker.backend -watchdog -native-api | |--- 53011 myuser /Applications/Docker.app/Contents/MacOS/com.docker.backend -watchdog -native-api | |-+- 53028 myuser com.docker.vpnkit --ethernet fd:3 --diagnostics fd:4 --pcap fd:5 --vsock-path /Users/myuser/Library/Containers/com.docker.docker/Data | | \--- 53034 myuser (uname) | |--- 53029 myuser docker serve --address unix:///Users/myuser/.docker/run/docker-cli-api.sock | |--- 53030 myuser vpnkit-bridge --disable wsl2-cross-distro-service,wsl2-bootstrap-expose-ports,transfused --addr listen://1999 host | \-+- 53031 myuser com.docker.driver.amd64-linux -addr fd:3 -debug -native-api | |--- 53035 myuser /Applications/Docker.app/Contents/MacOS/com.docker.driver.amd64-linux -addr fd:3 -debug -native-api | \--- 53036 myuser com.docker.hyperkit -A -u -F vms/0/hyperkit.pid -c 4 -m 12288M -s 0:0,hostbridge -s 31,lpc -s 1:0,virtio-vpnkit,path=/Users/myuser/ |--= 53009 myuser /Applications/Docker.app/Contents/MacOS/com.docker.dev-envs -watchdog |--= 53010 myuser /Applications/Docker.app/Contents/MacOS/com.docker.desktop-extensions -address /Users/myuser/Library/Containers/com.docker.docker/Data/ \-+= 53022 myuser /Applications/Docker.app/Contents/MacOS/Docker Desktop.app/Contents/MacOS/Docker Desktop --name=tray |--- 53033 myuser /Applications/Docker.app/Contents/MacOS/Docker Desktop.app/Contents/Frameworks/Docker Desktop Helper (GPU).app/Contents/MacOS/Dock |--- 53046 myuser /Applications/Docker.app/Contents/MacOS/Docker Desktop.app/Contents/Frameworks/Docker Desktop Helper.app/Contents/MacOS/Docker Des \--- 53062 myuser /Applications/Docker.app/Contents/MacOS/Docker Desktop.app/Contents/Frameworks/Docker Desktop Helper (Renderer).app/Contents/MacOS % docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bb58ed99c46f projects.registry.vmware.com/tce/kind:v1.22.7 "/usr/local/bin/entrโ€ฆ" 2 hours ago Up 2 hours 127.0.0.1:58859->6443/tcp test01-control-plane % kubectl get po -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-kube-controllers-7445f5f4d8-jjltv 1/1 Running 0 127m kube-system calico-node-zfw4b 1/1 Running 0 127m kube-system coredns-78fcd69978-fv9kd 1/1 Running 0 128m kube-system coredns-78fcd69978-wf8vf 1/1 Running 0 128m kube-system etcd-test01-control-plane 1/1 Running 0 128m kube-system kube-apiserver-test01-control-plane 1/1 Running 0 128m kube-system kube-controller-manager-test01-control-plane 1/1 Running 0 128m kube-system kube-proxy-fxkwj 1/1 Running 0 128m kube-system kube-scheduler-test01-control-plane 1/1 Running 0 128m local-path-storage local-path-provisioner-74567d47b4-pn4m8 1/1 Running 0 128m tkg-system kapp-controller-779d9777dc-8vmgg 1/1 Running 0 128m % kubectl config view --minify apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://127.0.0.1:58859 name: kind-test01 contexts: - context: cluster: kind-test01 user: kind-test01 name: kind-test01 current-context: kind-test01 kind: Config preferences: {} users: - name: kind-test01 user: client-certificate-data: REDACTED client-key-data: REDACTED % tanzu unmanaged-cluster list NAME PROVIDER STATUS test01 kind Running

Dal punto di vista tecnico Docker su MacOS non gira come su Linux in modo nativo. E' presente una VM che a sua volta contiene i container, questa implementazione genera alcune piccole differenze ma per le immagini ospitate non ci sono problemi.
E' possibile connettersi alla VM con: screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty. In realta' non funziona da un po'... quindi si usa:
  docker run -it --rm --privileged --pid=host justincormack/nsenter1

Se dall'immagine Docker si vuole accedere ad una porta sul Mac si deve utilizzare l'indirizzo host.docker.internal (in realta' vi sono diverse possibilita' di configurazione della rete... ma con l'impostazione a bridge, che e' il default, questo e' il modo piu' facile).

Varie ed eventuali

La documentazione ufficiale di VMware Tanzu Community Edition e' molto completa e curata.

Docker Docker e' stato sviluppato da dotCloud ed e' stato pubblicato come open source nel 2013-03. Dalla versione 0.9 Docker utilizza libcontainer (scritto in Go) al posto di LXC.
L'evoluzione di Docker e' stata notevole e molto veloce, le attuali versioni sono molto piu' robuste ed efficienti delle prime disponibili.

Kubernetes Kubernetes (K8s) e' un sistema open-source di orchestrazione e gestione di container. Nato come progetto interno in Google, e' mantenuto da Cloud Native Computing Foundation dal 2015. I rilasci di Kubernetes sono frequenti; fino alla versione 1.19 il supporto era N-2, quindi e' stato esteso a 14 mesi. La versione piu' recente e' la 1.24.1 [NdA 2022-05].

Con ESXi 7.0, rilasciata il 2020-04, VMware ha fornito il supporto a Kubernetes con Tanzu permettendo di creare cluster Kubernetes su vSphere. Sono disponibili tre Edition di Tanzu con funzionalita' crescenti: Basic, Standard, Advanced.

VMware Tanzu Community Edition e' la versione completamente Open Source di VMware Tanzu disponibile dal 2021-01. Si tratta di una versione completa anche se naturalmente a differenza dell'edizione Enterprise non ha un supporto.
In questa paginetta e' stata utilizzata la versione 0.12.1 rilasciata il 2022-05, ma quanto descritto vale in generale anche per le altre versioni.


Titolo: Tanzu CE su MAC OS X
Livello: Medio (2/5)
Data: 1 Aprile 2022
Versione: 1.0.0 - 1 Aprile 2022 ๐ŸŸ Fools' Day Edition
Autore: mail [AT] meo.bogliolo.name