
Den här artikeln avslutar cykeln av översatta anteckningar om OpenWhisk av författaren . 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 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).
- Installera paketförvaltaren
asdf, efter vilket vi automatiskt rättar till˜/.bash_profileeller 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]
- Lägg till plugins
minikubeochkubelet:
$ asdf plugin-add kubectl
$ asdf plugin-add minikube[Återigen hoppar vi över detta steg på Linux. — anm. från översättaren]
- 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\/- 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"- Byter nätverk i Docker till promiscuous läge:
$ minikube ssh -- sudo ip link set docker0 promisc on- Skapar namespace och märker arbetsnoden:
$ kubectl create namespace openwhisk
$ kubectl label nodes --all openwhisk-role=invoker- 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- 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- 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- Konfigurerar wsk för att fungera:
$ wsk property set --apihost 192.168.99.100:31001
$ wsk property set --auth 23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwPKontrollerar:
$ wsk -i list
Enheter i namnrymden: default
paket
actioner
utlösare
reglerProblem 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ägradeKontrollerar 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 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
Byggande och drift av OpenWhisk ovanpå Knative
- Vi hämtar innehållet :
$ git clone https://github.com/tektoncd/catalog/
$ cd catalog/openwhisk- 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.yamlKontrollerar:
$ kubectl get secret
NAME TYPE DATA AGE
dockerhub-user-pass kubernetes.io/basic-auth 2 21s- Skapar ett konto för att bygga miljöer:
$ kubectl apply -f service-account.yamlKontrollerar:
$ kubectl get serviceaccount/openwhisk-runtime-builder
NAME SECRETS AGE
openwhisk-runtime-builder 2 31m- Skapar en uppgift för att bygga imagen för OpenWhisk
$ kubectl apply -f openwhisk.yaml
task.tekton.dev/openwhisk created- 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.yamlTillä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 createdKontroll 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.comOm 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
Källa: habr.com
