Calculul fără server pe baza OpenWhisk, partea 4

Calculul fără server pe baza OpenWhisk, partea 4

Acest articol finalizează ciclul notelor traduse despre OpenWhisk de la autor Priti Desai. Astăzi vom examina procesul de desfășurare a OpenWhisk pe Kubernetes cu comenzi corectate pentru a funcționa cu versiunile actuale ale aplicațiilor. De asemenea, va fi descris procesul de lansare a funcțiilor OpenWhisk folosind Knative și TektonCD în Kubernetes, folosind mediul de execuție Nodejs.

Desfășurăm OpenWhisk pe Kubernetes

În câteva zile, am desfășurat un experiment pentru desfășurarea OpenWhisk în Kubernetes pentru a crea un poligon simplu și rapid pentru a exersa sarcini. Deoarece sunt novice în Kubernetes, consider că am petrecut o zi și jumătate pentru desfășurarea reușită. În aceasta repository sunt instrucțiuni foarte clare pentru desfășurarea OpenWhisk în Kubernetes. Aici vor fi instrucțiuni de desfășurare realizate pentru Mac (eu voi face totul pe Linux, pentru că prefer Linux. — n.r.

  1. Instalăm managerul de pachete asdf, după care corectăm automat ~/.bash_profile sau analogul său astfel:

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

[Pe Linux acest pas nu este necesar, deși brew există. — n.r.]

  1. Adăugăm pluginuri minikube și kubelet:

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

[Din nou, sărim peste acest pas pe Linux. — n.r.]

  1. Instalăm minikube și 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

[se instalează versiuni specifice, dar am verificat totul pe ultimele versiuni disponibile pentru Linux; bănuiesc că se poate instala cu încredere ultima versiune. — n.r.]

Pe Linux acest pas se face aproximativ așa (totul se instalează în ~/.bin, care este inclus în PATH-ul meu, n.r.):

$ 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. Creăm o mașină virtuală minikube (VirtualBox trebuie să fie instalat anterior):

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

[La mine totul funcționează cu comanda minikube start , fără parametrii și cu valorile implicite. — n.r.]

$ minikube start
  minikube v1.5.2 pe Debian 8.11
  Driverul 'virtualbox' a fost selectat automat
  Descărcare imagine de boot VM ...
    > 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
  Crearea VM-ului virtualbox (CPUs=2, Memorie=4096MB, Disk=20000MB) ...
  Pregătire Kubernetes v1.16.2 pe Docker '18.09.9' ...
  Descărcare kubelet v1.16.2
  Descărcare kubeadm v1.16.2
  Trăgerea imaginilor ...
  Lansare Kubernetes ...  Așteptare pentru: apiserver
  Gata! kubectl este acum configurat să folosească "minikube"

  1. Schimbarea rețelei în Docker în modul promiscuu:

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

  1. Creăm un namespace și marcăm nodul de lucru:

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

  1. Obținem conținutul repository-ului și redefinim tipul pentru ingress în fișierul mycluster.yaml:

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

  1. Instalăm Helm și realizăm desfășurarea utilizând acesta:

$ brew install kubernetes-helm
$ helm init # init Helm Tiller, nu este necesar pe Helm v3+
$ kubectl get pods -n kube-system # verificăm că tiller-deploy este în starea de rulare, nu este necesar pe helm v3+
$ kubectl create clusterrolebinding tiller-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default
$ helm install ./openwhisk/helm/ --namespace=openwhisk -f mycluster.yaml

[Pe Linux, cu ultimele versiuni (v3.0.1 disponibilă), va fi puțin diferit. — n.r.]

$ 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. Verificăm că totul s-a ridicat (STATUS = Running sau 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. Configurăm wsk pentru a funcționa:

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

Verificăm:

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

Probleme și soluții

getsockopt: conexiune refuzată

$ 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: conexiune refuzată

Verificăm dacă containerele din namespace openwhisk sunt în stare Running, deoarece uneori se prăbușește cu erori CreateContainerConfigError.

Invoker încă se inițializează — Init:1/2

Procesul de descărcare a tuturor medii de execuție poate dura mult timp. Pentru a accelera, puteți specifica o listă minimă scurtată în fișierul mycluster.yaml:

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

Containerul cu numele -install-packages- iese cu eroare

Pur și simplu extindeți timpii de așteptare pentru testele de liveness.

Instalarea OpenWhisk peste Knative

Priti Desai a efectuat instalarea peste clusterul din cloud IBM, dar și pe un minikube obișnuit, folosind Knative Build și BuildTemplates. De asemenea, voi instala peste minikube, în baza modului în care a fost descris în blogul nostru anterior - folosind cele mai recente versiuni de software. Deoarece Knative Build și BuildTemplates au fost oficial declarate învechite, voi utiliza înlocuirea recomandată sub forma Tekton Pipelines. Partea următoare a articolului este scrisă după citirea documentației pentru Tekton Pipelines, dar se bazează pe ideile lui Priti. Pentru a funcționa, este nevoie de acces la un anumit Docker Registry - eu, la fel ca și autorul original, voi folosi 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

Calculul fără server pe baza OpenWhisk, partea 4
Construirea și operarea OpenWhisk pe Knative

  1. Obținem conținutul acestui repository:

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

  1. Setăm datele de acces la Registry ca variabile de mediu și le salvăm sub formă de secret Kubernetes:

$ export DOCKER_USERNAME=
$ export DOCKER_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

Verificăm:

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

  1. Creăm un cont pentru construirea mediilor:

$ kubectl apply -f service-account.yaml

Verificăm:

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

  1. Creăm o sarcină pentru construirea imaginii pentru OpenWhisk

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

  1. Pornim sarcina pentru construirea imaginii (pe exemplul NodeJS):

Creăm un fișier taskrun.yaml cu conținutul:

# 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
---

Aplicăm datele actuale pentru acest fișier:

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

Aplicăm:

$ 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

Verificarea funcționării constă în obținerea numelui pod-ului, vizualizarea stării acestuia. De asemenea, se poate verifica jurnalul de execuție pentru fiecare pas, de exemplu:

$ 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"}

După execuție, în Registry va apărea o imagine care poate fi desfășurată cu ajutorul utilitarului kn, destinat lucrului cu serviciile Knative, de exemplu:

kn service create nodejs-helloworld --image docker.io\/${DOCKER_USERNAME}\/openwhisk-nodejs-helloworld
Serviciul 'nodejs-helloworld' a fost creat cu succes în spațiul de nume 'default'.
Așteptând ca serviciul 'nodejs-helloworld' să devină disponibil ... OK

URL-ul serviciului:
http:\/\/nodejs-helloworld.default.example.com

În cazul utilizării Gloo, funcționalitatea poate fi verificată astfel:

$ 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!"}

Alte articole din ciclu

Calcul cu serverless bazat pe OpenWhisk, partea 1
Calcul cu serverless bazat pe OpenWhisk, partea 2
Calcul cu serverless bazat pe OpenWhisk, partea 3
Calculul fără server pe baza OpenWhisk, partea 4

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster