{"id":430,"date":"2019-02-21T09:16:14","date_gmt":"2019-02-21T08:16:14","guid":{"rendered":"http:\/\/blog.zhaw.ch\/splab\/?p=430"},"modified":"2019-02-21T13:34:23","modified_gmt":"2019-02-21T12:34:23","slug":"deploying-openwhisk-on-kubernetes-on-openstack","status":"publish","type":"post","link":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/","title":{"rendered":"Deploying OpenWhisk on Kubernetes on OpenStack"},"content":{"rendered":"\n<p>Serverless applications is one topic that SPLab has been working on for a couple of years now, with, for example, our work on a stand-alone FaaS platform <a href=\"https:\/\/blog.zhaw.ch\/icclab\/snafu-the-swiss-army-knife-of-serverless-computing\/\">Snafu<\/a>, work on disaggregating applications into serverless functions, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/introducing-podilizer-automated-java-code-translator-for-aws-lambda\/\">Podilizer<\/a> and other activities. Having organised <a href=\"http:\/\/essca2018.servicelaboratory.ch\/\">ESSCA<\/a> some weeks ago, we are now again exploring the technical limits and challenges in this space. This blog post reports about our experience of running the combination of OpenWhisk, Kubernetes, Helm and OpenStack.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p><a href=\"https:\/\/openwhisk.apache.org\/\">OpenWhisk<\/a> was an early mover in this area and we did look at it some time ago, albeit with limited success due to installation woes; we decided it was time to take another look at OpenWhisk to see how it stacks up in 2019 and what potential non-trivial enhancements of the platform could be.<\/p>\n\n\n\n<p><strong>Launching OpenStack Instances<\/strong><\/p>\n\n\n\n<p>We wanted to set up OpenWhisk on some VMs on our lab&#8217;s OpenStack cluster. Hence we created 3 virtual machines on OpenStack &#8211; a single Kubernetes cluster master with 2 worker nodes; of course more than 2 worker nodes is possible. <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/kMuroLE5pWd46uR6SvX_vXVWMJwvryJbN-U-HstpgUk5p04nLY4OIrrtvnFI0vkxYJhX_gbEAOIM1Eswc17LE8onmgypwYwfTMOFczbidxHuQFxEbxXIMv7_ZyHK5pQ_C5O_Mucy\" alt=\"\" \/><\/figure><\/div>\n\n\n\n<p>We required at least 4 GB of RAM per machine. We did try VMs with a smaller amount of RAM but some containers could not start due to insufficient memory. Also, the Kubernetes master must have at least 2 CPUs.<br><\/p>\n\n\n\n<p>SSH access to all machines is required; in our case, the Kubernetes master had an associated floating IP and this could be used as a proxy to access the other nodes. If the nodes are on the same network and within the same security group in OpenStack this is possible by default.<br><\/p>\n\n\n\n<p><strong>Creating the Kubernetes Cluster<\/strong><\/p>\n\n\n\n<p>We decided to use <a href=\"https:\/\/kubernetes.io\/docs\/reference\/setup-tools\/kubeadm\/kubeadm\/\">kubeadm<\/a> to create the Kubernetes cluster on the VMs and used this <a href=\"https:\/\/kubernetes.io\/docs\/setup\/independent\/create-cluster-kubeadm\/#pod-network\">how-to<\/a> to bring everything up.<a href=\"https:\/\/kubernetes.io\/docs\/setup\/independent\/create-cluster-kubeadm\/#pod-network\"><\/a><\/p>\n\n\n\n<p>To confirm that everything is configured correctly run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ kubectl cluster-info<\/code><\/pre>\n\n\n\n<p>The following output shows everything is healthy:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/PUcrCYeGWWLB_xdwr8A_HDEPAedjmTCQH9w9GLORj9fUO_JHOyMQejG7fg8pia3TswEY97oZpNwe3NV2z1yWShSQINW8a5qJSrtsezk1kIPZVu_ZUfmZ0QgjmJtJvuhxxDOCB-Ei\" alt=\"\" \/><\/figure><\/div>\n\n\n\n<p>We installed OpenWhisk using the Kubernetes package manager, <a href=\"https:\/\/helm.sh\/\">Helm<\/a>. We used this <a href=\"https:\/\/github.com\/helm\/helm#install\">guide<\/a> to install helm.<br><\/p>\n\n\n\n<p>Once Helm was installed, we configured it as follows:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ helm init<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>$ kubectl create clusterrolebinding tiller-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default<\/code><\/pre>\n\n\n\n<p>This installed and configured the Helm server component, <a href=\"https:\/\/docs.helm.sh\/glossary\/#tiller\">Tiller<\/a>, on the Kubernetes master. You can check that Tiller has has been successfully installed by running:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ helm version<\/code><\/pre>\n\n\n\n<p>You should get a similar output:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/BNOzsE4K-2QdhHuRQml0UCJChjV4lqkQtn0m_len4ax8mU7Go6ZI7-C8a8pxq3wKppDleW4uN-giqBmhQaU2KqsO351VrCF8uU4XyxHcwGc3AED2rpVBiwqLydPVTIuKT2Uzfwg9\" alt=\"\" \/><\/figure><\/div>\n\n\n\n<p>With an operational Kubernetes cluster with Helm installed, it was time to turn our attention to OpenWhisk.<br><\/p>\n\n\n\n<p><strong>Deploying OpenWhisk<\/strong><br><\/p>\n\n\n\n<p>We started by cloning the OpenWhisk git repository:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ git clone https:\/\/github.com\/apache\/incubator-openwhisk-deploy-kube.git<\/code><\/pre>\n\n\n\n<p>To install OpenWhisk, it was necessary to tell it a bit about the environment to which it was being deployed; this was done by creating a <code>mycluster.yaml<\/code> file. In our case the file looked like this:<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>whisk:\n  ingress:\n    type: NodePort\n    apiHostName: x.x.x.x\n    apiHostPort: 31001\n\nnginx:\n  httpsNodePort: 31001\n\ninvoker:\n  containerFactory:\n    impl: \"kubernetes\"\n\nk8s:\n  persistence:\n    enabled: false<\/code><\/pre>\n\n\n\n<p>The <code>apiHostName<\/code> that we used was the internal IP address of the Kubernetes master (in our case it was 10.0.0.8) obtained via:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ kubectl cluster-info\nKubernetes master is running at https:\/\/10.0.0.8:6443\nKubeDNS is running at https:\/\/10.0.0.8:6443\/api\/v1\/namespaces\/kube-system\/services\/kube-dns:dns\/proxy<\/code><\/pre>\n\n\n\n<p>Next, we had to add some labels to nodes on the Kubernetes cluster; this information was used by Helm to determine where to deploy certain capabilities. We needed to differentiate between so-called core nodes and so-called invoker nodes; the former operates the OpenWhisk control plane (the controller, kafka, zookeeeper, and couchdb pods), while the latter schedules and executes user containers. More details <a href=\"https:\/\/github.com\/apache\/incubator-openwhisk-deploy-kube\/tree\/master\/helm\/openwhisk#chart-details\">here<\/a> and <a href=\"https:\/\/github.com\/apache\/incubator-openwhisk-deploy-kube\/tree\/master\/helm\/openwhisk#initial-setup\">here<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ kubectl label nodes &lt;CORE_NODE_NAME&gt; openwhisk-role=core<\/code><\/pre>\n\n\n\n<p>Similarly an invoker node was configured using:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ kubectl label nodes &lt;INVOKER_NODE_NAME&gt; openwhisk-role=invoker<\/code><\/pre>\n\n\n\n<p>Once that was set up, we were in a position to deploy OpenWhisk using the following:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ helm install .\/helm\/openwhisk --namespace=openwhisk --name=owdev -f mycluster.yaml<\/code><\/pre>\n\n\n\n<p>The process was generally quite smooth; we did have some small issues during the first OpenWhisk install due to an error in the <code>mycluster.yaml<\/code> file; the API hostname of the whisk ingress was misconfigured and hence the invoker pod got stuck in a Crashloop trying to talk to the ingress. Once that error was fixed &#8211; by modifying the <code>mycluster.yaml<\/code> file &#8211; we redeployed OpenWhisk again and everything worked as expected.<br><\/p>\n\n\n\n<p>This created all the required Kubernetes artifacts (containers, networks, volumes etc) &nbsp;required to run OpenWhisk. For us, this took somewhere between 5 and 10 minutes depending on network bandwidth, VM memory consumption etc.<\/p>\n\n\n\n<p>We used the following command to periodically check the status of the deployment:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ helm status owdev<\/code><\/pre>\n\n\n\n<p>This provides dynamic content which shows the state of the deployment as it evolves. We checked this frequently as the deployment was ongoing. The process is finished when the <code>install-packages<\/code> pod enters the Completed state. This is how the Pods section of the status report looked like when the deployment was ready:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/7ZQgKiIYotAeHvu8RGU4Qv2fLTU_L7rMCsCKZhRf4NF7OwL26wE0ZZjoMcRvn18Of6_8wQuGebswW8GvIF1umWxiJ6TMTzQwFcvI7Luzqmjj3C9PmuYQ6VD_riMuiRWCvhWG_GDy\" alt=\"\" \/><\/figure><\/div>\n\n\n\n<p>All we needed then was a CLI to talk to our new cluster &#8211; we downloaded it from <a href=\"https:\/\/github.com\/apache\/incubator-openwhisk-cli\/releases\">here<\/a>.<\/p>\n\n\n\n<p>It was necessary to configure it as follows:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ wsk property set --apihost &lt;whisk.ingress.apiHostName&gt;:31001<\/code><\/pre>\n\n\n\n<p>Where <code>&lt;whisk.ingress.apiHostName&gt;<\/code> is the public address of the machine running the Kubernetes master. <br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ wsk property set --auth \n23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwP<\/code><\/pre>\n\n\n\n<p>And the long token specified is a default token baked into OpenWhisk for the guest account.<\/p>\n\n\n\n<p><strong>IMPORTANT<\/strong>: The auth token <strong>MUST<\/strong> be overridden in production environments by editing the <code>values.yaml<\/code> file that belongs to the OpenWhisk Helm chart. <br><\/p>\n\n\n\n<p>With that configuration, it&#8217;s possible to list the installed packages, for example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ wsk -i package list \/whisk.system<\/code><\/pre>\n\n\n\n<p>And this is the output that we got:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/JqutIBJ40FLCj-kguSSlmyxaOfIDSSPOUGccIkg0u44Ix5us8yQUEWoxUZLjMLbiPMShqxpSwhahO-gORwev8_ORn8FzgoaftvK_0VNn_G3SA4vZSDriLZucGQ5q_IgkB98FyQpR\" alt=\"\" \/><\/figure><\/div>\n\n\n\n<p>We found out that deploying OpenWhisk on Kubernetes in 2019 was quite straightforward using the available Helm chart. The containerised environment comes up reasonably quickly and exhibited acceptable stability in our initial testing.  <\/p>\n\n\n\n<p>We were then ready to start using our shiny new OpenWhisk cluster. The next steps were to create new users using <code>wskadmin<\/code> (note that this had to be used from inside the <code>owdev-wskadmin<\/code> container) and start adding functions, triggers and event streams.<br><\/p>\n\n\n\n<p>More on that in the next post!<br><\/p>\n\n\n\n<p><strong>A Note on Tear Down<\/strong><\/p>\n\n\n\n<p>In the unlikely event that you&#8217;re unhappy with your OpenWhisk cluster you can run the following command and Helm will take care of deleting all the resources that it created:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ helm delete owdev --purge<\/code><\/pre>\n\n\n\n<p>You can then tear down the Kubernetes cluster using these <a href=\"https:\/\/kubernetes.io\/docs\/setup\/independent\/create-cluster-kubeadm\/#tear-down\">instructions.<\/a><\/p>\n\n\n\n<p>Alternatively, you can just shut down the VMs.<br><\/p>\n<div class=\"pt-sm\">Schlagw\u00f6rter: <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/faas\/\">faas<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/howto\/\">howto<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/openwhisk\/\">openwhisk<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/serverless\/\">serverless<\/a><br><\/div>","protected":false},"excerpt":{"rendered":"<p>Serverless applications is one topic that SPLab has been working on for a couple of years now, with, for example, our work on a stand-alone FaaS platform Snafu, work on disaggregating applications into serverless functions, Podilizer and other activities. Having organised ESSCA some weeks ago, we are now again exploring the technical limits and challenges [&hellip;]<\/p>\n","protected":false},"author":397,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[4],"tags":[7,51,50,8],"features":[],"class_list":["post-430","post","type-post","status-publish","format-standard","hentry","category-research","tag-faas","tag-howto","tag-openwhisk","tag-serverless"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Deploying OpenWhisk on Kubernetes on OpenStack - Service Prototyping Lab<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Deploying OpenWhisk on Kubernetes on OpenStack\" \/>\n<meta property=\"og:description\" content=\"Serverless applications is one topic that SPLab has been working on for a couple of years now, with, for example, our work on a stand-alone FaaS platform Snafu, work on disaggregating applications into serverless functions, Podilizer and other activities. Having organised ESSCA some weeks ago, we are now again exploring the technical limits and challenges [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/\" \/>\n<meta property=\"og:site_name\" content=\"Service Prototyping Lab\" \/>\n<meta property=\"article:published_time\" content=\"2019-02-21T08:16:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-02-21T12:34:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/lh4.googleusercontent.com\/kMuroLE5pWd46uR6SvX_vXVWMJwvryJbN-U-HstpgUk5p04nLY4OIrrtvnFI0vkxYJhX_gbEAOIM1Eswc17LE8onmgypwYwfTMOFczbidxHuQFxEbxXIMv7_ZyHK5pQ_C5O_Mucy\" \/>\n<meta name=\"author\" content=\"Mohammed Al-Ameen\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mohammed Al-Ameen\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/\"},\"author\":{\"name\":\"Mohammed Al-Ameen\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/3fc7624a4a118d37d1130b0400362f0b\"},\"headline\":\"Deploying OpenWhisk on Kubernetes on OpenStack\",\"datePublished\":\"2019-02-21T08:16:14+00:00\",\"dateModified\":\"2019-02-21T12:34:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/\"},\"wordCount\":928,\"commentCount\":1,\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/lh4.googleusercontent.com\/kMuroLE5pWd46uR6SvX_vXVWMJwvryJbN-U-HstpgUk5p04nLY4OIrrtvnFI0vkxYJhX_gbEAOIM1Eswc17LE8onmgypwYwfTMOFczbidxHuQFxEbxXIMv7_ZyHK5pQ_C5O_Mucy\",\"keywords\":[\"faas\",\"howto\",\"openwhisk\",\"serverless\"],\"articleSection\":[\"Research\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/\",\"url\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/\",\"name\":\"Deploying OpenWhisk on Kubernetes on OpenStack - Service Prototyping Lab\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/lh4.googleusercontent.com\/kMuroLE5pWd46uR6SvX_vXVWMJwvryJbN-U-HstpgUk5p04nLY4OIrrtvnFI0vkxYJhX_gbEAOIM1Eswc17LE8onmgypwYwfTMOFczbidxHuQFxEbxXIMv7_ZyHK5pQ_C5O_Mucy\",\"datePublished\":\"2019-02-21T08:16:14+00:00\",\"dateModified\":\"2019-02-21T12:34:23+00:00\",\"author\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/3fc7624a4a118d37d1130b0400362f0b\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/#primaryimage\",\"url\":\"https:\/\/lh4.googleusercontent.com\/kMuroLE5pWd46uR6SvX_vXVWMJwvryJbN-U-HstpgUk5p04nLY4OIrrtvnFI0vkxYJhX_gbEAOIM1Eswc17LE8onmgypwYwfTMOFczbidxHuQFxEbxXIMv7_ZyHK5pQ_C5O_Mucy\",\"contentUrl\":\"https:\/\/lh4.googleusercontent.com\/kMuroLE5pWd46uR6SvX_vXVWMJwvryJbN-U-HstpgUk5p04nLY4OIrrtvnFI0vkxYJhX_gbEAOIM1Eswc17LE8onmgypwYwfTMOFczbidxHuQFxEbxXIMv7_ZyHK5pQ_C5O_Mucy\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/blog.zhaw.ch\/splab\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Deploying OpenWhisk on Kubernetes on OpenStack\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#website\",\"url\":\"https:\/\/blog.zhaw.ch\/splab\/\",\"name\":\"Service Prototyping Lab\",\"description\":\"A Blog of the ZHAW Zurich University of Applied Sciences\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.zhaw.ch\/splab\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/3fc7624a4a118d37d1130b0400362f0b\",\"name\":\"Mohammed Al-Ameen\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/94977c59a64d3341d6db72d6958d1408413b56018f07c205a130d19d7ee3bb47?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/94977c59a64d3341d6db72d6958d1408413b56018f07c205a130d19d7ee3bb47?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/94977c59a64d3341d6db72d6958d1408413b56018f07c205a130d19d7ee3bb47?s=96&d=mm&r=g\",\"caption\":\"Mohammed Al-Ameen\"},\"url\":\"https:\/\/blog.zhaw.ch\/splab\/author\/alam\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Deploying OpenWhisk on Kubernetes on OpenStack - Service Prototyping Lab","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/","og_locale":"en_GB","og_type":"article","og_title":"Deploying OpenWhisk on Kubernetes on OpenStack","og_description":"Serverless applications is one topic that SPLab has been working on for a couple of years now, with, for example, our work on a stand-alone FaaS platform Snafu, work on disaggregating applications into serverless functions, Podilizer and other activities. Having organised ESSCA some weeks ago, we are now again exploring the technical limits and challenges [&hellip;]","og_url":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/","og_site_name":"Service Prototyping Lab","article_published_time":"2019-02-21T08:16:14+00:00","article_modified_time":"2019-02-21T12:34:23+00:00","og_image":[{"url":"https:\/\/lh4.googleusercontent.com\/kMuroLE5pWd46uR6SvX_vXVWMJwvryJbN-U-HstpgUk5p04nLY4OIrrtvnFI0vkxYJhX_gbEAOIM1Eswc17LE8onmgypwYwfTMOFczbidxHuQFxEbxXIMv7_ZyHK5pQ_C5O_Mucy","type":"","width":"","height":""}],"author":"Mohammed Al-Ameen","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Mohammed Al-Ameen","Estimated reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/#article","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/"},"author":{"name":"Mohammed Al-Ameen","@id":"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/3fc7624a4a118d37d1130b0400362f0b"},"headline":"Deploying OpenWhisk on Kubernetes on OpenStack","datePublished":"2019-02-21T08:16:14+00:00","dateModified":"2019-02-21T12:34:23+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/"},"wordCount":928,"commentCount":1,"image":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/#primaryimage"},"thumbnailUrl":"https:\/\/lh4.googleusercontent.com\/kMuroLE5pWd46uR6SvX_vXVWMJwvryJbN-U-HstpgUk5p04nLY4OIrrtvnFI0vkxYJhX_gbEAOIM1Eswc17LE8onmgypwYwfTMOFczbidxHuQFxEbxXIMv7_ZyHK5pQ_C5O_Mucy","keywords":["faas","howto","openwhisk","serverless"],"articleSection":["Research"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/","url":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/","name":"Deploying OpenWhisk on Kubernetes on OpenStack - Service Prototyping Lab","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/splab\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/#primaryimage"},"image":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/#primaryimage"},"thumbnailUrl":"https:\/\/lh4.googleusercontent.com\/kMuroLE5pWd46uR6SvX_vXVWMJwvryJbN-U-HstpgUk5p04nLY4OIrrtvnFI0vkxYJhX_gbEAOIM1Eswc17LE8onmgypwYwfTMOFczbidxHuQFxEbxXIMv7_ZyHK5pQ_C5O_Mucy","datePublished":"2019-02-21T08:16:14+00:00","dateModified":"2019-02-21T12:34:23+00:00","author":{"@id":"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/3fc7624a4a118d37d1130b0400362f0b"},"breadcrumb":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/#primaryimage","url":"https:\/\/lh4.googleusercontent.com\/kMuroLE5pWd46uR6SvX_vXVWMJwvryJbN-U-HstpgUk5p04nLY4OIrrtvnFI0vkxYJhX_gbEAOIM1Eswc17LE8onmgypwYwfTMOFczbidxHuQFxEbxXIMv7_ZyHK5pQ_C5O_Mucy","contentUrl":"https:\/\/lh4.googleusercontent.com\/kMuroLE5pWd46uR6SvX_vXVWMJwvryJbN-U-HstpgUk5p04nLY4OIrrtvnFI0vkxYJhX_gbEAOIM1Eswc17LE8onmgypwYwfTMOFczbidxHuQFxEbxXIMv7_ZyHK5pQ_C5O_Mucy"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/blog.zhaw.ch\/splab\/"},{"@type":"ListItem","position":2,"name":"Deploying OpenWhisk on Kubernetes on OpenStack"}]},{"@type":"WebSite","@id":"https:\/\/blog.zhaw.ch\/splab\/#website","url":"https:\/\/blog.zhaw.ch\/splab\/","name":"Service Prototyping Lab","description":"A Blog of the ZHAW Zurich University of Applied Sciences","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.zhaw.ch\/splab\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/3fc7624a4a118d37d1130b0400362f0b","name":"Mohammed Al-Ameen","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/94977c59a64d3341d6db72d6958d1408413b56018f07c205a130d19d7ee3bb47?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/94977c59a64d3341d6db72d6958d1408413b56018f07c205a130d19d7ee3bb47?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/94977c59a64d3341d6db72d6958d1408413b56018f07c205a130d19d7ee3bb47?s=96&d=mm&r=g","caption":"Mohammed Al-Ameen"},"url":"https:\/\/blog.zhaw.ch\/splab\/author\/alam\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts\/430","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/users\/397"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/comments?post=430"}],"version-history":[{"count":26,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts\/430\/revisions"}],"predecessor-version":[{"id":476,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts\/430\/revisions\/476"}],"wp:attachment":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/media?parent=430"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/categories?post=430"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/tags?post=430"},{"taxonomy":"features","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/features?post=430"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}