
Ky artikull përfundon ciklin e shënimeve të përkthyera mbi OpenWhisk nga autori . Sot do të shqyrtojmë procesin e implementimit të OpenWhisk mbi Kubernetes me komandat e përmirësuara për funksionimin me versionet aktuale të aplikacioneve. Po ashtu do të përshkruhet procesi i nisjes së funksioneve OpenWhisk duke përdorur Knative dhe TektonCD në Kubernetes me një mjedis ekzekutimi Nodejs.
Implementojmë OpenWhisk në Kubernetes
Gjatë disa ditëve, kam kryer një eksperiment për të instaluar OpenWhisk në Kubernetes për të krijuar një poligon të thjeshtë dhe të shpejtë për përpunimin e detyrave. Dhe pasi jam fillestare në Kubernetes – mendoj se një ditë e gjysmë u shpenzua për një implementim të suksesshëm. Në repo ka udhëzime shumë të qarta për instalimin e OpenWhisk në Kubernetes. Këtu do të jenë udhëzime për instalimin e bërë për Mac (unë gjithashtu do të bëj gjithçka në Linux, sepse preferoj Linuxin. — shën. i përkthyesit).
- Instalojmë menaxherin e paketave
asdf, pas së cilës automatikisht korrigjojmë~/.bash_profileose ekuivalenti i tij kështu:
$ brew install asdf
$ [ -s "/usr/local/opt/asdf/asdf.sh" ] && . /usr/local/opt/asdf/asdf.sh
$ source ~/.bash_profile[Në Linux ky hap nuk është i nevojshëm, megjithëse brew ekziston. — shën. i përkthyesit]
- Shtojmë pluginat
minikubedhekubelet:
$ asdf plugin-add kubectl
$ asdf plugin-add minikube[Përsëri e kalojmë këtë hap në Linux. — shën. i përkthyesit]
- Instalojmë minikube dhe 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[instalohen versione specifike, por unë i kam kontrolluar të gjitha në versionet më të fundit të disponueshme për Linux; dyshoj se mund të instalohet pa shqetësim versioni latest. — shën. i përkthyesit]
Në Linux ky hap bëhet përafërsisht kështu (të gjitha instalohen në ~/.bin, i cili është i shkruar në PATH tim, shën. i përkthyesit):
$ 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/- Krijojmë një makinë virtuale minikube (duhet të jetë instaluar paraprakisht VirtualBox):
$ minikube start --cpus 2 --memory 4096 --kubernetes-version=v1.9.0 --extra-config=apiserver.Authorization.Mode=RBAC[Të gjitha funksionojnë për mua me komandën minikube start , pa parametra dhe me vlera të paracaktuara. — shën. i përkthyesit]
$ minikube start
minikube v1.5.2 në Debian 8.11
Zgjidhur automatikisht drejtuesin 'virtualbox'
Duke shkarkuar imazhin e nisjes së 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
Duke krijuar VM virtualbox (CPUs=2, Memoria=4096MB, Disku=20000MB) ...
Duke përgatitur Kubernetes v1.16.2 në Docker '18.09.9' ...
Duke shkarkuar kubelet v1.16.2
Duke shkarkuar kubeadm v1.16.2
Duke tërhequr imazhet ...
Duke nisur Kubernetes ... Duke pritur për: apiserver
Përfunduar! kubectl tani është konfiguruar për të përdorur "minikube"- Ndryshoni rrjetin në Docker në modalitetin e papërshtatshëm:
$ minikube ssh -- sudo ip link set docker0 promisc on- Krijoni namespace dhe etiketoni nyjën e punës:
$ kubectl create namespace openwhisk
$ kubectl label nodes --all openwhisk-role=invoker- Merrni përmbajtjen e depozitës dhe ripërcaktoni tipin për ingress në skedarin 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- Instaloni Helm dhe bëni nisjen përmes tij:
$ brew install kubernetes-helm
$ helm init # init Helm Tiller, nuk është e nevojshme në Helm v3+
$ kubectl get pods -n kube-system # verifikoni që tiller-deploy është në gjendje të ekzekutimit, nuk është e nevojshme në helm v3+
$ kubectl create clusterrolebinding tiller-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default
$ helm install ./openwhisk/helm/ --namespace=openwhisk -f mycluster.yaml[Në Linux me versionet e fundit (ishte e disponueshme v3.0.1) do të jetë pak ndryshe. — shën. i përkthyesit]
$ 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- Verifikoni që gjithçka është aktivizuar (STATUS = Running ose 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- Konfigurojmë wsk për funksionim:
$ wsk property set --apihost 192.168.99.100:31001
$ wsk property set --auth 23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwPPo kontrollojmë:
$ wsk -i list
Entitetet në hapësirën emërore: default
paketave
actions
triggers
rulesProblemet dhe zgjidhjet e tyre
getsockopt: lidhja u refuzua
$ wsk -i list
error: Pamundësi për të marrë listën e entiteteve për hapësirën emërore 'default': Get http://192.168.99.100:31001/api/v1/namespaces/_/actions?limit=0&skip=0: dial tcp 192.168.99.100:31001: getsockopt: lidhja u refuzuaPo kontrollojmë, që kontejnerët në hapësirën emërore openwhisk janë në statusin Running, sepse ndonjëherë ai bjerë me gabime CreateContainerConfigError.
Invoker ende duke u inicializuar — Init:1/2
Procesi i shkarkimit të mjediseve të ndryshme ekzekutive mund të zgjasë shumë. Për ta shpejtuar, mund të specifikoni një listë minimale në skedarin mycluster.yaml:
whisk:
runtimes: "runtimes-minimal-travis.json"Kontejneri me emrin -install-packages- po shfaqet në Error
Thjesht rritni kohët e pritjes për testet e liveness.
Instalimi i OpenWhisk mbi Knative
Priti Desai kryente instalimin mbi klasterin në cloud IBM, si dhe në minikube të zakonshëm, duke përdorur Knative Build dhe BuildTemplates. Edhe unë do të instaloj mbi minikube, në frymën e asaj që Në blogun tonë më parë — duke përdorur versionet më të fundit të softuerit. Duke qenë se Knative Build dhe BuildTemplates janë shpallur zyrtarisht të vjetra, do të përdor zëvendësimin e rekomanduar në formë të Tekton Pipelines. Pjesa tjetër e artikullit është shkruar pas leximit të dokumentacionit për Tekton Pipelines, por është e bazuar në idetë e Priti. Për të punuar nevojitet akses në një Docker Registry — unë, ashtu si autori origjinal, do të përdor 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
EMRI GATI STATUS RINISJET MOSHË
activator-77fc555665-rvrst 1/1 Po funksionon 0 2m23s
autoscaler-5c98b7c9b6-x8hh4 1/1 Po funksionon 0 2m21s
autoscaler-hpa-5cfd4f6845-w87kq 1/1 Po funksionon 0 2m22s
controller-7fd74c8f67-tprm8 1/1 Po funksionon 0 2m19s
webhook-74847bb77c-txr2g 1/1 Po funksionon 0 2m17s
$ kubectl get pods -n gloo-system
EMRI GATI STATUS RINISJET MOSHË
discovery-859d7fbc9c-8xhvh 1/1 Po funksionon 0 51s
gloo-545886d9c6-85mwt 1/1 Po funksionon 0 51s
ingress-67d4996d75-lkkmw 1/1 Po funksionon 0 50s
knative-external-proxy-767dfd656c-wwv2z 1/1 Po funksionon 0 50s
knative-internal-proxy-6fdddcc6b5-7vqd8 1/1 Po funksionon 0 51s
Ndërtimi dhe operimi i OpenWhisk mbi Knative
- Marrim përmbajtjen :
$ git clone https://github.com/tektoncd/catalog/
$ cd catalog/openwhisk- Caktojmë si variabla mjedisore të dhënat për aksesin në Registry dhe i ruajmë ato si një sekret 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.yamlPo kontrollojmë:
$ kubectl get secret
EMRI LLOJI TË DHËNAT MOSHË
dockerhub-user-pass kubernetes.io/basic-auth 2 21s- Krijojmë një llogari për ndërtimin e mjediseve:
$ kubectl apply -f service-account.yamlPo kontrollojmë:
$ kubectl get serviceaccount/openwhisk-runtime-builder
EMRI SEKRETET MOSHË
openwhisk-runtime-builder 2 31m- Krijojmë një detyrë për ndërtimin e imazhit për OpenWhisk
$ kubectl apply -f openwhisk.yaml
task.tekton.dev/openwhisk created- Startojmë detyrën për ndërtimin e imazhit (në shembullin e NodeJS):
Krijojmë skedarin taskrun.yaml me përmbajtjen:
# 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
---Zbatojmë të dhënat aktuale për këtë skedar:
$ sed 's/${DOCKER_USERNAME}/'"$DOCKER_USERNAME"'/'' -i taskrun.yamlZbatojmë:
$ 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 createdKontrolli i funksionimit përfshin marrjen e emrit të pod-it, shikimin e statusit të tij. gjithashtu mund të shihni ditarin e ekzekutimit të çdo hapi, për shembull:
$ 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"}Pas pasjes pas te Registry do të kemi një imazh që mund të shpërndahet me ndihmën e utilitarit kn, i cili është i dedikuar për shërbimet Knative, për shembull:
kn service create nodejs-helloworld --image docker.io/${DOCKER_USERNAME}/openwhisk-nodejs-helloworld
Shërbimi 'nodejs-helloworld' u krijua me sukses në hapësirën emërore 'default'.
Duke pritur për shërbimin 'nodejs-helloworld' që të bëhet i gatshëm ... OK
URL e shërbimit:
http://nodejs-helloworld.default.example.comNë rastin e përdorimit të Gloo, mund të kontrollohet funksionaliteti kështu:
$ 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!"}Artikuj të tjerë të ciklit
Burimi: habr.com
