
Denne artikel afslutter cyklen af oversættelsesnoter om OpenWhisk af forfatteren . 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 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).
- Installerer pakkehåndtereren
asdf, hvorefter vi automatisk retter~/ .bash_profileeller 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]
- Tilføjer plug-ins
minikubeogkubelet:
$ asdf plugin-add kubectl
$ asdf plugin-add minikube[Igen springer vi dette trin over på Linux. — oversætterens bemærkning]
- 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/- 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"- Skifter netværk i Docker til promiscuøs tilstand:
$ minikube ssh -- sudo ip link set docker0 promisc on- Opretter namespace og mærker arbejdsnode:
$ kubectl create namespace openwhisk
$ kubectl label nodes --all openwhisk-role=invoker- 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- 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- 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- Vi konfigurerer wsk til at arbejde:
$ wsk property set --apihost 192.168.99.100:31001
$ wsk property set --auth 23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwPVi tjekker:
$ wsk -i list
Enheder i namespace: default
pakker
actioner
udløsere
reglerProblemer 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ægtetVi 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 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
Bygning og kørsel af OpenWhisk oven på Knative
- Hent indholdet :
$ git clone https://github.com/tektoncd/catalog/
$ cd catalog/openwhisk- 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.yamlVi tjekker:
$ kubectl get secret
NAME TYPE DATA AGE
dockerhub-user-pass kubernetes.io/basic-auth 2 21s- Opret en konto til bygning af miljøer:
$ kubectl apply -f service-account.yamlVi tjekker:
$ kubectl get serviceaccount/openwhisk-runtime-builder
NAME SECRETS AGE
openwhisk-runtime-builder 2 31m- Opret en opgave til at bygge et billede til OpenWhisk
$ kubectl apply -f openwhisk.yaml
task.tekton.dev/openwhisk created- 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.yamlAnvend:
$ 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 createdKontrollen 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.comHvis 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
Kilde: habr.com
