Serverless Computing uban sa OpenWhisk, Bahin 4

Serverless Computing uban sa OpenWhisk, Bahin 4

Kini nga artikulo nagtapos sa serye sa gihubad nga mga nota bahin sa OpenWhisk gikan sa tagsulat Priti Desai. Karon atong tan-awon ang proseso sa pag-deploy sa OpenWhisk sa mga Kubernetes nga adunay gitul-id nga mga sugo aron magtrabaho uban sa kasamtangan nga mga bersyon sa mga aplikasyon. Sakup usab niini ang proseso sa pagpadagan sa OpenWhisk function gamit ang Knative ug TektonCD sa Kubernetes gamit ang Nodejs runtime.

Pag-deploy sa OpenWhisk sa Kubernetes

Sulod sa pipila ka mga adlaw, nag-eksperimento ko sa pagdeploy sa OpenWhisk sa Kubernetes aron makahimo og usa ka yano ug paspas nga testing ground. Ug tungod kay bag-o pa ako sa Kubernetes, nagtuo ko nga usa ug tunga ka adlaw ang gigugol sa malampuson nga pagdeploy. SA kini Ang mga repository adunay klaro kaayo nga mga panudlo alang sa pag-deploy sa OpenWhisk sa Kubernetes. Ania ang mga panudlo sa pag-deploy nga gihimo alang sa Mac (Buhaton sab nako ang tanan sa Linux kay mas gusto nako ang Linux. β€” gibanabana. tighubad).

  1. Pag-instalar sa manager sa package asdf, pagkahuman awtomatiko namong gitul-id ~/.bash_profile o ang katumbas niini sama niini:

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

[Sa Linux dili kinahanglan kini nga lakang, bisan kung magamit ang brew. β€” gibanabana. tighubad]

  1. Pagdugang mga plugins minikube ΠΈ kubelet:

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

[Pag-usab, laktawan kini nga lakang sa Linux. β€” gibanabana. tighubad]

  1. I-install ang minikube ug 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

[espesipiko nga mga bersyon gi-install, apan akong gisusi ang tanan sa pinakabag-o nga magamit nga mga bersyon alang sa Linux; Nagduda ko nga mahimo nimong luwas nga ma-install ang pinakabag-o. β€” gibanabana. tighubad]

Sa Linux, kini nga lakang gihimo sama niini (ang tanan gibutang sa ~/bin, nga gilista sa akong PATH, nota sa tighubad):

$ 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. Paghimo og minikube virtual machine (Kinahanglang ma-pre-install ang VirtualBox):

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

[Ang tanan nagtrabaho alang kanako uban sa team minikube start , walay mga parametro ug adunay mga default nga bili. β€” gibanabana. tighubad]

$ 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. Pagbalhin sa network sa Docker sa promiscuous mode:

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

  1. Paghimo og namespace ug markahi ang worker node:

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

  1. Gikuha namo ang mga sulod sa repository ug gi-override ang tipo para sa ingress sa mycluster.yaml file:

$ 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. I-install ang Helm ug i-deploy kini gamit kini:

$ 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

[Sa Linux uban sa pinakabag-o nga mga bersyon (v3.0.1 anaa) kini mahimong usa ka gamay nga kalainan. β€” gibanabana. tighubad]

$ 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. Among gisusi nga ang tanan nabanhaw (STATUS = Running or 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. Pag-configure sa wsk aron magtrabaho:

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

Pagsusi:

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

Mga problema ug ang ilang mga solusyon

getsockopt: koneksyon mibalibad

$ 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

Pagsusi nga ang mga sudlanan naa sa namespace openwhisk sa status Running, kay usahay kini nahagsa uban sa mga sayop CreateContainerConfigError.

Nagsugod pa ang Invoker β€” Init:1/2

Ang proseso sa pag-download sa nagkalain-laing runtime environment mahimong magdugay. Aron mapadali ang mga butang, mahimo nimong itakda ang usa ka pinamubo nga minimum nga lista sa file mycluster.yaml:

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

Container nga adunay ngalan -instalar-mga pakete- nahagsa sa Error

Dugangi lang ang mga timeout para sa liveness tests.

Pag-instalar sa OpenWhisk sa Knative

Gipatuman ni Priti Desai ang pag-instalar sa ibabaw sa usa ka cluster sa IBM cloud, ingon man sa usa ka regular nga minikube, gamit ang Knative Build ug BuildTemplates. I-install usab nako sa ibabaw sa minukube, base kung giunsa kini gihulagway sa among blog kaniadto - gamit ang pinakabag-o nga bersyon sa software. Tungod kay ang Knative Build ug BuildTemplates opisyal na nga wala na gamita, akong gamiton ang girekomendar nga kapuli sa porma sa Tekton Pipelines. Ang nahabilin sa artikulo gisulat human mabasa ang dokumentasyon alang sa Tekton Pipelines, apan gibase sa mga ideya ni Priti. Aron magtrabaho, kinahanglan nimo ang pag-access sa pipila nga Docker Registry - Ako, sama sa orihinal nga tagsulat, mogamit sa 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

Serverless Computing uban sa OpenWhisk, Bahin 4
Pagtukod ug pagpadagan sa OpenWhisk sa ibabaw sa Knative

  1. Pagkuha sa sulod kini nga tipiganan:

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

  1. Gibutang namo ang datos alang sa pag-access sa Registry isip mga variable sa palibot ug gitipigan kini isip sekreto sa 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

Pagsusi:

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

  1. Paghimo og account alang sa pagtukod og mga palibot:

$ kubectl apply -f service-account.yaml

Pagsusi:

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

  1. Paghimo og buluhaton sa paghimo og imahen para sa OpenWhisk

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

  1. Gipadagan namo ang buluhaton sa paghimo sa imahe (gamit ang NodeJS isip pananglitan):

Paghimo og taskrun.yaml file nga adunay sulod:

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

Among gipadapat ang kasamtangang datos alang niini nga payl:

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

Nag-aplay kami:

$ 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

Ang pagsusi sa trabaho naglangkob sa pagkuha sa ngalan sa pod ug pagtan-aw sa kahimtang niini. Mahimo usab nimong tan-awon ang execution log sa matag lakang, pananglitan:

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

Pagkahuman sa pagpatuman, makabaton kami usa ka imahe sa Registry nga mahimong i-deploy gamit ang kn utility, gidisenyo aron magtrabaho sa mga serbisyo sa Knative, pananglitan:

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

Kung mogamit ka sa Gloo, mahimo nimong susihon ang pagpaandar niini sama niini:

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

Ang ubang mga artikulo sa serye

Serverless Computing uban sa OpenWhisk, Bahin 1
Serverless Computing uban sa OpenWhisk, Bahin 2
Serverless Computing uban sa OpenWhisk, Bahin 3
Serverless Computing uban sa OpenWhisk, Bahin 4

Source: www.habr.com

Idugang sa usa ka comment