सर्वरलेस कंप्यूटिंग OpenWhisk, भाग 4 पर आधारित है


यह लेख प्रीति देसाई द्वारा OpenWhisk अनुवाद नोट्स श्रृंखला का समापन करता है। आज हम अनुप्रयोगों के नवीनतम संस्करणों के साथ काम करने के लिए सही आदेशों के साथ कुबेरनेट्स के शीर्ष पर OpenWhisk को तैनात करने की प्रक्रिया को देखेंगे। यह भी वर्णन करेगा कि Nodejs रनटाइम का उपयोग करके कुबेरनेट्स में चाकू और टेकटनसीडी का उपयोग करके ओपनविस्क कार्यों को कैसे चलाया जाए।


Kubernetes पर OpenWhisk तैनात करें


कुछ दिनों के दौरान, मैंने एक त्वरित और आसान प्रशिक्षण ग्राउंड बनाने के लिए Kubernetes में OpenWhisk की तैनाती के साथ प्रयोग किया। और जब से मैं कुबेरनेट्स के लिए नया हूं, मेरा मानना ​​है कि एक सफल तैनाती पर एक दिन और आधा खर्च किया गया था। इस रिपॉजिटरी में ओपन व्हिस्क को कुबेरनेट्स पर तैनात करने के लिए बहुत स्पष्ट निर्देश हैं। यहां मैक के लिए तैनाती के निर्देश दिए गए हैं ( मैं लिनक्स पर भी सब कुछ करूंगा क्योंकि मैं लिनक्स पसंद करता हूं। - अनुवादक का ध्यान दें)।


  1. हम asdf पैकेज प्रबंधक स्थापित करते हैं, जिसके बाद हम स्वचालित रूप से ~/.bash_profile या इसके अनुरूप को ठीक करते हैं:

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

[ लिनक्स पर, इस चरण की आवश्यकता नहीं है, हालांकि एक काढ़ा है। - लगभग। अनुवादक]


  1. minikube और kubelet जोड़ें:

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

[ फिर से लिनक्स पर इस चरण को छोड़ें। - लगभग। अनुवादक]


  1. हम मिनीब्यूब और क्यूबलेट डालते हैं:

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

[ विशिष्ट संस्करण स्थापित हैं, लेकिन मैंने लिनक्स के लिए नवीनतम उपलब्ध संस्करणों पर सब कुछ जांचा; मुझे संदेह है कि आप सुरक्षित रूप से नवीनतम डाल सकते हैं। - लगभग। अनुवादक]


लिनक्स पर, यह कदम इस तरह से किया जाता है (सब कुछ ~ / बिन में रखा गया है, जो मेरे पास है, अनुवादक का नोट है):


 $ 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 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. हेल्म स्थापित करें और इसका उपयोग करते हुए तैनात करें:

 $ 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 

[ नवीनतम संस्करणों के साथ लिनक्स पर (v3.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. जांचें कि सब कुछ बढ़ गया है (STATUS = चल रहा है या पूरा हो गया है):

 $ 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 

समस्याओं और समाधान


getsockopt: कनेक्शन ने मना कर दिया


 $ 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 स्थापित करें


प्रीति देसाई ने आईबीएम क्लाउड में क्लस्टर के शीर्ष पर स्थापना की, साथ ही नियमित रूप से मिनीक्यूब पर, चाकू निर्माण और बिल्डटैम्पलेट्स का उपयोग किया। मैं minukube के शीर्ष पर भी स्थापित करूँगा, यह इस बात पर आधारित है कि इसे हमारे ब्लॉग में पहले कैसे वर्णित किया गया था - नवीनतम सॉफ़्टवेयर संस्करणों का उपयोग करके। चूंकि चाकू निर्माण और BuildTemplates आधिकारिक तौर पर हटाए गए हैं, मैं Tekton पाइपलाइनों के रूप में अनुशंसित प्रतिस्थापन का उपयोग करूंगा। बाकी का लेख टेक्टन पाइपलाइन प्रलेखन पढ़ने के बाद लिखा गया था, लेकिन प्रीति के विचारों पर आधारित था। काम करने के लिए, आपको कुछ डोकर रजिस्ट्री तक पहुंच की आवश्यकता होगी - मैं, मूल लेखक की तरह, डॉकरहब का उपयोग करूंगा।


 $ 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 बनाएँ और चलाएं


  1. हमें इस भंडार की सामग्री मिलती है :

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

  1. हम पर्यावरण चर के रूप में रजिस्ट्री तक पहुँचने के लिए डेटा सेट करते हैं और उन्हें कुबेरनेट गुप्त के रूप में सहेजते हैं:

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

ग्लो का उपयोग करने के मामले में, आप कार्यक्षमता की जाँच कर सकते हैं:


 $ 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 पर आधारित है

Source: https://habr.com/ru/post/hi481000/


All Articles