{"id":481,"date":"2019-02-28T11:56:33","date_gmt":"2019-02-28T10:56:33","guid":{"rendered":"http:\/\/blog.zhaw.ch\/splab\/?p=481"},"modified":"2019-02-28T11:56:35","modified_gmt":"2019-02-28T10:56:35","slug":"reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage","status":"publish","type":"post","link":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/","title":{"rendered":"Reliable OpenWhisk Deployment on Kubernetes With Persistent Storage"},"content":{"rendered":"\n<p>In a <a href=\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/\">previous<\/a> blog post, we described our experience with deploying OpenWhisk on Kubernetes on OpenStack. During subsequent testing, we observed some issues with the OpenWhisk deployment wherein some OpenWhisk components &#8211; specifically, the controller and the invoker &#8211; would fail to restart after rebooting the machines running the Kubernetes nodes for maintenance tasks. To fix this, we had to redeploy OpenWhisk after each failure which resulted in significant data loss and was clearly an unacceptable operational solution.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>To ensure that our OpenWhisk deployment is fault-tolerant and can survive failures and restarts without data loss, in this short blog post we discuss how we <a href=\"https:\/\/github.com\/apache\/incubator-openwhisk-deploy-kube\/blob\/master\/docs\/configurationChoices.md#persistence\">configured persistent storage<\/a> on our self-hosted Kubernetes cluster using an NFS server and the <a href=\"https:\/\/github.com\/kubernetes-incubator\/external-storage\/tree\/master\/nfs-client\">nfs-client-provisioner<\/a>, which is an automatic provisioner for Kubernetes. Of course, Kubernetes supports <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/\">other storage backends<\/a> but they are mostly geared towards public cloud deployments; we chose NFS as it supported dynamic provisioning, is based on a very mature technology and was easy to configure. <\/p>\n\n\n\n<p>We started by creating a new virtual machine within our OpenStack cluster with 50GBs of storage space and installed and configured an NFS server on it. We then made sure that the NFS server was accessible from all our Kubernetes nodes.<br><\/p>\n\n\n\n<p>This is how the <code>\/etc\/exports<\/code> file looked like after we were done with installing and configuring our NFS server:<\/p>\n\n\n\n<figure class=\"wp-block-image alignfull\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/oC0JqhwVaenhQqt0cKp_M3ubPL-SzwPK8MgYmOeUxvHTDkdJlbAn5LesGr25lzmWtrPn5tpea_2tj_lBBoneyjPuxQ-B8cUnSgFHg18C9W_KDzMbVOduigdsfhIuQPWKuVXMVA8Q\" alt=\"\" \/><figcaption>Contents of \/etc\/exports<\/figcaption><\/figure>\n\n\n\n<p>One issue that arose related to NFS file permissions: the OpenWhisk Helm chart has an initialisation phase which sets up file ownership for persistent data in the Redis pod; however, our initial NFS configuration didn\u2019t support setting arbitrary file ownership within the PVC due to the NFS permissions model. This caused the OpenWhisk deployment to fail as the Redis pod assumed that the file ownerships were configured in a certain way &#8211; an assumption that was not valid in the first instance. The NFS file ownership model is well understood and this is a well known <a href=\"https:\/\/serverfault.com\/questions\/212178\/chown-on-a-mounted-nfs-partition-gives-operation-not-permitted\">issue<\/a> with NFS in certain configurations. Setting the <code>no_root_squash<\/code> option on the NFS server enabled the pod to change file ownership as required which resulted in successful initialisation of the pod.<\/p>\n\n\n\n<p>Once we had the NFS server configured, we were then ready to deploy the nfs-client-provisioner. The nfs-client-provisioner uses the NFS server to dynamically provision persistent volumes (<a href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/persistent-volumes\/#types-of-persistent-volumes\">PVs<\/a>). A pod that requires persistent storage can make a persistence storage claim (<a href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/persistent-volumes\/#persistentvolumeclaims\">PVC<\/a>) which is essentially a storage request that specifies the storage resources that the pod requires. When a PVC is made, the Kubernetes cluster will ask the dynamic provisioner &#8211; the nfs-client-provisioner in this case &#8211; to provision persistent volumes to satisfy this claim. More on PV provisioning <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/persistent-volumes\/#provisioning\">here<\/a>.<\/p>\n\n\n\n<p>We deployed the <a href=\"https:\/\/github.com\/helm\/charts\/tree\/master\/stable\/nfs-client-provisioner\">nfs-client-provisioner<\/a> on our Kubernetes cluster using the <a href=\"https:\/\/helm.sh\/\">Helm<\/a> package manager by running the following command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ helm install stable\/nfs-client-provisioner \\\n--set nfs.server=x.x.x.x \\ \n--set nfs.path=\/exported\/path \\  \n--set storageClass.name=nfs-client<\/code><\/pre>\n\n\n\n<p>Once the deployment of the provisioner was completed, we were ready to deploy OpenWhisk with persistent storage. All we had to do was add the following to the bottom of the <code>mycluster.yaml<\/code> file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>---\nk8s:\n  persistence:\n    hasDefaultStorageClass: false\n    explicitStorageClass: \"nfs-client\"\n---<\/code><\/pre>\n\n\n\n<p>And follow the rest of the steps to install OpenWhisk from the <a href=\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/21\/deploying-openwhisk-on-kubernetes-on-openstack\/\">previous<\/a> blog post.<\/p>\n\n\n\n<p>After deploying OpenWhisk, we checked the created PVs by running the following command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ kubectl -n openwhisk get persistentvolumes<\/code><\/pre>\n\n\n\n<p>We got the following output:<\/p>\n\n\n\n<figure class=\"wp-block-image alignfull\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/5T_mYzDIeEL7XD9Zr6um4xh4K4j_LUzV0EyhwnmXi3EqjC5aGraXrPdZRqZOgpUMtAjEzR34cs7E6Sj2rNk3fWkOGNbzs4GSQ6jLbfLtJQkDe1BUMNNtGB2nMpvtl0X6h_FhKsXu\" alt=\"\" \/><figcaption>Persistent volumes created for the OpenWhisk deployment<\/figcaption><\/figure>\n\n\n\n<p>And we checked the PVCs created by the OpenWhisk deployment by running:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ kubectl -n openwhisk get persistentvolumeclaims<\/code><\/pre>\n\n\n\n<p>And we got the following output:<\/p>\n\n\n\n<figure class=\"wp-block-image alignfull\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/cF19aZfdUex95pcJ_5Dg2C8C6ciIyH1JacBOflYQxxKj4Y_Fr59lwWybGefkeCr8YaAFGwnbTqAxKvPzP3kxvNc9MUGWoL8aK4NTmcVWWAwR-KghY45TFozREvkV493gvuCxJgQ1\" alt=\"\" \/><figcaption>Persistent volume claims made by OpenWhisk components<\/figcaption><\/figure>\n\n\n\n<p>This showed that everything is healthy and working as expected.<br><\/p>\n\n\n\n<p>With these changes, our OpenWhisk deployment is now more reliable as our application data can now persist through boot cycles.<\/p>\n\n\n\n<p>In our next post, we\u2019ll discuss how to deploy standard web applications which hook into MQTT data collection systems to OpenWhisk.<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>In a previous blog post, we described our experience with deploying OpenWhisk on Kubernetes on OpenStack. During subsequent testing, we observed some issues with the OpenWhisk deployment wherein some OpenWhisk components &#8211; specifically, the controller and the invoker &#8211; would fail to restart after rebooting the machines running the Kubernetes nodes for maintenance tasks. To [&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-481","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>Reliable OpenWhisk Deployment on Kubernetes With Persistent Storage - 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\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Reliable OpenWhisk Deployment on Kubernetes With Persistent Storage\" \/>\n<meta property=\"og:description\" content=\"In a previous blog post, we described our experience with deploying OpenWhisk on Kubernetes on OpenStack. During subsequent testing, we observed some issues with the OpenWhisk deployment wherein some OpenWhisk components &#8211; specifically, the controller and the invoker &#8211; would fail to restart after rebooting the machines running the Kubernetes nodes for maintenance tasks. To [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/\" \/>\n<meta property=\"og:site_name\" content=\"Service Prototyping Lab\" \/>\n<meta property=\"article:published_time\" content=\"2019-02-28T10:56:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-02-28T10:56:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/lh6.googleusercontent.com\/oC0JqhwVaenhQqt0cKp_M3ubPL-SzwPK8MgYmOeUxvHTDkdJlbAn5LesGr25lzmWtrPn5tpea_2tj_lBBoneyjPuxQ-B8cUnSgFHg18C9W_KDzMbVOduigdsfhIuQPWKuVXMVA8Q\" \/>\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=\"3 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\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/\"},\"author\":{\"name\":\"Mohammed Al-Ameen\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/3fc7624a4a118d37d1130b0400362f0b\"},\"headline\":\"Reliable OpenWhisk Deployment on Kubernetes With Persistent Storage\",\"datePublished\":\"2019-02-28T10:56:33+00:00\",\"dateModified\":\"2019-02-28T10:56:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/\"},\"wordCount\":615,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/lh6.googleusercontent.com\/oC0JqhwVaenhQqt0cKp_M3ubPL-SzwPK8MgYmOeUxvHTDkdJlbAn5LesGr25lzmWtrPn5tpea_2tj_lBBoneyjPuxQ-B8cUnSgFHg18C9W_KDzMbVOduigdsfhIuQPWKuVXMVA8Q\",\"keywords\":[\"faas\",\"howto\",\"openwhisk\",\"serverless\"],\"articleSection\":[\"Research\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/\",\"url\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/\",\"name\":\"Reliable OpenWhisk Deployment on Kubernetes With Persistent Storage - Service Prototyping Lab\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/lh6.googleusercontent.com\/oC0JqhwVaenhQqt0cKp_M3ubPL-SzwPK8MgYmOeUxvHTDkdJlbAn5LesGr25lzmWtrPn5tpea_2tj_lBBoneyjPuxQ-B8cUnSgFHg18C9W_KDzMbVOduigdsfhIuQPWKuVXMVA8Q\",\"datePublished\":\"2019-02-28T10:56:33+00:00\",\"dateModified\":\"2019-02-28T10:56:35+00:00\",\"author\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/3fc7624a4a118d37d1130b0400362f0b\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/#primaryimage\",\"url\":\"https:\/\/lh6.googleusercontent.com\/oC0JqhwVaenhQqt0cKp_M3ubPL-SzwPK8MgYmOeUxvHTDkdJlbAn5LesGr25lzmWtrPn5tpea_2tj_lBBoneyjPuxQ-B8cUnSgFHg18C9W_KDzMbVOduigdsfhIuQPWKuVXMVA8Q\",\"contentUrl\":\"https:\/\/lh6.googleusercontent.com\/oC0JqhwVaenhQqt0cKp_M3ubPL-SzwPK8MgYmOeUxvHTDkdJlbAn5LesGr25lzmWtrPn5tpea_2tj_lBBoneyjPuxQ-B8cUnSgFHg18C9W_KDzMbVOduigdsfhIuQPWKuVXMVA8Q\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/blog.zhaw.ch\/splab\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Reliable OpenWhisk Deployment on Kubernetes With Persistent Storage\"}]},{\"@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":"Reliable OpenWhisk Deployment on Kubernetes With Persistent Storage - 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\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/","og_locale":"en_GB","og_type":"article","og_title":"Reliable OpenWhisk Deployment on Kubernetes With Persistent Storage","og_description":"In a previous blog post, we described our experience with deploying OpenWhisk on Kubernetes on OpenStack. During subsequent testing, we observed some issues with the OpenWhisk deployment wherein some OpenWhisk components &#8211; specifically, the controller and the invoker &#8211; would fail to restart after rebooting the machines running the Kubernetes nodes for maintenance tasks. To [&hellip;]","og_url":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/","og_site_name":"Service Prototyping Lab","article_published_time":"2019-02-28T10:56:33+00:00","article_modified_time":"2019-02-28T10:56:35+00:00","og_image":[{"url":"https:\/\/lh6.googleusercontent.com\/oC0JqhwVaenhQqt0cKp_M3ubPL-SzwPK8MgYmOeUxvHTDkdJlbAn5LesGr25lzmWtrPn5tpea_2tj_lBBoneyjPuxQ-B8cUnSgFHg18C9W_KDzMbVOduigdsfhIuQPWKuVXMVA8Q","type":"","width":"","height":""}],"author":"Mohammed Al-Ameen","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Mohammed Al-Ameen","Estimated reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/#article","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/"},"author":{"name":"Mohammed Al-Ameen","@id":"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/3fc7624a4a118d37d1130b0400362f0b"},"headline":"Reliable OpenWhisk Deployment on Kubernetes With Persistent Storage","datePublished":"2019-02-28T10:56:33+00:00","dateModified":"2019-02-28T10:56:35+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/"},"wordCount":615,"commentCount":0,"image":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/#primaryimage"},"thumbnailUrl":"https:\/\/lh6.googleusercontent.com\/oC0JqhwVaenhQqt0cKp_M3ubPL-SzwPK8MgYmOeUxvHTDkdJlbAn5LesGr25lzmWtrPn5tpea_2tj_lBBoneyjPuxQ-B8cUnSgFHg18C9W_KDzMbVOduigdsfhIuQPWKuVXMVA8Q","keywords":["faas","howto","openwhisk","serverless"],"articleSection":["Research"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/","url":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/","name":"Reliable OpenWhisk Deployment on Kubernetes With Persistent Storage - Service Prototyping Lab","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/splab\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/#primaryimage"},"image":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/#primaryimage"},"thumbnailUrl":"https:\/\/lh6.googleusercontent.com\/oC0JqhwVaenhQqt0cKp_M3ubPL-SzwPK8MgYmOeUxvHTDkdJlbAn5LesGr25lzmWtrPn5tpea_2tj_lBBoneyjPuxQ-B8cUnSgFHg18C9W_KDzMbVOduigdsfhIuQPWKuVXMVA8Q","datePublished":"2019-02-28T10:56:33+00:00","dateModified":"2019-02-28T10:56:35+00:00","author":{"@id":"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/3fc7624a4a118d37d1130b0400362f0b"},"breadcrumb":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/#primaryimage","url":"https:\/\/lh6.googleusercontent.com\/oC0JqhwVaenhQqt0cKp_M3ubPL-SzwPK8MgYmOeUxvHTDkdJlbAn5LesGr25lzmWtrPn5tpea_2tj_lBBoneyjPuxQ-B8cUnSgFHg18C9W_KDzMbVOduigdsfhIuQPWKuVXMVA8Q","contentUrl":"https:\/\/lh6.googleusercontent.com\/oC0JqhwVaenhQqt0cKp_M3ubPL-SzwPK8MgYmOeUxvHTDkdJlbAn5LesGr25lzmWtrPn5tpea_2tj_lBBoneyjPuxQ-B8cUnSgFHg18C9W_KDzMbVOduigdsfhIuQPWKuVXMVA8Q"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/02\/28\/reliable-openwhisk-deployment-on-kubernetes-with-persistent-storage\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/blog.zhaw.ch\/splab\/"},{"@type":"ListItem","position":2,"name":"Reliable OpenWhisk Deployment on Kubernetes With Persistent Storage"}]},{"@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\/481","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=481"}],"version-history":[{"count":6,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts\/481\/revisions"}],"predecessor-version":[{"id":490,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts\/481\/revisions\/490"}],"wp:attachment":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/media?parent=481"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/categories?post=481"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/tags?post=481"},{"taxonomy":"features","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/features?post=481"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}