
Artikel ini menyimpulkan seri catatan terjemahan OpenWhisk oleh Priti Desai . Hari ini kita akan melihat proses penerapan OpenWhisk di atas Kubernetes dengan perintah yang dikoreksi untuk bekerja dengan aplikasi versi terbaru. Ini juga akan menjelaskan cara menjalankan fungsi OpenWhisk menggunakan Knative dan TektonCD di Kubernetes menggunakan runtime Nodejs.
Menyebarkan OpenWhisk di Kubernetes
Selama beberapa hari, saya bereksperimen dengan menggunakan OpenWhisk di Kubernetes untuk menciptakan tempat pelatihan yang cepat dan mudah. Dan karena saya baru di Kubernetes, saya percaya bahwa satu setengah hari dihabiskan untuk penempatan yang sukses. Repositori ini memiliki instruksi yang sangat jelas untuk menggunakan OpenWhisk ke Kubernetes. Berikut adalah instruksi penyebaran yang dibuat untuk Mac ( Saya juga akan melakukan segalanya di Linux karena saya lebih suka Linux. - Catatan Penerjemah).
- Kami menginstal manajer paket
asdf
, setelah itu kami secara otomatis memperbaiki ~/.bash_profile
atau analognya seperti ini:
$ brew install asdf $ [ -s "/usr/local/opt/asdf/asdf.sh" ] && . /usr/local/opt/asdf/asdf.sh $ source ~/.bash_profile
[ Di Linux, langkah ini tidak diperlukan, meskipun ada minuman. - kira-kira. penerjemah]
- Tambahkan
kubelet
dan kubelet
:
$ asdf plugin-add kubectl $ asdf plugin-add minikube
[ Sekali lagi lewati langkah ini di Linux. - kira-kira. penerjemah]
- Kami menempatkan minikube dan 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
[ versi spesifik diinstal, tetapi saya memeriksa semuanya pada versi terbaru yang tersedia untuk Linux; Saya menduga bahwa Anda dapat dengan aman memasukkan yang terbaru. - kira-kira. penerjemah]
Di Linux, langkah ini dilakukan seperti ini (semuanya ditempatkan di ~ / bin, yang saya miliki di PATH, catatan penerjemah):
$ 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/
- Kami membuat mesin virtual minikube (VirtualBox harus sudah diinstal sebelumnya):
$ minikube start --cpus 2 --memory 4096 --kubernetes-version=v1.9.0 --extra-config=apiserver.Authorization.Mode=RBAC
[ Semuanya bekerja untuk saya dengan perintah minikube start
, tanpa parameter dan dengan nilai default. - kira-kira. penerjemah]
$ 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"
- Alihkan jaringan di Docker ke mode promiscuous:
$ minikube ssh -- sudo ip link set docker0 promisc on
- Buat namespace dan tandai simpul kerja:
$ kubectl create namespace openwhisk $ kubectl label nodes --all openwhisk-role=invoker
- Kami mendapatkan isi dari repositori dan mendefinisikan kembali tipe untuk masuk dalam file 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
- Instal Helm dan gunakan menggunakannya:
$ 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
[ Di Linux dengan versi terbaru (v3.0.1 tersedia) itu akan sedikit berbeda. - kira-kira. penerjemah]
$ 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
- Periksa apakah semuanya telah meningkat (STATUS = Berjalan atau Selesai):
$ 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
- Kami mengkonfigurasi wsk untuk pekerjaan:
$ wsk property set --apihost 192.168.99.100:31001 $ wsk property set --auth 23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwP
Kami memeriksa:
$ wsk -i list Entities in namespace: default packages actions triggers rules
Masalah dan solusi
mendapatockopt: koneksi ditolak
$ 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
Kami memeriksa bahwa kontainer di namespace openwhisk
dalam status Running
, karena terkadang crash dengan kesalahan CreateContainerConfigError
.
Invoker masih menginisialisasi - Init: 1/2
Proses mengunduh semua jenis runtimes dapat memakan banyak waktu. Untuk mempercepat, Anda dapat menentukan daftar minimum yang disingkat dalam file mycluster.yaml
:
whisk: runtimes: "runtimes-minimal-travis.json"
Wadah bernama -install-paket- jatuh di Galat
Hanya menambah batas waktu untuk tes liveness.
Instal OpenWhisk di atas Knative
Priti Desai melakukan instalasi di atas cluster di cloud IBM, serta di minikube biasa, menggunakan Knative Build dan BuildTemplates. Saya juga akan menginstal di atas minukube, berdasarkan bagaimana itu dijelaskan di blog kami sebelumnya - menggunakan versi perangkat lunak terbaru. Karena Knative Build dan BuildTemplates secara resmi tidak digunakan lagi, saya akan menggunakan pengganti yang disarankan dalam bentuk Pipa Tekton. Sisa artikel ini ditulis setelah membaca dokumentasi Tekton Pipelines, tetapi berdasarkan ide-ide Priti. Agar berfungsi, Anda akan memerlukan akses ke beberapa Docker Registry - saya, seperti penulis aslinya, akan menggunakan 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

Bangun dan jalankan OpenWhisk di atas Knative
- Kami mendapatkan isi dari repositori ini :
$ git clone https://github.com/tektoncd/catalog/ $ cd catalog/openwhisk
- Kami menyiapkan data untuk mengakses Registry dalam bentuk variabel lingkungan dan menyimpannya sebagai rahasia 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
Kami memeriksa:
$ kubectl get secret NAME TYPE DATA AGE dockerhub-user-pass kubernetes.io/basic-auth 2 21s
- Buat akun untuk membangun lingkungan:
$ kubectl apply -f service-account.yaml
Kami memeriksa:
$ kubectl get serviceaccount/openwhisk-runtime-builder NAME SECRETS AGE openwhisk-runtime-builder 2 31m
- Buat tugas untuk membuat gambar untuk OpenWhisk
$ kubectl apply -f openwhisk.yaml task.tekton.dev/openwhisk created
- Jalankan tugas untuk membangun gambar (menggunakan NodeJS sebagai contoh):
Buat file taskrun.yaml dengan konten:
# 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 ---
Kami menerapkan data saat ini untuk file ini:
$ sed 's/${DOCKER_USERNAME}/'"$DOCKER_USERNAME"'/' -i taskrun.yaml
Kami menerapkan:
$ 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
Memeriksa pekerjaan terdiri dari mendapatkan nama pod, melihat statusnya. Anda juga dapat melihat log dari setiap langkah, misalnya:
$ 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"}
Setelah eksekusi, sebuah gambar akan muncul di Registry kami yang dapat digunakan menggunakan utilitas kn yang dirancang untuk bekerja dengan layanan Knative, misalnya:
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
Dalam hal menggunakan Gloo, Anda dapat memeriksa fungsionalitas dengan:
$ 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!"}
Artikel siklus lainnya
Komputasi tanpa server berdasarkan OpenWhisk, bagian 1
Komputasi tanpa server berdasarkan OpenWhisk, bagian 2
Komputasi tanpa server berdasarkan OpenWhisk, bagian 3
Komputasi tanpa server berdasarkan OpenWhisk, bagian 4