{"id":295992,"date":"2019-12-18T15:00:25","date_gmt":"2019-12-18T15:00:25","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=295992"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=295992","title":{"rendered":"\u0411\u0435\u0441\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 OpenWhisk, \u0447\u0430\u0441\u0442\u044c 4"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/481000\/\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/yk\/jd\/cb\/ykjdcbuozxj70sxwrtxebx0l6u8.png\"><\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442 \u0446\u0438\u043a\u043b \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043d\u044b\u0445 \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u043e\u0431 OpenWhisk \u043e\u0442 \u0430\u0432\u0442\u043e\u0440\u0430 <a href=\"https:\/\/medium.com\/@pdesai8\">Priti Desai<\/a>. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f OpenWhisk \u043f\u043e\u0432\u0435\u0440\u0445 Kubernetes \u0441 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0441 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0422\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 OpenWhisk \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Knative \u0438 TektonCD \u0432 Kubernetes \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Nodejs.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2 id=\"razvorachivaem-openwhisk-na-kubernetes\">\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c OpenWhisk \u043d\u0430 Kubernetes<\/h2>\n<p>  <\/p>\n<p>\u0417\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 \u044f \u043f\u0440\u043e\u0432\u0435\u043b\u0430 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043f\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044e OpenWhisk \u0432 Kubernetes \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0438 \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0434\u043b\u044f \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u0434\u0430\u0447. \u0410 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044f \u043d\u043e\u0432\u0438\u0447\u043e\u043a \u0432 Kubernetes \u2014 \u043f\u043e\u043b\u0430\u0433\u0430\u044e, \u0447\u0442\u043e \u043f\u043e\u043b\u0442\u043e\u0440\u0430 \u0434\u043d\u044f \u0431\u044b\u043b\u043e \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043e \u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435. \u0412 <a href=\"https:\/\/github.com\/apache\/incubator-openwhisk-deploy-kube\">\u044d\u0442\u043e\u043c<\/a> \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0435\u0441\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f OpenWhisk \u0432 Kubernetes. \u0417\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0443\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f Mac (<em>\u044f \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0443 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u0430 Linux, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e Linux.<\/em> \u2014 \u043f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a\u0430).<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 <code>asdf<\/code>, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c <code>~\/.bash_profile<\/code> \u0438\u043b\u0438 \u0435\u0433\u043e \u0430\u043d\u0430\u043b\u043e\u0433 \u0442\u0430\u043a:<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ brew install asdf $ [ -s \"\/usr\/local\/opt\/asdf\/asdf.sh\" ] &amp;&amp; . \/usr\/local\/opt\/asdf\/asdf.sh $ source ~\/.bash_profile<\/code><\/pre>\n<p>  <\/p>\n<p>[<em>\u041d\u0430 Linux \u044d\u0442\u043e\u0442 \u0448\u0430\u0433 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u0445\u043e\u0442\u044f brew \u0435\u0441\u0442\u044c.<\/em> \u2014 \u043f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a\u0430]<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u044b <code>minikube<\/code> \u0438 <code>kubelet<\/code>:<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ asdf plugin-add kubectl $ asdf plugin-add minikube<\/code><\/pre>\n<p>  <\/p>\n<p>[<em>\u041e\u043f\u044f\u0442\u044c \u0436\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u0448\u0430\u0433 \u043d\u0430 Linux.<\/em> \u2014 \u043f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a\u0430]<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0421\u0442\u0430\u0432\u0438\u043c minikube \u0438 kubelet:<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ asdf install kubectl 1.9.0 $ asdf global kubectl 1.9.0 $ asdf install minikube 0.25.2 $ asdf global minikube 0.25.2<\/code><\/pre>\n<p>  <\/p>\n<p>[<em>\u0441\u0442\u0430\u0432\u044f\u0442\u0441\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438, \u043d\u043e \u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b \u0432\u0441\u0435 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0434\u043b\u044f Linux; \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u044e, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u0441\u0442\u0430\u0432\u0438\u0442\u044c latest.<\/em> \u2014 \u043f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a\u0430]<\/p>\n<p>  <\/p>\n<p>\u041d\u0430 Linux \u044d\u0442\u043e\u0442 \u0448\u0430\u0433 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a (\u0432\u0441\u0435 \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u0432 ~\/bin, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443 \u043c\u0435\u043d\u044f \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d \u0432 PATH, \u043f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a\u0430):<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ curl -L0 minikube https:\/\/storage.googleapis.com\/minikube\/releases\/latest\/minikube-linux-amd64 &amp;&amp; chmod +x minikube &amp;&amp; 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 &amp;&amp; chmod +x kubectl &amp;&amp; mv kubectl ~\/bin\/<\/code><\/pre>\n<p>  <\/p>\n<ol>\n<li>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 minikube (\u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d VirtualBox):<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ minikube start --cpus 2 --memory 4096 --kubernetes-version=v1.9.0 --extra-config=apiserver.Authorization.Mode=RBAC<\/code><\/pre>\n<p>  <\/p>\n<p>[<em>\u0423 \u043c\u0435\u043d\u044f \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439<\/em> <code>minikube start<\/code> <em>, \u0431\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/em> \u2014 \u043f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a\u0430]<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ minikube start   minikube v1.5.2 on Debian 8.11   Automatically selected the 'virtualbox' driver   Downloading VM boot image ...     &gt; minikube-v1.5.1.iso.sha256: 65 B \/ 65 B [--------------] 100.00% ? p\/s 0s     &gt; 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\"<\/code><\/pre>\n<p>  <\/p>\n<ol>\n<li>\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0441\u0435\u0442\u044c \u0432 Docker \u0432 \u043d\u0435\u0440\u0430\u0437\u0431\u043e\u0440\u0447\u0438\u0432\u044b\u0439 \u0440\u0435\u0436\u0438\u043c:<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ minikube ssh -- sudo ip link set docker0 promisc on<\/code><\/pre>\n<p>  <\/p>\n<ol>\n<li>\u0421\u043e\u0437\u0434\u0430\u0435\u043c namespace \u0438 \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0443\u0437\u0435\u043b:<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ kubectl create namespace openwhisk $ kubectl label nodes --all openwhisk-role=invoker<\/code><\/pre>\n<p>  <\/p>\n<ol>\n<li>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0442\u0438\u043f \u0434\u043b\u044f ingress \u0432 \u0444\u0430\u0439\u043b\u0435 mycluster.yaml:<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ git clone https:\/\/github.com\/apache\/incubator-openwhisk-deploy-kube.git $ cd incubator-openwhisk-deploy-kube\/ $ cat &lt;&lt; \"EOF\" &gt; mycluster.yaml whisk:     ingress:         type: NodePort             api_host_name: 192.168.99.100             api_host_port: 31001 nginx:     httpsNodePort: 31001 EOF<\/code><\/pre>\n<p>  <\/p>\n<ol>\n<li>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c Helm \u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e:<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ brew install kubernetes-helm $ helm init # init Helm Tiller, \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0430 Helm v3+ $ kubectl get pods -n kube-system # verify that tiller-deploy is in the running state, \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0430 helm v3+ $ kubectl create clusterrolebinding tiller-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default $ helm install .\/openwhisk\/helm\/ --namespace=openwhisk -f mycluster.yaml<\/code><\/pre>\n<p>  <\/p>\n<p>[<em>\u041d\u0430 Linux \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 (\u0431\u044b\u043b\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 v3.0.1) \u0431\u0443\u0434\u0435\u0442 \u0447\u0443\u0442\u044c \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443.<\/em> \u2014 \u043f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a\u0430]<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ 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<\/code><\/pre>\n<p>  <\/p>\n<ol>\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u0434\u043d\u044f\u043b\u043e\u0441\u044c (STATUS = Running \u0438\u043b\u0438 Completed):<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ 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<\/code><\/pre>\n<p>  <\/p>\n<ol>\n<li>\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c wsk \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b:<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ wsk property set --apihost 192.168.99.100:31001 $ wsk property set --auth 23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwP<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ wsk -i list Entities in namespace: default packages actions triggers rules<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"problemy-i-ih-resheniya\">\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438 \u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h2>\n<p>  <\/p>\n<h3 id=\"getsockopt-connection-refused\">getsockopt: connection refused<\/h3>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ 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&amp;skip=0: dial tcp 192.168.99.100:31001: getsockopt: connection refused<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 namespace <code>openwhisk<\/code> \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 <code>Running<\/code>, \u0442.\u043a. \u0438\u043d\u043e\u0433\u0434\u0430 \u043e\u043d\u043e \u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 <code>CreateContainerConfigError<\/code>.<\/p>\n<p>  <\/p>\n<h3 id=\"invoker-still-initializing--init12\">Invoker still initializing \u2014 Init:1\/2<\/h3>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u0440\u0435\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0414\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0444\u0430\u0439\u043b\u0435 <code>mycluster.yaml<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">whisk:   runtimes: \"runtimes-minimal-travis.json\"<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"konteyner-s-imenem--install-packages--vyvalivaetsya-v-error\">\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <em>-install-packages-<\/em> \u0432\u044b\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 Error<\/h3>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0440\u0430\u0441\u0442\u0438\u0442\u0435 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u0434\u043b\u044f liveness \u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<h2 id=\"ustanovka-openwhisk-poverh-knative\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 OpenWhisk \u043f\u043e\u0432\u0435\u0440\u0445 Knative<\/h2>\n<p>  <\/p>\n<p>Priti Desai \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u043f\u043e\u0432\u0435\u0440\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 IBM, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u043c minikube, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Knative Build \u0438 BuildTemplates. \u042f \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0443 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0440\u0445 minukube, \u043f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u0442\u043e\u0433\u043e, \u043a\u0430\u043a <a href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/475630\/\">\u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e<\/a> \u0432 \u043d\u0430\u0448\u0435\u043c \u0431\u043b\u043e\u0433\u0435 \u0440\u0430\u043d\u0435\u0435 \u2014 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u041f\u041e. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 Knative Build \u0438 BuildTemplates \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u044b \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043c\u0438, \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u0443\u044e \u0437\u0430\u043c\u0435\u043d\u0443 \u0432 \u0432\u0438\u0434\u0435 Tekton Pipelines. \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043a Tekton Pipelines, \u043d\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0438\u0434\u0435\u044f\u0445 Priti. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 Docker Registry \u2014 \u044f, \u043a\u0430\u043a \u0438 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0430\u0432\u0442\u043e\u0440, \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c DockerHub.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ 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<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gd\/9j\/is\/gd9jissmmsuh_jbjvtw7cwp_sea.png\"><br \/>  <em>\u0421\u0431\u043e\u0440\u043a\u0430 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430 OpenWhisk \u043f\u043e\u0432\u0435\u0440\u0445 Knative<\/em><\/p>\n<p>  <\/p>\n<ol>\n<li>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 <a href=\"https:\/\/github.com\/tektoncd\/catalog.git\">\u044d\u0442\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/a>:<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ git clone https:\/\/github.com\/tektoncd\/catalog\/ $ cd catalog\/openwhisk<\/code><\/pre>\n<p>  <\/p>\n<ol>\n<li>\u0412\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0432\u0438\u0434\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a Registry \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438\u0445 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u0430 Kubernetes:<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ export DOCKER_USERNAME=&lt;your docker hub username&gt; $ export DOCKER_PASSWORD=&lt;your docker hub password&gt; $ sed -e 's\/${DOCKER_USERNAME}\/'\"$DOCKER_USERNAME\"'\/' -e 's\/${DOCKER_PASSWORD}\/'\"$DOCKER_PASSWORD\"'\/' docker-secret.yaml.tmpl &gt; docker-secret.yaml $ kubectl apply -f docker-secret.yaml<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ kubectl get secret NAME                    TYPE                                  DATA      AGE dockerhub-user-pass     kubernetes.io\/basic-auth              2         21s<\/code><\/pre>\n<p>  <\/p>\n<ol>\n<li>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439:<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ kubectl apply -f service-account.yaml<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ kubectl get serviceaccount\/openwhisk-runtime-builder NAME                        SECRETS   AGE openwhisk-runtime-builder   2         31m<\/code><\/pre>\n<p>  <\/p>\n<ol>\n<li>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u0430 \u0434\u043b\u044f OpenWhisk<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ kubectl apply -f openwhisk.yaml task.tekton.dev\/openwhisk created<\/code><\/pre>\n<p>  <\/p>\n<ol>\n<li>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u0430 (\u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 NodeJS):<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b taskrun.yaml \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># 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 ---<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ sed 's\/${DOCKER_USERNAME}\/'\"$DOCKER_USERNAME\"'\/' -i taskrun.yaml<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ 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<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0438\u043c\u0435\u043d\u0438 pod`\u0430, \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0435\u0433\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0430. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0448\u0430\u0433\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ 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\"}<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0443 \u043d\u0430\u0441 \u0432 Registry \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0437, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u044b kn, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Knative \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">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<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Gloo \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ 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!\"}<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"drugie-stati-cikla\">\u0414\u0440\u0443\u0433\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0446\u0438\u043a\u043b\u0430<\/h2>\n<p>  <\/p>\n<p><a href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/477336\/\">\u0411\u0435\u0441\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 OpenWhisk, \u0447\u0430\u0441\u0442\u044c 1<\/a><br \/>  <a href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/477628\/\">\u0411\u0435\u0441\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 OpenWhisk, \u0447\u0430\u0441\u0442\u044c 2<\/a><br \/>  <a href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/479492\/\">\u0411\u0435\u0441\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 OpenWhisk, \u0447\u0430\u0441\u0442\u044c 3<\/a><br \/>  <a href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/481000\/\">\u0411\u0435\u0441\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 OpenWhisk, \u0447\u0430\u0441\u0442\u044c 4<\/a><\/p>\n<\/div>\n<p>               <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d() } } }t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>      <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/481000\/\"> https:\/\/habr.com\/ru\/company\/southbridge\/blog\/481000\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/481000\/\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/yk\/jd\/cb\/ykjdcbuozxj70sxwrtxebx0l6u8.png\"><\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442 \u0446\u0438\u043a\u043b \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043d\u044b\u0445 \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u043e\u0431 OpenWhisk \u043e\u0442 \u0430\u0432\u0442\u043e\u0440\u0430 <a href=\"https:\/\/medium.com\/@pdesai8\">Priti Desai<\/a>. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f OpenWhisk \u043f\u043e\u0432\u0435\u0440\u0445 Kubernetes \u0441 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0441 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0422\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 OpenWhisk \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Knative \u0438 TektonCD \u0432 Kubernetes \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Nodejs.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-295992","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/295992","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=295992"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/295992\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=295992"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=295992"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=295992"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}