Máy tính không máy chủ với OpenWhisk, Phần 4

Máy tính không máy chủ với OpenWhisk, Phần 4

Bài viết này kết thúc loạt bài dịch về OpenWhisk của tác giả Priti Desai. Hôm nay chúng ta sẽ xem xét quá trình triển khai OpenWhisk trên Kubernetes bằng các lệnh được sửa để hoạt động với các phiên bản ứng dụng hiện tại. Nó cũng sẽ đề cập đến quá trình chạy các hàm OpenWhisk bằng Knative và TektonCD trên Kubernetes bằng thời gian chạy Nodejs.

Triển khai OpenWhisk trên Kubernetes

Trong vài ngày, tôi đã thử nghiệm triển khai OpenWhisk cho Kubernetes để tạo nền tảng thử nghiệm đơn giản và nhanh chóng. Và vì tôi mới làm quen với Kubernetes nên tôi tin rằng tôi đã dành một ngày rưỡi để triển khai thành công. TRONG Điều này Các kho lưu trữ có hướng dẫn rất rõ ràng để triển khai OpenWhisk trên Kubernetes. Dưới đây là hướng dẫn triển khai được tạo cho Mac (Tôi cũng sẽ làm mọi thứ trên Linux vì tôi thích Linux hơn. - khoảng. người dịch).

  1. Cài đặt trình quản lý gói asdf, sau đó chúng tôi tự động sửa ~/.bash_profile hoặc tương đương như thế này:

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

[Trên Linux, bước này không cần thiết, mặc dù có sẵn brew. - khoảng. người dịch]

  1. Thêm plugin minikube и kubelet:

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

[Một lần nữa, bỏ qua bước này trên Linux. - khoảng. người dịch]

  1. Cài đặt minikube và 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

[các phiên bản cụ thể đã được cài đặt, nhưng tôi đã kiểm tra mọi thứ trên các phiên bản mới nhất hiện có dành cho Linux; Tôi nghi ngờ rằng bạn có thể cài đặt phiên bản mới nhất một cách an toàn. - khoảng. người dịch]

Trên Linux, bước này được thực hiện giống như thế này (mọi thứ được đặt trong ~/bin, được liệt kê trong PATH của tôi, ghi chú của người dịch):

$ 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. Tạo máy ảo minikube (VirtualBox phải được cài đặt sẵn):

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

[Mọi thứ đều phù hợp với tôi với nhóm minikube start , không có tham số và có giá trị mặc định. - khoảng. người dịch]

$ 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. Chuyển mạng trong Docker sang chế độ lăng nhăng:

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

  1. Tạo một không gian tên và đánh dấu nút công nhân:

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

  1. Chúng tôi lấy nội dung của kho lưu trữ và ghi đè kiểu xâm nhập trong tệp 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. Cài đặt Helm và triển khai nó bằng cách sử dụng nó:

$ 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

[Trên Linux với các phiên bản mới nhất (đã có v3.0.1) thì sẽ khác một chút. - khoảng. người dịch]

$ 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. Chúng tôi kiểm tra xem mọi thứ đã tăng chưa (TÌNH TRẠNG = Đang chạy hoặc Đã hoàn thành):

$ 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. Cấu hình wsk để hoạt động:

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

Chúng tôi kiểm tra:

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

Các vấn đề và giải pháp

getockopt: kết nối bị từ chối

$ 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

Kiểm tra xem các thùng chứa có trong không gian tên không openwhisk trong trạng thái Running, bởi vì đôi khi nó bị treo và có lỗi CreateContainerConfigError.

Invoker vẫn đang khởi tạo — Init:1/2

Quá trình tải xuống các môi trường thời gian chạy khác nhau có thể mất nhiều thời gian. Để tăng tốc mọi thứ, bạn có thể chỉ định danh sách tối thiểu rút gọn trong tệp mycluster.yaml:

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

Vùng chứa có tên -cài đặt-gói- gặp lỗi

Chỉ cần tăng thời gian chờ cho các bài kiểm tra độ sống.

Cài đặt OpenWhisk qua Knative

Priti Desai đã tiến hành cài đặt trên một cụm trong đám mây IBM, cũng như trên một minikube thông thường, sử dụng Knative Build và BuildTemplates. Tôi cũng sẽ cài đặt trên minukube, dựa trên cách nó đã được mô tả trong blog của chúng tôi trước đó - sử dụng các phiên bản phần mềm mới nhất. Vì Knative Build và BuildTemplates đã chính thức không được dùng nữa nên tôi sẽ sử dụng giải pháp thay thế được đề xuất dưới dạng Tekton Pipelines. Phần còn lại của bài viết được viết sau khi đọc tài liệu về Tekton Pipelines nhưng dựa trên ý tưởng của Priti. Để làm việc, bạn sẽ cần quyền truy cập vào một số Docker Đăng ký - Tôi, giống như tác giả ban đầu, sẽ sử dụng 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

Máy tính không máy chủ với OpenWhisk, Phần 4
Xây dựng và chạy OpenWhisk trên Knative

  1. Lấy nội dung kho lưu trữ này:

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

  1. Chúng tôi đặt dữ liệu để truy cập Sổ đăng ký dưới dạng biến môi trường và lưu chúng dưới dạng bí mật 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

Chúng tôi kiểm tra:

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

  1. Tạo một tài khoản cho môi trường xây dựng:

$ kubectl apply -f service-account.yaml

Chúng tôi kiểm tra:

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

  1. Tạo task xây dựng image cho OpenWhisk

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

  1. Chúng ta chạy task build image (dùng NodeJS làm ví dụ):

Tạo tệp taskrun.yaml có nội dung:

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

Chúng tôi áp dụng dữ liệu hiện tại cho tệp này:

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

Chúng tôi áp dụng:

$ 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

Kiểm tra công việc bao gồm lấy tên của nhóm và xem trạng thái của nó. Bạn cũng có thể xem nhật ký thực hiện của từng bước, ví dụ:

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

Sau khi thực thi, chúng ta sẽ có một image trong Sổ đăng ký có thể được triển khai bằng tiện ích kn, được thiết kế để hoạt động với các dịch vụ Knative, ví dụ:

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

Nếu sử dụng Gloo, bạn có thể kiểm tra chức năng của nó như sau:

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

Các bài viết khác trong loạt bài

Máy tính không máy chủ với OpenWhisk, Phần 1
Máy tính không máy chủ với OpenWhisk, Phần 2
Máy tính không máy chủ với OpenWhisk, Phần 3
Máy tính không máy chủ với OpenWhisk, Phần 4

Nguồn: www.habr.com

Thêm một lời nhận xét