الحوسبة بدون خادم باستخدام OpenWhisk، الجزء 4

الحوسبة بدون خادم باستخدام OpenWhisk، الجزء 4

تنهي هذه المقالة سلسلة الملاحظات المترجمة حول OpenWhisk من المؤلف بريتي ديساي. سنلقي نظرة اليوم على عملية نشر OpenWhisk عبر Kubernetes باستخدام الأوامر المصححة للعمل مع الإصدارات الحالية من التطبيقات. وسيغطي أيضًا عملية تشغيل وظائف OpenWhisk باستخدام Knative وTektonCD على Kubernetes باستخدام وقت تشغيل Nodejs.

نشر OpenWhisk على Kubernetes

على مدار بضعة أيام، قمت بتجربة نشر OpenWhisk في Kubernetes لإنشاء ساحة اختبار بسيطة وسريعة. وبما أنني جديد على Kubernetes، أعتقد أنه تم قضاء يوم ونصف في النشر الناجح. في هذا تحتوي المستودعات على تعليمات واضحة جدًا لنشر OpenWhisk على Kubernetes. فيما يلي تعليمات النشر المعدة لنظام التشغيل Mac (سأفعل أيضًا كل شيء على Linux لأنني أفضل Linux. - تقريبا. مترجم).

  1. تثبيت مدير الحزم asdf، وبعد ذلك نقوم بالتصحيح تلقائيًا ~/.bash_profile أو ما يعادلها هكذا:

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

[في نظام التشغيل Linux، ليست هناك حاجة لهذه الخطوة، على الرغم من توفر الشراب. - تقريبا. مترجم]

  1. إضافة الإضافات minikube и kubelet:

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

[مرة أخرى، تخطي هذه الخطوة على نظام التشغيل Linux. - تقريبا. مترجم]

  1. تثبيت minikube و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

[تم تثبيت إصدارات محددة، ولكنني قمت بفحص كل شيء على أحدث الإصدارات المتاحة لنظام التشغيل Linux؛ وأظن أنه يمكنك تثبيت أحدث بأمان. - تقريبا. مترجم]

في نظام التشغيل Linux، تتم هذه الخطوة على النحو التالي (يتم وضع كل شيء في ~/bin، وهو مدرج في PATH الخاص بي، ملاحظة المترجم):

$ 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 (يجب تثبيت VirtualBox مسبقًا):

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

[كل شيء يسير على ما يرام بالنسبة لي مع الفريق minikube start بدون معلمات ومع القيم الافتراضية. - تقريبا. مترجم]

$ 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 إلى الوضع المختلط:

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

  1. قم بإنشاء مساحة اسم ووضع علامة على العقدة العاملة:

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

  1. نحصل على محتويات المستودع ونتجاوز نوع الدخول إلى ملف mycluster.yaml:

$ 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 ونشره باستخدامه:

$ 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

[في نظام التشغيل Linux بأحدث الإصدارات (كان الإصدار 3.0.1 متاحًا) سيكون الأمر مختلفًا بعض الشيء. - تقريبا. مترجم]

$ 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. نتحقق من أن كل شيء قد ارتفع (الحالة = قيد التشغيل أو مكتمل):

$ 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 للعمل:

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

نتحقق من:

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

المشاكل والحلول

getockopt: تم رفض الاتصال

$ 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

التحقق من وجود الحاويات في مساحة الاسم openwhisk في الوضع Running، لأن في بعض الأحيان يتعطل مع الأخطاء CreateContainerConfigError.

لا يزال المستدعي قيد التهيئة - Init:1/2

يمكن أن تستغرق عملية تنزيل بيئات التشغيل المختلفة وقتًا طويلاً. لتسريع الأمور، يمكنك تحديد قائمة مختصرة بالحد الأدنى في الملف mycluster.yaml:

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

حاوية بالاسم -تثبيت-الحزم- تعطل إلى خطأ

ما عليك سوى زيادة المهلات الخاصة باختبارات الحيوية.

تثبيت OpenWhisk على Knative

نفذت Priti Desai عملية التثبيت أعلى مجموعة في سحابة IBM، وكذلك على minikube عادي، باستخدام Knative Build وBuildTemplates. سأقوم أيضًا بالتثبيت فوق minukube، بناءً على كيفية القيام بذلك تم وصفه في مدونتنا سابقًا - باستخدام أحدث إصدارات البرامج. نظرًا لإهمال Knative Build وBuildTemplates رسميًا، سأستخدم البديل الموصى به في شكل Tekton Pipelines. تمت كتابة بقية المقالة بعد قراءة الوثائق الخاصة بخطوط أنابيب Tekton، ولكنها مبنية على أفكار بريتي. للعمل، ستحتاج إلى الوصول إلى بعض سجلات Docker - أنا، مثل المؤلف الأصلي، سأستخدم 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

الحوسبة بدون خادم باستخدام OpenWhisk، الجزء 4
إنشاء وتشغيل OpenWhisk أعلى Knative

  1. الحصول على المحتويات هذا المستودع:

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

  1. نقوم بتعيين البيانات للوصول إلى السجل كمتغيرات بيئة ونحفظها باعتبارها سر Kubernetes:

$ 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

نتحقق من:

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

  1. إنشاء حساب لبيئات البناء:

$ kubectl apply -f service-account.yaml

نتحقق من:

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

  1. قم بإنشاء مهمة لإنشاء صورة لـ OpenWhisk

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

  1. نقوم بتشغيل المهمة لبناء الصورة (باستخدام NodeJS كمثال):

قم بإنشاء ملف Taskrun.yaml بالمحتويات:

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

نحن نطبق البيانات الحالية لهذا الملف:

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

نطبق:

$ 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

يتكون فحص العمل من الحصول على اسم الكبسولة وعرض حالتها. يمكنك أيضًا عرض سجل التنفيذ لكل خطوة، على سبيل المثال:

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

بعد التنفيذ، سيكون لدينا صورة في السجل يمكن نشرها باستخدام الأداة المساعدة kn، المصممة للعمل مع خدمات Knative، على سبيل المثال:

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، فيمكنك التحقق من وظائفه مثل هذا:

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

مقالات أخرى في السلسلة

الحوسبة بدون خادم باستخدام OpenWhisk، الجزء 1
الحوسبة بدون خادم باستخدام OpenWhisk، الجزء 2
الحوسبة بدون خادم باستخدام OpenWhisk، الجزء 3
الحوسبة بدون خادم باستخدام OpenWhisk، الجزء 4

المصدر: www.habr.com

إضافة تعليق