Serverless computing baseret på OpenWhisk, del 4

Serverless computing baseret på OpenWhisk, del 4

Denne artikel afslutter cyklen af oversættelsesnoter om OpenWhisk af forfatteren Priti Desai. I dag vil vi se på processen med at implementere OpenWhisk oven på Kubernetes med rettede kommandoer, der fungerer med opdaterede versioner af applikationer. Der vil også blive beskrevet, hvordan man kører OpenWhisk-funktioner ved hjælp af Knative og TektonCD i Kubernetes med Nodejs runtime-miljø.

Implementering af OpenWhisk på Kubernetes

Over et par dage udførte jeg et eksperiment med at implementere OpenWhisk i Kubernetes for at skabe en simpel og hurtig platform til at øve opgaver. Da jeg er ny i Kubernetes, vil jeg tro, at halvanden dag blev brugt på en vellykket implementering. I denne deponeringen er der meget klare instruktioner til at implementere OpenWhisk i Kubernetes. Her vil være instruktioner til implementering, der er udarbejdet til Mac (jeg vil også gøre alt på Linux, fordi jeg foretrækker Linux. — bemærkning fra oversætteren).

  1. Installerer pakkehåndtereren asdf, hvorefter vi automatisk retter ~/ .bash_profile eller en tilsvarende sådan:

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

[På Linux er dette trin ikke nødvendigt, selvom brew er tilgængeligt. — oversætterens bemærkning]

  1. Tilføjer plug-ins minikube og kubelet:

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

[Igen springer vi dette trin over på Linux. — oversætterens bemærkning]

  1. Installerer minikube og 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

[der installeres specifikke versioner, men jeg har testet alt på de nyeste tilgængelige versioner for Linux; jeg formoder, at man trygt kan installere den nyeste. — oversætterens bemærkning]

På Linux gøres dette trin nogenlunde sådan (alt bliver installeret i ~/.bin, som jeg har angivet i PATH, bemærkning fra oversætteren):

$ 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. Opretter en virtuel maskine i minikube (VirtualBox skal være installeret på forhånd):

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

[Alt fungerer for mig med kommandoen minikube start , uden parametre og med standardværdier. — oversætterens bemærkning]

$ minikube start
  minikube v1.5.2 på Debian 8.11
  Automatisk valgt 'virtualbox' driver
  Downloader 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
  Opretter virtualbox VM (CPUs=2, Hukommelse=4096MB, Disk=20000MB) ...
  Forbereder Kubernetes v1.16.2 på Docker '18.09.9' ...
  Downloader kubelet v1.16.2
  Downloader kubeadm v1.16.2
  Henter billeder ...
  Starter Kubernetes ...  Venter på: apiserver
  Færdig! kubectl er nu konfigureret til at bruge "minikube"

  1. Skifter netværk i Docker til promiscuøs tilstand:

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

  1. Opretter namespace og mærker arbejdsnode:

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

  1. Henter indholdet fra repository og overstyrer typen for ingress i mycluster.yaml-filen:

$ 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. Installerer Helm og udfører deployment med det:

$ brew install kubernetes-helm
$ helm init # init Helm Tiller, ikke nødvendigt på Helm v3+
$ kubectl get pods -n kube-system # verificer at tiller-deploy er i den kørende tilstand, ikke nødvendigt på helm v3+
$ kubectl create clusterrolebinding tiller-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default
$ helm install ./openwhisk/helm/ --namespace=openwhisk -f mycluster.yaml

[På Linux med de nyeste versioner (v3.0.1 var tilgængelig) vil det være lidt anderledes. — oversætterens bemærkning]

$ 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. Vi kontrollerer, at alt er oppe at køre (STATUS = Running eller Completed):

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

  1. Vi konfigurerer wsk til at arbejde:

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

Vi tjekker:

$ wsk -i list
Enheder i namespace: default
pakker
actioner
udløsere
regler

Problemer og deres løsninger

getsockopt: forbindelse nægtet

$ wsk -i list
fejl: Kan ikke opnå listen over enheder 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: forbindelse nægtet

Vi tjekker, at containerne er i namespace openwhisk i status Kørende, da det nogle gange falder med fejl CreateContainerConfigError.

Invoker stadig initializing — Init:1/2

Processen med at downloade forskellige runtime-miljøer kan tage lang tid. For at fremskynde kan du angive en forkortet minimal liste i filen mycluster.yaml:

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

Containeren med navnet -install-packages- fejler med fejl

Forøg blot timeout-indstillingerne for liveness tests.

Installation af OpenWhisk oven på Knative

Priti Desai udførte installationen oven på et cluster i IBM-skyen samt på almindelig minikube, ved brug af Knative Build og BuildTemplates. Jeg vil også installere oven på minikube, inspireret af hvordan det blev beskrevet I vores blog tidligere — ved brug af de nyeste versioner af software. Da Knative Build og BuildTemplates officielt er blevet erklæret forældede, vil jeg bruge den anbefalede erstatning i form af Tekton Pipelines. Den videre del af artiklen er skrevet efter at have læst dokumentationen til Tekton Pipelines, men baseret på idéer fra Priti. For at kunne arbejde skal der være adgang til et Docker Registry — jeg vil, ligesom den oprindelige forfatter, bruge 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

Serverless computing baseret på OpenWhisk, del 4
Bygning og kørsel af OpenWhisk oven på Knative

  1. Hent indholdet af dette repository:

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

  1. Sæt data til adgang til Registry som miljøvariabler og gem dem som en Kubernetes-hemmelighed:

$ 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

Vi tjekker:

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

  1. Opret en konto til bygning af miljøer:

$ kubectl apply -f service-account.yaml

Vi tjekker:

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

  1. Opret en opgave til at bygge et billede til OpenWhisk

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

  1. Kør opgaven for at bygge billedet (med NodeJS som eksempel):

Opret en fil taskrun.yaml med indholdet:

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

Anvend de relevante data til denne fil:

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

Anvend:

$ 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

Kontrollen af systemets funktioner involverer at hente navnet på pod'en, se dens status. Det er også muligt at se loggen for hver trin, for eksempel:

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

Efter gennemførelsen vil vi have et billede i Registry, som kan implementeres ved hjælp af kn-værktøjet, der er beregnet til arbejde med Knative-tjenester, for eksempel:

kn service create nodejs-helloworld --image docker.io\/${DOCKER_USERNAME}\/openwhisk-nodejs-helloworld
Service 'nodejs-helloworld' blev oprettet med succes i navnerummet 'default'.
Venter på, at tjenesten 'nodejs-helloworld' bliver klar ... OK

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

Hvis du bruger Gloo, kan du kontrollere funktionaliteten således:

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

Andre artikler i serien

Serverløse beregninger baseret på OpenWhisk, del 1
Serverløse beregninger baseret på OpenWhisk, del 2
Serverløse beregninger baseret på OpenWhisk, del 3
Serverless computing baseret på OpenWhisk, del 4

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster