
Acest articol finalizează ciclul notelor traduse despre OpenWhisk de la autor . Astăzi vom examina procesul de desfășurare a OpenWhisk pe Kubernetes cu comenzi corectate pentru a funcționa cu versiunile actuale ale aplicațiilor. De asemenea, va fi descris procesul de lansare a funcțiilor OpenWhisk folosind Knative și TektonCD în Kubernetes, folosind mediul de execuție Nodejs.
Desfășurăm OpenWhisk pe Kubernetes
În câteva zile, am desfășurat un experiment pentru desfășurarea OpenWhisk în Kubernetes pentru a crea un poligon simplu și rapid pentru a exersa sarcini. Deoarece sunt novice în Kubernetes, consider că am petrecut o zi și jumătate pentru desfășurarea reușită. În repository sunt instrucțiuni foarte clare pentru desfășurarea OpenWhisk în Kubernetes. Aici vor fi instrucțiuni de desfășurare realizate pentru Mac (eu voi face totul pe Linux, pentru că prefer Linux. — n.r.
- Instalăm managerul de pachete
asdf, după care corectăm automat~/.bash_profilesau analogul său astfel:
$ brew install asdf
$ [ -s "/usr/local/opt/asdf/asdf.sh" ] && . /usr/local/opt/asdf/asdf.sh
$ source ~/.bash_profile[Pe Linux acest pas nu este necesar, deși brew există. — n.r.]
- Adăugăm pluginuri
minikubeșikubelet:
$ asdf plugin-add kubectl
$ asdf plugin-add minikube[Din nou, sărim peste acest pas pe Linux. — n.r.]
- Instalăm minikube și 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[se instalează versiuni specifice, dar am verificat totul pe ultimele versiuni disponibile pentru Linux; bănuiesc că se poate instala cu încredere ultima versiune. — n.r.]
Pe Linux acest pas se face aproximativ așa (totul se instalează în ~/.bin, care este inclus în PATH-ul meu, n.r.):
$ 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ăm o mașină virtuală minikube (VirtualBox trebuie să fie instalat anterior):
$ minikube start --cpus 2 --memory 4096 --kubernetes-version=v1.9.0 --extra-config=apiserver.Authorization.Mode=RBAC[La mine totul funcționează cu comanda minikube start , fără parametrii și cu valorile implicite. — n.r.]
$ minikube start
minikube v1.5.2 pe Debian 8.11
Driverul 'virtualbox' a fost selectat automat
Descărcare imagine de boot VM ...
> 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
Crearea VM-ului virtualbox (CPUs=2, Memorie=4096MB, Disk=20000MB) ...
Pregătire Kubernetes v1.16.2 pe Docker '18.09.9' ...
Descărcare kubelet v1.16.2
Descărcare kubeadm v1.16.2
Trăgerea imaginilor ...
Lansare Kubernetes ... Așteptare pentru: apiserver
Gata! kubectl este acum configurat să folosească "minikube"- Schimbarea rețelei în Docker în modul promiscuu:
$ minikube ssh -- sudo ip link set docker0 promisc on- Creăm un namespace și marcăm nodul de lucru:
$ kubectl create namespace openwhisk
$ kubectl label nodes --all openwhisk-role=invoker- Obținem conținutul repository-ului și redefinim tipul pentru ingress în fișierul 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- Instalăm Helm și realizăm desfășurarea utilizând acesta:
$ brew install kubernetes-helm
$ helm init # init Helm Tiller, nu este necesar pe Helm v3+
$ kubectl get pods -n kube-system # verificăm că tiller-deploy este în starea de rulare, nu este necesar pe helm v3+
$ kubectl create clusterrolebinding tiller-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default
$ helm install ./openwhisk/helm/ --namespace=openwhisk -f mycluster.yaml[Pe Linux, cu ultimele versiuni (v3.0.1 disponibilă), va fi puțin diferit. — n.r.]
$ 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- Verificăm că totul s-a ridicat (STATUS = Running sau 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- Configurăm wsk pentru a funcționa:
$ wsk property set --apihost 192.168.99.100:31001
$ wsk property set --auth 23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwPVerificăm:
$ wsk -i list
Entities in namespace: default
packages
actions
triggers
rulesProbleme și soluții
getsockopt: conexiune refuzată
$ 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: conexiune refuzatăVerificăm dacă containerele din namespace openwhisk sunt în stare Running, deoarece uneori se prăbușește cu erori CreateContainerConfigError.
Invoker încă se inițializează — Init:1/2
Procesul de descărcare a tuturor medii de execuție poate dura mult timp. Pentru a accelera, puteți specifica o listă minimă scurtată în fișierul mycluster.yaml:
whisk:
runtimes: "runtimes-minimal-travis.json"Containerul cu numele -install-packages- iese cu eroare
Pur și simplu extindeți timpii de așteptare pentru testele de liveness.
Instalarea OpenWhisk peste Knative
Priti Desai a efectuat instalarea peste clusterul din cloud IBM, dar și pe un minikube obișnuit, folosind Knative Build și BuildTemplates. De asemenea, voi instala peste minikube, în baza modului în care în blogul nostru anterior - folosind cele mai recente versiuni de software. Deoarece Knative Build și BuildTemplates au fost oficial declarate învechite, voi utiliza înlocuirea recomandată sub forma Tekton Pipelines. Partea următoare a articolului este scrisă după citirea documentației pentru Tekton Pipelines, dar se bazează pe ideile lui Priti. Pentru a funcționa, este nevoie de acces la un anumit Docker Registry - eu, la fel ca și autorul original, voi folosi 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
Construirea și operarea OpenWhisk pe Knative
- Obținem conținutul :
$ git clone https://github.com/tektoncd/catalog/
$ cd catalog/openwhisk- Setăm datele de acces la Registry ca variabile de mediu și le salvăm sub formă de secret Kubernetes:
$ 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.yamlVerificăm:
$ kubectl get secret
NAME TYPE DATA AGE
dockerhub-user-pass kubernetes.io/basic-auth 2 21s- Creăm un cont pentru construirea mediilor:
$ kubectl apply -f service-account.yamlVerificăm:
$ kubectl get serviceaccount/openwhisk-runtime-builder
NAME SECRETS AGE
openwhisk-runtime-builder 2 31m- Creăm o sarcină pentru construirea imaginii pentru OpenWhisk
$ kubectl apply -f openwhisk.yaml
task.tekton.dev/openwhisk created- Pornim sarcina pentru construirea imaginii (pe exemplul NodeJS):
Creăm un fișier taskrun.yaml cu conținutul:
# 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
---Aplicăm datele actuale pentru acest fișier:
$ sed 's/${DOCKER_USERNAME}/'"$DOCKER_USERNAME"'/' -i taskrun.yamlAplicăm:
$ 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 createdVerificarea funcționării constă în obținerea numelui pod-ului, vizualizarea stării acestuia. De asemenea, se poate verifica jurnalul de execuție pentru fiecare pas, de exemplu:
$ 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"}După execuție, în Registry va apărea o imagine care poate fi desfășurată cu ajutorul utilitarului kn, destinat lucrului cu serviciile Knative, de exemplu:
kn service create nodejs-helloworld --image docker.io\/${DOCKER_USERNAME}\/openwhisk-nodejs-helloworld
Serviciul 'nodejs-helloworld' a fost creat cu succes în spațiul de nume 'default'.
Așteptând ca serviciul 'nodejs-helloworld' să devină disponibil ... OK
URL-ul serviciului:
http:\/\/nodejs-helloworld.default.example.comÎn cazul utilizării Gloo, funcționalitatea poate fi verificată astfel:
$ 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!"}Alte articole din ciclu
Sursa: habr.com
