{"id":42315,"date":"2019-05-15T05:16:55","date_gmt":"2019-05-15T02:16:55","guid":{"rendered":"https:\/\/www.altoros.com\/blog\/?p=42315"},"modified":"2019-05-31T10:14:00","modified_gmt":"2019-05-31T07:14:00","slug":"deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes","status":"publish","type":"post","link":"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/","title":{"rendered":"Deploying a Blockchain App on Cloud Foundry and Kubernetes"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_79_2 counter-hierarchy ez-toc-counter ez-toc-transparent ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#Whats_needed_for_a_DApp_on_CFK8s\" >What&#8217;s needed for a DApp on CF+K8s<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#Three_steps_in_detail\" >Three steps in detail<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#Creating_a_service\" >Creating a service<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#Assigning_resources\" >Assigning resources<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#Exposing_a_ready-to-use_service\" >Exposing a ready-to-use service<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#Accessing_the_service\" >Accessing the service<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#Building_a_CICD_pipeline\" >Building a CI\/CD pipeline<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#Want_details_Watch_the_video\" >Want details? Watch the video!<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#Further_reading\" >Further reading<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#About_the_authors\" >About the authors<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"Whats_needed_for_a_DApp_on_CFK8s\"><\/span>What&#8217;s needed for a DApp on CF+K8s<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Using blockchain, various industries have been able to improve efficiency through automation of mundane, manual processes in a secure and transparent manner. Commonly, for a blockchain (Ethereum) implementation in production, there is a need for:<\/p>\n<ul>\n<li>a server-client app to build a network<\/li>\n<li>a decentralized app (DApp) to process the data stored<\/li>\n<\/ul>\n<p>According to <a href=\"https:\/\/github.com\/Ykisialiou\" rel=\"noopener noreferrer\" target=\"_blank\">Yauheni Kisialiou<\/a> of Altoros, this process can be split into three major steps:<\/p>\n<ul>\n<li>push a DApp to Cloud Foundry<\/li>\n<li>build a service broker between the platform and the DApp<\/li>\n<li>containerize the DApp<\/li>\n<\/ul>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-the-development-of-blockchain-apps-kubernetes-cloud-foundry-summit-eugene-kisialiou.jpg\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-the-development-of-blockchain-apps-kubernetes-cloud-foundry-summit-eugene-kisialiou-1024x768.jpg\" alt=\"\" width=\"640\" class=\"aligncenter size-large wp-image-42837\" \/><\/a><small>Yauheni Kisialiou at Cloud Foundry Summit North America 2019<\/small><\/center><\/p>\n<p>In this model, a service broker is needed to determine:<\/p>\n<ul>\n<li>the way the platform knows about the service<\/li>\n<li>how many resources should be assigned<\/li>\n<li>what should be done with a service to make it ready to use<\/li>\n<li>how a developer can access the service<\/li>\n<\/ul>\n<p>At the recent <a href=\"https:\/\/www.altoros.com\/blog\/top-quotes-from-cloud-foundry-summit-north-america-2019\/\">CF summit<\/a> in Philadelphia, Yauheni shared his experience of developing DApps on Cloud Foundry and Kubernetes, taking a closer look at each of the steps listed above.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Three_steps_in_detail\"><\/span>Three steps in detail<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>So, what are the major tasks behind deploying a blockchain app on Cloud Foundry coupled with Kubernetes?<\/p>\n<p>&nbsp;<\/p>\n<p><b>1. Push a DApp to Cloud Foundry<\/b><\/p>\n<p>At the beginning, having Cloud Foundry already set up, Yauheni suggests running <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">cf push<\/code> for a voting app. (Currently, some minor issues related to the inconsistency of the <em>npm<\/em> module version may occur in the app repository and in the Cloud Foundry buildpack. To fix the issue, one can recreate <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">package.json<\/code> to successfully push the app.)<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-the-development-of-blockchain-apps-kubernetes-cloud-foundry-ethereum.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-the-development-of-blockchain-apps-kubernetes-cloud-foundry-ethereum.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-42819\" \/><\/a><\/center><\/p>\n<p>Yauheni recommends utilizing <a href=\"https:\/\/www.parity.io\/technologies\/ethereum\" rel=\"noopener noreferrer\" target=\"_blank\">Parity<\/a>\u2014an Ethereum client providing core infrastructure for services\u2014on a separate VM, specifying its address in the app configurations. To achieve more flexibility and overcome the limits of persistence, the Parity client can be moved to Kubernetes, which is quite simple, since Parity has an official Docker image. Then, Parity has to be exposed as a Kubernetes service, and the address should be set in the app configurations.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-the-development-of-blockchain-apps-kubernetes-cloud-foundry.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-the-development-of-blockchain-apps-kubernetes-cloud-foundry.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-42825\" \/><\/a><\/center><\/p>\n<p>With Parity serving as a middleware between an app and a database, the next step is to bring an app deployed to Cloud Foundry and Parity implemented as a service in Kubernetes together.<\/p>\n<p>&nbsp;<\/p>\n<p><b>2. Build a service broker<b><\/p>\n<p>To enable a solution to be deployed and destroyed as an on-demand service via the CF CLI, as well as to automatically provide connection parameters, a service broker has to be created.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-the-development-of-blockchain-apps-kubernetes-cloud-foundry-service-broker.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-the-development-of-blockchain-apps-kubernetes-cloud-foundry-service-broker.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-42820\" \/><\/a><\/center><\/p>\n<p>Typically, a service broker is implemented as a web app, and the platform is a client for this web app. It answers API calls, and returns corresponding JSON objects to the platform. The most common types of service broker deployments are:<\/p>\n<ul>\n<li>as an app on Cloud Foundry<\/li>\n<li>as a BOSH release on a separate VM<\/li>\n<\/ul>\n<p>Though, as long as a service broker is a web app in the first place, you may choose any deployment method you find convenient, be it a Kubernetes container, an Ansible playbook, a bare-metal server, etc.<\/p>\n<p>While a typical broker takes some resources from the pool (for example, creates a database instance in an already provided cluster), an on-demand service broker creates the cluster by request, and removes it when it&#8217;s no longer needed. Generally, an on-demand service broker operates BOSH and deploys service instances as BOSH releases. With services deployed to Kubernetes, a developer enjoys more flexibility and better hardware utilization, that is why Yauheni suggests this container orchestrator to run on-demand Parity clients.<\/p>\n<p>&nbsp;<\/p>\n<p><b>3. Adopt Kibosh<\/b><\/p>\n<p>The next step is to adopt Kibosh to deploy Parity clients to Kubernetes on demand. <a href=\"https:\/\/github.com\/vmware-archive\/kibosh\" rel=\"noopener noreferrer\" target=\"_blank\">Kibosh<\/a> is an open service broker that ebables a developer to automatically create resources in Kubernetes upon request. With Kibosh, one can use the familiar CF CLI, and all the necessary configuration data is transferred directly to the app via environment variables. A developer then simply parses the variables in his\/her programming language of choice.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-the-development-of-blockchain-apps-with-cloud-foundry-kuberntes-kibosh-helm-charts.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-the-development-of-blockchain-apps-with-cloud-foundry-kuberntes-kibosh-helm-charts.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-42826\" \/><\/a><\/center><\/p>\n<p>Kibosh uses <a href=\"https:\/\/www.altoros.com\/blog\/kubernetes-cluster-ops-options-for-configuration-management\/\">Helm<\/a> to deploy resources to Kubernetes, so, there is a need to create a Helm chart for Parity, using the existing deployment.<\/p>\n<p>To understand how the solution works, let\u2019s take a look at how Helm, Kibosh, and a Parity chart in the existing deployment address the tasks usually assigned to a service broker.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Creating_a_service\"><\/span>Creating a service<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Like an ordinary service broker, Kibosh answers API calls and can be registered through the CF API call. As a result, Kibosh service offerings will appear in the Cloud Foundry marketplace, ready to be used by developers and operators via the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">cf create-service<\/code> and <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">cf bind-service<\/code> commands.<\/p>\n<p>When the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">create-service<\/code> request is received, Kibosh will deploy a Helm chart to Kubernetes. Then, a Kubernetes cluster access parameters should be configured. Kibosh will use Helm to manage Kubernetes. To make Helm usable, the necessary resources, such as a namespace and a service account, will be created automatically.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-the-development-of-blockchain-apps-kubernetes-cloud-foundry-kibosh-helm.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-the-development-of-blockchain-apps-kubernetes-cloud-foundry-kibosh-helm.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-42824\" \/><\/a><\/center><\/p>\n<p>To register a service broker, one can use the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">cf create-service-broker<\/code> command, but the process is actually automated via a special errand provided by the Kibosh team, so you just need to deploy it via a manifest.<\/p>\n<pre style=\"padding-left: 20px;\">- azs:\r\n  - z1\r\n  instances: 1\r\n  jobs:\r\n  - name: cf-cli-6-linux\r\n\trelease: cf-cli\r\n  - name: register-broker\r\n\trelease: kibosh\r\n  lifecycle: errand\r\n  name: register-broker\r\n  networks:\r\n  - name: default\r\n  properties:\r\n\tbroker_name: kibosh-parity\r\n\tcf:\r\n  \t  admin_password: ((cf-admin-password))\r\n  \t  admin_username: admin\r\n  \t  api_url: ((cf-api-url))\r\n\t  disable_ssl_cert_verification: true\r\n  stemcell: bosh-google-kvm-ubuntu-xenial-go_agent\r\n  vm_type: default<\/pre>\n<p>Then, run the following command.<\/p>\n<pre style=\"padding-left: 20px;\">bosh -d kibosh run-errand register-broker<\/pre>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Assigning_resources\"><\/span>Assigning resources<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The Parity chart (or any other Kibosh-driven Helm chart) should have definitions of service plans, as a typical service broker usually does. In case of an ordinary service broker, a definition is a JSON response with a plan definition generated by a service broker. Kibosh will generate this output itself, however, the plan descriptions should be provided.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-the-development-of-blockchain-apps-with-kubernetes-cloud-foundry-kibosh.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-the-development-of-blockchain-apps-with-kubernetes-cloud-foundry-kibosh.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-42828\" \/><\/a><\/center><\/p>\n<p>The chart used in this example has <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">values.yaml<\/code> with Parity and deployment parameters defined. The <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">plans.yaml<\/code> file can be used to define plans, as well as a plans directory to place files with a possibility to redefine the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">values.yaml<\/code> variables. This results in having several plans with a special set of variable values each. Below is the structure of the chart files.<\/p>\n<pre style=\"padding-left: 20px;\">$ ls -la parity-chart\r\ntotal 28\r\ndrwxrwxr-x 4 eugene eugene 4096 Apr 11 18:45 .\r\ndrwxrwxr-x 3 eugene eugene 4096 Mar 26 10:30 ..\r\n-rw-rw-r-- 1 eugene eugene  122 Mar 26 10:30 Chart.yaml\r\n-rwxrwxr-x 1 eugene eugene\t0 Mar 26 10:30 .helmignore\r\ndrwxrwxr-x 2 eugene eugene 4096 Mar 26 17:36 plans\r\n-rw-rw-r-- 1 eugene eugene   71 Mar 26 10:30 plans.yaml\r\ndrwxrwxr-x 2 eugene eugene 4096 Mar 26 10:30 templates\r\n-rw-rw-r-- 1 eugene eugene  596 Mar 26 10:30 values.yaml<\/pre>\n<p>Here is an example of a plan definition and variable reassignment.<\/p>\n<pre style=\"padding-left: 20px;\">$ cat plans.yaml\r\n- name: \"default\"\r\n  description: \"default plan\"\r\n  file: \"default.yaml\"<\/pre>\n<pre style=\"padding-left: 20px;\">$ cat plans\/default.yaml\r\nappname: paritynode<\/pre>\n<p>In this case, only the default plan is used, though, there are such variables as the number of Parity nodes and a client version, which can be redefined for different plans. For more examples of defining plans, check out the <a href=\"https:\/\/github.com\/cf-platform-eng\/kibosh-sample\/tree\/master\/sample-charts\" rel=\"noopener noreferrer\" target=\"_blank\">kibosh-sample<\/a> GitHub repository.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Exposing_a_ready-to-use_service\"><\/span>Exposing a ready-to-use service<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>With an ordinary service broker, a logic should be defined to create databases or user accounts, generate credentials or make some external API calls. With Kibosh and a Parity client, everything is done via a Helm chart.<\/p>\n<p>Due to the decentralized nature of blockchain, nothing specific should be done with Parity, except for configuring it on a start-up with a special configurational file. So, all we need is <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">init script<\/code> in <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">configmap<\/code> in a Helm chart template and the above-mentioned <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">values.yaml<\/code> file. <\/p>\n<p>Our colleagues have created <a href=\"https:\/\/github.com\/poanetwork\/poa-chain-spec\" rel=\"noopener noreferrer\" target=\"_blank\">a template<\/a> that triggers the number of Parity nodes required by a developer and connected to a specified network. The template is fairly simple, yet flexible, and can be easily customized to fully comply with the functionality of Parity. Below is a sample template, which illustrates the usage of parametrized Parity configurations in the Kubernetes configmap.<\/p>\n<pre style=\"padding-left: 20px;\">cat templates\/configmap.yaml {{- range .Values.nodes }}\r\n---\r\nkind: ConfigMap\r\napiVersion: v1\r\nmetadata:\r\n  name: bootstrap-{{ .branch }}\r\ndata:\r\n  script: |\r\n\t#!\/bin\/ash\r\n\t\r\n\tgit -c http.sslVerify=false clone https:\/\/github.com\/poanetwork\/poa-chain-spec.git \/tmp\/poa-chain-spec\r\n\tcd \/tmp\/poa-chain-spec\r\n\tgit checkout {{ .branch }}\r\n       \u2026\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Accessing_the_service\"><\/span>Accessing the service<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Kibosh returns the definitions of Kubernetes objects, such as services and secrets, to the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">VCAP_SERVICES<\/code> environmental variable. By parsing this variable, a developer can easily find how to get to the service container and what credentials use to log in. Partially, the JSON file of <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">VCAP_SERVICES<\/code> is exemplified here.<\/p>\n<pre style=\"padding-left: 20px;\">echo $VCAP_SERVICES\r\n     ....\r\n      \"poanode\":[\r\n      {\r\n         \"Label\":\"poanode\",\r\n         \"provider\":null,\r\n         \"plan\":\"default\",\r\n         \"name\":\"poatest\",\r\n         \"tags\":[\r\n\r\n         ],\r\n         \"instance_name\":\"poatest\",\r\n         \"binding_name\":null,\r\n         \"credentials\":{\r\n            \"secrets\":[\r\n               {\r\n                  \"data\":{\r\n                     \"branch\":\"core\",\r\n                     \"chainid\":\"\\\"99\\\"\",\r\n                     \"name\":\"core\",\r\n                     \"testnet\":\"\\\"true\\\"\"\r\n                  },\r\n\r\n                  \"name\":\"core-branch\"\r\n               },\r\n\r\n\u2026\r\n\r\n            \"services\":[\r\n               {\r\n                  \"name\":\"poanode-tcp-core\",\r\n                  \"spec\":{\r\n                     \"ports\":[\r\n                        {\r\n                           \"name\":\"rpc\",\r\n                           \"protocol\":\"TCP\",\r\n                           \"port\":8545,\r\n                           \"targetPort\":8545,\r\n                           \"nodePort\":30350\r\n                        }\r\n                     ],\r\n                     \"selector\":{\r\n                        \"app\":\"poanode-core\"\r\n                     },\r\n                     \"clusterIP\":\"10.11.246.134\",\r\n                     \"type\":\"LoadBalancer\",\r\n                     \"sessionAffinity\":\"None\",\r\n                     \"externalTrafficPolicy\":\"Cluster\"\r\n                  },\r\n                  \"status\":{\r\n                     \"loadBalancer\":{\r\n                        \"ingress\":[\r\n                           {\r\n                              \"ip\":\"10.10.10.10\"\r\n                           }\r\n                        ]\r\n                     }\r\n                  }\r\n               },\r\n\u2026\r\n<\/pre>\n<p>Actually, Yauheni says, he didn\u2019t need the credentials, as authentication is the responsibility of the DApp itself and a wallet communication. Still, one needs some specific key-value configurational pairs, such as a network ID or a boolean showing that the network is a testnet. Yauheni had an idea to embed this information to service labels, but, unfortunately, this is not working for Kibosh yet, and he had to use a more traditional approach: secrets. Kibosh is mature enough to decode base64-encoded Kubernetes secrets, that\u2019s why one can see decoded values in the credentials\/secrets section in <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">VCAP_SERVICES<\/code>.<\/p>\n<p>To deploy Kibosh, a developer can follow the standard procedure described in <a href=\"https:\/\/github.com\/vmware-archive\/kibosh\" rel=\"noopener noreferrer\" target=\"_blank\">the solution\u2019s GitHub repo<\/a>. Kibosh itself and a Parity chart can be collocated as a BOSH release deployed to a single virtual machine. Yauheni revealed that he slightly modified the Kibosh\u2019s repository manifest with errands added and an image uploader removed, as he was using the Parity image and didn\u2019t upload any images.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Building_a_CICD_pipeline\"><\/span>Building a CI\/CD pipeline<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>So, at this poit, the developed service described here comprises three tightly connected components. A CI\/CD pipeline\u2014aimed to automate the system\u2014will accordingly consist of three logical parts, as well.<\/p>\n<p>The first one is the delivered Parity chart, which uses Helm under the hood. When any change is needed for this component, smoke tests are executed.<\/p>\n<p>The Helm chart alongside with Kibosh and its components are part of a BOSH release. Under the CI\/CD workflow, any changes to the repositories\u2014where the development of Kibosh and Helm charts is maintained\u2014are monitored. Once the changes are in force, a new version of a BOSH release is pushed and stored in a specified AWS S3 instance, as well as deployed to the dev environment.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-development-of-blockchain-apps-kubernetes-cloud-foundry-ci-cd-pipeline.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-development-of-blockchain-apps-kubernetes-cloud-foundry-ci-cd-pipeline.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-42823\" \/><\/a><\/center><\/p>\n<p>Finally, the delivered CI\/CD workflow is responsible for assembling and testing the developed DApps. The release version of a DApp is deployed to Cloud Foundry with a corresponding service automatically created for it. Using Kibosh, this service is then deployed to Kubernetes.<\/p>\n<p>Cloud Foundry is a mature platform for developing DApps in a fast and agile manner. When building a blockchain-based application, however, a developer also needs to utilize stateful clients, which configurations and versions may differ dramatically. Kubernetes significantly facilitates deployment of such clients. To automate this process via the CF CLI means, as well as ensure smooth integration between Cloud Foundry and Kubernetes, Yauheni recommends employing Kibosh.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-the-development-of-blockchan-apps-with-kubernetes-cloud-foundry-eugene-kisialiou.jpg\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-the-development-of-blockchan-apps-with-kubernetes-cloud-foundry-eugene-kisialiou-1024x768.jpg\" alt=\"\" width=\"640\" class=\"aligncenter size-large wp-image-42839\" \/><\/a><small>Yauheni Kisialiou explains the developed CI\/CD workflow<\/small><\/center><\/p>\n<p>This tool proved to be efficient in a dev environment, when there is a need to bind stateless apps on Cloud Foundry with stateful services in Kubernetes. Furthermore, Kibosh allows for deploying Helm charts to Kubernetes, tuning a variety of service plans for these charts, as well as setting up the necessary parameters inside an app container. Finally, Kibosh is convenient to use for Cloud Foundry developers for it is shipped as a BOSH release.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Want_details_Watch_the_video\"><\/span>Want details? Watch the video!<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<table width=\"100%\">\n<tbody>\n<tr>\n<td class=\"video-details-td\">\n<div style=\"float:right; width:50%; padding-left:15px; font-size:14px;\">\n<p><strong style=\"margin-bottom: 6px;\">Table of contents<\/strong><\/p>\n<ol>\n<li style=\"margin-bottom: 12px;\">Why blockchain? (00:30)<\/li>\n<li style=\"margin-bottom: 12px;\">What is needed to develop a blockchain app? (01:24)<\/li>\n<li style=\"margin-bottom: 12px;\">Employing Cloud Foundry as a platform (03:14)<\/li>\n<li style=\"margin-bottom: 12px;\">Using Kubernetes for orchestration (05:18)<\/li>\n<li style=\"margin-bottom: 12px;\">A need for a service broker in between (07:16)<\/li>\n<li style=\"margin-bottom: 12px;\">Using Kibosh for automating Kubernetes deployments (08:30)<\/li>\n<li style=\"margin-bottom: 12px;\">Creating a service with Kibosh and Helm (09:04)<\/li>\n<li style=\"margin-bottom: 12px;\">Assigning resources (09:32)<\/li>\n<li style=\"margin-bottom: 12px;\">Accessing the service (10:57)<\/li>\n<li style=\"margin-bottom: 12px;\">Designing a CI\/CD pipeline (12:46)<\/li>\n<\/ol><\/div>\n<div class=\"video-container\"><iframe loading=\"lazy\" title=\"Using Kubernetes+CF Stack as a Part of Blockchain CI\/CD... - Yauheni Kisialiou &amp; Arsenii Petrovich\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/LnfNGcdwS2A?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<br \/>\n<small>These are the slides presented by Yauheni.<\/small><\/p>\n<p><center><iframe loading=\"lazy\" src=\"\/\/www.slideshare.net\/slideshow\/embed_code\/key\/LxzExneoxsysTZ\" width=\"595\" height=\"485\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\" style=\"border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;\" allowfullscreen><\/iframe><\/center><\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Further_reading\"><\/span>Further reading<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/running-stateful-apps-on-kubernetes-with-statefulsets\/\">Considerations for Running Stateful Apps on Kubernetes<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/deploying-services-to-cloud-foundry-is-easier-with-kubernetes\/\">Deploying Services to Cloud Foundry Using Kubernetes: Less BOSH, More Freedom<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/blockchain-as-a-service-running-cloud-foundry-apps-on-ethereum\/\">Blockchain as a Service: Running Cloud Foundry Apps on Ethereum<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"About_the_authors\"><\/span>About the authors<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/Yauheni-Kisialiou-bio.png\" alt=\"\" width=\"150\" height=\"150\" class=\"alignright size-full wp-image-42799\" \/><\/p>\n<p><small><a href=\"https:\/\/github.com\/Ykisialiou\" rel=\"noopener noreferrer\" target=\"_blank\">Yauheni Kisialiou<\/a> is Cloud Foundry DevOps Engineer at Altoros. He specializes in enterprise cloud platform support and automation, using almost 10 years of experience in cloud administration and building cloud systems. Yauheni is highly adept at using BOSH for deploying Cloud Foundry and other services. Now, he is part of the team working on container orchestration enablement for a leading insurance company.<\/small><\/p>\n<hr \/>\n<p><center><small>This blog post was written by <a href=\"https:\/\/github.com\/Ykisialiou\" rel=\"noopener noreferrer\" target=\"_blank\">Yauheni Kisialiou<\/a>, <a href=\"https:\/\/www.altoros.com\/blog\/author\/sophie.turol\/\">Sophia Turol<\/a>, and <a href=\"https:\/\/www.altoros.com\/blog\/author\/alex\/\">Alex Khizhniak<\/a>.<\/small><\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>What&#8217;s needed for a DApp on CF+K8s<\/p>\n<p>Using blockchain, various industries have been able to improve efficiency through automation of mundane, manual processes in a secure and transparent manner. Commonly, for a blockchain (Ethereum) implementation in production, there is a need for:<\/p>\n<p>a server-client app to build a network<br \/>\na decentralized app (DApp) [&#8230;]<\/p>\n","protected":false},"author":3,"featured_media":42979,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":"","_links_to":"","_links_to_target":""},"categories":[214],"tags":[672,873,807,912,206],"class_list":["post-42315","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-blockchain","tag-cloud-native","tag-ethereum","tag-kubernetes","tag-oss-cloud-foundry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Deploying a Blockchain App on Cloud Foundry and Kubernetes | Altoros<\/title>\n<meta name=\"description\" content=\"Explore how to automate DApp deployment in terms of creating services needed, assigning resources, enabling CI\/CD, etc.\u2014using Kibosh, Parity, and Helm.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Deploying a Blockchain App on Cloud Foundry and Kubernetes | Altoros\" \/>\n<meta property=\"og:description\" content=\"What&#8217;s needed for a DApp on CF+K8s Using blockchain, various industries have been able to improve efficiency through automation of mundane, manual processes in a secure and transparent manner. Commonly, for a blockchain (Ethereum) implementation in production, there is a need for: a server-client app to build a network a decentralized app (DApp) [...]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/\" \/>\n<meta property=\"og:site_name\" content=\"Altoros\" \/>\n<meta property=\"article:published_time\" content=\"2019-05-15T02:16:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-05-31T07:14:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-blockchain-development-using-cloud-foundry-and-kubernetes-v1.gif\" \/>\n\t<meta property=\"og:image:width\" content=\"640\" \/>\n\t<meta property=\"og:image:height\" content=\"360\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/gif\" \/>\n<meta name=\"author\" content=\"Sophia Turol\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sophia Turol\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/\",\"name\":\"Deploying a Blockchain App on Cloud Foundry and Kubernetes | Altoros\",\"isPartOf\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-blockchain-development-using-cloud-foundry-and-kubernetes-v1.gif\",\"datePublished\":\"2019-05-15T02:16:55+00:00\",\"dateModified\":\"2019-05-31T07:14:00+00:00\",\"author\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/58194952af19fe7b2b830846e077a58e\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#primaryimage\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-blockchain-development-using-cloud-foundry-and-kubernetes-v1.gif\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-blockchain-development-using-cloud-foundry-and-kubernetes-v1.gif\",\"width\":640,\"height\":360},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.altoros.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Deploying a Blockchain App on Cloud Foundry and Kubernetes\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\",\"url\":\"https:\/\/www.altoros.com\/blog\/\",\"name\":\"Altoros\",\"description\":\"Insight\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.altoros.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/58194952af19fe7b2b830846e077a58e\",\"name\":\"Sophia Turol\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/trello_card-96x96.jpg\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/trello_card-96x96.jpg\",\"caption\":\"Sophia Turol\"},\"description\":\"Sophia Turol is passionate about delivering well-structured articles that cater for picky technical audience. With 3+ years in technical writing and 5+ years in editorship, she enjoys collaboration with developers to create insightful, yet intelligible technical tutorials, overviews, and case studies. Sophie is enthusiastic about deep learning solutions\u2014TensorFlow in particular\u2014and PaaS systems, such as Cloud Foundry.\",\"url\":\"https:\/\/www.altoros.com\/blog\/author\/sophie-turol\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Deploying a Blockchain App on Cloud Foundry and Kubernetes | Altoros","description":"Explore how to automate DApp deployment in terms of creating services needed, assigning resources, enabling CI\/CD, etc.\u2014using Kibosh, Parity, and Helm.","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:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/","og_locale":"en_US","og_type":"article","og_title":"Deploying a Blockchain App on Cloud Foundry and Kubernetes | Altoros","og_description":"What&#8217;s needed for a DApp on CF+K8s Using blockchain, various industries have been able to improve efficiency through automation of mundane, manual processes in a secure and transparent manner. Commonly, for a blockchain (Ethereum) implementation in production, there is a need for: a server-client app to build a network a decentralized app (DApp) [...]","og_url":"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/","og_site_name":"Altoros","article_published_time":"2019-05-15T02:16:55+00:00","article_modified_time":"2019-05-31T07:14:00+00:00","og_image":[{"width":640,"height":360,"url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-blockchain-development-using-cloud-foundry-and-kubernetes-v1.gif","type":"image\/gif"}],"author":"Sophia Turol","twitter_misc":{"Written by":"Sophia Turol","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/","url":"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/","name":"Deploying a Blockchain App on Cloud Foundry and Kubernetes | Altoros","isPartOf":{"@id":"https:\/\/www.altoros.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#primaryimage"},"image":{"@id":"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#primaryimage"},"thumbnailUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-blockchain-development-using-cloud-foundry-and-kubernetes-v1.gif","datePublished":"2019-05-15T02:16:55+00:00","dateModified":"2019-05-31T07:14:00+00:00","author":{"@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/58194952af19fe7b2b830846e077a58e"},"breadcrumb":{"@id":"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#primaryimage","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-blockchain-development-using-cloud-foundry-and-kubernetes-v1.gif","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/automating-blockchain-development-using-cloud-foundry-and-kubernetes-v1.gif","width":640,"height":360},{"@type":"BreadcrumbList","@id":"https:\/\/www.altoros.com\/blog\/deploying-a-blockchain-app-on-cloud-foundry-and-kubernetes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.altoros.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Deploying a Blockchain App on Cloud Foundry and Kubernetes"}]},{"@type":"WebSite","@id":"https:\/\/www.altoros.com\/blog\/#website","url":"https:\/\/www.altoros.com\/blog\/","name":"Altoros","description":"Insight","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.altoros.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/58194952af19fe7b2b830846e077a58e","name":"Sophia Turol","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/trello_card-96x96.jpg","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/05\/trello_card-96x96.jpg","caption":"Sophia Turol"},"description":"Sophia Turol is passionate about delivering well-structured articles that cater for picky technical audience. With 3+ years in technical writing and 5+ years in editorship, she enjoys collaboration with developers to create insightful, yet intelligible technical tutorials, overviews, and case studies. Sophie is enthusiastic about deep learning solutions\u2014TensorFlow in particular\u2014and PaaS systems, such as Cloud Foundry.","url":"https:\/\/www.altoros.com\/blog\/author\/sophie-turol\/"}]}},"_links":{"self":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/42315","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/comments?post=42315"}],"version-history":[{"count":76,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/42315\/revisions"}],"predecessor-version":[{"id":43804,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/42315\/revisions\/43804"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media\/42979"}],"wp:attachment":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media?parent=42315"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/categories?post=42315"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/tags?post=42315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}