
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
