Serverless Computing nrog OpenWhisk, Ntu 4

Serverless Computing nrog OpenWhisk, Ntu 4

Kab lus no xaus cov ntawv txhais lus ntawm OpenWhisk los ntawm tus sau Priti Desai. Niaj hnub no peb yuav saib cov txheej txheem ntawm kev xa tawm OpenWhisk hla Kubernetes nrog cov lus raug kho kom ua haujlwm nrog cov ntawv thov tam sim no. Nws tseem yuav npog cov txheej txheem ntawm kev khiav haujlwm OpenWhisk siv Knative thiab TektonCD ntawm Kubernetes siv Nodejs runtime.

Deploying OpenWhisk ntawm Kubernetes

Ob peb hnub dhau los, kuv tau sim siv OpenWhisk rau Kubernetes los tsim qhov chaw sim yooj yim thiab nrawm. Thiab txij li thaum kuv yog tus tshiab rau Kubernetes, kuv ntseeg tias ib hnub thiab ib nrab tau siv rau kev xa mus ua tiav. IN qhov no Cov chaw khaws cia muaj cov lus qhia meej heev rau kev xa tawm OpenWhisk ntawm Kubernetes. Nov yog cov lus qhia xa mus rau Mac (Kuv kuj yuav ua txhua yam ntawm Linux vim kuv nyiam Linux. - kwv yees. tus txhais lus).

  1. Txhim kho tus neeg saib xyuas pob asdf, tom qab uas peb tau kho ~/.bash_profile los yog nws sib npaug zoo li no:

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

[Ntawm Linux cov kauj ruam no tsis xav tau, txawm tias brew muaj. - kwv yees. tus txhais lus]

  1. Ntxiv plugins minikube ΠΈ kubelet:

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

[Ib zaug ntxiv, hla cov kauj ruam no ntawm Linux. - kwv yees. tus txhais lus]

  1. Nruab minikube thiab 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

[cov versions tshwj xeeb tau teeb tsa, tab sis kuv tau tshawb xyuas txhua yam ntawm cov ntawv tshiab muaj nyob rau Linux; Kuv xav tias koj tuaj yeem ruaj ntseg nruab qhov tseeb. - kwv yees. tus txhais lus]

Ntawm Linux, cov kauj ruam no tau ua ib yam dab tsi zoo li no (txhua yam yog muab tso rau hauv ~ / bin, uas tau teev nyob rau hauv kuv PATH, tus txhais lus ceeb toom):

$ 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. Tsim ib lub tshuab virtual minikube (VirtualBox yuav tsum tau ua ntej ntsia):

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

[Txhua yam ua haujlwm rau kuv nrog pab neeg minikube start , tsis muaj parameters thiab nrog tus nqi pib. - kwv yees. tus txhais lus]

$ 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. Hloov lub network hauv Docker rau hom promiscuous:

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

  1. Tsim lub namespace thiab kos tus neeg ua haujlwm node:

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

  1. Peb tau txais cov ntsiab lus ntawm qhov chaw cia khoom thiab hla hom rau ingress hauv mycluster.yaml cov ntaub ntawv:

$ 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. Nruab Helm thiab xa nws siv nws:

$ 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

[Ntawm Linux nrog rau qhov tseeb versions (v3.0.1 muaj) nws yuav txawv me ntsis. - kwv yees. tus txhais lus]

$ 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. Peb xyuas tias txhua yam tau nce (STATUS = Khiav lossis Ua tiav):

$ 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. Configuring wsk ua haujlwm:

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

Peb tshawb xyuas:

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

Teeb meem thiab lawv cov kev daws teeb meem

getsockopt: kev twb kev txuas tsis kam

$ 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

Tshawb xyuas tias cov ntim khoom nyob hauv lub npe openwhisk hauv xwm txheej Running, vim qee zaum nws tsoo nrog qhov yuam kev CreateContainerConfigError.

Invoker tseem tab tom pib - Init: 1/2

Cov txheej txheem ntawm rub tawm ntau qhov chaw khiav haujlwm tuaj yeem siv sijhawm ntev. Txhawm rau ua kom nrawm dua, koj tuaj yeem teev cov npe luv luv luv hauv cov ntaub ntawv mycluster.yaml:

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

Thawv nrog lub npe -install-packages- crashes rau yuam kev

Tsuas yog nce lub sijhawm rau kev sim ua neej nyob.

Txhim kho OpenWhisk hla Knative

Priti Desai tau ua tiav qhov kev teeb tsa saum toj ntawm pawg hauv IBM huab, nrog rau ntawm lub minikube tsis tu ncua, siv Knative Build thiab BuildTemplates. Kuv tseem yuav nruab rau saum minukube, raws li yuav ua li cas tau piav nyob rau hauv peb blog ua ntej - siv qhov tseeb software versions. Txij li thaum Knative Build thiab BuildTemplates tau raug tso cai tawm, kuv yuav siv qhov kev pom zoo hloov hauv daim ntawv Tekton Pipelines. Cov seem ntawm tsab xov xwm tau sau tom qab nyeem cov ntaub ntawv rau Tekton Pipelines, tab sis yog raws li cov tswv yim ntawm Priti. Txhawm rau ua haujlwm, koj yuav tsum nkag mus rau qee qhov Docker Registry - Kuv, zoo li tus thawj sau, yuav siv 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 nrog OpenWhisk, Ntu 4
Tsim thiab khiav OpenWhisk rau saum Knative

  1. Tau txais cov ntsiab lus qhov chaw khaws cia:

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

  1. Peb teeb tsa cov ntaub ntawv rau kev nkag mus rau Registry raws li ib puag ncig hloov pauv thiab txuag lawv li Kubernetes zais cia:

$ 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

Peb tshawb xyuas:

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

  1. Tsim ib tus account rau lub tsev ib puag ncig:

$ kubectl apply -f service-account.yaml

Peb tshawb xyuas:

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

  1. Tsim ib txoj haujlwm los tsim cov duab rau OpenWhisk

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

  1. Peb khiav txoj haujlwm los tsim cov duab (siv NodeJS ua piv txwv):

Tsim ib cov ntaub ntawv taskrun.yaml nrog cov ntsiab lus:

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

Peb siv cov ntaub ntawv tam sim no rau cov ntaub ntawv no:

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

Peb thov:

$ 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

Kev tshuaj xyuas cov haujlwm muaj xws li tau txais lub pod lub npe thiab saib nws cov xwm txheej. Koj tuaj yeem saib daim ntawv ua tiav ntawm txhua kauj ruam, piv txwv li:

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

Tom qab ua tiav, peb yuav muaj cov duab hauv Registry uas tuaj yeem siv tau siv cov khoom siv kn, tsim los ua haujlwm nrog Knative cov kev pabcuam, piv txwv li:

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

Yog tias koj siv Gloo, koj tuaj yeem tshawb xyuas nws cov haujlwm zoo li no:

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

Lwm cov ntawv hauv koob

Serverless Computing nrog OpenWhisk, Ntu 1
Serverless Computing nrog OpenWhisk, Ntu 2
Serverless Computing nrog OpenWhisk, Ntu 3
Serverless Computing nrog OpenWhisk, Ntu 4

Tau qhov twg los: www.hab.com

Ntxiv ib saib