
Tsab xov xwm no xaus cov lus txhais ntawm OpenWhisk los ntawm tus sau. Niaj 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. 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).
- Txhim kho tus thawj tswj pob khoom
asdf, tom qab ntawd peb kho nws cia li~/.bash_profilelos 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]
- 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]
- 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/- 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"- Hloov lub network hauv Docker mus rau hom promiscuous:
$ minikube ssh -- sudo ip link set docker0 promisc on- Tsim ib lub npe thiab cim tus neeg ua haujlwm node:
$ kubectl create namespace openwhisk
$ kubectl label nodes --all openwhisk-role=invoker- 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- 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- 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- 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:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwPPeb tshawb xyuas:
$ wsk -i list
Entities in namespace: default
packages
actions
triggers
rulesTeeb 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 refusedPeb 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 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
Tsim thiab khiav OpenWhisk ntawm Knative
- Tau txais cov ntsiab lus :
$ git clone https://github.com/tektoncd/catalog/
$ cd catalog/openwhisk- 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.yamlPeb tshawb xyuas:
$ kubectl get secret
NAME TYPE DATA AGE
dockerhub-user-pass kubernetes.io/basic-auth 2 21s- Tsim ib tus account rau kev tsim cov chaw ib puag ncig:
$ kubectl apply -f service-account.yamlPeb tshawb xyuas:
$ kubectl get serviceaccount/openwhisk-runtime-builder
NAME SECRETS AGE
openwhisk-runtime-builder 2 31m- Tsim ib txoj haujlwm los tsim ib daim duab rau OpenWhisk
$ kubectl apply -f openwhisk.yaml
task.tekton.dev/openwhisk created- 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.yamlPeb 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 createdKev 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.comYog 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
Tau qhov twg los: www.hab.com
