Elaborazione serverless con OpenWhisk, parte 4

Elaborazione serverless con OpenWhisk, parte 4

Questo articolo conclude la serie di note tradotte su OpenWhisk dall'autore Priti Desai. Oggi esamineremo il processo di distribuzione di OpenWhisk su Kubernetes con i comandi corretti per funzionare con le versioni attuali delle applicazioni. Coprirà inoltre il processo di esecuzione delle funzioni OpenWhisk utilizzando Knative e TektonCD su Kubernetes utilizzando il runtime Nodejs.

Distribuzione di OpenWhisk su Kubernetes

Nel corso di alcuni giorni, ho sperimentato la distribuzione di OpenWhisk su Kubernetes per creare un banco di prova semplice e veloce. E poiché sono nuovo in Kubernetes, credo che sia stato dedicato un giorno e mezzo a una distribuzione di successo. IN Questo I repository contengono istruzioni molto chiare per la distribuzione di OpenWhisk su Kubernetes. Ecco le istruzioni di distribuzione realizzate per Mac (Farò tutto anche su Linux perché preferisco Linux. - ca. traduttore).

  1. Installazione del gestore pacchetti asdf, dopodiché correggiamo automaticamente ~/.bash_profile o il suo equivalente in questo modo:

$ brew install asdf
$ [ -s "/usr/local/opt/asdf/asdf.sh" ] && . /usr/local/opt/asdf/asdf.sh
$ source ~/.bash_profile

[Su Linux questo passaggio non è necessario, sebbene sia disponibile brew. - ca. traduttore]

  1. Aggiunta di plugin minikube и kubelet:

$ asdf plugin-add kubectl
$ asdf plugin-add minikube

[Ancora una volta, salta questo passaggio su Linux. - ca. traduttore]

  1. Installa minikube e kubelet:

$ asdf install kubectl 1.9.0
$ asdf global kubectl 1.9.0
$ asdf install minikube 0.25.2
$ asdf global minikube 0.25.2

[sono installate versioni specifiche, ma ho controllato tutto sulle ultime versioni disponibili per Linux; Sospetto che tu possa tranquillamente installare l'ultima versione. - ca. traduttore]

Su Linux, questo passaggio viene eseguito in questo modo (tutto viene inserito in ~/bin, che è elencato nel mio PERCORSO, nota del traduttore):

$ curl -L0 minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && mv minikube ~/bin/
$ curl -L0 https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl && mv kubectl ~/bin/

  1. Crea una macchina virtuale minikube (VirtualBox deve essere preinstallato):

$ minikube start --cpus 2 --memory 4096 --kubernetes-version=v1.9.0 --extra-config=apiserver.Authorization.Mode=RBAC

[Tutto funziona per me con la squadra minikube start , senza parametri e con valori predefiniti. - ca. traduttore]

$ minikube start
  minikube v1.5.2 on Debian 8.11
  Automatically selected the 'virtualbox' driver
  Downloading VM boot image ...
    > minikube-v1.5.1.iso.sha256: 65 B / 65 B [--------------] 100.00% ? p/s 0s
    > minikube-v1.5.1.iso: 143.76 MiB / 143.76 MiB [-] 100.00% 5.63 MiB p/s 26s
  Creating virtualbox VM (CPUs=2, Memory=4096MB, Disk=20000MB) ...
  Preparing Kubernetes v1.16.2 on Docker '18.09.9' ...
  Downloading kubelet v1.16.2
  Downloading kubeadm v1.16.2
  Pulling images ...
  Launching Kubernetes ...  Waiting for: apiserver
  Done! kubectl is now configured to use "minikube"

  1. Passaggio della rete in Docker alla modalità promiscua:

$ minikube ssh -- sudo ip link set docker0 promisc on

  1. Crea uno spazio dei nomi e contrassegna il nodo di lavoro:

$ kubectl create namespace openwhisk
$ kubectl label nodes --all openwhisk-role=invoker

  1. Otteniamo il contenuto del repository e sovrascriviamo il tipo per l'ingresso nel file mycluster.yaml:

$ git clone https://github.com/apache/incubator-openwhisk-deploy-kube.git
$ cd incubator-openwhisk-deploy-kube/
$ cat << "EOF" > mycluster.yaml
whisk:
    ingress:
        type: NodePort
            api_host_name: 192.168.99.100
            api_host_port: 31001
nginx:
    httpsNodePort: 31001
EOF

  1. Installa Helm e distribuiscilo utilizzandolo:

$ brew install kubernetes-helm
$ helm init # init Helm Tiller, не нужно на Helm v3+
$ kubectl get pods -n kube-system # verify that tiller-deploy is in the running state, не нужно на helm v3+
$ kubectl create clusterrolebinding tiller-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default
$ helm install ./openwhisk/helm/ --namespace=openwhisk -f mycluster.yaml

[Su Linux con le ultime versioni (era disponibile la v3.0.1) sarà leggermente diverso. - ca. traduttore]

$ curl -L0 https://get.helm.sh/helm-v3.0.1-linux-amd64.tar.gz | tar -xzvf - linux-amd64/helm --strip-components=1; sudo mv helm /usr/local/bin
$ kubectl create clusterrolebinding tiller-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default
$ helm install ./openwhisk/helm/ --namespace=openwhisk --generate-name -f mycluster.yaml

  1. Controlliamo che tutto sia salito (STATUS = Running o Completed):

$ kubectl get pods -n openwhisk
NAME                                                              READY   STATUS      RESTARTS   AGE
openwhisk-1576070780-alarmprovider-6868dc694-plvpf                1/1     Running     1          1d5h
openwhisk-1576070780-apigateway-8d56f4979-825hf                   1/1     Running     1          1d5h
openwhisk-1576070780-cloudantprovider-544bb46596-9scph            1/1     Running     1          1d5h
openwhisk-1576070780-controller-0                                 1/1     Running     2          1d5h
openwhisk-1576070780-couchdb-7fd7f6c7cc-42tw6                     1/1     Running     1          1d5h
openwhisk-1576070780-gen-certs-z9nsb                              0/1     Completed   0          1d5h
openwhisk-1576070780-init-couchdb-r2vmt                           0/1     Completed   0          1d5h
openwhisk-1576070780-install-packages-27dtr                       0/1     Completed   0          1d4h
openwhisk-1576070780-invoker-0                                    1/1     Running     1          1d5h
openwhisk-1576070780-kafka-0                                      1/1     Running     1          1d5h
openwhisk-1576070780-kafkaprovider-f8b4cf4fc-7z4gt                1/1     Running     1          1d5h
openwhisk-1576070780-nginx-6dbdbf69bc-5x76n                       1/1     Running     1          1d5h
openwhisk-1576070780-redis-cfd8756f4-hkrt6                        1/1     Running     1          1d5h
openwhisk-1576070780-wskadmin                                     1/1     Running     1          1d5h
openwhisk-1576070780-zookeeper-0                                  1/1     Running     1          1d5h
wskopenwhisk-1576070780-invoker-00-1-prewarm-nodejs10             1/1     Running     0          61s
wskopenwhisk-1576070780-invoker-00-2-prewarm-nodejs10             1/1     Running     0          61s
wskopenwhisk-1576070780-invoker-00-3-whisksystem-invokerhealtht   1/1     Running     0          59s

  1. Configurazione di wsk per funzionare:

$ wsk property set --apihost 192.168.99.100:31001
$ wsk property set --auth 23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwP

Controlliamo:

$ wsk -i list
Entities in namespace: default
packages
actions
triggers
rules

Problemi e soluzioni

getsockopt: connessione rifiutata

$ wsk -i list
error: Unable to obtain the list of entities for namespace 'default': Get http://192.168.99.100:31001/api/v1/namespaces/_/actions?limit=0&skip=0: dial tcp 192.168.99.100:31001: getsockopt: connection refused

Verifica che i contenitori siano nello spazio dei nomi openwhisk nello stato Running, Perché a volte si blocca con errori CreateContainerConfigError.

L'invoker è ancora in fase di inizializzazione: Init:1/2

Il processo di download di vari ambienti runtime può richiedere molto tempo. Per velocizzare le cose, puoi specificare un elenco minimo abbreviato nel file mycluster.yaml:

whisk:
  runtimes: "runtimes-minimal-travis.json"

Contenitore con nome -installa-pacchetti- si blocca in Errore

Aumenta semplicemente i timeout per i test di attività.

Installazione di OpenWhisk su Knative

Priti Desai ha eseguito l'installazione su un cluster nel cloud IBM, nonché su un normale minikube, utilizzando Knative Build e BuildTemplates. Lo installerò anche sopra minukube, in base a come è stato descritto nel nostro blog in precedenza, utilizzando le versioni software più recenti. Poiché Knative Build e BuildTemplates sono stati ufficialmente deprecati, utilizzerò la sostituzione consigliata sotto forma di Tekton Pipelines. Il resto dell'articolo è stato scritto dopo aver letto la documentazione di Tekton Pipelines, ma si basa sulle idee di Priti. Per funzionare, avrai bisogno dell'accesso ad alcuni registri Docker: io, come l'autore originale, utilizzerò DockerHub.

$ curl -L0 https://github.com/solo-io/gloo/releases/download/v1.2.10/glooctl-linux-amd64; chmod +x glooctl-linux-amd64; mv glooctl-linux-amd64 ~/bin
$ glooctl install knative
$ kubectl get pods -n knative-serving
NAME                              READY   STATUS    RESTARTS   AGE
activator-77fc555665-rvrst        1/1     Running   0          2m23s
autoscaler-5c98b7c9b6-x8hh4       1/1     Running   0          2m21s
autoscaler-hpa-5cfd4f6845-w87kq   1/1     Running   0          2m22s
controller-7fd74c8f67-tprm8       1/1     Running   0          2m19s
webhook-74847bb77c-txr2g          1/1     Running   0          2m17s
$ kubectl get pods -n gloo-system
NAME                                      READY   STATUS    RESTARTS   AGE
discovery-859d7fbc9c-8xhvh                1/1     Running   0          51s
gloo-545886d9c6-85mwt                     1/1     Running   0          51s
ingress-67d4996d75-lkkmw                  1/1     Running   0          50s
knative-external-proxy-767dfd656c-wwv2z   1/1     Running   0          50s
knative-internal-proxy-6fdddcc6b5-7vqd8   1/1     Running   0          51s

Elaborazione serverless con OpenWhisk, parte 4
Creazione ed esecuzione di OpenWhisk su Knative

  1. Ottenere i contenuti questo deposito:

$ git clone https://github.com/tektoncd/catalog/
$ cd catalog/openwhisk

  1. Impostiamo i dati per l'accesso al Registro come variabili di ambiente e li salviamo come segreto Kubernetes:

$ export DOCKER_USERNAME=<your docker hub username>
$ export DOCKER_PASSWORD=<your docker hub password>
$ sed -e 's/${DOCKER_USERNAME}/'"$DOCKER_USERNAME"'/' -e 's/${DOCKER_PASSWORD}/'"$DOCKER_PASSWORD"'/' docker-secret.yaml.tmpl > docker-secret.yaml
$ kubectl apply -f docker-secret.yaml

Controlliamo:

$ kubectl get secret
NAME                    TYPE                                  DATA      AGE
dockerhub-user-pass     kubernetes.io/basic-auth              2         21s

  1. Crea un account per costruire ambienti:

$ kubectl apply -f service-account.yaml

Controlliamo:

$ kubectl get serviceaccount/openwhisk-runtime-builder
NAME                        SECRETS   AGE
openwhisk-runtime-builder   2         31m

  1. Crea un'attività per creare un'immagine per OpenWhisk

$ kubectl apply -f openwhisk.yaml
task.tekton.dev/openwhisk created

  1. Eseguiamo l'attività per creare l'immagine (usando NodeJS come esempio):

Crea un file taskrun.yaml con il contenuto:

# Git Pipeline Resource for OpenWhisk NodeJS Runtime
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
    name: openwhisk-nodejs-runtime-git
spec:
    type: git
    params:
        - name: revision
          value: master
        - name: url
          value: https://github.com/apache/openwhisk-runtime-nodejs.git
---

# Image Pipeline Resource for OpenWhisk NodeJS Sample Application
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
    name: openwhisk-nodejs-helloworld-image
spec:
    type: image
    params:
        - name: url
          value: docker.io/${DOCKER_USERNAME}/openwhisk-nodejs-helloworld
---

# Task Run to build NodeJS image with the action source
apiVersion: tekton.dev/v1alpha1
kind: TaskRun
metadata:
    name: openwhisk-nodejs-helloworld
spec:
    serviceAccountName: openwhisk-runtime-builder
    taskRef:
        name: openwhisk
    inputs:
        resources:
            - name: runtime-git
              resourceRef:
                name: openwhisk-nodejs-runtime-git
        params:
            - name: DOCKERFILE
              value: "./runtime-git/core/nodejs10Action/knative/Dockerfile"
            - name: OW_ACTION_NAME
              value: "nodejs-helloworld"
            - name: OW_ACTION_CODE
              value: "function main() {return {payload: 'Hello World!'};}"
            - name: OW_PROJECT_URL
              value: ""
    outputs:
        resources:
            - name: runtime-image
              resourceRef:
                name: openwhisk-nodejs-helloworld-image
---

Applichiamo i dati attuali per questo file:

$ sed 's/${DOCKER_USERNAME}/'"$DOCKER_USERNAME"'/' -i taskrun.yaml

Applichiamo:

$ kubectl apply -f taskrun.yaml
pipelineresource.tekton.dev/openwhisk-nodejs-runtime-git created
pipelineresource.tekton.dev/openwhisk-nodejs-helloworld-image created
taskrun.tekton.dev/openwhisk-nodejs-helloworld created

Il controllo del lavoro consiste nell'ottenere il nome del pod e visualizzarne lo stato. Puoi anche visualizzare il registro di esecuzione di ogni passaggio, ad esempio:

$ kubectl get taskrun
NAME                          SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
openwhisk-nodejs-helloworld   True        Succeeded   5m15s       44s
$ kubectl get pod openwhisk-nodejs-helloworld-pod-4640d3
NAME                                     READY   STATUS      RESTARTS   AGE
openwhisk-nodejs-helloworld-pod-4640d3   0/6     Completed   0          5m20s
$ kubectl logs openwhisk-nodejs-helloworld-pod-4640d3 -c step-git-source-openwhisk-nodejs-runtime-git-r8vhr
{"level":"info","ts":1576532931.5880227,"logger":"fallback-logger","caller":"logging/config.go:69","msg":"Fetch GitHub commit ID from kodata failed: open /var/run/ko/refs/heads/master: no such file or directory"}
{"level":"info","ts":1576532936.538926,"logger":"fallback-logger","caller":"git/git.go:81","msg":"Successfully cloned https://github.com/apache/openwhisk-runtime-nodejs.git @ master in path /workspace/runtime-git"}
{"level":"warn","ts":1576532936.5395331,"logger":"fallback-logger","caller":"git/git.go:128","msg":"Unexpected error: creating symlink: symlink /tekton/home/.ssh /root/.ssh: file exists"}
{"level":"info","ts":1576532936.8202565,"logger":"fallback-logger","caller":"git/git.go:109","msg":"Successfully initialized and updated submodules in path /workspace/runtime-git"}

Dopo l'esecuzione, avremo un'immagine nel registro che può essere distribuita utilizzando l'utilità kn, progettata per funzionare con i servizi Knative, ad esempio:

kn service create nodejs-helloworld --image docker.io/${DOCKER_USERNAME}/openwhisk-nodejs-helloworld
Service 'nodejs-helloworld' successfully created in namespace 'default'.
Waiting for service 'nodejs-helloworld' to become ready ... OK

Service URL:
http://nodejs-helloworld.default.example.com

Se usi Gloo, puoi verificarne la funzionalità in questo modo:

$ curl -H "Host: nodejs-helloworld.default.example.com" -X POST $(glooctl proxy url --name knative-external-proxy)
{"OK":true}
$ curl -H "Host: nodejs-helloworld.default.example.com" -X POST $(glooctl proxy url --name knative-external-proxy)
{"payload":"Hello World!"}

Altri articoli della serie

Elaborazione serverless con OpenWhisk, parte 1
Elaborazione serverless con OpenWhisk, parte 2
Elaborazione serverless con OpenWhisk, parte 3
Elaborazione serverless con OpenWhisk, parte 4

Fonte: habr.com

Aggiungi un commento