
Dit artikel beƫindigt de cyclus van vertaalde notities over OpenWhisk door de auteur . 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 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).
- Installeer de pakketbeheerder
asdf, waarna we automatisch corrigeren~/.bash_profileof 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]
- Voeg de plugins toe
minikubeenkubelet:
$ asdf plugin-add kubectl
$ asdf plugin-add minikube[Deze stap slaan we opnieuw over op Linux. ā opmerking van de vertaler]
- 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/- 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- Schakel het netwerk in Docker in de promiscuous mode:
$ minikube ssh -- sudo ip link set docker0 promisc on- Namespace aanmaken en werknode labelen:
$ kubectl create namespace openwhisk
$ kubectl label nodes --all openwhisk-role=invoker- 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- 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- 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- We configureren wsk voor gebruik:
$ wsk property set --apihost 192.168.99.100:31001
$ wsk property set --auth 23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwPWe controleren:
$ wsk -i list
Entiteiten in de namespace: default
pakketten
actions
triggers
regelsProblemen 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 geweigerdWe 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 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
Bouwen en draaien van OpenWhisk bovenop Knative
- Inhoud ophalen :
$ git clone https://github.com/tektoncd/catalog/
$ cd catalog/openwhisk- 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.yamlWe controleren:
$ kubectl get secret
NAME TYPE DATA AGE
dockerhub-user-pass kubernetes.io/basic-auth 2 21s- We creƫren een account voor het bouwen van omgevingen:
$ kubectl apply -f service-account.yamlWe controleren:
$ kubectl get serviceaccount/openwhisk-runtime-builder
NAME SECRETS AGE
openwhisk-runtime-builder 2 31m- We creƫren een taak voor het bouwen van een afbeelding voor OpenWhisk
$ kubectl apply -f openwhisk.yaml
task.tekton.dev/openwhisk created- 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.yamlToepassen:
$ 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 createdDe 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.comBij 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
Bron: habr.com
