Serverless computing op basis van OpenWhisk, deel 4

Serverless computing op basis van OpenWhisk, deel 4

Dit artikel beƫindigt de cyclus van vertaalde notities over OpenWhisk door de auteur Priti Desai. Vandaag bekijken we het proces van het implementeren van OpenWhisk bovenop Kubernetes met gecorrigeerde commando's om compatibel te zijn met de huidige versies van applicaties. Ook wordt het proces beschreven voor het starten van OpenWhisk-functies met behulp van Knative en TektonCD in Kubernetes met behulp van de Nodejs-runtime.

OpenWhisk implementeren op Kubernetes

In een paar dagen heb ik een experiment gedaan met het implementeren van OpenWhisk in Kubernetes om een eenvoudige en snelle testomgeving te creĆ«ren voor het uitvoeren van taken. Aangezien ik een beginner ben in Kubernetes, denk ik dat anderhalve dag is besteed aan een succesvolle implementatie. In deze de repository zijn er zeer duidelijke instructies voor het implementeren van OpenWhisk in Kubernetes. Hier zijn de instructies voor implementatie, gemaakt voor Mac (ik zal ook alles op Linux doen, omdat ik Linux verkies. — opmerking van de vertaler).

  1. Installeer de pakketbeheerder asdf, waarna we automatisch corrigeren ~/.bash_profile of een vergelijkbare configuratie als volgt:

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

[Op Linux is deze stap niet nodig, hoewel brew beschikbaar is. — opmerking van de vertaler]

  1. Voeg de plugins toe minikube en kubelet:

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

[Deze stap slaan we opnieuw over op Linux. — opmerking van de vertaler]

  1. Installeer minikube en 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

[er worden specifieke versies geĆÆnstalleerd, maar ik heb alles getest op de laatste beschikbare versies voor Linux; ik vermoed dat je gerust de laatste versie kunt installeren. — opmerking van de vertaler]

Op Linux wordt deze stap ongeveer als volgt uitgevoerd (alles wordt geĆÆnstalleerd in ~/.bin, dat in mijn PATH is opgenomen, opmerking van de vertaler):

$ 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ëer een virtuele machine minikube (VirtualBox moet vooraf geïnstalleerd zijn):

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

[Bij mij werkt alles met het commando minikube start , zonder parameters en met standaardwaarden. — opmerking van de vertaler]

$ minikube start
  minikube v1.5.2 op Debian 8.11
  Automatisch de 'virtualbox'-driver geselecteerd
  VM opstartafbeelding downloaden ...
    > 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
  Virtualbox VM aanmaken (CPUs=2, Geheugen=4096MB, Schijf=20000MB) ...
  Kubernetes v1.16.2 voorbereiden op Docker '18.09.9' ...
  kubelet v1.16.2 downloaden
  kubeadm v1.16.2 downloaden
  Afbeeldingen ophalen ...
  Kubernetes starten ...  Wachten op: apiserver
  Klaar! kubectl is nu geconfigureerd om "minikube" te gebruiken

  1. Schakel het netwerk in Docker in de promiscuous mode:

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

  1. Namespace aanmaken en werknode labelen:

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

  1. De inhoud van de repository ophalen en het type voor ingress in het bestand mycluster.yaml overschrijven:

$ 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. Installeer Helm en voer de implementatie hiermee uit:

$ brew install kubernetes-helm
$ helm init # init Helm Tiller, niet nodig op Helm v3+
$ kubectl get pods -n kube-system # verifieer dat tiller-deploy actief is, niet nodig op helm v3+
$ kubectl create clusterrolebinding tiller-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default
$ helm install ./openwhisk/helm/ --namespace=openwhisk -f mycluster.yaml

[Op Linux met de laatste versies (de v3.0.1 was beschikbaar) zal het iets anders gaan. — opmerking van de vertaler]

$ 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. Controleer of alles omhoog is (STATUS = Running of 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. We configureren wsk voor gebruik:

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

We controleren:

$ wsk -i list
Entiteiten in de namespace: default
pakketten
actions
triggers
regels

Problemen en hun oplossingen

getsockopt: verbinding geweigerd

$ wsk -i list
fout: Kan de lijst van entiteiten voor namespace 'default' niet verkrijgen: Get http://192.168.99.100:31001/api/v1/namespaces/_/actions?limit=0&skip=0: dial tcp 192.168.99.100:31001: getsockopt: verbinding geweigerd

We controleren of de containers in de namespace openwhisk in status zijn Running, want soms faalt het met fouten CreateContainerConfigError.

Invoker nog aan het initialiseren — Init:1/2

Het proces van het downloaden van allerlei uitvoeringsomgevingen kan veel tijd in beslag nemen. Om het te versnellen, kunt u een verkorte minimale lijst opgeven in het bestand mycluster.yaml:

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

Container met de naam -install-packages- valt uit met een fout

Verhoog gewoon de time-outs voor liveness-tests.

Installatie van OpenWhisk bovenop Knative

Priti Desai heeft de installatie uitgevoerd op een cloudcluster bij IBM, evenals op een standaard minikube, gebruikmakend van Knative Build en BuildTemplates. Ik zal ook installeren bovenop minikube, gebaseerd op hoe dit werd beschreven In onze blog eerder - met gebruik van de nieuwste softwareversies. Aangezien Knative Build en BuildTemplates officieel zijn vervangen, zal ik de aanbevolen vervanging in de vorm van Tekton Pipelines gebruiken. De rest van het artikel is geschreven na het lezen van de documentatie van Tekton Pipelines, maar is gebaseerd op de ideeƫn van Priti. Voor deze toepassing is toegang tot een Docker Registry nodig - net als de oorspronkelijke auteur zal ik DockerHub gebruiken.

$ 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 op basis van OpenWhisk, deel 4
Bouwen en draaien van OpenWhisk bovenop Knative

  1. Inhoud ophalen deze repository:

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

  1. We stellen de toegang gegevens voor de Registry in als omgevingsvariabelen en slaan ze op als Kubernetes geheim:

$ 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

We controleren:

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

  1. We creƫren een account voor het bouwen van omgevingen:

$ kubectl apply -f service-account.yaml

We controleren:

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

  1. We creƫren een taak voor het bouwen van een afbeelding voor OpenWhisk

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

  1. We starten de taak om een afbeelding te bouwen (met NodeJS als voorbeeld):

We creƫren een bestand taskrun.yaml met de inhoud:

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

We passen de actuele gegevens voor dit bestand toe:

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

Toepassen:

$ 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

De functie wordt gecontroleerd door de naam van de pod te verkrijgen, de status ervan te bekijken. U kunt ook de logboeken van elke stap bekijken, bijvoorbeeld:

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

Na afloop hebben we een afbeelding in de Registry die kan worden uitgerold met behulp van de kn-tool, die is ontworpen voor het werken met Knative-services, bijvoorbeeld:

kn service create nodejs-helloworld --image docker.io/${DOCKER_USERNAME}/openwhisk-nodejs-helloworld
Service 'nodejs-helloworld' succesvol aangemaakt in namespace 'default'.
Wachten tot service 'nodejs-helloworld' gereed is ... OK

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

Bij gebruik van Gloo kan de werking als volgt worden gecontroleerd:

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

Andere artikelen in de serie

Serverless computing op basis van OpenWhisk, deel 1
Serverless computing op basis van OpenWhisk, deel 2
Serverless computing op basis van OpenWhisk, deel 3
Serverless computing op basis van OpenWhisk, deel 4

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster