Serverless Computing nrog OpenWhisk, Ntu 4

Serverless Computing nrog OpenWhisk, Ntu 4

Tsab xov xwm no xaus cov lus txhais ntawm OpenWhisk los ntawm tus sau. Priti DesaiNiaj hnub no, peb yuav tham txog cov txheej txheem ntawm kev xa tawm OpenWhisk ntawm Kubernetes, nrog rau cov lus txib kho kom ua haujlwm nrog cov ntawv thov tam sim no. Peb kuj tseem yuav tham txog kev khiav OpenWhisk functions siv Knative thiab TektonCD hauv Kubernetes nrog Node.js runtime.

Kev Siv OpenWhisk Rau Kubernetes

Tau ob peb hnub, kuv tau sim siv OpenWhisk rau Kubernetes los tsim ib qho chaw sim yooj yim thiab ceev rau cov haujlwm. Thiab vim kuv tshiab rau Kubernetes, kuv kwv yees tias nws siv sijhawm ib hnub thiab ib nrab los ua kom tiav. qhov no Cov chaw khaws cia muaj cov lus qhia meej heev rau kev xa tawm OpenWhisk hauv Kubernetes. Nov yog cov lus qhia xa tawm rau Mac (Kuv tseem yuav ua txhua yam rau Linux, vim kuv nyiam Linux. — daim ntawv sau los ntawm tus neeg txhais lus).

  1. Txhim kho tus thawj tswj pob khoom asdf, tom qab ntawd peb kho nws cia li ~/.bash_profile los yog nws sib npaug:

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

[rau Linux Cov kauj ruam no tsis tsim nyog, txawm hais tias brew muaj. - kwv yees. tus txhais lus]

  1. Ntxiv cov plugins minikube и kubelet:

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

[Dua li no, peb hla qhov kauj ruam no 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 version tshwj xeeb tau teeb tsa, tab sis kuv tau kuaj xyuas txhua yam ntawm cov versions tshiab tshaj plaws rau Linux; Kuv xav tias koj tuaj yeem nruab qhov tseeb tshaj plaws tau yam tsis muaj teeb meem. - kwv yees. tus txhais lus]

rau Linux Cov kauj ruam no tau ua tiav ib yam dab tsi zoo li no (txhua yam tau teeb tsa hauv ~ / bin, uas yog nyob rau hauv kuv txoj kev, tus neeg txhais lus cov lus):

$ 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 nruab ua ntej):

$ 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 cov kev cai thiab nrog cov nqi tsis siv neeg. - 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 mus rau hom promiscuous:

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

  1. Tsim ib lub npe thiab cim tus neeg ua haujlwm node:

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

  1. Peb tau txais cov ntsiab lus ntawm lub chaw cia khoom thiab hloov hom rau ingress hauv cov ntaub ntawv 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. Nruab Helm thiab xa tawm 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

[rau Linux Nrog cov versions tshiab kawg (v3.0.1 twb muaj lawm) 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. Cia peb xyuas seb txhua yam puas ua haujlwm (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. Teeb tsa wsk rau kev 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 sib txuas tsis raug lees paub

$ 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

Peb xyuas kom meej tias cov thawv nyob hauv qhov chaw sau npe openwhisk nyob rau hauv qhov xwm txheej Running, vim qee zaum nws crashes nrog errors CreateContainerConfigError.

Tus neeg thov tseem tab tom pib - Init: 1/2

Rub tawm txhua qhov chaw ua haujlwm sib txawv tuaj yeem siv sijhawm ntev. Yuav kom ua kom sai dua, koj tuaj yeem teev cov npe tsawg kawg nkaus hauv cov ntaub ntawv. mycluster.yaml:

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

Lub thawv muaj npe -nruab-pob- poob rau hauv Error

Tsuas yog ua kom lub sijhawm tawm ntau dua rau kev xeem kev ua neej nyob.

Txhim kho OpenWhisk ntawm Knative

Priti Desai tau teeb tsa rau saum IBM huab cluster, thiab rau ntawm minikube ib txwm muaj, siv Knative Build thiab BuildTemplates. Kuv kuj tseem yuav teeb tsa rau saum minukube, raws li yuav ua li cas nws tau piav qhia Kuv tau sau txog qhov no ua ntej hauv peb lub blog siv cov software versions tshiab. Txij li thaum Knative Build thiab BuildTemplates tau raug tshem tawm lawm, kuv yuav siv qhov hloov pauv uas pom zoo, Tekton Pipelines. Cov ntawv sau tas los tau sau tom qab nyeem cov ntaub ntawv Tekton Pipelines, tab sis yog raws li Priti lub tswv yim. Tsab ntawv no yuav xav tau kev nkag mus rau Docker registry - zoo li tus sau thawj, kuv 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 ntawm Knative

  1. Tau txais cov ntsiab lus lub tsev khaws ntaub ntawv no:

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

  1. Peb teeb tsa cov ntaub ntawv nkag mus rau Registry ua cov hloov pauv ib puag ncig thiab txuag nws ua qhov zais cia 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

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 kev tsim cov chaw 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 ib daim duab rau OpenWhisk

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

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

Tsim ib daim ntawv taskrun.yaml nrog cov ntsiab lus hauv qab no:

# 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 txheeb xyuas qhov kev ua haujlwm suav nrog kev rov qab tau lub npe ntawm lub pod thiab saib nws qhov xwm txheej. Koj tuaj yeem saib cov ntaub ntawv teev cia rau 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"}

Thaum ua tiav lawm, peb yuav muaj ib daim duab hauv Registry uas tuaj yeem xa tawm siv cov cuab yeej 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 raws li hauv qab 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

Yuav txhim khu kev qha hosting rau cov chaw nrog DDoS tiv thaiv, VPS VDS servers 🔥 Yuav lub vev xaib hosting txhim khu kev qha nrog kev tiv thaiv DDoS, VPS VDS servers | ProHoster