БСссСрвСрныС вычислСния Π½Π° основС OpenWhisk, Ρ‡Π°ΡΡ‚ΡŒ 4

БСссСрвСрныС вычислСния Π½Π° основС OpenWhisk, Ρ‡Π°ΡΡ‚ΡŒ 4

Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ†ΠΈΠΊΠ» ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π½Ρ‹Ρ… Π·Π°ΠΌΠ΅Ρ‚ΠΎΠΊ ΠΎΠ± OpenWhisk ΠΎΡ‚ Π°Π²Ρ‚ΠΎΡ€Π° Priti Desai. БСгодня рассмотрим процСсс развСртывания OpenWhisk ΠΏΠΎΠ²Π΅Ρ€Ρ… Kubernetes с исправлСнными ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ для работоспособности с Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ вСрсиями ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π’Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ описан процСсс запуска Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ OpenWhisk с использованиСм Knative ΠΈ TektonCD Π² Kubernetes с использованиСм срСды исполнСния Nodejs.

Π Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ OpenWhisk Π½Π° Kubernetes

Π—Π° нСсколько Π΄Π½Π΅ΠΉ я ΠΏΡ€ΠΎΠ²Π΅Π»Π° экспСримСнт ΠΏΠΎ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΡŽ OpenWhisk Π² Kubernetes для создания простого ΠΈ быстрого ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½Π° для ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π·Π°Π΄Π°Ρ‡. А ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ я Π½ΠΎΠ²ΠΈΡ‡ΠΎΠΊ Π² Kubernetes β€” полагаю, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Ρ‚ΠΎΡ€Π° дня Π±Ρ‹Π»ΠΎ ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½ΠΎ Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅. Π’ этом Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π΅ΡΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ понятныС инструкции для развСртывания OpenWhisk Π² Kubernetes. Π—Π΄Π΅ΡΡŒ Π±ΡƒΠ΄ΡƒΡ‚ инструкции для развСртывания, сдСланныС для Mac (я Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Ρƒ Π΄Π΅Π»Π°Ρ‚ΡŒ всС Π½Π° Linux, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ Linux. β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°).

  1. УстанавливаСм ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ asdf, послС Ρ‡Π΅Π³ΠΎ автоматичСски исправляСм ~/.bash_profile ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π°Π½Π°Π»ΠΎΠ³ Ρ‚Π°ΠΊ:

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

[На Linux этот шаг Π½Π΅ Π½ΡƒΠΆΠ΅Π½, хотя brew Π΅ΡΡ‚ΡŒ. β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°]

  1. ДобавляСм ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ minikube ΠΈ kubelet:

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

[ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅ пропускаСм этот шаг Π½Π° Linux. β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°]

  1. Π‘Ρ‚Π°Π²ΠΈΠΌ minikube ΠΈ 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

[ставятся ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ вСрсии, Π½ΠΎ я провСрял всС Π½Π° послСдних доступных вСрсиях для Linux; ΠΏΠΎΠ΄ΠΎΠ·Ρ€Π΅Π²Π°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ смСло ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ latest. β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°]

На Linux этот шаг дСлаСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ (всС ставится Π² ~/bin, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρƒ мСня прописан Π² PATH, ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°):

$ 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. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ minikube (Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ установлСн VirtualBox):

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

[Π£ мСня всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ minikube start , Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ со значСниями ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°]

$ 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. ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΡΠ΅Ρ‚ΡŒ Π² Docker Π² Π½Π΅Ρ€Π°Π·Π±ΠΎΡ€Ρ‡ΠΈΠ²Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ:

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

  1. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ namespace ΠΈ ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΡƒΠ·Π΅Π»:

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

  1. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ содСрТимоС рСпозитория ΠΈ пСрСопрСдСляСм Ρ‚ΠΈΠΏ для ingress Π² Ρ„Π°ΠΉΠ»Π΅ 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. УстанавливаСм Helm ΠΈ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ с Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ:

$ 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

[На Linux с послСдними вСрсиями (Π±Ρ‹Π»Π° доступна v3.0.1) Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ. β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°]

$ 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. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ всС поднялось (STATUS = Running ΠΈΠ»ΠΈ Completed):

$ 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. НастраиваСм wsk для Ρ€Π°Π±ΠΎΡ‚Ρ‹:

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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ:

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

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

getsockopt: connection refused

$ 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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ Π² namespace openwhisk Π² статусС Running, Ρ‚.ΠΊ. ΠΈΠ½ΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ ΠΏΠ°Π΄Π°Π΅Ρ‚ с ошибками CreateContainerConfigError.

Invoker still initializing β€” Init:1/2

ΠŸΡ€ΠΎΡ†Π΅ΡΡ скачивания всСвозмоТных срСд выполнСния ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Для ускорСния ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ сокращСнный ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ список Π² Ρ„Π°ΠΉΠ»Π΅ mycluster.yaml:

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

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с ΠΈΠΌΠ΅Π½Π΅ΠΌ -install-packages- вываливаСтся Π² Error

ΠŸΡ€ΠΎΡΡ‚ΠΎ нараститС Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Ρ‹ для liveness тСстов.

Установка OpenWhisk ΠΏΠΎΠ²Π΅Ρ€Ρ… Knative

Priti Desai ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠ»Π° установку ΠΏΠΎΠ²Π΅Ρ€Ρ… кластСра Π² ΠΎΠ±Π»Π°ΠΊΠ΅ IBM, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ minikube, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Knative Build ΠΈ BuildTemplates. Π― Ρ‚ΠΎΠΆΠ΅ Π±ΡƒΠ΄Ρƒ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Ρ€Ρ… minukube, ΠΏΠΎ ΠΌΠΎΡ‚ΠΈΠ²Π°ΠΌ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ это Π±Ρ‹Π»ΠΎ описано Π² нашСм Π±Π»ΠΎΠ³Π΅ Ρ€Π°Π½Π΅Π΅ β€” с использованиСм послСдних вСрсий ПО. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Knative Build ΠΈ BuildTemplates ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌΠΈ, Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡƒΡŽ Π·Π°ΠΌΠ΅Π½Ρƒ Π² Π²ΠΈΠ΄Π΅ Tekton Pipelines. Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΠΈ написана послС прочтСния Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΊ Tekton Pipelines, Π½ΠΎ основана Π½Π° идСях Priti. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ потрСбуСтся доступ ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Docker Registry β€” я, ΠΊΠ°ΠΊ ΠΈ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Π°Ρ Π°Π²Ρ‚ΠΎΡ€, Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ 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

БСссСрвСрныС вычислСния Π½Π° основС OpenWhisk, Ρ‡Π°ΡΡ‚ΡŒ 4
Π‘Π±ΠΎΡ€ΠΊΠ° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° OpenWhisk ΠΏΠΎΠ²Π΅Ρ€Ρ… Knative

  1. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ содСрТимоС этого рСпозитория:

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

  1. ВыставляСм Π² Π²ΠΈΠ΄Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния Π΄Π°Π½Π½Ρ‹Π΅ для доступа ΠΊ Registry ΠΈ сохраняСм ΠΈΡ… Π² Π²ΠΈΠ΄Π΅ сСкрСта 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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ:

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

  1. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡƒΡ‡Π΅Ρ‚Π½ΡƒΡŽ запись для сборки ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ:

$ kubectl apply -f service-account.yaml

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ:

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

  1. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π·Π°Π΄Π°Ρ‡Ρƒ для сборки ΠΎΠ±Ρ€Π°Π·Π° для OpenWhisk

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

  1. ЗапускаСм Π·Π°Π΄Π°Ρ‡Ρƒ для сборки ΠΎΠ±Ρ€Π°Π·Π° (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ NodeJS):

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» taskrun.yaml с содСрТимым:

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

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ для этого Ρ„Π°ΠΉΠ»Π°:

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

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ:

$ 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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΈΠΌΠ΅Π½ΠΈ pod`Π°, просмотра Π΅Π³ΠΎ статуса. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π» выполнСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ шага, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

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

ПослС выполнСния Ρƒ нас Π² Registry появится ΠΎΠ±Ρ€Π°Π·, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ kn, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Knative сСрвисами, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

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

Π’ случаС использования Gloo ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊ:

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

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ Ρ†ΠΈΠΊΠ»Π°

БСссСрвСрныС вычислСния Π½Π° основС OpenWhisk, Ρ‡Π°ΡΡ‚ΡŒ 1
БСссСрвСрныС вычислСния Π½Π° основС OpenWhisk, Ρ‡Π°ΡΡ‚ΡŒ 2
БСссСрвСрныС вычислСния Π½Π° основС OpenWhisk, Ρ‡Π°ΡΡ‚ΡŒ 3
БСссСрвСрныС вычислСния Π½Π° основС OpenWhisk, Ρ‡Π°ΡΡ‚ΡŒ 4

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com