Negli ultimi tempi mi sono interessato alle architetture serverless, grazie ad alcuni interessanti post di Michele Sciabarrà su Linkedin. Ho quindi deciso di giocare un po’ con Apache OpenWhisk, che è il software open source alla base ad esempio di IBM Cloud Functions e Nimbella. In questo articolo spiegherò come installarlo su Docker Desktop in locale.
Setup di Docker Desktop/Kubernetes
- Scaricare e installare Docker Desktop per Windows
- Andare nei settings di Docker Desktop e abilitare Kubernetes
- Installare Chocolatey, che è un gestore di pacchetti per Windows:
- Avviare la PowerShell come amministratore (tasto Windows + x e selezionare Windows PowerShell (Admin))
- Eseguire:
Set-ExecutionPolicy AllSigned
- Eseguire:
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
- Installare helm tramite Chocolatey, un gestore di pacchetti per Kubernetes, con il comando
choco install kubernetes-helm
Deploy di Apache OpenWhisk
Ora che abbiamo helm installato, possiamo procedere all’installazione di Openwhisk:
- All’interno di una cartella clonare il repository git con il comando:
git clone https://github.com/apache/openwhisk-deploy-kube.git
- Eseguire il comando sempre dalla PowerShell
kubectl describe nodes
e annotarsi il valore di InternalIP - All’interno della cartella creata in precedenza con il clone del repository creare il file mycluster.yaml, mettendo il valore di InternalIP nel parametro apiHostName:
whisk:
ingress:
type: NodePort
apiHostName: 192.168.65.3
apiHostPort: 31001
nginx:
httpsNodePort: 31001
- Eseguire
kubectl label nodes --all openwhisk-role=invoker
- Creare il namespace openwhisk all’interno di Kubernetes:
openwhisk kubectl create ns openwhisk
- Effettuare il deploy di Openwhisk su Kubernetes:
helm install owdev ./helm/openwhisk -n openwhisk -f mycluster.yaml
- Scaricare il binario della CLI di Openwhisk dalla pagina . Aggiungere l’eseguibile cli.exe alla variabile PATH di Windows.
- Eseguire il comando:
wsk property set --apihost localhost:31001
- Eseguire il comando:
wsk property set --auth 23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwP
Verifica dell’installazione
Il comando di deploy di Openwhisk eseguito poco sopra effettuerà l’installazione di tutti i componenti necessari su Kubernetes in qualche minuto. Una volta terminato il processo, il comando kubectl get all -n openwhisk -o wide
, se non ci sono stati errori, dovrà dare un output di questo tipo:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/owdev-alarmprovider-6f584689bf-j5tgz 1/1 Running 0 43d 10.1.1.13 docker-desktop <none> <none> pod/owdev-apigateway-6d864b779d-lvgs2 1/1 Running 0 43d 10.1.1.20 docker-desktop <none> <none> pod/owdev-controller-0 1/1 Running 0 43d 10.1.1.16 docker-desktop <none> <none> pod/owdev-couchdb-647d5945ff-6kww2 1/1 Running 0 43d 10.1.1.15 docker-desktop <none> <none> pod/owdev-gen-certs-2hdlq 0/1 Completed 0 43d 10.1.0.15 docker-desktop <none> <none> pod/owdev-init-couchdb-jmfp8 0/1 Completed 0 43d 10.1.0.13 docker-desktop <none> <none> pod/owdev-install-packages-rjh9r 0/1 Completed 0 43d 10.1.0.10 docker-desktop <none> <none> pod/owdev-invoker-0 1/1 Running 0 43d 10.1.1.10 docker-desktop <none> <none> pod/owdev-kafka-0 1/1 Running 0 43d 10.1.1.12 docker-desktop <none> <none> pod/owdev-kafkaprovider-795b455d7-rfgds 1/1 Running 0 43d 10.1.1.9 docker-desktop <none> <none> pod/owdev-nginx-85f9fdc44-pvbdm 1/1 Running 0 43d 10.1.1.21 docker-desktop <none> <none> pod/owdev-redis-9bf746976-w5t47 1/1 Running 0 43d 10.1.1.11 docker-desktop <none> <none> pod/owdev-wskadmin 1/1 Running 0 43d 10.1.1.19 docker-desktop <none> <none> pod/owdev-zookeeper-0 1/1 Running 0 43d 10.1.1.14 docker-desktop <none> <none> pod/wskowdev-invoker-00-1-prewarm-nodejs10 1/1 Running 0 6h4m 10.1.1.24 docker-desktop <none> <none> pod/wskowdev-invoker-00-2-prewarm-nodejs10 1/1 Running 0 6h4m 10.1.1.25 docker-desktop <none> <none> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR service/owdev-apigateway ClusterIP 10.99.44.8 <none> 8080/TCP,9000/TCP 43d name=owdev-apigateway service/owdev-controller ClusterIP 10.96.47.134 <none> 8080/TCP 43d name=owdev-controller service/owdev-couchdb ClusterIP 10.96.176.173 <none> 5984/TCP 43d name=owdev-couchdb service/owdev-kafka ClusterIP None <none> 9092/TCP 43d name=owdev-kafka service/owdev-nginx NodePort 10.103.112.186 <none> 80:30302/TCP,443:31001/TCP 43d name=owdev-nginx service/owdev-redis ClusterIP 10.106.4.19 <none> 6379/TCP 43d name=owdev-redis service/owdev-zookeeper ClusterIP None <none> 2181/TCP,2888/TCP,3888/TCP 43d name=owdev-zookeeper NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR deployment.apps/owdev-alarmprovider 1/1 1 1 43d alarmprovider openwhisk/alarmprovider:2.2.0 name=owdev-alarmprovider deployment.apps/owdev-apigateway 1/1 1 1 43d apigateway openwhisk/apigateway:1.0.0 name=owdev-apigateway deployment.apps/owdev-couchdb 1/1 1 1 43d couchdb apache/couchdb:2.3 name=owdev-couchdb deployment.apps/owdev-kafkaprovider 1/1 1 1 43d kafkaprovider openwhisk/kafkaprovider:2.1.0 name=owdev-kafkaprovider deployment.apps/owdev-nginx 1/1 1 1 43d nginx nginx:1.17 name=owdev-nginx deployment.apps/owdev-redis 1/1 1 1 43d redis redis:4.0 name=owdev-redis NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR replicaset.apps/owdev-alarmprovider-6f584689bf 1 1 1 43d alarmprovider openwhisk/alarmprovider:2.2.0 name=owdev-alarmprovider,pod-template-hash=6f584689bf replicaset.apps/owdev-apigateway-6d864b779d 1 1 1 43d apigateway openwhisk/apigateway:1.0.0 name=owdev-apigateway,pod-template-hash=6d864b779d replicaset.apps/owdev-couchdb-647d5945ff 1 1 1 43d couchdb apache/couchdb:2.3 name=owdev-couchdb,pod-template-hash=647d5945ff replicaset.apps/owdev-kafkaprovider-795b455d7 1 1 1 43d kafkaprovider openwhisk/kafkaprovider:2.1.0 name=owdev-kafkaprovider,pod-template-hash=795b455d7 replicaset.apps/owdev-nginx-85f9fdc44 1 1 1 43d nginx nginx:1.17 name=owdev-nginx,pod-template-hash=85f9fdc44 replicaset.apps/owdev-redis-9bf746976 1 1 1 43d redis redis:4.0 name=owdev-redis,pod-template-hash=9bf746976 NAME READY AGE CONTAINERS IMAGES statefulset.apps/owdev-controller 1/1 43d controller openwhisk/controller:71b7d56 statefulset.apps/owdev-invoker 1/1 43d invoker openwhisk/invoker:71b7d56 statefulset.apps/owdev-kafka 1/1 43d kafka wurstmeister/kafka:2.12-2.3.1 statefulset.apps/owdev-zookeeper 1/1 43d zookeeper zookeeper:3.4 NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR job.batch/owdev-gen-certs 1/1 2m8s 43d gen-certs openwhisk/ow-utils:71b7d56 controller-uid=4aeeffc8-836b-4ee4-a55c-17a08fe2bdc7 job.batch/owdev-init-couchdb 1/1 3m2s 43d init-couchdb openwhisk/ow-utils:71b7d56 controller-uid=39e41fbc-715d-44a7-9cc5-d1cb6d83e077 job.batch/owdev-install-packages 1/1 13m 43d install-packages openwhisk/ow-utils:71b7d56 controller-uid=8e3ca341-2d06-497b-a97e-282a6db3d465
Se qualche componente permanesse in uno stato di init o errore, allora vorrebbe dire che Openwhisk non può funzionare correttamente.
Durante la prima installazione avevo riscontrato sul pod del controller lo stato “ImageInspectError”. Ho risolto installando una versione più vecchia di Docker Desktop e ripetendo l’installazione. Qui trovate la issue che avevo aperto su Github.