Υπολογισμός χωρίς διακομιστή με 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

Προβλήματα και Λύσεις

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.

Ο Invoker εξακολουθεί να προετοιμάζεται — Init:1/2

Η διαδικασία λήψης διαφόρων περιβαλλόντων χρόνου εκτέλεσης μπορεί να διαρκέσει πολύ. Για να επιταχύνετε τα πράγματα, μπορείτε να καθορίσετε μια συντομευμένη ελάχιστη λίστα στο αρχείο mycluster.yaml:

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

Δοχείο με όνομα -εγκατάσταση-πακέτα- κολλάει στο Σφάλμα

Απλώς αυξήστε τα χρονικά διαστήματα για τεστ ζωντάνιας.

Εγκατάσταση του OpenWhisk μέσω Knative

Η Priti Desai πραγματοποίησε την εγκατάσταση πάνω από ένα σύμπλεγμα στο cloud της IBM, καθώς και σε ένα κανονικό minikube, χρησιμοποιώντας Knative Build και BuildTemplates. Θα εγκαταστήσω επίσης πάνω από το minukube, με βάση τον τρόπο περιγράφηκε στο ιστολόγιό μας νωρίτερα - χρησιμοποιώντας τις πιο πρόσφατες εκδόσεις λογισμικού. Εφόσον τα Knative Build και BuildTemplates έχουν καταργηθεί επίσημα, θα χρησιμοποιήσω την προτεινόμενη αντικατάσταση με τη μορφή Tekton Pipelines. Το υπόλοιπο άρθρο γράφτηκε μετά την ανάγνωση της τεκμηρίωσης για την Tekton Pipelines, αλλά βασίζεται στις ιδέες του Priti. Για να εργαστείτε, θα χρειαστείτε πρόσβαση σε κάποιο Docker Registry - εγώ, όπως ο αρχικός συγγραφέας, θα χρησιμοποιήσω το 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

Ο έλεγχος της εργασίας συνίσταται στη λήψη του ονόματος του pod και στην προβολή της κατάστασής του. Μπορείτε επίσης να προβάλετε το αρχείο καταγραφής εκτέλεσης κάθε βήματος, για παράδειγμα:

$ 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

Προσθέστε ένα σχόλιο