OpenWhisk ilə serversiz hesablama, 4-cü hissə

OpenWhisk ilə serversiz hesablama, 4-cü hissə

Bu məqalə müəllifdən OpenWhisk haqqında tərcümə edilmiş qeydlər seriyasını bitirir Priti Desai. Bu gün biz tətbiqlərin cari versiyaları ilə işləmək üçün düzəldilmiş əmrlərlə OpenWhisk-in Kubernetes üzərindən yerləşdirilməsi prosesinə baxacağıq. O, həmçinin Nodejs iş vaxtından istifadə edərək Kubernetes-də Knative və TektonCD-dən istifadə edərək OpenWhisk funksiyalarının icrası prosesini əhatə edəcək.

OpenWhisk-in Kubernetes-də yerləşdirilməsi

Bir neçə gün ərzində mən sadə və sürətli sınaq meydançası yaratmaq üçün OpenWhisk-i Kubernetes-də yerləşdirməyi sınaqdan keçirdim. Mən Kubernetes-də yeni olduğum üçün inanıram ki, uğurlu yerləşdirməyə bir gün yarım sərf olunub. IN bu Anbarlarda OpenWhisk-i Kubernetes-də yerləşdirmək üçün çox aydın təlimatlar var. Mac üçün hazırlanmış yerləşdirmə təlimatları buradadır (Mən də Linux-da hər şeyi edəcəm, çünki Linux-a üstünlük verirəm. - təqribən. tərcüməçi).

  1. Paket menecerinin quraşdırılması asdf, bundan sonra biz avtomatik düzəliş edirik ~/.bash_profile və ya bunun ekvivalenti:

$ brew install asdf
$ [ -s "/usr/local/opt/asdf/asdf.sh" ] && . /usr/local/opt/asdf/asdf.sh
$ source ~/.bash_profile

[Linux-da bu addım lazım deyil, baxmayaraq ki, dəmləmə mövcuddur. - təqribən. tərcüməçi]

  1. Pluginlərin əlavə edilməsi minikube и kubelet:

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

[Yenə Linux-da bu addımı atlayın. - təqribən. tərcüməçi]

  1. Minikube və kubelet quraşdırın:

$ asdf install kubectl 1.9.0
$ asdf global kubectl 1.9.0
$ asdf install minikube 0.25.2
$ asdf global minikube 0.25.2

[xüsusi versiyalar quraşdırılıb, lakin mən Linux üçün ən son mövcud versiyalarda hər şeyi yoxladım; Sonuncunu etibarlı şəkildə quraşdıra biləcəyinizə şübhə edirəm. - təqribən. tərcüməçi]

Linux-da bu addım belə edilir (hər şey mənim PATH-də, tərcüməçinin qeydində qeyd olunan ~/bin-ə qoyulur):

$ 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. Minikube virtual maşını yaradın (VirtualBox əvvəlcədən quraşdırılmalıdır):

$ minikube start --cpus 2 --memory 4096 --kubernetes-version=v1.9.0 --extra-config=apiserver.Authorization.Mode=RBAC

[Komanda ilə hər şey mənim üçün işləyir minikube start , parametrlərsiz və standart dəyərlərlə. - təqribən. tərcüməçi]

$ minikube start
  minikube v1.5.2 on Debian 8.11
  Automatically selected the 'virtualbox' driver
  Downloading VM boot image ...
    > 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
  Creating virtualbox VM (CPUs=2, Memory=4096MB, Disk=20000MB) ...
  Preparing Kubernetes v1.16.2 on Docker '18.09.9' ...
  Downloading kubelet v1.16.2
  Downloading kubeadm v1.16.2
  Pulling images ...
  Launching Kubernetes ...  Waiting for: apiserver
  Done! kubectl is now configured to use "minikube"

  1. Docker-də şəbəkənin qeyri-adi rejimə keçirilməsi:

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

  1. Ad sahəsi yaradın və işçi qovşağını qeyd edin:

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

  1. Biz deponun məzmununu əldə edirik və mycluster.yaml faylına daxil olmaq üçün növü ləğv edirik:

$ git clone https://github.com/apache/incubator-openwhisk-deploy-kube.git
$ cd incubator-openwhisk-deploy-kube/
$ cat << "EOF" > mycluster.yaml
whisk:
    ingress:
        type: NodePort
            api_host_name: 192.168.99.100
            api_host_port: 31001
nginx:
    httpsNodePort: 31001
EOF

  1. Helm-i quraşdırın və ondan istifadə edərək yerləşdirin:

$ brew install kubernetes-helm
$ helm init # init Helm Tiller, не нужно на Helm v3+
$ kubectl get pods -n kube-system # verify that tiller-deploy is in the running state, не нужно на 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 son versiyaları olan Linux-da (v3.0.1 mövcud idi) bir az fərqli olacaq. - təqribən. tərcüməçi]

$ 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. Hər şeyin yüksəldiyini yoxlayırıq (STATUS = Çalışır və ya Tamamlandı):

$ 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. wsk-nin işləməsi üçün konfiqurasiya:

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

Yoxlayırıq:

$ wsk -i list
Entities in namespace: default
packages
actions
triggers
rules

Problemlər və Həll Yolları

getsockopt: əlaqə rədd edildi

$ 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: connection refused

Konteynerlərin ad məkanında olması yoxlanılır openwhisk statusunda Running, çünki bəzən səhvlərlə çökür CreateContainerConfigError.

Invoker hələ də işə salınır - Başlanğıc: 1/2

Müxtəlif iş vaxtı mühitlərinin endirilməsi prosesi uzun müddət çəkə bilər. İşləri sürətləndirmək üçün faylda qısaldılmış minimum siyahı təyin edə bilərsiniz mycluster.yaml:

whisk:
  runtimes: "runtimes-minimal-travis.json"

Adı olan konteyner -quraşdırma paketləri- Xəta ilə çökür

Sadəcə canlılıq testləri üçün fasilələri artırın.

Knative üzərində OpenWhisk quraşdırılması

Priti Desai quraşdırmanı Knative Build və BuildTemplates proqramlarından istifadə edərək IBM buludunda, eləcə də adi minikube-də klasterin üstündə həyata keçirib. Mən də minukubenin üstünə quraşdıracağam, necə olduğuna görə təsvir edilmişdir əvvəllər bloqumuzda - ən son proqram versiyalarından istifadə etməklə. Knative Build və BuildTemplates rəsmi olaraq köhnəldiyi üçün, Təkton Boru Kəmərləri şəklində tövsiyə olunan əvəzetmədən istifadə edəcəyəm. Məqalənin qalan hissəsi Tekton Pipelines üçün sənədləri oxuduqdan sonra yazılmışdır, lakin Pritinin ideyalarına əsaslanır. İşləmək üçün sizə bəzi Docker Registry-ə daxil olmaq lazımdır - mən də orijinal müəllif kimi DockerHub-dan istifadə edəcəyəm.

$ 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

OpenWhisk ilə serversiz hesablama, 4-cü hissə
Knative üzərində OpenWhisk qurun və işlədin

  1. Məzmunu əldə etmək bu depo:

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

  1. Reyestrə daxil olmaq üçün məlumatları mühit dəyişənləri kimi təyin edirik və onları Kubernetes sirri kimi saxlayırıq:

$ export DOCKER_USERNAME=<your docker hub username>
$ export DOCKER_PASSWORD=<your docker hub 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

Yoxlayırıq:

$ kubectl get secret
NAME                    TYPE                                  DATA      AGE
dockerhub-user-pass     kubernetes.io/basic-auth              2         21s

  1. Bina mühitləri üçün hesab yaradın:

$ kubectl apply -f service-account.yaml

Yoxlayırıq:

$ kubectl get serviceaccount/openwhisk-runtime-builder
NAME                        SECRETS   AGE
openwhisk-runtime-builder   2         31m

  1. OpenWhisk üçün şəkil yaratmaq üçün tapşırıq yaradın

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

  1. Şəkil yaratmaq tapşırığını yerinə yetiririk (nümunə olaraq NodeJS istifadə edərək):

Tərkibi olan taskrun.yaml faylı yaradın:

# 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
---

Bu fayl üçün cari məlumatları tətbiq edirik:

$ sed 's/${DOCKER_USERNAME}/'"$DOCKER_USERNAME"'/' -i taskrun.yaml

Biz müraciət edirik:

$ 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

İşin yoxlanılması podun adını almaq və onun statusuna baxmaqdan ibarətdir. Siz həmçinin hər bir addımın icra jurnalına baxa bilərsiniz, məsələn:

$ 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"}

İcra etdikdən sonra, Reyestrdə Knative xidmətləri ilə işləmək üçün nəzərdə tutulmuş kn yardım proqramından istifadə edərək yerləşdirilə bilən bir şəkilimiz olacaq, məsələn:

kn service create nodejs-helloworld --image docker.io/${DOCKER_USERNAME}/openwhisk-nodejs-helloworld
Service 'nodejs-helloworld' successfully created in namespace 'default'.
Waiting for service 'nodejs-helloworld' to become ready ... OK

Service URL:
http://nodejs-helloworld.default.example.com

Gloo istifadə edirsinizsə, onun funksionallığını belə yoxlaya bilərsiniz:

$ 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!"}

Serialdakı digər məqalələr

OpenWhisk ilə serversiz hesablama, 1-cü hissə
OpenWhisk ilə serversiz hesablama, 2-cü hissə
OpenWhisk ilə serversiz hesablama, 3-cü hissə
OpenWhisk ilə serversiz hesablama, 4-cü hissə

Mənbə: www.habr.com

Добавить комментарий