<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gbeminiyi 'Telo Briggs' Oshoba</title>
    <description>The latest articles on DEV Community by Gbeminiyi 'Telo Briggs' Oshoba (@ocdkerosine).</description>
    <link>https://dev.to/ocdkerosine</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F818565%2F9248d4f7-425e-435e-9473-62f4c4f3bd9a.jpeg</url>
      <title>DEV Community: Gbeminiyi 'Telo Briggs' Oshoba</title>
      <link>https://dev.to/ocdkerosine</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ocdkerosine"/>
    <language>en</language>
    <item>
      <title>Parallel Processing with Multithreaded Node.js</title>
      <dc:creator>Gbeminiyi 'Telo Briggs' Oshoba</dc:creator>
      <pubDate>Sat, 26 Feb 2022 21:49:25 +0000</pubDate>
      <link>https://dev.to/ocdkerosine/parallel-processing-with-multithreaded-nodejs-24le</link>
      <guid>https://dev.to/ocdkerosine/parallel-processing-with-multithreaded-nodejs-24le</guid>
      <description>&lt;p&gt;Whether you're a few days in or a few years, a lot of people can't seem to understand how single-threaded NodeJS can compete with multi-threaded backends.&lt;/p&gt;

&lt;p&gt;To identify the reasons, we have to understand what it really means when we say Node.js is single-threaded.&lt;/p&gt;

&lt;p&gt;JavaScript itself was originally created to do basic things like validating forms, making things responsive, etc., and it was only in 2009 that Node.js creator Ryan Dahl made it possible to use JavaScript to write server-side code.&lt;/p&gt;

&lt;p&gt;Server-side languages that support multithreading have all manners of structures and constructs in place for syncing values between threads and other thread-oriented features. &lt;/p&gt;

&lt;p&gt;Supporting those things meant JavaScript would have needed to change the entire language which was never the plan of it's creator. So in order for plain JavaScript to support multi-threading, Dahl had to create a workaround. Let's dive in!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;How does Node.js actually work?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Node.js uses two kinds of threads: a main thread handled by the &lt;a href="https://nodejs.org/en/docs/guides/dont-block-the-event-loop/"&gt;event loop&lt;/a&gt; and several auxiliary threads in a &lt;a href="http://nodesource.com/blog/worker-threads-nodejs/"&gt;worker pool&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Event loop&lt;/strong&gt; is the infrastructure that takes callbacks (functions) and registers them to be executed at a later time in the future. It executes in the same thread as the JavaScript code itself. When a JavaScript operation blocks the thread, the event loop is also blocked.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;Worker pool&lt;/strong&gt; is an execution model that spawns and handles separate threads, it then synchronously performs the task and return the result to the event loop. The event loop then executes the provided callback with said result.&lt;/p&gt;

&lt;p&gt;Basically worker pools handles asynchronous I/O operations - mainly, interactions with the system's disk and network. A few modules use worker pools out the box such as fs (I/O-heavy) or crypto (CPU-heavy). Worker pool is implemented in libuv, which results in slight delays whenever Node needs to transmit data internally between JavaScript and C++, but this is hardly noticeable.&lt;/p&gt;

&lt;p&gt;The implication of both systems is that we are able to write code like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--91nyqpEh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ujthwtrl1ngrpe0rq4ku.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--91nyqpEh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ujthwtrl1ngrpe0rq4ku.png" alt="fs is a nodejs module" width="670" height="107"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the code above we don't have to synchronously wait for an event. We delegate the task of reading the file to the worker pool and call the provided function with the result. Since worker pool has its own threads, the event loop can continue executing normally while the file is being read.&lt;/p&gt;

&lt;p&gt;This is seemingly sufficient until it is necessary to synchronously execute a complex operation - any function that takes too long to run will block the thread. If in your application you have functions of that nature, it could significantly reduce the throughput of your server or even completely freeze it. In this scenario we have no way of delegating the load to the worker pool.&lt;/p&gt;

&lt;p&gt;Tech fields that required complex calculations - such as AI, machine learning, or big data - couldn't really use Node.js efficiently due to the operations blocking the main (and only) thread, making the server unresponsive. This was the case up until Node.js v10.5.0 came out in June 2018, which added support for multiple threads and opened up new possibilities for JavaScript.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;I introduce to you: worker_threads&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With the release of Node.js 10.5.0 came about worker_threads. It enables the creation of simple multi-threaded applications in JavaScript. Threads are pretty simple and, very importantly, fun.&lt;/p&gt;

&lt;p&gt;The worker_threads module is a package that allows us to design fully functional multithreaded Node.js applications. A thread worker is a piece of code (usually taken out of a file) spawned in a separate thread.&lt;/p&gt;

&lt;p&gt;It is important to note that the terms thread worker, worker, and thread are often used interchangeably; they all refer to the same thing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---kfryNac--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q1xa8ty4h6r6ow8g182r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---kfryNac--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q1xa8ty4h6r6ow8g182r.png" alt="image" width="323" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Worker Threads in Node.js is useful for performing heavy JavaScript tasks. With the help of threads, Worker makes it easy to run JavaScript codes in parallel making it much faster and efficient. We can do heavy tasks without even disturbing the main thread.&lt;/p&gt;

&lt;p&gt;Worker threads were not introduced in the older versions of Node. Therefore, first update your Node.js for getting started.&lt;/p&gt;

&lt;p&gt;Now create two files for implementing the thread as shown below:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filename: worker.js&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;// workerData is used for fetching the data from the thread and parentPort is used for manipulating the thread&lt;br&gt;
const { workerData, parentPort } = require('worker_threads');&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;// log some stuff&lt;br&gt;
console.log(&lt;/code&gt;&lt;code&gt;Write-up on how ${workerData} wants to chill with the big boys&lt;/code&gt;&lt;code&gt;);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;// The postMessage() method is used for posting the given message in the console by taking the filename as fetched by workerData&lt;br&gt;
parentPort.postMessage({ filename: workerData, status: 'Done'});&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filename: index.js&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const { Worker } = require('worker_threads');&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;// function runService() runs the worker thread and returns a Promise &lt;br&gt;
const runSerice = (workerData) =&amp;gt; {&lt;br&gt;
 return new Promise((resolve, reject) =&amp;gt; {&lt;br&gt;
 const worker = new Worker('./worker.js', { workerData });&lt;br&gt;
 worker.on('message', resolve);&lt;br&gt;
 worker.on('error', reject);&lt;br&gt;
 worker.on('exit', code =&amp;gt; {&lt;br&gt;
 if (code !== 0) reject(new Error(&lt;/code&gt;&lt;code&gt;Worker Thread stopped with exit code ${code}&lt;/code&gt;&lt;code&gt;));&lt;br&gt;
 });&lt;br&gt;
 });&lt;br&gt;
 }&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;// function run() is used for calling the function runService() and giving the value for workerData&lt;br&gt;
const run = async () =&amp;gt; {&lt;br&gt;
 const result = await runSerice('Tunde Ednut');&lt;br&gt;
 console.log(result);&lt;br&gt;
 }&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;run().catch(err =&amp;gt; console.error(err));&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gkDkwf3L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1uihv238mzaw88019jqu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gkDkwf3L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1uihv238mzaw88019jqu.png" alt="node index.js" width="539" height="62"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Full working code on github: &lt;a href="https://github.com/ocdkerosine/multithreaded-node-js"&gt;https://github.com/ocdkerosine/multithreaded-node-js&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
By delegating heavy CPU computations to other threads, we can significantly increase our server's throughput and worker_threads provide a fairly easy way to add multithreading support to production applications.&lt;/p&gt;

&lt;p&gt;With the official threads support, we can expect more developers and engineers from data and compute intensive fields to start harnessing the added power and notorious speed of Node.js.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read More&lt;/strong&gt;&lt;br&gt;
Looking to scale from local first development to production first coding? Join us at &lt;a href="https://kerosinecoding.com"&gt;Kerosine Coding&lt;/a&gt; today!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Deploy to Kubernetes in 5 minutes with Docker Compose and Okteto Cloud</title>
      <dc:creator>Gbeminiyi 'Telo Briggs' Oshoba</dc:creator>
      <pubDate>Sat, 26 Feb 2022 01:54:20 +0000</pubDate>
      <link>https://dev.to/ocdkerosine/deploy-to-kubernetes-in-5-minutes-with-docker-compose-and-okteto-cloud-3f9g</link>
      <guid>https://dev.to/ocdkerosine/deploy-to-kubernetes-in-5-minutes-with-docker-compose-and-okteto-cloud-3f9g</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--M3M334Y9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hu7zzw2j34xqh0dneiov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M3M334Y9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hu7zzw2j34xqh0dneiov.png" alt="header" width="880" height="414"&gt;&lt;/a&gt; &lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why developers need Docker Compose in Kubernetes&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;br&gt;A Docker Compose file for five microservices might be around 30 lines of yaml, but the same application in Kubernetes would be 500+ lines of yaml and about 10-15 different files. Also, the Docker Compose CLI rebuilds and redeploys containers when needed. In Kubernetes, you need additional tools to build your images, tag them, push them to a Docker Registry, update your Kubernetes manifests, and redeploy them. It’s too much friction for something that’s wholly abstracted away by Docker Compose.&lt;/p&gt;

&lt;p&gt;There are some use cases where running your Docker Compose files locally presents some challenges. For example, you might need to run dozens of microservices that exhausts your local CPU/Memory resources, you might need access to GPUs to develop a ML application, or you might want to integrate with a service deployed in a remote Kubernetes cluster. For these scenarios, running Docker Compose in Kubernetes is the perfect solution. This way, developers get access to on demand CPU/Memory/GPU resources, direct access to other services running in the cluster, and more realistic end-to-end integration with the cluster configuration (ingress controllers, SSL termination, monitoring tools, secret manager tools…), while still using the application definition format they know and love.&lt;/p&gt;

&lt;p&gt;A docker-compose manifest is a configuration manifest file for listing and configuring single or multiple application services to be deployed. Like Kubernetes manifests or Helm charts, docker-compose is supported as a manifest for application deployment on Okteto.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ea_pKeaS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kerosinecoding.com/wp-content/uploads/2022/02/teleprescenceokteto.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ea_pKeaS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kerosinecoding.com/wp-content/uploads/2022/02/teleprescenceokteto.png" alt="teleprescense" width="880" height="517"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Docker Compose, Kubernetes &amp;amp; Okteto Stacks&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Okteto Stacks is a fully compatible Kubernetes backend for Docker Compose. Okteto Stacks are unique with respect to other Kubernetes backend implementations of the Docker Compose Specification because they provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In-cluster builds for better performance and caching behavior.&lt;/li&gt;
&lt;li&gt;Ingress Controller integration and SSL termination for public ports.&lt;/li&gt;
&lt;li&gt;Bidirectional synchronization between your local filesystem and your containers in Kubernetes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Okteto’s bidirectional synchronization is pretty handy: .it reloads your application on the cluster while you edit your code locally. It’s equivalent to mounting your code inside a container using Docker Compose host volumes, but for containers running in a remote cluster.&lt;/p&gt;

&lt;p&gt;For a more beginner friendly quickstart there is a handy tutorial hosted by the Docker Team &lt;a href="https://www.docker.com/blog/from-compose-to-kubernetes-with-okteto/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this tutorial, you’ll learn how to deploy a Fullstack Invoice Management App called Kerosine Invoicing to Okteto Cloud by using a docker compose manifest. Quickly grab the code &lt;a href="http://github.com/ocdkerosine/kerosine-invoicing.git"&gt;here&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How to get started&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In order to follow this tutorial, the following prerequisites must be met:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The latest stable version of &lt;a href="https://nodejs.org/en/download/"&gt;Node&lt;/a&gt; installed on your machine&lt;/li&gt;
&lt;li&gt;Good knowledge of the Nodejs and Docker&lt;/li&gt;
&lt;li&gt;Docker compose installed.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://okteto.com/docs/getting-started/installation/"&gt;Okteto CLI&lt;/a&gt; installed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To show the possibilities of Okteto Stacks, let’s deploy our Invoice Management App, &lt;strong&gt;Kerosine Invoicing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Get a local version of the Kerosine Invoicing App by executing the following commands:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git clone https://github.com/ocdkerosine/kerosine-invoicing.git&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ cd kerosine-invoicing&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ okteto stack deploy --wait

i Using ocdkerosine @ cloud.okteto.com as context
! The following fields are not currently supported and will be ignored: 
    - networks
    - services[kerosine-invoice-frontend, kerosine-invoice-backend].networks
    - volumes[api-data].driver
Help us to decide which fields to implement next by filing an issue in https://github.com/okteto/okteto/issues/new
✓ Created volume 'api-data'
✓ Deployed service 'kerosine-invoice-frontend'
✓ Deployed service 'kerosine-invoice-backend'
✓ Stack 'kerosine-invoicing' successfully deployed
i Endpoints available:
   - https://kerosine-invoice-backend-ocdkerosine.cloud.okteto.net/
   - https://kerosine-invoice-frontend-ocdkerosine.cloud.okteto.net/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The deploy command will create the necessary deployments, services, persistent volumes, and ingress rules needed to run the Kerosine Invoicing App. Go to the &lt;a href="http://cloud.okteto.com"&gt;Okteto Cloud&lt;/a&gt; dashboard and you will get the URL of the application… or maybe just pick it up from your console. &lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dashboard&lt;/strong&gt; :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m9LmZXjU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kerosinecoding.com/wp-content/uploads/2022/02/oktetodashboard.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m9LmZXjU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kerosinecoding.com/wp-content/uploads/2022/02/oktetodashboard.png" alt="dashboard" width="880" height="478"&gt;&lt;/a&gt; &lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live App:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oN3IPuuK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kerosinecoding.com/wp-content/uploads/2022/02/livekerosineapp-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oN3IPuuK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kerosinecoding.com/wp-content/uploads/2022/02/livekerosineapp-1.png" alt="live app" width="880" height="476"&gt;&lt;/a&gt;&lt;/strong&gt; &lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Sidebar:
&lt;/h3&gt;

&lt;p&gt;It is at this point I would like to obligatorily pull you away from the action to speak on my environment setup and tell you the inspiration behind it. I code using VS Codium(open source binary release of vscode without Microsoft telemetry) on Parrot OS, Linux. Parrot is a security and pen-testing based OS. Its popular rival is Kali Linux, the OS in which I learnt the bread and butter of hacking and Linux Administration. But why? Because trackers are using your information for purposes that don’t protect your self interest. Find out how you can protect yourself from the PrivacyTools.io site &lt;a href="https://www.privacytools.io/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1da9-HUr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kerosinecoding.com/wp-content/uploads/2022/02/privacytoolslogo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1da9-HUr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kerosinecoding.com/wp-content/uploads/2022/02/privacytoolslogo.png" alt="privacy tools" width="880" height="306"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Moving On
&lt;/h3&gt;

&lt;p&gt;We have successfully deployed our application to the Kubernetes development platform, Okteto, using docker-compose as below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YILJ0JZ6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kerosinecoding.com/wp-content/uploads/2022/02/docker-compose.ymlokteto.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YILJ0JZ6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kerosinecoding.com/wp-content/uploads/2022/02/docker-compose.ymlokteto.png" alt="moving on" width="880" height="541"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Local Development
&lt;/h3&gt;

&lt;p&gt;Now that the Kerosine Invoicing App is running on the cloud (production), let’s make a small change (on local pc) to show you the full development workflow.&lt;/p&gt;

&lt;p&gt;Open the “frontend/public/index.html” file in your IDE and change the line 14. Save your changes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;title&amp;gt;Kerosine Invoice App&amp;lt;/title&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you’re happy with your changes, execute the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;okteto up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the URL of your application again. Your code changes were instantly applied. No commit, build, or push required. And from this moment, any changes done from your IDE will be immediately applied to your application all thanks to Telepresence!&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--THBY70ky--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kerosinecoding.com/wp-content/uploads/2022/02/okteto-upokteto.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--THBY70ky--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kerosinecoding.com/wp-content/uploads/2022/02/okteto-upokteto.png" alt="local development" width="880" height="733"&gt;&lt;/a&gt;&lt;br&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By using docker-compose with Okteto, you’re able to get all the benefits of developing with Kubernetes, such as using monitoring tools, platform services like secret management tools, and taking ownership of the release pipeline, but without the hassle of needing to learn Kubernetes.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://kerosinecoding.com/2022/02/deploy-to-kubernetes-in-5-minutes-with-docker-compose-and-okteto-cloud/"&gt;Deploy to Kubernetes in 5 minutes with Docker Compose and Okteto Cloud&lt;/a&gt; first appeared on &lt;a href="https://kerosinecoding.com"&gt;Kerosine Coding&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>dockercompose</category>
      <category>kubernetes</category>
      <category>node</category>
    </item>
  </channel>
</rss>
