Serverloses Computing mit OpenWhisk, Teil 4

Serverloses Computing mit OpenWhisk, Teil 4

Dieser Artikel beendet die Reihe übersetzter Notizen des Autors zu OpenWhisk Priti Desai. Heute schauen wir uns den Prozess der Bereitstellung von OpenWhisk über Kubernetes mit korrigierten Befehlen an, um mit aktuellen Anwendungsversionen zu arbeiten. Außerdem wird der Prozess der Ausführung von OpenWhisk-Funktionen mit Knative und TektonCD auf Kubernetes unter Verwendung der Nodejs-Laufzeitumgebung behandelt.

Bereitstellung von OpenWhisk auf Kubernetes

Im Laufe einiger Tage experimentierte ich mit der Bereitstellung von OpenWhisk auf Kubernetes, um ein einfaches und schnelles Testgelände zu schaffen. Und da ich neu bei Kubernetes bin, glaube ich, dass eineinhalb Tage für die erfolgreiche Bereitstellung aufgewendet wurden. IN Dies Die Repositorys enthalten sehr klare Anweisungen für die Bereitstellung von OpenWhisk auf Kubernetes. Hier sind die Bereitstellungsanweisungen für Mac (Ich werde auch alles unter Linux machen, weil ich Linux bevorzuge. — ca. Übersetzer).

  1. Installieren des Paketmanagers asdf, danach korrigieren wir automatisch ~/.bash_profile oder sein Äquivalent wie folgt:

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

[Unter Linux ist dieser Schritt nicht erforderlich, obwohl brew verfügbar ist. — ca. Übersetzer]

  1. Plugins hinzufügen minikube и kubelet:

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

[Auch hier können Sie diesen Schritt unter Linux überspringen. — ca. Übersetzer]

  1. Minikube und Kubelet installieren:

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

[Es sind bestimmte Versionen installiert, aber ich habe alles auf die neuesten verfügbaren Versionen für Linux überprüft. Ich vermute, dass Sie die neueste Version sicher installieren können. — ca. Übersetzer]

Unter Linux wird dieser Schritt etwa so durchgeführt (alles wird in ~/bin abgelegt, was in meinem PATH aufgeführt ist, Anmerkung des Übersetzers):

$ 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. Erstellen Sie eine virtuelle Minikube-Maschine (VirtualBox muss vorinstalliert sein):

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

[Bei mir klappt alles mit dem Team minikube start , ohne Parameter und mit Standardwerten. — ca. Übersetzer]

$ 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. Netzwerk in Docker in den Promiscuous-Modus schalten:

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

  1. Erstellen Sie einen Namespace und markieren Sie den Worker-Knoten:

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

  1. Wir rufen den Inhalt des Repositorys ab und überschreiben den Typ für Ingress in der Datei 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. Installieren Sie Helm und stellen Sie es damit bereit:

$ 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

[Unter Linux mit den neuesten Versionen (v3.0.1 war verfügbar) wird es etwas anders sein. — ca. Übersetzer]

$ 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. Wir überprüfen, ob alles gestiegen ist (STATUS = Läuft oder Abgeschlossen):

$ 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. WSK so konfigurieren, dass es funktioniert:

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

Wir prüfen:

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

Probleme und Lösungen

getsockopt: Verbindung abgelehnt

$ 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

Überprüfen, ob sich die Container im Namespace befinden openwhisk im Zustand Running, Weil Manchmal stürzt es mit Fehlern ab CreateContainerConfigError.

Der Aufrufer wird noch initialisiert – Init:1/2

Der Download verschiedener Laufzeitumgebungen kann lange dauern. Um die Arbeit zu beschleunigen, können Sie in der Datei eine verkürzte Mindestliste angeben mycluster.yaml:

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

Behälter mit Namen -Pakete installieren- stürzt mit Fehler ab

Erhöhen Sie einfach die Zeitüberschreitungen für Lebendigkeitstests.

OpenWhisk über Knative installieren

Priti Desai führte die Installation auf einem Cluster in der IBM Cloud sowie auf einem regulären Minikube mithilfe von Knative Build und BuildTemplates durch. Ich werde auch auf Minukube installieren, je nachdem, wie es wurde beschrieben in unserem Blog früher - mit den neuesten Softwareversionen. Da Knative Build und BuildTemplates offiziell veraltet sind, werde ich den empfohlenen Ersatz in Form von Tekton Pipelines verwenden. Der Rest des Artikels wurde nach der Lektüre der Dokumentation zu Tekton Pipelines geschrieben, basiert aber auf den Ideen von Priti. Um zu funktionieren, benötigen Sie Zugriff auf eine Docker-Registrierung – ich werde, wie der ursprüngliche Autor, DockerHub verwenden.

$ 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

Serverloses Computing mit OpenWhisk, Teil 4
Aufbau und Betrieb von OpenWhisk auf Knative

  1. Den Inhalt abrufen dieses Repository:

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

  1. Wir legen die Daten für den Zugriff auf die Registry als Umgebungsvariablen fest und speichern sie als Kubernetes-Geheimnis:

$ 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

Wir prüfen:

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

  1. Erstellen Sie ein Konto für Gebäudeumgebungen:

$ kubectl apply -f service-account.yaml

Wir prüfen:

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

  1. Erstellen Sie eine Aufgabe, um ein Image für OpenWhisk zu erstellen

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

  1. Wir führen die Aufgabe aus, um das Image zu erstellen (am Beispiel von NodeJS):

Erstellen Sie eine taskrun.yaml-Datei mit dem Inhalt:

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

Wir verwenden die aktuellen Daten für diese Datei:

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

Wir bewerben uns:

$ 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

Die Überprüfung der Arbeit besteht darin, den Namen des Pods abzurufen und seinen Status anzuzeigen. Sie können auch das Ausführungsprotokoll jedes Schritts anzeigen, zum Beispiel:

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

Nach der Ausführung verfügen wir über ein Image in der Registry, das mit dem kn-Dienstprogramm bereitgestellt werden kann und für die Zusammenarbeit mit Knative-Diensten konzipiert ist, zum Beispiel:

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

Wenn Sie Gloo verwenden, können Sie die Funktionalität wie folgt überprüfen:

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

Weitere Artikel der Serie

Serverloses Computing mit OpenWhisk, Teil 1
Serverloses Computing mit OpenWhisk, Teil 2
Serverloses Computing mit OpenWhisk, Teil 3
Serverloses Computing mit OpenWhisk, Teil 4

Source: habr.com

Kommentar hinzufügen