เจ“เจชเจจเจตเจฟเจธเจ• เจจเจพเจฒ เจธเจฐเจตเจฐ เจฐเจนเจฟเจค เจ•เฉฐเจชเจฟเจŠเจŸเจฟเฉฐเจ—, เจญเจพเจ— 4

เจ“เจชเจจเจตเจฟเจธเจ• เจจเจพเจฒ เจธเจฐเจตเจฐ เจฐเจนเจฟเจค เจ•เฉฐเจชเจฟเจŠเจŸเจฟเฉฐเจ—, เจญเจพเจ— 4

เจ‡เจน เจฒเฉ‡เจ– เจฒเฉ‡เจ–เจ• เจคเฉ‹เจ‚ เจ“เจชเจจเจตเจฟเจธเจ• เจฌเจพเจฐเฉ‡ เจ…เจจเฉเจตเจพเจฆ เจ•เฉ€เจคเฉ‡ เจจเฉ‹เจŸเจพเจ‚ เจฆเฉ€ เจฒเฉœเฉ€ เจจเฉ‚เฉฐ เจ–เจคเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ เจชเฉเจฐเฉ€เจคเฉ€ เจฆเฉ‡เจธเจพเจˆ. เจ…เฉฑเจœ เจ…เจธเฉ€เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจฆเฉ‡ เจฎเฉŒเจœเฉ‚เจฆเจพ เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจธเจนเฉ€ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจ‰เฉฑเจคเฉ‡ OpenWhisk เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเจจ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจฆเฉ‡เจ–เจพเจ‚เจ—เฉ‡เฅค เจ‡เจน Nodejs เจฐเจจเจŸเจพเจˆเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ Kubernetes 'เจคเฉ‡ Knative เจ…เจคเฉ‡ TektonCD เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ OpenWhisk เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจตเฉ€ เจ•เจตเจฐ เจ•เจฐเฉ‡เจ—เจพเฅค

Kubernetes 'เจคเฉ‡ OpenWhisk เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เฉ€เจคเจพ เจœเจพ เจฐเจฟเจนเจพ เจนเฉˆ

เจ•เฉเจ เจฆเจฟเจจเจพเจ‚ เจฆเฉ‡ เจฆเฉŒเจฐเจพเจจ, เจฎเฉˆเจ‚ เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ เจ…เจคเฉ‡ เจคเฉ‡เจœเจผ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจฎเฉˆเจฆเจพเจจ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจฟเฉฑเจš เจ“เจชเจจเจตเจฟเจธเจ• เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเจจ เจฆเจพ เจชเฉเจฐเจฏเฉ‹เจ— เจ•เฉ€เจคเจพเฅค เจ…เจคเฉ‡ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฎเฉˆเจ‚ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฒเจˆ เจจเจตเจพเจ‚ เจนเจพเจ‚, เจฎเฉ‡เจฐเจพ เจฎเฉฐเจจเจฃเจพ เจนเฉˆ เจ•เจฟ เจธเจซเจฒ เจคเฉˆเจจเจพเจคเฉ€ 'เจคเฉ‡ เจกเฉ‡เจข เจฆเจฟเจจ เจ–เจฐเจš เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€เฅค IN เจ‡เจน เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€เจ†เจ‚ เจ•เฉ‹เจฒ Kubernetes เจ‰เฉฑเจคเฉ‡ OpenWhisk เจจเฉ‚เฉฐ เจคเจพเจ‡เจจเจพเจค เจ•เจฐเจจ เจฒเจˆ เจฌเจนเฉเจค เจธเจชเฉฑเจธเจผเจŸ เจจเจฟเจฐเจฆเฉ‡เจธเจผ เจนเจจเฅค เจ‡เฉฑเจฅเฉ‡ เจฎเฉˆเจ• เจฒเจˆ เจคเฉˆเจจเจพเจคเฉ€ เจจเจฟเจฐเจฆเฉ‡เจธเจผ เจนเจจ (เจฎเฉˆเจ‚ เจฒเฉ€เจจเจ•เจธ 'เจคเฉ‡ เจตเฉ€ เจธเจญ เจ•เฉเจ เจ•เจฐเจพเจ‚เจ—เจพ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฎเฉˆเจ‚ เจฒเฉ€เจจเจ•เจธ เจจเฉ‚เฉฐ เจคเจฐเจœเฉ€เจน เจฆเจฟเฉฐเจฆเจพ เจนเจพเจ‚เฅค - เจฒเจ—เจญเจ— เจ…เจจเฉเจตเจพเจฆเจ•)

  1. เจชเฉˆเจ•เฉ‡เจœ เจฎเฉˆเจจเฉ‡เจœเจฐ เจจเฉ‚เฉฐ เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เฉ€เจคเจพ เจœเจพ เจฐเจฟเจนเจพ เจนเฉˆ asdf, เจœเจฟเจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจ†เจช เจ เฉ€เจ• เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ ~/.bash_profile เจœเจพเจ‚ เจ‡เจธ เจฆเฉ‡ เจฌเจฐเจพเจฌเจฐ:

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

[เจฒเฉ€เจจเจ•เจธ 'เจคเฉ‡ เจ‡เจธ เจ•เจฆเจฎ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจนเจพเจฒเจพเจ‚เจ•เจฟ เจฌเจฐเจฟเจŠ เจ‰เจชเจฒเจฌเจง เจนเฉˆเฅค - เจฒเจ—เจญเจ— เจ…เจจเฉเจตเจพเจฆเจ•]

  1. เจชเจฒเฉฑเจ—เจ‡เจจ เจœเฉ‹เฉœ เจฐเจฟเจนเจพ เจนเฉˆ minikube ะธ kubelet:

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

[เจฆเฉเจฌเจพเจฐเจพ, เจฒเฉ€เจจเจ•เจธ 'เจคเฉ‡ เจ‡เจธ เจชเจ— เจจเฉ‚เฉฐ เจ›เฉฑเจก เจฆเจฟเจ“เฅค - เจฒเจ—เจญเจ— เจ…เจจเฉเจตเจพเจฆเจ•]

  1. เจฎเจฟเจจเฉ€เจ•เฉ‚เจฌ เจ…เจคเฉ‡ เจ•เฉเจฌเฉ‡เจฒเฉ‡เจŸ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเฉ‹:

$ asdf install kubectl 1.9.0
$ asdf global kubectl 1.9.0
$ asdf install minikube 0.25.2
$ asdf global minikube 0.25.2

[เจ–เจพเจธ เจธเฉฐเจธเจ•เจฐเจฃ เจธเจฅเจพเจชเจฟเจค เจ•เฉ€เจคเฉ‡ เจ—เจ เจนเจจ, เจชเจฐ เจฎเฉˆเจ‚ เจฒเฉ€เจจเจ•เจธ เจฒเจˆ เจจเจตเฉ€เจจเจคเจฎ เจ‰เจชเจฒเจฌเจง เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ 'เจคเฉ‡ เจนเจฐ เจšเฉ€เจœเจผ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เฉ€เจคเฉ€ เจนเฉˆ; เจฎเฉˆเจจเฉ‚เฉฐ เจธเจผเฉฑเจ• เจนเฉˆ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจขเฉฐเจ— เจจเจพเจฒ เจจเจตเฉ€เจจเจคเจฎ เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค - เจฒเจ—เจญเจ— เจ…เจจเฉเจตเจพเจฆเจ•]

เจฒเฉ€เจจเจ•เจธ 'เจคเฉ‡, เจ‡เจน เจ•เจฆเจฎ เจ•เฉเจ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ (เจธเจญ เจ•เฉเจ ~/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 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. เจกเฉŒเจ•เจฐ เจตเจฟเฉฑเจš เจจเฉˆเจŸเจตเจฐเจ• เจจเฉ‚เฉฐ เจ…เจธเจผเจฒเฉ€เจฒ เจฎเฉ‹เจก เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฃเจพ:

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

  1. เจ‡เฉฑเจ• เจจเฉ‡เจฎเจธเจชเฉ‡เจธ เจฌเจฃเจพเจ“ เจ…เจคเฉ‡ เจตเจฐเจ•เจฐ เจจเฉ‹เจก เจจเฉ‚เฉฐ เจฎเจพเจฐเจ• เจ•เจฐเฉ‹:

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

  1. เจ…เจธเฉ€เจ‚ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ 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. เจนเฉˆเจฒเจฎ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเฉ‹ เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเฉ‹:

$ 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

[เจจเจตเฉ€เจจเจคเจฎ เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจตเจพเจฒเฉ‡ เจฒเฉ€เจจเจ•เจธ 'เจคเฉ‡ (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 = เจšเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉˆ เจœเจพเจ‚ เจชเฉ‚เจฐเจพ เจนเฉ‹เจ‡เจ†):

$ 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: เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจคเฉ‹เจ‚ เจ‡เจจเจ•เจพเจฐ เจ•เจฐ เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ†

$ 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

เจœเจพเจ‚เจš เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ เจ•เจฟ เจกเฉฑเจฌเฉ‡ เจจเฉ‡เจฎเจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจนเจจ openwhisk เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš Running, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ•เจˆ เจตเจพเจฐ เจ‡เจน เจ—เจฒเจคเฉ€เจ†เจ‚ เจจเจพเจฒ เจ•เจฐเฉˆเจธเจผ เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆ CreateContainerConfigError.

เจ‡เจจเจตเฉ‹เจ•เจฐ เจ…เจœเฉ‡ เจตเฉ€ เจธเจผเฉเจฐเฉ‚ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ โ€” Init:1/2

เจตเฉฑเจ–-เจตเฉฑเจ– เจฐเจจเจŸเจพเจˆเจฎ เจตเจพเจคเจพเจตเจฐเจฃเจพเจ‚ เจจเฉ‚เฉฐ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเจจ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจตเจฟเฉฑเจš เจฒเฉฐเจฎเจพ เจธเจฎเจพเจ‚ เจฒเฉฑเจ— เจธเจ•เจฆเจพ เจนเฉˆเฅค เจšเฉ€เจœเจผเจพเจ‚ เจจเฉ‚เฉฐ เจคเฉ‡เจœเจผ เจ•เจฐเจจ เจฒเจˆ, เจคเฉเจธเฉ€เจ‚ เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ›เฉ‹เจŸเฉ€ เจ•เฉ€เจคเฉ€ เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจธเฉ‚เจšเฉ€ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ mycluster.yaml:

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

เจจเจพเจฎ เจฆเฉ‡ เจจเจพเจฒ เจ•เฉฐเจŸเฉ‡เจจเจฐ -เจชเฉˆเจ•เฉ‡เจœ เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเฉ‹- เจ—เจฒเจคเฉ€ เจฒเจˆ เจ•เจฐเฉˆเจธเจผ

เจœเฉ€เจตเจฃเจคเจพ เจŸเฉˆเจธเจŸเจพเจ‚ เจฒเจˆ เจธเจฎเจพเจ‚-เจ…เฉฐเจคเจฐเจพเจฒ เจตเจงเจพเจ“เฅค

Knative เจ‰เฉฑเจคเฉ‡ OpenWhisk เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเจจเจพ

เจชเฉเจฐเฉ€เจคเฉ€ เจฆเฉ‡เจธเจพเจˆ เจจเฉ‡ เจจเฉ‡เจŸเจฟเจต เจฌเจฟเจฒเจก เจ…เจคเฉ‡ เจฌเจฟเจฒเจก เจŸเฉˆเจ‚เจชเจฒเฉ‡เจŸเจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, IBM เจ•เจฒเจพเจ‰เจก เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ•เจฒเฉฑเจธเจŸเจฐ เจฆเฉ‡ เจธเจฟเจ–เจฐ 'เจคเฉ‡, เจ…เจคเฉ‡ เจจเจพเจฒ เจนเฉ€ เจ‡เฉฑเจ• เจจเจฟเจฏเจฎเจค เจฎเจฟเจจเฉ€เจ•เจฟเจŠเจฌ 'เจคเฉ‡ เจธเจฅเจพเจชเจจเจพ เจ•เฉ€เจคเฉ€เฅค เจฎเฉˆเจ‚ เจ•เจฟเจตเฉ‡เจ‚ เจฆเฉ‡ เจ†เจงเจพเจฐ 'เจคเฉ‡, เจฎเจฟเจจเจ•เฉ‚เจฌเฉ‡ เจฆเฉ‡ เจธเจฟเจ–เจฐ 'เจคเฉ‡ เจตเฉ€ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจพเจ‚เจ—เจพ เจ‡เจน เจตเจฐเจฃเจจ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€ เจธเจพเจกเฉ‡ เจฌเจฒเฉŒเจ— เจตเจฟเฉฑเจš เจชเจนเจฟเจฒเจพเจ‚ - เจจเจตเฉ€เจจเจคเจฎ เจธเฉŒเจซเจŸเจตเฉ‡เจ…เจฐ เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจเฅค เจ•เจฟเจ‰เจ‚เจ•เจฟ Knative Build เจ…เจคเฉ‡ BuildTemplates เจจเฉ‚เฉฐ เจ…เจงเจฟเจ•เจพเจฐเจค เจคเฉŒเจฐ 'เจคเฉ‡ เจฌเจฐเจคเจฐเจซเจผ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ, เจฎเฉˆเจ‚ เจŸเฉ‡เจ•เจŸเจจ เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจธเจฟเจซเจผเจพเจฐเจฟเจธเจผ เจ•เฉ€เจคเฉ€ เจคเจฌเจฆเฉ€เจฒเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจพเจ‚เจ—เจพเฅค เจฌเจพเจ•เฉ€ เจฒเฉ‡เจ– เจŸเฉ‡เจ•เจŸเจจ เจชเจพเจˆเจชเจฒเจพเจˆเจจเจœเจผ เจฒเจˆ เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจฒเจฟเจ–เจฟเจ† เจ—เจฟเจ† เจธเฉ€, เจชเจฐ เจชเฉเจฐเฉ€เจคเฉ€ เจฆเฉ‡ เจตเจฟเจšเจพเจฐเจพเจ‚ 'เจคเฉ‡ เจ…เจงเจพเจฐเจค เจนเฉˆเฅค เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เฉเจ เจกเฉŒเจ•เจฐ เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจฆเฉ€ เจฒเฉ‹เฉœ เจชเจตเฉ‡เจ—เฉ€ - เจฎเฉˆเจ‚, เจ…เจธเจฒ เจฒเฉ‡เจ–เจ• เจตเจพเจ‚เจ—, เจกเฉŒเจ•เจฐเจนเฉฑเจฌ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจพเจ‚เจ—เจพเฅค

$ 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

เจ“เจชเจจเจตเจฟเจธเจ• เจจเจพเจฒ เจธเจฐเจตเจฐ เจฐเจนเจฟเจค เจ•เฉฐเจชเจฟเจŠเจŸเจฟเฉฐเจ—, เจญเจพเจ— 4
Knative เจฆเฉ‡ เจธเจฟเจ–เจฐ 'เจคเฉ‡ OpenWhisk เจฌเจฃเจพเจ‰เจฃเจพ เจ…เจคเฉ‡ เจšเจฒเจพเจ‰เจฃเจพ

  1. เจธเจฎเฉฑเจ—เจฐเฉ€ เจชเฉเจฐเจพเจชเจค เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ เจ‡เจน เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€:

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

  1. เจ…เจธเฉ€เจ‚ เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เจฐเจจ เจฒเจˆ เจกเฉ‡เจŸเจพ เจธเฉˆเจŸ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจธเฉ€เจ•เจฐเฉ‡เจŸ เจตเจœเฉ‹เจ‚ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚:

$ 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. เจ…เจธเฉ€เจ‚ เจšเจฟเฉฑเจคเจฐ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ•เฉฐเจฎ เจšเจฒเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚ (เจ‰เจฆเจพเจนเจฐเจฃ เจตเจœเฉ‹เจ‚ เจจเฉ‹เจกเจœเฉ‡เจเจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ):

เจธเจฎเฉฑเจ—เจฐเฉ€ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• 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

เจ•เฉฐเจฎ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจตเจฟเฉฑเจš เจชเฉŒเจก เจฆเจพ เจจเจพเจฎ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจ‰เจธเจฆเฉ€ เจธเจฅเจฟเจคเฉ€ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เจฃเจพ เจธเจผเจพเจฎเจฒ เจนเฉˆเฅค เจคเฉเจธเฉ€เจ‚ เจนเจฐเฉ‡เจ• เจชเฉœเจพเจ… เจฆเจพ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจฒเฉŒเจ— เจตเฉ€ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ:

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

เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจšเจฟเฉฑเจคเจฐ เจนเฉ‹เจตเฉ‡เจ—เจพ เจœเฉ‹ kn เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจคเฉˆเจจเจพเจค เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจจเฉˆเจŸเจฟเจต เจธเฉ‡เจตเจพเจตเจพเจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ:

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

เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจ—เจฒเฉ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจ‡เจธเจฆเฉ€ เจ•เจพเจฐเจœเจธเจผเฉ€เจฒเจคเจพ เจจเฉ‚เฉฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹:

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

เจฒเฉœเฉ€ เจตเจฟเฉฑเจš เจนเฉ‹เจฐ เจฒเฉ‡เจ–

เจ“เจชเจจเจตเจฟเจธเจ• เจจเจพเจฒ เจธเจฐเจตเจฐ เจฐเจนเจฟเจค เจ•เฉฐเจชเจฟเจŠเจŸเจฟเฉฐเจ—, เจญเจพเจ— 1
เจ“เจชเจจเจตเจฟเจธเจ• เจจเจพเจฒ เจธเจฐเจตเจฐ เจฐเจนเจฟเจค เจ•เฉฐเจชเจฟเจŠเจŸเจฟเฉฐเจ—, เจญเจพเจ— 2
เจ“เจชเจจเจตเจฟเจธเจ• เจจเจพเจฒ เจธเจฐเจตเจฐ เจฐเจนเจฟเจค เจ•เฉฐเจชเจฟเจŠเจŸเจฟเฉฐเจ—, เจญเจพเจ— 3
เจ“เจชเจจเจตเจฟเจธเจ• เจจเจพเจฒ เจธเจฐเจตเจฐ เจฐเจนเจฟเจค เจ•เฉฐเจชเจฟเจŠเจŸเจฟเฉฐเจ—, เจญเจพเจ— 4

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹