Llogaritjet pa serverë bazuar në OpenWhisk, pjesa 4

Llogaritjet pa serverë bazuar në OpenWhisk, pjesa 4

Ky artikull përfundon ciklin e shënimeve të përkthyera mbi OpenWhisk nga autori Priti Desai. 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ë këtë 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).

  1. Instalojmë menaxherin e paketave asdf, pas së cilës automatikisht korrigjojmë ~/.bash_profile ose 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]

  1. Shtojmë pluginat minikube dhe kubelet:

$ asdf plugin-add kubectl
$ asdf plugin-add minikube

[Përsëri e kalojmë këtë hap në Linux. — shën. i përkthyesit]

  1. 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/

  1. 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"

  1. Ndryshoni rrjetin në Docker në modalitetin e papërshtatshëm:

$ minikube ssh -- sudo ip link set docker0 promisc on

  1. Krijoni namespace dhe etiketoni nyjën e punës:

$ kubectl create namespace openwhisk
$ kubectl label nodes --all openwhisk-role=invoker

  1. 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

  1. 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

  1. 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

  1. Konfigurojmë wsk për funksionim:

$ wsk property set --apihost 192.168.99.100:31001
$ wsk property set --auth 23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwP

Po kontrollojmë:

$ wsk -i list
Entitetet në hapësirën emërore: default
paketave
actions
triggers
rules

Problemet 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 refuzua

Po 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ë është përshkruar 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

Llogaritjet pa serverë bazuar në OpenWhisk, pjesa 4
Ndërtimi dhe operimi i OpenWhisk mbi Knative

  1. Marrim përmbajtjen e këtij repository:

$ git clone https://github.com/tektoncd/catalog/
$ cd catalog/openwhisk

  1. 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.yaml

Po kontrollojmë:

$ kubectl get secret
EMRI                    LLOJI                                  TË DHËNAT      MOSHË
dockerhub-user-pass     kubernetes.io/basic-auth              2         21s

  1. Krijojmë një llogari për ndërtimin e mjediseve:

$ kubectl apply -f service-account.yaml

Po kontrollojmë:

$ kubectl get serviceaccount/openwhisk-runtime-builder
EMRI                        SEKRETET   MOSHË
openwhisk-runtime-builder   2         31m

  1. Krijojmë një detyrë për ndërtimin e imazhit për OpenWhisk

$ kubectl apply -f openwhisk.yaml
task.tekton.dev/openwhisk created

  1. 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.yaml

Zbatojmë:

$ 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 created

Kontrolli 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.com

Në 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

Llogaritjet pa server me bazë OpenWhisk, pjesa 1
Llogaritjet pa server me bazë OpenWhisk, pjesa 2
Llogaritjet pa server me bazë OpenWhisk, pjesa 3
Llogaritjet pa serverë bazuar në OpenWhisk, pjesa 4

Burimi: habr.com

Blini hostim të besueshëm për faqe interneti me mbrojtje DDoS, serverë VPS VDS 🔥 Blini hostim të besueshëm për faqe interneti me mbrojtje DDoS, serverë VPS VDS - ProHoster