Serverlösa beräkningar baserade på OpenWhisk, del 4

Serverlösa beräkningar baserade på OpenWhisk, del 4

Den här artikeln avslutar cykeln av översatta anteckningar om OpenWhisk av författaren Priti Desai. Idag kommer vi att titta på distributionsprocessen av OpenWhisk ovanpå Kubernetes med korrekta kommandon för att fungera med aktuella versioner av applikationer. Processen för att köra OpenWhisk-funktioner med hjälp av Knative och TektonCD i Kubernetes med Nodejs som körmiljö kommer också att beskrivas.

Distribuera OpenWhisk på Kubernetes

Under några dagar genomförde jag ett experiment med att distribuera OpenWhisk i Kubernetes för att skapa en enkel och snabb plattform för att öva på uppgifter. Eftersom jag är ny på Kubernetes, tror jag att jag spenderade en och en halv dag på en framgångsrik distribution. I detta repository finns mycket tydliga instruktioner för distribution av OpenWhisk i Kubernetes. Här kommer instruktionerna för distribution, gjorda för Mac (jag kommer också att göra allt på Linux, eftersom jag föredrar Linux. — anm. från översättaren).

  1. Installera paketförvaltaren asdf, efter vilket vi automatiskt rättar till ˜/.bash_profile eller dess motsvarighet så här:

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

[På Linux behövs detta steg inte, även om brew finns. — anm. från översättaren]

  1. Lägg till plugins minikube och kubelet:

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

[Återigen hoppar vi över detta steg på Linux. — anm. från översättaren]

  1. Installera minikube och 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

[bestämmer specifika versioner, men jag har testat allt på de senaste tillgängliga versionerna för Linux; jag misstänker att det går bra att använda latest. — anm. från översättaren]

På Linux görs detta steg ungefär så här (allt installeras i ~\/bin, som jag har angivet i PATH, anm. från översättaren):

$ curl -L0 minikube https:\/\/storage.googleapis.com\/minikube\/releases\/latest\/minikube-linux-amd64 && chmod +x minikube && mv minikube ~\/bin\/\n$ 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. Skapa en virtuell maskin med minikube (VirtualBox bör vara installerat i förväg):

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

[Allt fungerar för mig med kommandot minikube start , utan parametrar och med standardvärden. — anm. från översättaren]

$ minikube start
  minikube v1.5.2 på Debian 8.11
  Automatisk valde 'virtualbox' drivrutinen
  Laddar ner VM-startbild ...
    > 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
  Skapar virtualbox VM (CPU:er=2, Minne=4096MB, Disk=20000MB) ...
  Förbereder Kubernetes v1.16.2 på Docker '18.09.9' ...
  Laddar ner kubelet v1.16.2
  Laddar ner kubeadm v1.16.2
  Hämtar bilder ...
  Startar Kubernetes ...  Väntar på: apiserver
  Klar! kubectl är nu konfigurerat för att använda "minikube"

  1. Byter nätverk i Docker till promiscuous läge:

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

  1. Skapar namespace och märker arbetsnoden:

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

  1. Hämtar innehåll från förvaret och överskriver typen för ingress i filen 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. Installerar Helm och genomför distribution med dess hjälp:

$ brew install kubernetes-helm
$ helm init # init Helm Tiller, inte nödvändigt på Helm v3+
$ kubectl get pods -n kube-system # verifiera att tiller-deploy är i körande tillstånd, inte nödvändigt 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 senaste versionerna (v3.0.1 var tillgänglig) kommer det att vara lite annorlunda. — anm. från översättaren]

$ 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. Kontrollerar att allt har startat (STATUS = Running eller Completed):

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

  1. Konfigurerar wsk för att fungera:

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

Kontrollerar:

$ wsk -i list
Enheter i namnrymden: default
paket
actioner
utlösare
regler

Problem och deras lösningar

getsockopt: anslutning vägrade

$ wsk -i list
fel: Kunde inte hämta listan över enheter för namnrymden 'default': Get http://192.168.99.100:31001/api/v1/namespaces/_/actions?limit=0&skip=0: dial tcp 192.168.99.100:31001: getsockopt: anslutning vägrade

Kontrollerar att containrar i namnrymden openwhisk är i status Running, eftersom den ibland kraschar med fel CreateContainerConfigError.

Invoker fortsätter att initieras — Init:1/2

Processen att ladda ner olika körmiljöer kan ta mycket tid. För att påskynda kan man ange en förkortad minimal lista i filen mycluster.yaml:

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

Containern med namnet -install-packages- faller med ett fel

Öka helt enkelt timeoutarna för liveness tester.

Installation av OpenWhisk ovanpå Knative

Priti Desai gjorde installationen ovanpå en cluster i IBM:s moln samt på en vanlig minikube, med hjälp av Knative Build och BuildTemplates. Jag kommer också att installera ovanpå minikube, inspirerad av hur det beskrevs i vår blogg tidigare – med hjälp av de senaste versionerna av programvara. Eftersom Knative Build och BuildTemplates officiellt har utgått, kommer jag att använda den rekommenderade ersättningen i form av Tekton Pipelines. Den fortsatta delen av artikeln är skriven efter att ha läst dokumentationen för Tekton Pipelines, men bygger på Pritis idéer. För att arbeta krävs tillgång till en Docker Registry – jag, precis som den ursprungliga författaren, kommer att använda 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

Serverlösa beräkningar baserade på OpenWhisk, del 4
Byggande och drift av OpenWhisk ovanpå Knative

  1. Vi hämtar innehållet i detta repository:

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

  1. Sätter in data för åtkomst till Registry som miljövariabler och sparar dem i form av en Kubernetes-hemlighet:

$ 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

Kontrollerar:

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

  1. Skapar ett konto för att bygga miljöer:

$ kubectl apply -f service-account.yaml

Kontrollerar:

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

  1. Skapar en uppgift för att bygga imagen för OpenWhisk

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

  1. Startar uppgiften för att bygga imagen (med NodeJS som exempel):

Skapar filen taskrun.yaml med innehållet:

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

Tillämpa aktuella uppgifter för denna fil:

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

Tillämpa:

$ 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

Kontroll av driften innebär att hämta namnet på poden, se dess status. Man kan också titta på loggen för varje steg, till exempel:

$ 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 genomförande kommer vi att ha en bild i Registry som kan distribueras med verktyget kn, avsett för att arbeta med Knative-tjänster, till exempel:

kn service create nodejs-helloworld --image docker.io/${DOCKER_USERNAME}/openwhisk-nodejs-helloworld
Tjänst 'nodejs-helloworld' skapad framgångsrikt i namnområdet 'default'.
Väntar på att tjänsten 'nodejs-helloworld' ska bli redo ... OK

Tjänst-URL:
http://nodejs-helloworld.default.example.com

Om man använder Gloo kan man kontrollera funktionaliteten så här:

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

Andra artiklar i serien

Serverlös databehandling baserad på OpenWhisk, del 1
Serverlös databehandling baserad på OpenWhisk, del 2
Serverlös databehandling baserad på OpenWhisk, del 3
Serverlösa beräkningar baserade på OpenWhisk, del 4

Källa: habr.com

Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster