<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Okteto Blog</title>
        <link>https://www.okteto.com/blog/</link>
        <description>Posts from the Okteto team on development environments, platform engineering, Kubernetes, and AI coding agents.</description>
        <lastBuildDate>Thu, 10 Sep 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>Copyright © 2026 Okteto, Inc.</copyright>
        <item>
            <title><![CDATA[Okteto vs Bunnyshell: Choosing the Right Kubernetes Environment Platform for Your Team]]></title>
            <link>https://www.okteto.com/blog/compare-okteto-versus-bunnyshell/</link>
            <guid>https://www.okteto.com/blog/compare-okteto-versus-bunnyshell/</guid>
            <pubDate>Thu, 10 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Okteto and Bunnyshell take different approaches to Kubernetes environments. This guide explains the key differences to help you choose.]]></description>
            <content:encoded><![CDATA[<p>Most platform comparisons turn into feature checklists, and feature checklists are the least useful way to make this decision. Both Okteto and Bunnyshell will give your developers an environment per pull request. Both run your workloads in your own Kubernetes cluster. If that is the whole requirement, either one will do the job.</p>
<!-- -->
<p>The decision gets interesting when you ask a different question: who holds the environment, and who does it answer to? Bunnyshell delivers environments to you as a service from its own cloud. Okteto gives you an environment platform that lives inside your infrastructure. That single difference propagates into where your configuration is stored, what access your cluster has to grant, how the platform bills you, and what happens when AI agents start asking for environments too. This guide walks through it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-the-shared-challenge">Understanding the Shared Challenge<a href="https://www.okteto.com/blog/compare-okteto-versus-bunnyshell/#understanding-the-shared-challenge" class="hash-link" aria-label="Direct link to Understanding the Shared Challenge" title="Direct link to Understanding the Shared Challenge" translate="no">​</a></h2>
<p>Modern cloud-native development is complex. Your applications aren't just code anymore. They're code plus configuration, runtime dependencies, network policies, secrets, and interactions across dozens of microservices. Developers can't gain real confidence that their changes work by running unit tests on a laptop. They need access to realistic environments that reflect production complexity.</p>
<p>Both Okteto and Bunnyshell recognize this challenge, and both were built to end the queue for a shared staging environment. Bunnyshell's own documentation opens on exactly that pain: only one engineer at a time can deploy to staging, so everyone else waits or competes for access. That is a real problem, and it is worth solving.</p>
<p>The two platforms diverge on where the solution should live. That is the part worth understanding before you commit.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-bunnyshell-works">How Bunnyshell Works<a href="https://www.okteto.com/blog/compare-okteto-versus-bunnyshell/#how-bunnyshell-works" class="hash-link" aria-label="Direct link to How Bunnyshell Works" title="Direct link to How Bunnyshell Works" translate="no">​</a></h2>
<p>Bunnyshell describes itself as an Environments as a Service platform. You connect a Kubernetes cluster and a Git provider, and Bunnyshell orchestrates full-stack environments inside your cluster on demand or automatically from pull requests.</p>
<p>The model is genuinely capable. You define an environment as a set of components, and those components can come from Docker Compose files, Helm charts, raw Kubernetes manifests, Terraform modules, prebuilt Docker images, or your own scripts. First-class Terraform components are a real strength if your environments include cloud resources alongside containers. Container images build inside a Kubernetes cluster using Kaniko or BuildKit, either yours or one Bunnyshell manages. Dependencies between components are declared with <code>dependsOn</code>, and anything without a dependency deploys in parallel. Bunnyshell installs webhooks in your Git provider, so opening a pull request clones a designated primary environment with the branch swapped, and closing or merging the pull request destroys it. Git ChatOps lets developers drive environments from pull request comments, which is a nice touch we do not have an equivalent for.</p>
<p>The architectural detail that matters most is how Bunnyshell reaches your cluster. It connects from the outside, to your Kubernetes API server, using credentials you provide. Its documentation is direct about the consequence: clusters "need to either be publicly exposed, or have Bunnyshell IPs whitelisted." Its guidance for private and air-gapped clusters says the same thing, and states plainly that without API access, Bunnyshell cannot create, monitor, or destroy environments. The environment definition itself, <code>bunnyshell.yaml</code>, is held by the platform rather than your repository. Their docs note it is stored "for now" exclusively in Bunnyshell.</p>
<p>For teams whose main pain is the staging queue, and whose clusters can accept an external control plane, this is a coherent and well-built answer.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-okteto-works">How Okteto Works<a href="https://www.okteto.com/blog/compare-okteto-versus-bunnyshell/#how-okteto-works" class="hash-link" aria-label="Direct link to How Okteto Works" title="Direct link to How Okteto Works" translate="no">​</a></h2>
<p>Okteto starts from a different premise: the environment platform should be a component of your infrastructure, not a service that reaches into it.</p>
<p>You <a href="https://www.okteto.com/docs/get-started/install/" target="_blank" rel="noopener noreferrer" class="">install Okteto inside your own Kubernetes cluster with our Helm chart</a>, or you run it as <a href="https://www.okteto.com/docs/byoc/" target="_blank" rel="noopener noreferrer" class="">Bring Your Own Cloud</a>, where we operate the platform inside your cloud account while you keep ownership of the account and the data. Nothing outside your perimeter needs a route to your Kubernetes API. <a href="https://www.okteto.com/docs/self-hosted/manage/air-gapped/" target="_blank" rel="noopener noreferrer" class="">Air-gapped installation</a> is documented end to end, including mirroring the platform and CLI images into your private registry and disabling telemetry, so a cluster with no internet access at all can still run the full platform.</p>
<p>Your environment definition, <a href="https://www.okteto.com/docs/core/okteto-manifest/" target="_blank" rel="noopener noreferrer" class=""><code>okteto.yaml</code></a>, is a file in your repository. That is not a filing detail. It means environment changes arrive as pull requests, get reviewed, carry history, and roll back like any other code. It also means one definition serves every consumer: the CLI a developer runs, the Preview Environment built for a pull request, the test containers <code>okteto test</code> executes, and the AI agent working on a ticket all read the same file.</p>
<p>That manifest sits on top of what you already have rather than replacing it. Okteto implements and extends the <a href="https://www.okteto.com/docs/reference/docker-compose/" target="_blank" rel="noopener noreferrer" class="">Compose Specification</a>, so a <code>docker-compose.yaml</code> deploys to Kubernetes as written, and Helm charts and raw Kubernetes manifests work the same way. For the parts of your stack that are not containers, the manifest's <a href="https://www.okteto.com/docs/tutorials/external-resources/" target="_blank" rel="noopener noreferrer" class=""><code>external</code> section</a> pulls cloud resources into the environment, so an RDS database, an S3 bucket, a Lambda function or a LaunchDarkly environment is created alongside it, shown in the dashboard, garbage-collected with it, and torn down by <code>okteto destroy</code>. Provisioning tooling stays your choice, because <code>deploy</code> commands run whatever you point them at, Terraform included. And since <a href="https://www.okteto.com/docs/core/remote-execution/" target="_blank" rel="noopener noreferrer" class="">those commands can run remotely</a>, your developers do not need Helm, kubectl or Terraform installed locally at all.</p>
<p>Okteto is also built on the premise that different environment types exist to serve different workflows, and a platform should be optimized for each workflow's specific job.</p>
<p><a href="https://www.okteto.com/docs/development/" target="_blank" rel="noopener noreferrer" class=""><strong>Dev Environments</strong></a> are optimized for iteration speed. <a href="https://www.okteto.com/docs/development/containers/file-sync/" target="_blank" rel="noopener noreferrer" class="">File sync and live updates</a>, hot reload, remote debugging, port forwarding for IDE integration, <a href="https://www.okteto.com/docs/development/containers/hybrid/" target="_blank" rel="noopener noreferrer" class="">hybrid mode</a> for running one service locally against the rest in the cluster, and <a href="https://www.okteto.com/docs/core/use-volume-snapshots/" target="_blank" rel="noopener noreferrer" class="">Volume Snapshots</a>, which seed a new environment's database from a snapshot of real staging or production data, so dev and preview environments come up populated instead of empty.</p>
<p><a href="https://www.okteto.com/docs/previews/" target="_blank" rel="noopener noreferrer" class=""><strong>Preview Environments</strong></a> are optimized for collaboration and validation, with auto-deploy on pull requests, shareable URLs, and automatic cleanup. The job is letting PMs, designers, QA, and stakeholders validate a change with no technical setup.</p>
<p><strong>Test Environments</strong> are optimized for consistency. <a href="https://www.okteto.com/docs/testing/" target="_blank" rel="noopener noreferrer" class="">Okteto Test</a> runs unit, integration, and end-to-end tests inside the cluster rather than on a separate CI virtual machine, with the same runtime as production and access to private services.</p>
<p><a href="https://www.okteto.com/docs/ai-agent-environments/" target="_blank" rel="noopener noreferrer" class=""><strong>Agent Environments</strong></a> give AI coding agents the same isolated, production-like environment a developer gets, driven by the same CLI and manifest, so an agent can deploy its change, run the tests, hit the live endpoints, and read the logs before a human reviews anything.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">See how Okteto's on-demand development environments provide the runtime feedback infrastructure developers and AI agents need to deliver production-ready code.</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/get-demo" target="_self">Get a demo</a></div></section>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="quick-comparison">Quick Comparison<a href="https://www.okteto.com/blog/compare-okteto-versus-bunnyshell/#quick-comparison" class="hash-link" aria-label="Direct link to Quick Comparison" title="Direct link to Quick Comparison" translate="no">​</a></h2>
<p>Eight differences that decide most evaluations. The rest of this guide explains why each one matters.</p>
<ul>
<li class=""><strong>Stack support</strong>: both read Docker Compose, Helm charts and Kubernetes manifests. Bunnyshell adds a declarative Terraform component type, which Okteto does not have; with Okteto you run Terraform from a <code>deploy</code> command and register what it creates in the manifest's <code>external</code> section.</li>
<li class=""><strong>Where the platform runs</strong>: Okteto installs inside your infrastructure, Self-Hosted or BYOC. Bunnyshell runs an external control plane that needs to reach your Kubernetes API, or your cluster whitelisting its IP ranges.</li>
<li class=""><strong>Where the environment is defined</strong>: <code>okteto.yaml</code> lives in your Git repository and is reviewed like code. <code>bunnyshell.yaml</code> is stored in the Bunnyshell platform.</li>
<li class=""><strong>What an AI agent gets</strong>: with Okteto, the same production-like environment a developer gets, with real services and data. With Bunnyshell, a separate sandbox service with an isolated scratch filesystem.</li>
<li class=""><strong>Environment types</strong>: purpose-built dev, preview, test and agent environments on one platform, against primary, ephemeral and preview environments that are clones of one pattern.</li>
<li class=""><strong>Development container fidelity</strong>: Okteto's inherits the real Deployment config, including service account, secrets, volumes and sidecars. Bunnyshell's Remote Development strips the Kubernetes health probes and syncs through a third-party tool.</li>
<li class=""><strong>Testing</strong>: in-cluster execution via Okteto Test with production parity, against no dedicated test product and a reliance on your external CI.</li>
<li class=""><strong>Pricing model</strong>: per seat with unlimited environments and agents per seat, against $0.007 per minute for every active environment.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-philosophical-divide-a-service-you-consume-vs-a-capability-you-own">The Philosophical Divide: A Service You Consume vs a Capability You Own<a href="https://www.okteto.com/blog/compare-okteto-versus-bunnyshell/#the-philosophical-divide-a-service-you-consume-vs-a-capability-you-own" class="hash-link" aria-label="Direct link to The Philosophical Divide: A Service You Consume vs a Capability You Own" title="Direct link to The Philosophical Divide: A Service You Consume vs a Capability You Own" translate="no">​</a></h2>
<p>Here is the distinction that explains almost every other difference between these platforms.</p>
<p>Bunnyshell treats environments as a service delivered to you. The provider holds the control plane, holds the environment definition, reaches into your cluster to act, and meters what you consume. That is a legitimate model, and it is the same model behind most of the SaaS you already buy. It has a real benefit: there is very little for you to operate.</p>
<p>Okteto treats environments as a capability you own. The platform runs inside your boundary, the definition lives in your repository, and the same substrate serves developers, CI, and agents. There is a little more for you to own, and in exchange the environment layer becomes part of your infrastructure rather than a dependency on someone else's.</p>
<p>Neither answer is universally right. But the second one holds up better under three specific pressures: security review, GitOps discipline, and agent scale. The rest of this guide is about those three.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="architecture-matters-where-the-control-plane-sits">Architecture Matters: Where the Control Plane Sits<a href="https://www.okteto.com/blog/compare-okteto-versus-bunnyshell/#architecture-matters-where-the-control-plane-sits" class="hash-link" aria-label="Direct link to Architecture Matters: Where the Control Plane Sits" title="Direct link to Architecture Matters: Where the Control Plane Sits" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-cluster-does-not-have-to-be-reachable">Your cluster does not have to be reachable<a href="https://www.okteto.com/blog/compare-okteto-versus-bunnyshell/#your-cluster-does-not-have-to-be-reachable" class="hash-link" aria-label="Direct link to Your cluster does not have to be reachable" title="Direct link to Your cluster does not have to be reachable" translate="no">​</a></h3>
<p>This is the difference that most often decides an enterprise evaluation. With Bunnyshell, your Kubernetes API server has to be reachable by an external service, whether by public exposure or by whitelisting its published IP ranges, and it has to accept credentials with enough authority to create and destroy workloads across namespaces. Their private-cluster guidance requires exactly this, which means a cluster with genuinely no inbound path cannot be onboarded.</p>
<p>With Okteto, the platform is <a href="https://www.okteto.com/docs/self-hosted/" target="_blank" rel="noopener noreferrer" class="">a workload inside the cluster</a>. There is no external control plane to admit, no IP range to allow, and no standing credential held outside your boundary. If your security team's position is that nothing outside the perimeter gets an authenticated path to the Kubernetes API, that position stays intact.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-environment-definition-is-a-file-in-your-repository">Your environment definition is a file in your repository<a href="https://www.okteto.com/blog/compare-okteto-versus-bunnyshell/#your-environment-definition-is-a-file-in-your-repository" class="hash-link" aria-label="Direct link to Your environment definition is a file in your repository" title="Direct link to Your environment definition is a file in your repository" translate="no">​</a></h3>
<p>When configuration lives in the platform rather than the repo, ordinary engineering practice gets harder. You cannot review an environment change in a pull request, cannot diff what changed between two weeks, cannot revert by reverting a commit, and cannot reconstruct the environment from the repository alone. Bunnyshell mitigates this in part: custom templates can be stored in Git repositories you choose, and its CLI can fetch and decrypt definitions. But the environment definition, by their documentation, sits in the platform.</p>
<p>Okteto's <a href="https://www.okteto.com/docs/reference/okteto-manifest/" target="_blank" rel="noopener noreferrer" class=""><code>okteto.yaml</code></a> is versioned with the code it describes. This also matters for a reason that was not obvious two years ago: it is how an AI agent learns your environment. The agent reads the manifest out of the repository, discovers your services from it, and runs the same commands a developer would.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-development-container-inherits-real-production-configuration">Your development container inherits real production configuration<a href="https://www.okteto.com/blog/compare-okteto-versus-bunnyshell/#your-development-container-inherits-real-production-configuration" class="hash-link" aria-label="Direct link to Your development container inherits real production configuration" title="Direct link to Your development container inherits real production configuration" translate="no">​</a></h3>
<p>Both platforms let you write code locally and run it in the cluster. The mechanics differ in ways worth knowing.</p>
<p>Bunnyshell's Remote Development prepares the target component by adding init containers and a persistent volume for your code, installing an SSH server, syncing files with Mutagen, and overriding the container's command. It also removes the Kubernetes <code>livenessProbe</code>, <code>readinessProbe</code>, and <code>startupProbe</code>, overwriting them with null for the duration of the session, because development containers usually don't start the same processes production ones do.</p>
<p>Okteto's <a href="https://www.okteto.com/docs/development/containers/file-sync/" target="_blank" rel="noopener noreferrer" class=""><code>okteto up</code> creates a development copy</a> of the Deployment that inherits the original manifest. Per our documentation, the development container uses the same service account, environment variables, secrets, volumes, and sidecars as the workload it stands in for. We override container-level configuration too, primarily to swap in a development image, so this is a difference in degree rather than kind. But the degree is the point: the closer the development container sits to the real Deployment, the fewer bugs wait until production to introduce themselves.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-changes-when-agents-enter-the-picture">What Changes When Agents Enter the Picture<a href="https://www.okteto.com/blog/compare-okteto-versus-bunnyshell/#what-changes-when-agents-enter-the-picture" class="hash-link" aria-label="Direct link to What Changes When Agents Enter the Picture" title="Direct link to What Changes When Agents Enter the Picture" translate="no">​</a></h2>
<p>This is where the two platforms diverge most sharply, and it is the newest part of the comparison.</p>
<p>Bunnyshell's answer for AI is a separate sandbox service, marketed alongside the platform rather than built into it. It provisions an isolated micro-sandbox in roughly 100 milliseconds, with its own filesystem and network namespace, sized in their published example at half a CPU and 512Mi of memory, and it is designed for running untrusted code. It is a good primitive, and for tasks like executing a model's generated snippet it is the right tool. What it is not is your application. We went deeper on that distinction in <a href="https://www.okteto.com/blog/sandboxes-vs-environments-why-the-distinction-matters-for-enterprise-ai-development/" target="_blank" rel="noopener noreferrer" class="">Sandboxes vs. Environments</a>. There is no service graph in it, no real database, no message queue, none of your configuration. Their in-platform AI feature, Workspaces, is a persistent virtual machine on KubeVirt with a preinstalled toolchain, aimed at connecting Cursor, Windsurf, Copilot, or JetBrains Gateway over SSH. That is a cloud development machine, which is useful, but it is still not your running system.</p>
<p>The distinction decides what an agent can actually prove. An agent with a scratch filesystem can write code and run whatever tests need nothing but the language runtime. An agent with a real environment can deploy the change, watch the dependent services respond, run the integration suite against a real database, curl the live endpoint, read the logs, and fix what broke. Only the second one produces a change that has been verified rather than merely written, and the review burden on your engineers is completely different in each case.</p>
<p>Okteto gives the agent the developer's environment. You <a href="https://www.okteto.com/docs/agentic/" target="_blank" rel="noopener noreferrer" class="">install the plugin</a> in one command, and Claude Code, Cursor, Codex, Copilot, or anything else that reads the open Agent Skills format learns your CLI and your manifest. Agents work in one of two modes: <a href="https://www.okteto.com/docs/agentic/collaborative-workflows/" target="_blank" rel="noopener noreferrer" class="">collaborative</a>, where you hold the dev session and the agent runs commands inside it, or <a href="https://www.okteto.com/docs/agentic/autonomous-workflows/" target="_blank" rel="noopener noreferrer" class="">autonomous</a>, where the agent deploys the environment, implements the change, runs the test containers, smoke-tests the endpoints, checks the logs, and opens a pull request when everything passes.</p>
<p>Then there is the bill. Bunnyshell's published Startup rate, as of September 2026, is $0.007 per minute per active environment, which is $0.42 an hour. For short-lived human previews that is a sensible way to charge. Agents invert the assumption, because they hold environments concurrently and for longer stretches than people do. A hundred concurrent environments running eight hours a day, twenty-one days a month, comes to roughly $7,000 a month in platform fees before a cent of your own cloud spend. Okteto <a href="https://www.okteto.com/docs/admin/billing/" target="_blank" rel="noopener noreferrer" class="">bills per seat</a> annually and charges nothing per environment or per agent: one seat can run as many of both as your infrastructure supports, and an Enterprise license covers every cluster in your fleet with only unique seats counted. What is left to optimize is your own infrastructure, which the Garbage Collector and Resource Manager exist to do. That model is also why your bill tracks your team rather than your machine time, so it stays predictable as your agent count climbs. For the number itself, our team can put together a real quote, sized to your team, your cluster footprint, and the agent concurrency you expect.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="platform-engineering-enablements">Platform Engineering Enablements<a href="https://www.okteto.com/blog/compare-okteto-versus-bunnyshell/#platform-engineering-enablements" class="hash-link" aria-label="Direct link to Platform Engineering Enablements" title="Direct link to Platform Engineering Enablements" translate="no">​</a></h2>
<p>For platform engineering leaders, the question isn't just "which tool helps developers code faster?" It's "which platform helps me build and scale a developer experience function?"</p>
<p>Both products give you instrumentation, though they measure different things, and it is worth being precise about the difference. Bunnyshell reports DORA-style Engineering Metrics derived from your Git history, with average cycle time broken into coding, pickup, review, and deploy intervals, plus deployment frequency, and it integrates Kubecost for cloud cost reporting grouped by project, environment, cluster, template, or user. If what you want is delivery-flow reporting, that is a solid offering, and if DORA reporting to leadership is a hard requirement this quarter, weigh it honestly. Okteto Insights measures the platform rather than the Git graph, and it exports its metrics, so you can join them to whatever already tracks your delivery flow.</p>
<p>Okteto instruments the platform itself:</p>
<p><a href="https://www.okteto.com/docs/core/okteto-insights-dashboards/" target="_blank" rel="noopener noreferrer" class=""><strong>Okteto Insights</strong></a> gives you dashboards for build duration, deploy times, test results, node and pod utilization, and platform adoption, and the metrics can be consumed from your own observability tooling.</p>
<p><a href="https://www.okteto.com/docs/admin/catalog/" target="_blank" rel="noopener noreferrer" class=""><strong>Okteto Catalog</strong></a> lets platform teams define standardized, compliant environment templates, managed from the Admin Dashboard or declared as <a href="https://www.okteto.com/docs/self-hosted/manage/custom-resource-definitions/" target="_blank" rel="noopener noreferrer" class="">Custom Resource Definitions</a> so they live in your GitOps repo. Developers get self-service access to approved configurations without the platform team becoming a bottleneck.</p>
<p><a href="https://www.okteto.com/docs/admin/resource-manager/" target="_blank" rel="noopener noreferrer" class=""><strong>Resource Manager</strong></a> right-sizes CPU and memory requests from observed usage, and the <a href="https://www.okteto.com/docs/admin/cleanup/" target="_blank" rel="noopener noreferrer" class=""><strong>Garbage Collector</strong></a> applies sleep and delete policies to idle namespaces and Preview Environments. These are remediation, not just reporting: they act on the cost rather than charting it.</p>
<p><a href="https://www.okteto.com/docs/reference/okteto-manifest/" target="_blank" rel="noopener noreferrer" class=""><strong>Unified manifest</strong></a> with <code>build</code>, <code>dev</code>, <code>test</code>, and <code>deploy</code> sections gives you one configuration model across every environment type, in your repository.</p>
<p><strong>Enterprise readiness</strong>: SSO, <a href="https://www.okteto.com/docs/core/user-roles-and-permissions/" target="_blank" rel="noopener noreferrer" class="">RBAC</a>, audit logs, <a href="https://www.okteto.com/docs/core/endpoints/private-endpoints/" target="_blank" rel="noopener noreferrer" class="">private endpoints</a>, and SOC 2 Type 2 compliance, without tier gating that depends on your headcount.</p>
<p>One practical note on tiering, since it affects evaluation. Bunnyshell's published plans put DORA metrics, cloud cost reporting, and advanced RBAC on the Scaleup plan, which carries a twenty user minimum, and the audit log on Enterprise. Worth checking against your own team size and compliance requirements early rather than late.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="choosing-the-right-platform-for-your-team">Choosing the Right Platform for Your Team<a href="https://www.okteto.com/blog/compare-okteto-versus-bunnyshell/#choosing-the-right-platform-for-your-team" class="hash-link" aria-label="Direct link to Choosing the Right Platform for Your Team" title="Direct link to Choosing the Right Platform for Your Team" translate="no">​</a></h2>
<p>Both platforms solve real problems. The right choice depends on your organization's context, not which platform has more features.</p>
<p><strong>Okteto fits best if:</strong></p>
<ul>
<li class="">Your security posture will not grant an external control plane an authenticated path to your Kubernetes API, or you operate air-gapped</li>
<li class="">You want environment configuration versioned in Git and reviewed like code</li>
<li class="">You are putting AI agents to work and need them verifying changes against real services and data, not writing code in a scratch sandbox</li>
<li class="">You expect environment and agent counts to grow and do not want platform cost to track machine time</li>
<li class="">You need different workflows optimized for different jobs: developer velocity, stakeholder review, test reliability, agent autonomy</li>
<li class="">You are building or scaling a platform engineering function and want telemetry on the platform, plus automated cost remediation</li>
<li class="">You have existing production pipelines such as <a href="https://www.okteto.com/docs/self-hosted/manage/argocd/" target="_blank" rel="noopener noreferrer" class="">ArgoCD</a> and need a platform that integrates rather than replaces</li>
</ul>
<p><strong>Bunnyshell may fit if:</strong></p>
<ul>
<li class="">Your primary pain is the shared staging queue, and a full-stack environment per pull request is the whole requirement</li>
<li class="">Your clusters can accept an external control plane, and a managed control plane is an advantage rather than a constraint</li>
<li class="">You want delivery-flow DORA reporting out of the box</li>
<li class="">Your consumption is genuinely bursty and short-lived, which is where pay-per-minute is cheapest</li>
<li class="">You want driving environments from pull request comments via ChatOps</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-platform-engineering-perspective">The Platform Engineering Perspective<a href="https://www.okteto.com/blog/compare-okteto-versus-bunnyshell/#the-platform-engineering-perspective" class="hash-link" aria-label="Direct link to The Platform Engineering Perspective" title="Direct link to The Platform Engineering Perspective" translate="no">​</a></h2>
<p>If you are a platform engineering leader evaluating these solutions, the strategic question is this: are you buying an environment service, or building an environment capability?</p>
<p>Bunnyshell answers the first. It hands you on-demand environments with very little to operate, and for a team whose constraint is the staging queue, that is a fast win.</p>
<p>Okteto answers the second. The platform runs inside your boundary, the definition of an environment lives in your repository, and the same substrate serves developers, CI, and now agents, under governance you set. That matters more every quarter, because the number of things asking your platform for a production-like environment is going up, and most of them are not people.</p>
<p>If your organization has committed to Kubernetes, and your constraint is verified velocity across humans and agents rather than the absence of a staging environment, Okteto is purpose-built for that outcome.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">See how teams of 20 to 2,000+ developers use Okteto to give every engineer and every agent a production-like place to prove their work before review.</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/get-demo/" target="_self">See how it works</a></div></section>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sandboxes vs. Environments: Why the Distinction Matters for Enterprise AI Development]]></title>
            <link>https://www.okteto.com/blog/sandboxes-vs-environments-why-the-distinction-matters-for-enterprise-ai-development/</link>
            <guid>https://www.okteto.com/blog/sandboxes-vs-environments-why-the-distinction-matters-for-enterprise-ai-development/</guid>
            <pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Sandboxes were built for one problem. AI agents need more. Here's why full-stack environments change everything for enterprise teams.]]></description>
            <content:encoded><![CDATA[<p>Something is shifting in how platform teams talk about developer infrastructure. A few months ago, the conversation was: "How do we stop developers from blocking each other on shared staging?" Today it's become: "How do we manage hundreds of developers and an unknown number of AI agents all pushing code simultaneously, and how do we know what's happening?"</p>
<!-- -->
<p>Those are not the same problem. The solutions aren't either.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-the-sandbox-conversation-started">How the sandbox conversation started<a href="https://www.okteto.com/blog/sandboxes-vs-environments-why-the-distinction-matters-for-enterprise-ai-development/#how-the-sandbox-conversation-started" class="hash-link" aria-label="Direct link to How the sandbox conversation started" title="Direct link to How the sandbox conversation started" translate="no">​</a></h2>
<p>The sandbox model made a lot of sense when the original problem was straightforward. Developers on microservices teams were blocked waiting for shared environments. If you could spin up a lightweight copy of just the service you were touching and route traffic to it for testing, you could unblock the team without duplicating the entire cluster. Fast, cheap, and easy to explain to anyone who'd ever waited three hours to get a staging slot.</p>
<p>For teams running primarily HTTP services, sandboxes still do that job well. The concept is immediately legible to engineering teams, the economics are compelling, and the time-to-working-demo is fast.</p>
<p>The issue is that "sandbox" has become the default vocabulary for any kind of isolated development environment. And those two things, a routing overlay for a specific service versus a fully isolated environment, are meaningfully different.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-breaks-when-ai-enters-the-loop">What breaks when AI enters the loop<a href="https://www.okteto.com/blog/sandboxes-vs-environments-why-the-distinction-matters-for-enterprise-ai-development/#what-breaks-when-ai-enters-the-loop" class="hash-link" aria-label="Direct link to What breaks when AI enters the loop" title="Direct link to What breaks when AI enters the loop" translate="no">​</a></h2>
<p>Engineering teams are discovering that AI agents have a different profile of requirements than human developers. Humans working in a constrained environment can adapt. They notice that a network path isn't supported, file a ticket, adjust the workflow. They can read documentation and make configuration changes to work around a routing limitation.</p>
<p>AI agents can't. They require environments that are complete, where the full build, deploy, and verify loop runs without workarounds.</p>
<p>In conversations with platform engineering teams over the past several months, three failure modes keep surfacing.</p>
<p><strong>The build gap.</strong> Closing the loop in agentic development means the agent tests its change, receives feedback, iterates intelligently on that feedback, and produces a PR that will pass CI, without a human stepping in. An agent that can write code but can't build it inside its own environment can't do that. The code gets written and pushed, but the agent has to wait for an external build to surface errors, which can take minutes or hours. Every iteration cycle is slowed by that wait. The agentic development loop breaks at exactly the point it was supposed to accelerate things. The velocity benefit teams are expecting doesn't materialize when a human or a separate CI system still has to close the loop.</p>
<p><strong>The environment scope gap.</strong> A sandbox is a routing overlay, not a complete environment. An agent working in a sandbox has a scoped view: it can route traffic to a specific service, but the rest of the stack, filesystem state, queue consumers, deployment configuration, the full service graph, is shared and outside the agent's control. Agents don't just touch traffic endpoints. They write code that interacts with everything. When the environment doesn't encompass that full scope, changes that appear to work within the sandbox may behave differently when they interact with parts of the stack that were never isolated. Full-context environments give agents a complete, isolated namespace. Everything the agent needs is within its scope, under its control.</p>
<p><strong>The governance gap.</strong> This is the one that keeps platform engineering leads up at night, and it's the one that's been slowest to get architectural attention. When AI agents create environments at scale, spinning up, modifying, and tearing down infrastructure in response to code commits, platform teams need visibility. Which agents created which environments? What did they access? What did it cost? Who authorized it? Without an audit trail and a policy layer, AI-at-scale becomes an unmanaged black box. Security reviews stall. Budget conversations get difficult. The platform team, which was supposed to be an enabler, becomes a blocker.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-matters-specifically-for-enterprise-teams">Why this matters specifically for enterprise teams<a href="https://www.okteto.com/blog/sandboxes-vs-environments-why-the-distinction-matters-for-enterprise-ai-development/#why-this-matters-specifically-for-enterprise-teams" class="hash-link" aria-label="Direct link to Why this matters specifically for enterprise teams" title="Direct link to Why this matters specifically for enterprise teams" translate="no">​</a></h2>
<p>For a small team running HTTP microservices, sandboxes are probably enough. The networking requirements are simple, governance is informal, and the per-service economics make sense.</p>
<p>For an enterprise team, 200 to 1,000+ developers, complex networking, formal security reviews, platform engineering teams with compliance and cost accountability, the requirements are structurally different. The platform team needs to approve the tooling. Security needs identity integration (SSO, SAML, SCIM). Compliance may need audit trails. And the development workflow needs to support the full stack, not just a routing layer.</p>
<p>The teams that move fast on sandbox tools in early evaluation often hit these walls at the platform engineering review. "We were making too many compromises" is a phrase that shows up more than once when teams describe why a tool that worked in demos didn't make it through a real implementation.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-right-frame-governed-agentic-development">The right frame: governed agentic development<a href="https://www.okteto.com/blog/sandboxes-vs-environments-why-the-distinction-matters-for-enterprise-ai-development/#the-right-frame-governed-agentic-development" class="hash-link" aria-label="Direct link to The right frame: governed agentic development" title="Direct link to The right frame: governed agentic development" translate="no">​</a></h2>
<p>The productive frame isn't "sandboxes are bad." It's that sandboxes were designed for a specific problem, and that problem has grown. As AI agents take on more of the development loop, the infrastructure underneath them needs to grow with it.</p>
<p>That means build systems agents can operate natively. Full-stack environment isolation so agents work in a complete, controlled context. Enterprise auth that integrates with how the rest of the organization manages access. And a governance layer that creates audit trails and policy enforcement for everything agents do, so platform teams can approve AI tooling for production use and developers can trust that what agents build actually works end to end.</p>
<p>The teams asking the right questions right now are the ones separating "can we demo this?" from "can we run this in production at enterprise scale?" Sandboxes are a starting point. Governed environments are the destination.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Okteto is the enterprise platform for governed agentic development, full Kubernetes environments with a build system, enterprise auth, and agent governance. </p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/get-demo/" target="_self">See how it works →</a></div></section>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Missing Infrastructure Layer That's Breaking Agentic Development]]></title>
            <link>https://www.okteto.com/blog/the-missing-infrastructure-layer-thats-breaking-agentic-development/</link>
            <guid>https://www.okteto.com/blog/the-missing-infrastructure-layer-thats-breaking-agentic-development/</guid>
            <pubDate>Mon, 23 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[AI agents can't validate code without runtime feedback. Learn why ephemeral development environments are essential for enterprise agentic workflows.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-every-agent-needs-runtime-feedback">Why every agent needs runtime feedback<a href="https://www.okteto.com/blog/the-missing-infrastructure-layer-thats-breaking-agentic-development/#why-every-agent-needs-runtime-feedback" class="hash-link" aria-label="Direct link to Why every agent needs runtime feedback" title="Direct link to Why every agent needs runtime feedback" translate="no">​</a></h2>
<p>AI agents are quickly becoming first-class contributors to enterprise codebases, generating pull requests and refactoring systems at scale. Yet there's a growing disconnect between what agentic development demos promise and what engineering teams experience in practice.</p>
<!-- -->
<p>The gap isn't model intelligence or prompt sophistication. It's something more fundamental: agents lack access to the runtime feedback loops that human developers rely on constantly. Without the ability to run and observe their code in realistic conditions, agents remain stuck optimizing for syntax rather than behavior.</p>
<p>The solution lies in extending on-demand development environments to support agentic workflows. When agents can validate changes against real dependencies and iterate based on runtime behavior, the quality ceiling disappears.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-code-only-validation-fails-modern-development">Why Code-Only Validation Fails Modern Development<a href="https://www.okteto.com/blog/the-missing-infrastructure-layer-thats-breaking-agentic-development/#why-code-only-validation-fails-modern-development" class="hash-link" aria-label="Direct link to Why Code-Only Validation Fails Modern Development" title="Direct link to Why Code-Only Validation Fails Modern Development" translate="no">​</a></h2>
<p>Modern applications depend on complex webs of infrastructure, external services, and runtime configurations. A microservice might interact with Kubernetes clusters, Redis caches, PostgreSQL databases, and third-party APIs while respecting network policies that exist only in deployed environments.</p>
<p>Human developers understand this intuitively. We write code, then immediately run it. We spin up environments, test edge cases, and iterate until reality confirms our assumptions.</p>
<p><strong>Agents can't do this yet.</strong></p>
<p>Most current workflows stop at code generation and unit testing, leaving agents to guess whether their output works in real systems. They're essentially coding blind, optimizing for patterns rather than measurable outcomes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-runtime-feedback-problem">The Runtime Feedback Problem<a href="https://www.okteto.com/blog/the-missing-infrastructure-layer-thats-breaking-agentic-development/#the-runtime-feedback-problem" class="hash-link" aria-label="Direct link to The Runtime Feedback Problem" title="Direct link to The Runtime Feedback Problem" translate="no">​</a></h2>
<p>This constraint creates a recognizable pattern: agents that look impressive in isolated demos but produce brittle code in production. Generated code follows correct patterns and passes basic tests, but subtle integration failures accumulate over time.</p>
<p>The broken feedback loop follows this sequence:</p>
<ul>
<li class=""><strong>Generate</strong> code based on static analysis</li>
<li class=""><strong>Unit test</strong> against isolated cases</li>
<li class=""><strong>Submit</strong> changes and hope they work</li>
<li class=""><strong>Discover</strong> runtime issues post-deployment</li>
</ul>
<p>Without runtime validation, agents can't distinguish between code that compiles and code that actually works. They can't observe whether database migrations handle production data volumes or whether API changes maintain backward compatibility with existing clients.</p>
<p>Quality plateaus because agents lack the iterative validation that drives improvement in human development workflows.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="development-environments-close-the-loop">Development Environments Close the Loop<a href="https://www.okteto.com/blog/the-missing-infrastructure-layer-thats-breaking-agentic-development/#development-environments-close-the-loop" class="hash-link" aria-label="Direct link to Development Environments Close the Loop" title="Direct link to Development Environments Close the Loop" translate="no">​</a></h2>
<p>The solution requires completing the feedback cycle that produces high-quality software: <strong>generate → run → observe → refine</strong>.</p>
<p>This means providing agents with ephemeral development environments where they can:</p>
<ul>
<li class="">Execute code against realistic dependencies</li>
<li class="">Observe actual behavior and performance</li>
<li class="">Iterate based on concrete outcomes</li>
<li class="">Test integration points safely</li>
</ul>
<p><img decoding="async" loading="lazy" alt="The runtime feedback gap comparison chart" src="https://www.okteto.com/blog/assets/images/8666eac3f104-c6c19b38e5e80293388617cfb73eedc1.webp" width="1904" height="1904" class="img_ev3q"></p>
<p><strong>Self-service environment provisioning becomes crucial.</strong> Agents working on different system components need dedicated environments where they can validate changes without coordination overhead or resource conflicts.</p>
<p>This infrastructure transforms agentic development from speculation-driven to validation-driven. It shifts their reality from "does this code look right" to "what happens when this code runs". In turn, agents generate verified code backed by concrete evidence of runtime behavior.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="enterprise-requirements-inside-the-firewall">Enterprise Requirements: Inside the Firewall<a href="https://www.okteto.com/blog/the-missing-infrastructure-layer-thats-breaking-agentic-development/#enterprise-requirements-inside-the-firewall" class="hash-link" aria-label="Direct link to Enterprise Requirements: Inside the Firewall" title="Direct link to Enterprise Requirements: Inside the Firewall" translate="no">​</a></h2>
<p>Enterprise adoption faces an additional constraint: agents need access to internal services, proprietary data, and real configuration systems (all while maintaining security boundaries).</p>
<p>Most enterprises won't allow agents to modify systems without understanding how changes interact with internal APIs, database schemas, and security policies that exist only within their infrastructure perimeters.</p>
<p><strong>Cloud development environments solve this by bringing computation inside the enterprise firewall</strong> while maintaining the isolation and on-demand provisioning that agents require. Organizations can run agents within their own Kubernetes clusters, connected to internal services but isolated in ephemeral environments that prevent unintended side effects.</p>
<p>This approach scales with agentic workflow adoption without requiring manual platform team intervention.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">See how Okteto's on-demand development environments provide the runtime feedback infrastructure your agents need to deliver production-ready code.</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/get-demo" target="_self">Get a demo</a></div></section>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-future-every-agent-gets-an-environment">The Future: Every Agent Gets an Environment<a href="https://www.okteto.com/blog/the-missing-infrastructure-layer-thats-breaking-agentic-development/#the-future-every-agent-gets-an-environment" class="hash-link" aria-label="Direct link to The Future: Every Agent Gets an Environment" title="Direct link to The Future: Every Agent Gets an Environment" translate="no">​</a></h2>
<p>Looking ahead, successful agentic development will require infrastructure parity between human and artificial contributors. Just as every developer expects access to development environments, every agent will need similar runtime resources.</p>
<p>This represents a fundamental shift in how we approach code quality:</p>
<ul>
<li class=""><strong>Before:</strong> Static analysis → code review → post-deployment monitoring</li>
<li class=""><strong>After:</strong> Continuous runtime validation throughout development</li>
</ul>
<p>Agents won't just run unit tests or push changes blindly to CI. Agents will spin up environments, run integration tests, measure performance impacts, and iterate based on observed behavior before submitting changes for review.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="oktetos-competitive-advantage-in-agentic-development">Okteto's Competitive Advantage in Agentic Development<a href="https://www.okteto.com/blog/the-missing-infrastructure-layer-thats-breaking-agentic-development/#oktetos-competitive-advantage-in-agentic-development" class="hash-link" aria-label="Direct link to Okteto's Competitive Advantage in Agentic Development" title="Direct link to Okteto's Competitive Advantage in Agentic Development" translate="no">​</a></h2>
<p>Okteto has spent years solving a hard infrastructure problem: how to provision development environments that are fast, accessible, and enterprise-ready.</p>
<p>We built our platform for the reality of modern development. Complex, distributed systems require runtime validation that unit tests simply can't provide. Others in the space treat environments as deployment destinations. We designed them as development infrastructure from the ground up.</p>
<p>This foundation becomes essential as agents take on sophisticated architectural changes that demand real-time feedback. While others are retrofitting deployment tools for development workflows, we're extending proven development infrastructure to support agentic workflows.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ready-to-enable-agentic-development">Ready to Enable Agentic Development?<a href="https://www.okteto.com/blog/the-missing-infrastructure-layer-thats-breaking-agentic-development/#ready-to-enable-agentic-development" class="hash-link" aria-label="Direct link to Ready to Enable Agentic Development?" title="Direct link to Ready to Enable Agentic Development?" translate="no">​</a></h2>
<p>The infrastructure for autonomous development isn't a future problem (it's an opportunity available today). Organizations that extend their development environment strategies to include AI contributors will unlock more sophisticated agentic workflows while maintaining security and quality standards.</p>
<p><a href="https://www.okteto.com/get-demo" target="_blank" rel="noopener noreferrer" class=""><strong>See how Okteto's on-demand development environments provide the runtime feedback infrastructure your agents need to deliver production-ready code</strong></a><strong>.</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-bottom-line">The Bottom Line<a href="https://www.okteto.com/blog/the-missing-infrastructure-layer-thats-breaking-agentic-development/#the-bottom-line" class="hash-link" aria-label="Direct link to The Bottom Line" title="Direct link to The Bottom Line" translate="no">​</a></h3>
<p>Agentic development won't reach its potential through better models alone. The breakthrough comes when agents gain access to the same runtime feedback loops that human developers rely on for building reliable software.</p>
<p>Development environments (ephemeral, enterprise-ready, and optimized for continuous validation) are the missing infrastructure layer that will unlock this potential. The future belongs to agents that can validate their decisions against runtime reality, not just static analysis.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Ingress NGINX Controller Deprecation: Your Migration Guide to Kubernetes Gateway API]]></title>
            <link>https://www.okteto.com/blog/ingress-nginx-controller-deprecation-your-migration-guide-to-kubernetes-gateway-api/</link>
            <guid>https://www.okteto.com/blog/ingress-nginx-controller-deprecation-your-migration-guide-to-kubernetes-gateway-api/</guid>
            <pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Ingress NGINX Controller retires March 2026. Learn why Kubernetes is moving to Gateway API and get a practical migration framework for platform teams.]]></description>
            <content:encoded><![CDATA[<p>The Kubernetes project announced in November 2025 that the Ingress NGINX Controller will be retired on March 31st, 2026.</p>
<!-- -->
<p>This is the ingress controller that ships as the default in most Kubernetes distributions. It's what countless tutorials recommend. It's probably what you're running in production right now. In three months, it stops receiving security patches, bug fixes, and compatibility updates.</p>
<p>We've been evaluating what this ingress nginx deprecation means for Okteto and the broader Kubernetes ecosystem. Here's our analysis and a decision framework that might help if you're navigating this transition.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-actually-happening-with-the-ingress-nginx-deprecation">What's Actually Happening with the Ingress NGINX Deprecation<a href="https://www.okteto.com/blog/ingress-nginx-controller-deprecation-your-migration-guide-to-kubernetes-gateway-api/#whats-actually-happening-with-the-ingress-nginx-deprecation" class="hash-link" aria-label="Direct link to What's Actually Happening with the Ingress NGINX Deprecation" title="Direct link to What's Actually Happening with the Ingress NGINX Deprecation" translate="no">​</a></h2>
<p>The Kubernetes Ingress API itself is not being deprecated. You can still create Ingress resources. What's being retired is the specific NGINX-based controller that implements that API.</p>
<p>This Ingress NGINX Controller retirement creates three critical operational risks:</p>
<p><strong>Security vulnerabilities won't receive patches.</strong> After March 2026, CVEs discovered in the Ingress NGINX Controller won't be fixed upstream. You'll need to maintain your own fork or accept the security exposure.</p>
<p><strong>Bug fixes end permanently.</strong> When ingress routing breaks or behaves unexpectedly, there's no upstream maintainer to file issues with or expect resolution from.</p>
<p><strong>Kubernetes compatibility will degrade over time.</strong> New Kubernetes releases will introduce changes that the deprecated controller can't handle. It might function with Kubernetes 1.32, but will likely fail with 1.35 and beyond.</p>
<p>Important distinction: This deprecation affects only the <code>kubernetes/ingress-nginx</code> project. NGINX Inc.'s commercial ingress controller (now part of F5) remains actively maintained and supported. It's a completely separate codebase with its own lifecycle.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-kubernetes-is-moving-to-gateway-api">Why Kubernetes is Moving to Gateway API<a href="https://www.okteto.com/blog/ingress-nginx-controller-deprecation-your-migration-guide-to-kubernetes-gateway-api/#why-kubernetes-is-moving-to-gateway-api" class="hash-link" aria-label="Direct link to Why Kubernetes is Moving to Gateway API" title="Direct link to Why Kubernetes is Moving to Gateway API" translate="no">​</a></h2>
<p>The Ingress API served the ecosystem during Kubernetes' early years, but its design assumptions no longer match how production platforms operate. Three fundamental limitations drove the need for a replacement:</p>
<p><strong>Annotation-based configuration creates vendor lock-in.</strong> Configuring request timeouts requires <code>nginx.ingress.kubernetes.io/proxy-read-timeout</code> on NGINX controllers but <code>traefik.ingress.kubernetes.io/service.serversscheme</code> on Traefik. Every controller implements essential features through proprietary annotations. Switching controllers means rewriting all your routing configuration.</p>
<p><strong>Role boundaries don't exist.</strong> Platform operators, application developers, and security teams all modify the same Ingress resources with identical permissions. A developer adding a hostname shouldn't need cluster-admin rights, but the Ingress API provides no mechanism for granular access control.</p>
<p><strong>Traffic management capabilities are severely limited.</strong> Modern applications need canary deployments with traffic splitting, header-based routing decisions, request mirroring, and sophisticated load balancing. The Ingress API can't express these patterns. Each controller invents proprietary extensions that don't work anywhere else.</p>
<p>Gateway API addresses these architectural problems systematically. It provides role-separated resources (Gateway for infrastructure teams, HTTPRoute for developers, GatewayClass for platform vendors), controller-portable configuration that works across implementations, and comprehensive traffic management built into the specification.</p>
<p>The ecosystem has already committed to this direction. Istio, Contour, Traefik, Envoy Gateway, and every major ingress controller supports Gateway API today. This represents alignment with Kubernetes' established roadmap, not speculation about future possibilities.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-world-migration-strategy-how-were-approaching-this-at-okteto">Real-World Migration Strategy: How We're Approaching This at Okteto<a href="https://www.okteto.com/blog/ingress-nginx-controller-deprecation-your-migration-guide-to-kubernetes-gateway-api/#real-world-migration-strategy-how-were-approaching-this-at-okteto" class="hash-link" aria-label="Direct link to Real-World Migration Strategy: How We're Approaching This at Okteto" title="Direct link to Real-World Migration Strategy: How We're Approaching This at Okteto" translate="no">​</a></h2>
<p>Okteto's platform depends on ingress infrastructure for generating HTTPS endpoints, routing development environment traffic, and implementing private networking security. This deprecation directly affects our core functionality.</p>
<p>We analyzed three Kubernetes Gateway API migration strategies:</p>
<p><strong>Replace NGINX with another Ingress controller.</strong> This minimizes immediate disruption but perpetuates the same architectural problems. We'd remain dependent on annotation-based configuration and controller-specific behaviors. Most problematically, we'd face identical migration pressure when the replacement controller reaches end-of-life.</p>
<p><strong>Migrate completely to Gateway API with Ingress compatibility layers.</strong> This aligns with Kubernetes' long-term direction but requires building complex translation mechanisms between networking models. We'd need to handle edge cases where Ingress semantics don't map to Gateway API primitives while supporting both during transition.</p>
<p><strong>Implement hybrid support for both networking models.</strong> Maintain Ingress functionality for existing workloads while building new features on Gateway API foundations. This enables incremental modernization without disrupting operational systems.</p>
<p>We chose the hybrid approach because it balances technical debt reduction with platform stability.</p>
<p>The architectural principle guiding our decision: <strong>depend on APIs, not implementations.</strong> Platform resilience comes from abstractions that multiple controllers can satisfy, not tight coupling to specific controller behaviors.</p>
<p>Gateway API provides exactly that abstraction layer. We can implement features once and support customer choice in underlying networking infrastructure.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="practical-next-steps-for-platform-teams">Practical Next Steps for Platform Teams<a href="https://www.okteto.com/blog/ingress-nginx-controller-deprecation-your-migration-guide-to-kubernetes-gateway-api/#practical-next-steps-for-platform-teams" class="hash-link" aria-label="Direct link to Practical Next Steps for Platform Teams" title="Direct link to Practical Next Steps for Platform Teams" translate="no">​</a></h2>
<p>This decision framework applies regardless of whether you're running Okteto or managing your own Kubernetes infrastructure:</p>
<p><strong>Inventory your annotation dependencies immediately.</strong> Every <code>nginx.ingress.kubernetes.io/*</code> annotation represents technical debt requiring migration. Create a comprehensive catalog of controller-specific configurations in your manifests. Focus on annotations that implement business logic rather than basic routing (those represent the highest migration complexity).</p>
<p><strong>Assess your controller's Gateway API maturity.</strong> Controllers without Gateway API support signal questionable long-term viability. You don't need immediate migration, but understanding your options prevents crisis-driven decisions. Proven Gateway API implementations include Istio Gateway, Contour, Traefik v3, and Envoy Gateway.</p>
<p><strong>Evaluate whether bundling controllers still makes sense.</strong> If your platform ships with embedded ingress controllers, reconsider that architectural choice. Every bundled controller creates ongoing CVE tracking, compatibility testing, and support obligations. Letting customers provide their own networking infrastructure while you deliver higher-level abstractions often proves more sustainable.</p>
<p><strong>Design for portability over convenience.</strong> Build platform features that work regardless of which Gateway API controller customers deploy. This architectural discipline creates resilience against future infrastructure changes while reducing your maintenance burden.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-this-means-for-okteto-users">What This Means for Okteto Users<a href="https://www.okteto.com/blog/ingress-nginx-controller-deprecation-your-migration-guide-to-kubernetes-gateway-api/#what-this-means-for-okteto-users" class="hash-link" aria-label="Direct link to What This Means for Okteto Users" title="Direct link to What This Means for Okteto Users" translate="no">​</a></h2>
<p>We're treating this transition as an opportunity to strengthen our networking architecture. The migration prioritizes continuity (your development environments maintain their endpoints, TLS certificates continue automatic provisioning, and private networking remains fully functional). Behind the scenes, we're implementing Gateway API support for new capabilities while preserving existing workflows during the transition.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">If you're an existing Okteto customer, please read this post about what's changing, impact and timelines. </p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://community.okteto.com/t/gateway-api-migration-what-okteto-customers-need-to-know/1451" target="_self">Community Post</a></div></section>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="infrastructure-evolution-as-platform-opportunity">Infrastructure Evolution as Platform Opportunity<a href="https://www.okteto.com/blog/ingress-nginx-controller-deprecation-your-migration-guide-to-kubernetes-gateway-api/#infrastructure-evolution-as-platform-opportunity" class="hash-link" aria-label="Direct link to Infrastructure Evolution as Platform Opportunity" title="Direct link to Infrastructure Evolution as Platform Opportunity" translate="no">​</a></h2>
<p>The Ingress NGINX Controller deprecation represents natural ecosystem maturation rather than arbitrary disruption. Kubernetes networking is evolving from early-adoption defaults toward sophisticated, portable abstractions that serve diverse production requirements better.</p>
<p>For platform teams, this creates an opportunity to reduce technical debt, improve operational flexibility, and align with Kubernetes' architectural direction. The migration investment pays returns through reduced vendor coupling, enhanced multi-cloud portability, and more predictable upgrade experiences.</p>
<p>If you're navigating this Kubernetes ingress controller replacement, we'd value learning about your approach. Migration challenges are similar across platforms. Sharing experiences with both successful strategies and unexpected obstacles benefits the entire community.</p>
<p>The March 2026 deadline might feel aggressive, but it's accelerating the ecosystem toward more maintainable infrastructure patterns. That makes the migration effort worthwhile.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Why Every Development Environment Eventually Falls Short.  And Why That’s Okay.]]></title>
            <link>https://www.okteto.com/blog/development-environment-pitfalls/</link>
            <guid>https://www.okteto.com/blog/development-environment-pitfalls/</guid>
            <pubDate>Mon, 05 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn why every development environment eventually hits its limits—and how a flexible, cloud-native strategy helps teams scale with confidence.]]></description>
            <content:encoded><![CDATA[<p>Someone asked me a great question during a recent <a href="https://www.youtube.com/live/EZ6wodGif0Q?si=XOuDLR_-mbMedfv8&amp;t=3960" target="_blank" rel="noopener noreferrer" class="">DevOps Toolkit livestream:</a></p>
<!-- -->
<p><em>“How do you handle development environments? I’ve tried many tools, but they all fall short at some point.”</em></p>
<p>I'm sure this resonated with so many people tuning in.</p>
<p>Every dev environment solution does fall short eventually. And that’s not a sign they’re broken. It’s a sign the problem is harder (and more contextual) than most people realize.</p>
<p>Here are a few follow up thoughts on the subject of environment pitfalls with lessons we’ve learned from helping platform teams design their environment strategies over the years.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dev-environments-shouldnt-work-out-of-the-box">Dev environments shouldn’t “work out of the box”<a href="https://www.okteto.com/blog/development-environment-pitfalls/#dev-environments-shouldnt-work-out-of-the-box" class="hash-link" aria-label="Direct link to Dev environments shouldn’t “work out of the box”" title="Direct link to Dev environments shouldn’t “work out of the box”" translate="no">​</a></h3>
<p>There’s this widespread hope that dev environments will one day “just work” for everyone, in every architecture, with zero setup. That sounds amazing.</p>
<p>But it’s not realistic, at least not for teams building real-world software at scale.</p>
<p>At Okteto, we’ve been working on this problem for 6+ years. We’ve learned that dev environments aren’t something you install and forget. They’re a system you design, evolve, and constantly refine as your stack, team, and goals change.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="think-in-terms-of-systems-not-just-tools">Think in terms of systems, not just tools<a href="https://www.okteto.com/blog/development-environment-pitfalls/#think-in-terms-of-systems-not-just-tools" class="hash-link" aria-label="Direct link to Think in terms of systems, not just tools" title="Direct link to Think in terms of systems, not just tools" translate="no">​</a></h3>
<p>One thing I see all the time: teams blame their dev environment tooling when what they’re really running into is a system-level tradeoff.</p>
<p>Let’s say you’re spinning up dozens or even hundreds of microservices and multiple databases for every developer. That can work. In fact, for some teams, it’s the best way forward. It’s simple, consistent, and isolates every dev experience.</p>
<p>But that model also comes with a literal cost. Running full replicas of complex systems for every developer can get expensive, especially as your team grows. And maintaining that level of scale, performance, and cleanup across environments becomes an operational challenge of its own.</p>
<p>The hard truth is that there is no universally right answer. Some teams prioritize speed and simplicity and are fine paying more to cloud providers. Others invest in alternate environment strategies like sharing infrastructure, selectively isolating services, or adopting stronger control policies to address budget and complexity needs over time.</p>
<p>Either path can work. But the point is that you need to be intentional about the tradeoffs you’re making and revisit them as your architecture evolves.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="local-dev-isnt-the-future">Local dev isn’t the future<a href="https://www.okteto.com/blog/development-environment-pitfalls/#local-dev-isnt-the-future" class="hash-link" aria-label="Direct link to Local dev isn’t the future" title="Direct link to Local dev isn’t the future" translate="no">​</a></h3>
<p>I still hear people say, “I just want to run everything locally.” And look, I get it. I’ve been there too. There’s a certain comfort in having control of running things on your machine.</p>
<p>But I’ll be honest…local dev isn’t the future.</p>
<p>As architectures shift toward microservices, cloud-managed dependencies, and event-driven systems, local environments start breaking down. They're brittle, inconsistent, hard to replicate and impossible to scale in any realistic way.</p>
<blockquote>
<p>“You can’t run a distributed monolith on your laptop. You can run it in the cloud and start fixing what’s broken.”</p>
</blockquote>
<p>This is where the industry is headed. Modern cloud-native architectures aren’t designed to run locally. They’re designed for platforms like Kubernetes. Trying to emulate that locally, or stitching together remote services with a mostly-local workflow, becomes a fragile patchwork.</p>
<p>To truly test and iterate the way your app behaves in production, you need to run <em>in</em> Kubernetes not just redirect traffic to it. That’s how you close the gap between dev and prod, and build confidence into every commit.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="remote-environments-doesnt-always-mean-full-replication">Remote environments doesn’t always mean full replication<a href="https://www.okteto.com/blog/development-environment-pitfalls/#remote-environments-doesnt-always-mean-full-replication" class="hash-link" aria-label="Direct link to Remote environments doesn’t always mean full replication" title="Direct link to Remote environments doesn’t always mean full replication" translate="no">​</a></h3>
<p>Another common misconception is that every developer <em>always</em> needs a fully isolated copy of the entire stack. But as your team grows and your architecture becomes more complex, replicating everything from databases, services, dependencies, for each individual developer can become slower, expensive to scale, and difficult to manage.</p>
<p>This is where flexibility of choice becomes important in your environment strategy. The ability to use the right environments for the right scenarios makes a big difference.</p>
<p>Many teams are adopting a hybrid approach that combines shared resources with selective isolation. At Okteto, we call this feature <a href="https://www.okteto.com/docs/reference/okteto-manifest/#divert" target="_blank" rel="noopener noreferrer" class="">Divert</a>. Instead of full replication for each developer, Divert allows you to create lightweight development environments that include only the services you are actively working on while leveraging an existing shared environment for all other microservices. At large scale, these environments become faster to spin up, more cost-efficient, and still gives you realistic, production-like context.</p>
<p><img decoding="async" loading="lazy" alt="Diagram of lightweight environment using isolated services from a shared environment" src="https://www.okteto.com/blog/assets/images/77d3a0c8a4af-c984c30212d311353238b7f2603cfbc1.webp" width="1120" height="636" class="img_ev3q"></p>
<p>And of course, there are times when a fully replicated environment <em>is</em> the right choice, like end-to-end testing, or when debugging issues that span across multiple services. The key is having the flexibility to choose the right model for the job, and to shift as those jobs change.</p>
<blockquote>
<p>“There’s no one-size-fits-all. The best environment strategies evolve with your architecture and your team’s needs.”</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="optimize-environments-for-the-team-not-just-you">Optimize environments for the team, not just you<a href="https://www.okteto.com/blog/development-environment-pitfalls/#optimize-environments-for-the-team-not-just-you" class="hash-link" aria-label="Direct link to Optimize environments for the team, not just you" title="Direct link to Optimize environments for the team, not just you" translate="no">​</a></h3>
<p>Here’s one of my hotter takes: sometimes, a dev environment feels like it’s slowing <em>you</em> down, but it’s actually speeding up the whole <em>team</em>.</p>
<p>And at the end of the day, that’s what matters.</p>
<p>If we’re optimizing for individual convenience, we end up with silos and snowflake setups. But if we’re optimizing for team throughput—collaboration, testing, deploy velocity—that’s where the real value shows up.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-the-right-dev-environment-strategy">What’s the “right” dev environment strategy?<a href="https://www.okteto.com/blog/development-environment-pitfalls/#whats-the-right-dev-environment-strategy" class="hash-link" aria-label="Direct link to What’s the “right” dev environment strategy?" title="Direct link to What’s the “right” dev environment strategy?" translate="no">​</a></h3>
<p>There isn’t one. That’s the truth.</p>
<p>What works for your team depends on your goals, your architecture, and your appetite for change. Some teams need isolated cloud environments. Others might get by with remote-local setups. Many land somewhere in between.</p>
<p>The most successful teams aren’t chasing the perfect dev environment. They’re building systems that adapt. They’re flexible. They revisit their environment strategy often and as their architecture changes. They’re not afraid to experiment, iterate, or even switch tools when the context demands it.</p>
<blockquote>
<p>“The best dev environments aren’t perfect—they’re adaptable. You need something that grows with your architecture, not fights against it.”</p>
</blockquote>
<p>Whether you’re wrangling a distributed monolith or just trying to spin up isolated previews, the goal isn’t perfection. It’s progress. Ultimately, it’s making sure your dev environment is working <em>for</em> your team, not slowing them down.</p>
<div class="embed_uCA2"><iframe src="https://www.youtube-nocookie.com/embed/EZ6wodGif0Q" title="YouTube video player" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="final-thought">Final thought<a href="https://www.okteto.com/blog/development-environment-pitfalls/#final-thought" class="hash-link" aria-label="Direct link to Final thought" title="Direct link to Final thought" translate="no">​</a></h3>
<p>If you’ve ever felt like your dev environment is falling short, you’re not alone. That’s exactly where every team starts.</p>
<p>What matters is whether you’re building a system that adapts. One that helps your team ship faster—not just work harder.</p>
<p>If you want to talk more about environments or developer experience, I’m always up for it. <a href="https://www.okteto.com/get-demo/" target="_blank" rel="noopener noreferrer" class="">Reach out here →</a></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Okteto vs Qovery: Choosing the Right Kubernetes Development Platform for Your Team]]></title>
            <link>https://www.okteto.com/blog/compare-okteto-versus-qovery/</link>
            <guid>https://www.okteto.com/blog/compare-okteto-versus-qovery/</guid>
            <pubDate>Fri, 19 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Okteto and Qovery take different approaches to Kubernetes development environments. This guide explains the key differences to help you choose.]]></description>
            <content:encoded><![CDATA[<p>The development platform you choose shapes how your entire engineering organization works, not just today, but as you scale. So the question isn't just which platform has the right features. It's which platform is built around the right philosophy for how your team works. Do you need infrastructure automation, or developer velocity? Deployment simplicity, or faster iteration? Okteto and Qovery answer these questions differently. This guide explains how.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-the-shared-challenge">Understanding the Shared Challenge<a href="https://www.okteto.com/blog/compare-okteto-versus-qovery/#understanding-the-shared-challenge" class="hash-link" aria-label="Direct link to Understanding the Shared Challenge" title="Direct link to Understanding the Shared Challenge" translate="no">​</a></h2>
<p>Modern cloud-native development is complex. Your applications aren't just code anymore. They're code plus configuration, runtime dependencies, network policies, secrets, and interactions across dozens of microservices. Developers can't gain real confidence that their changes work by running unit tests on a laptop. They need access to realistic environments that reflect production complexity.</p>
<p>Both Okteto and Qovery recognize this challenge. Both aim to give developers better environments than local development that can't match production's complexity. But they approach the problem from different starting points, and those starting points shape everything about how each platform works.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-qovery-works">How Qovery Works<a href="https://www.okteto.com/blog/compare-okteto-versus-qovery/#how-qovery-works" class="hash-link" aria-label="Direct link to How Qovery Works" title="Direct link to How Qovery Works" translate="no">​</a></h2>
<p>Qovery positions itself as a DevOps automation platform. Its core promise is to give teams Heroku-like simplicity while running on their own cloud infrastructure. When you use Qovery, the platform provisions complete, standalone copies of your infrastructure for each environment: development, staging, production.</p>
<p>This approach has clear appeal. Teams migrating from Heroku or Elastic Beanstalk get a familiar abstraction layer. Organizations without deep Kubernetes expertise can deploy to Kubernetes without learning Kubernetes. The platform handles infrastructure provisioning and deployment, prioritizing abstraction over daily developer experience.</p>
<p>Qovery's architecture creates full infrastructure copies for each environment. For example, when you spin up a preview environment, you get a complete replica of your services, databases, and dependencies. This provides high fidelity but comes with tradeoffs: longer spin-up times (minutes rather than seconds), higher infrastructure costs (full resource duplication per environment), and costs that scale linearly with environment count. You'll also need to translate your existing deployments into Qovery's configuration model rather than using your native Kubernetes manifests.</p>
<p>The focus is on deployment automation and infrastructure abstraction. Qovery aims to eliminate the need for DevOps expertise by handling the complexity behind a simplified interface.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-okteto-works">How Okteto Works<a href="https://www.okteto.com/blog/compare-okteto-versus-qovery/#how-okteto-works" class="hash-link" aria-label="Direct link to How Okteto Works" title="Direct link to How Okteto Works" translate="no">​</a></h2>
<p>Okteto takes a different architectural approach, starting from a different premise about what developers actually need.</p>
<p>Instead of creating infrastructure copies, Okteto runs your development process directly in Kubernetes, in actual pods within your cluster. When you develop with Okteto, your code executes in the same runtime environment where it will eventually run in production: same service accounts, same environment variables, same security configurations, same volumes, same sidecars. Changes sync in real-time, with feedback loops measured in seconds rather than minutes.</p>
<p>But the deeper difference isn't just architecture. It's philosophy.</p>
<p>Okteto is built on the premise that different environment types exist to serve different workflows and use cases, and a platform should be optimized for each workflow's specific job. A dev environment isn't a small staging environment. A preview environment isn't a temporary production replica. Each environment class has a distinct purpose and requires distinct capabilities.</p>
<p>This "environments have different jobs" philosophy shapes everything about how Okteto works:</p>
<p><strong>Dev Environments</strong> are optimized for iteration speed. Real-time file sync, hot reload, bidirectional synchronization, remote debugging, port forwarding for IDE integration, and volume snapshots to quickly restore state. The job is all about helping individual developers move fast.</p>
<p><strong>Preview Environments</strong> are optimized for collaboration and validation with auto-deploy on pull requests, shareable URLs and automatic cleanup on merge. The job is enabling PMs, designers, QA, and stakeholders to validate changes before they're merged, without any technical setup required.</p>
<p><strong>Test Environments</strong> are optimized for consistency and reliability. Tests run inside the Kubernetes cluster, not on a separate CI virtual machine. They have the same runtime as production, access to private services and reduced latency. The job is ensuring your entire pipeline, from dev through CI, runs on Kubernetes to eliminate "works in CI but not in prod" surprises.</p>
<p><strong>Agent Environments</strong> give AI coding agents a place to build, test, and validate code. AI agents need production context the same way developers do. They need safe, secure, production-like environments to build, deploy, and verify code end-to-end, not just suggest changes. Each agent gets its own isolated, ephemeral environment with full access to code, infrastructure, and tests. The job is enabling teams to run fleets of agents in parallel, each working independently on different tasks, with the security and observability enterprise teams require.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="quick-comparison">Quick Comparison<a href="https://www.okteto.com/blog/compare-okteto-versus-qovery/#quick-comparison" class="hash-link" aria-label="Direct link to Quick Comparison" title="Direct link to Quick Comparison" translate="no">​</a></h2>
<p><em>The table shows what each solution offers. The rest of this guide explains why those differences matter for your decision.</em></p>
<figure class="figure_HOu8 float-center_VJCd"><img src="https://www.okteto.com/blog/assets/images/b4d572a23306-dc2bc3a9a06ef92820dfb4071d5d9d9e.webp" alt="" loading="lazy"></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-philosophical-divide">The Philosophical Divide<a href="https://www.okteto.com/blog/compare-okteto-versus-qovery/#the-philosophical-divide" class="hash-link" aria-label="Direct link to The Philosophical Divide" title="Direct link to The Philosophical Divide" translate="no">​</a></h2>
<p>Here's the core distinction that explains most of the differences between these platforms:</p>
<p>Qovery takes a generic approach to environments. Every environment is an infrastructure copy with different sizing and lifecycle rules. This works if your needs are straightforward, but it means the platform can't optimize for what each workflow actually requires.</p>
<p>Okteto takes a purpose-built approach. Each environment type is designed around its specific job because those jobs are fundamentally different.</p>
<p>The result isn't more complexity for developers. It’s that developers (and PMs, QA, agents, etc.) get better outcomes because the environment is optimized for what they're actually trying to accomplish, rather than forcing everyone to use a generic infrastructure copy.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="architecture-matters-where-your-code-actually-runs">Architecture Matters: Where Your Code Actually Runs<a href="https://www.okteto.com/blog/compare-okteto-versus-qovery/#architecture-matters-where-your-code-actually-runs" class="hash-link" aria-label="Direct link to Architecture Matters: Where Your Code Actually Runs" title="Direct link to Architecture Matters: Where Your Code Actually Runs" translate="no">​</a></h2>
<p>The philosophical difference manifests in a concrete technical distinction: where your code actually runs during development.</p>
<p>With Qovery, you get a complete, isolated replica of your services, but you're working with deployed containers, not an interactive development experience.</p>
<p>With Okteto, your development process runs in actual Kubernetes pods, inheriting your production configuration automatically. You're not developing in something that looks like production. You're developing in production's twin.</p>
<p>This matters for several reasons:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="you-get-true-production-parity">You get true production parity<a href="https://www.okteto.com/blog/compare-okteto-versus-qovery/#you-get-true-production-parity" class="hash-link" aria-label="Direct link to You get true production parity" title="Direct link to You get true production parity" translate="no">​</a></h3>
<p>Okteto eliminates the "works on my machine" problem at the root. If it works in your dev environment, it works in production, because they're the same runtime. Integration issues surface during development, not after deployment. Configuration drift between environments disappears because there's only one environment configuration.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-feedback-loops-drop-to-seconds">Your Feedback Loops Drop to Seconds<a href="https://www.okteto.com/blog/compare-okteto-versus-qovery/#your-feedback-loops-drop-to-seconds" class="hash-link" aria-label="Direct link to Your Feedback Loops Drop to Seconds" title="Direct link to Your Feedback Loops Drop to Seconds" translate="no">​</a></h3>
<p>Code changes sync in under 3 seconds. You write code, save the file, and see results immediately. Developers aren't waiting on container builds, image pushes, or long deployments. Seconds vs. minutes adds up. A developer iterating 50 times a day saves over 2 hours with a 3-second loop instead of a 3-minute deploy. Multiply that across your team and the year, and you're recovering thousands of engineering hours.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="you-debug-directly-in-kubernetes">You Debug Directly in Kubernetes<a href="https://www.okteto.com/blog/compare-okteto-versus-qovery/#you-debug-directly-in-kubernetes" class="hash-link" aria-label="Direct link to You Debug Directly in Kubernetes" title="Direct link to You Debug Directly in Kubernetes" translate="no">​</a></h3>
<p>Attach your IDE's debugger directly to code running in Kubernetes, setting breakpoints, inspecting variables, and stepping through execution against realistic services and data. Instead of adding log statements, redeploying, and waiting, you can pause execution and inspect state in real time. You're debugging against actual dependencies, actual data flows, and actual network conditions. For complex bugs that only manifest in production-like environments, this cuts investigation time dramatically.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-costs-dont-scale-linearly">Your Costs Don't Scale Linearly<a href="https://www.okteto.com/blog/compare-okteto-versus-qovery/#your-costs-dont-scale-linearly" class="hash-link" aria-label="Direct link to Your Costs Don't Scale Linearly" title="Direct link to Your Costs Don't Scale Linearly" translate="no">​</a></h3>
<p>Environments share cluster resources intelligently, so costs don't scale linearly with team size. With infrastructure-copy approaches, ten developers mean ten full environment replicas, and fifty developers mean fifty. Okteto's architecture lets teams share baseline resources while isolating only what each developer is actively changing. The result is predictable costs that don't balloon as your team grows.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="platform-engineering-enablements">Platform Engineering Enablements<a href="https://www.okteto.com/blog/compare-okteto-versus-qovery/#platform-engineering-enablements" class="hash-link" aria-label="Direct link to Platform Engineering Enablements" title="Direct link to Platform Engineering Enablements" translate="no">​</a></h2>
<p>For platform engineering leaders, the question isn't just "which tool helps developers code faster?" It's "which platform helps me build and scale a developer experience function?"</p>
<p>Okteto provides the infrastructure platform teams need:</p>
<p><strong>Okteto Insights</strong> gives you visibility into your developer experience by tracking build duration trends, deploy times, test success rates, and platform adoption metrics. This is the data you need to understand how your platform serves developers and where to improve.</p>
<p><strong>Okteto Catalog</strong> lets platform teams define standardized, compliant environment templates. Developers get self-service access to approved configurations, and platform teams maintain governance without becoming a bottleneck.</p>
<p><strong>Resource Manager</strong> provides cost visibility and optimization across namespaces, while <strong>Garbage Collector</strong> sets sleep and delete policies for automatic cleanup. Know what you're spending, where to optimize, and let smart policies handle the rest.</p>
<p><strong>Unified manifest</strong> with <code>build</code>, <code>dev</code>, <code>test</code>, and <code>deploy</code> sections provides consistent governance across all environment types. One configuration model for your entire development lifecycle.</p>
<p><strong>Enterprise readiness</strong>: SSO, RBAC, audit logs, and the compliance features (SOC 2 Type 2) that enterprise organizations require.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="choosing-the-right-platform-for-your-team">Choosing the Right Platform for Your Team<a href="https://www.okteto.com/blog/compare-okteto-versus-qovery/#choosing-the-right-platform-for-your-team" class="hash-link" aria-label="Direct link to Choosing the Right Platform for Your Team" title="Direct link to Choosing the Right Platform for Your Team" translate="no">​</a></h2>
<p>Both platforms solve real problems. The right choice depends on your organization's context, not which platform has more features.</p>
<p><strong>Okteto fits best if:</strong></p>
<ul>
<li class="">Your organization has already committed to Kubernetes and is experiencing developer productivity pain</li>
<li class="">You want developers working in environments that truly mirror production to eliminate environment skew</li>
<li class="">You need to support different workflows for different teams (dev velocity, stakeholder review, test reliability)</li>
<li class="">You're building or scaling a platform engineering function</li>
<li class="">You have existing production deployment pipelines and need a solution that integrates rather than replaces</li>
<li class="">You care about enabling your entire product team, not just developers</li>
<li class="">You want visibility into platform adoption and developer productivity metrics</li>
</ul>
<p><strong>Qovery may fit if:</strong></p>
<ul>
<li class="">You're building greenfield infrastructure without existing Kubernetes expertise</li>
<li class="">You want a single vendor for dev through production because infrastructure management is your primary pain point, not developer velocity</li>
<li class="">You're migrating from Heroku or similar PaaS and want familiar abstractions</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-platform-engineering-perspective">The Platform Engineering Perspective<a href="https://www.okteto.com/blog/compare-okteto-versus-qovery/#the-platform-engineering-perspective" class="hash-link" aria-label="Direct link to The Platform Engineering Perspective" title="Direct link to The Platform Engineering Perspective" translate="no">​</a></h2>
<p>If you're a platform engineering leader evaluating these solutions, here's the strategic question: Are you trying to automate infrastructure, or are you trying to accelerate your entire product team?</p>
<p>Qovery answers the first question. It automates DevOps so you don't have to hire for it. That's valuable for organizations at a certain stage.</p>
<p>Okteto answers the second question. It gives developers sub-3-second feedback loops, gives PMs and designers shareable preview URLs, gives QA on-demand test environments, and gives you the visibility to continuously improve. It treats each workflow stage as a distinct problem worth solving well.</p>
<p>If your organization has committed to Kubernetes and your constraint is developer velocity, not deployment automation, Okteto is purpose-built for that outcome.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-the-difference">See the Difference<a href="https://www.okteto.com/blog/compare-okteto-versus-qovery/#see-the-difference" class="hash-link" aria-label="Direct link to See the Difference" title="Direct link to See the Difference" translate="no">​</a></h2>
<p>Ready to see how purpose-built development environments can accelerate your team?</p>
<div class="button_B_vc"><a class="Button teal layout" href="https://www.okteto.com/get-demo/" target="_self">Request a demo<!-- --> →</a></div>
<p>Our team has helped organizations from 20 to 2,000+ developers build platforms that actually scale. We'll walk through your specific environment strategy and show you how Okteto fits your development process.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Okteto vs mirrord: Choosing the Right Development Environment Solution for Your Team]]></title>
            <link>https://www.okteto.com/blog/okteto-vs-mirrord-choosing-the-right-development-environment-solution-for-your-team/</link>
            <guid>https://www.okteto.com/blog/okteto-vs-mirrord-choosing-the-right-development-environment-solution-for-your-team/</guid>
            <pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Compare Okteto vs mirrord for development environments. Learn which solution fits your team's needs today and supports your platform vision as you scale.]]></description>
            <content:encoded><![CDATA[<p>When evaluating Kubernetes development solutions, platform teams face a critical choice: invest in a tool that solves one problem well, or a platform that meets your needs today and supports your development environment vision as you scale. If you're researching mirrord by MetalBear and Okteto, you're likely focused on solving the same core challenge: giving developers faster feedback loops without sacrificing environment realism.</p>
<!-- -->
<p>Both solutions address this need, but one is built for individual developer speed while the other is designed for organizational velocity.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-the-shared-goal">Understanding the Shared Goal<a href="https://www.okteto.com/blog/okteto-vs-mirrord-choosing-the-right-development-environment-solution-for-your-team/#understanding-the-shared-goal" class="hash-link" aria-label="Direct link to Understanding the Shared Goal" title="Direct link to Understanding the Shared Goal" translate="no">​</a></h2>
<p>Modern application development has moved far beyond simple monoliths. Your applications are now code plus configuration, runtime, network policies, and countless dependencies across microservices. Developers can't gain real confidence that their changes work by running unit tests alone. They need access to realistic environments that reflect production complexity.</p>
<p>This is where solutions like Okteto and mirrord come in. Both recognize that the traditional "code locally, pray it works in CI" workflow creates bottlenecks, bugs, and frustration. Both offer ways to speed up the inner development loop while connecting to shared services.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-mirrord-works">How mirrord Works<a href="https://www.okteto.com/blog/okteto-vs-mirrord-choosing-the-right-development-environment-solution-for-your-team/#how-mirrord-works" class="hash-link" aria-label="Direct link to How mirrord Works" title="Direct link to How mirrord Works" translate="no">​</a></h2>
<p>mirrord is designed to give individual developers a fast feedback loop by allowing them to run their code locally while connecting to services running in a remote Kubernetes cluster. When you use mirrord, your application process runs on your local machine, but mirrord creates an abstraction layer that intercepts network calls, environment variables, and file system access, routing them to or from the remote cluster as needed.</p>
<p>This approach lets developers iterate quickly on their code without needing to build containers, push images, or wait for deployments. You write code, save the file, and see results almost immediately, all while your service behaves as if it's connected to your staging or development environment.</p>
<p>The focus is squarely on developer velocity for that inner development loop: the cycle of writing code and iterating.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-okteto-works">How Okteto Works<a href="https://www.okteto.com/blog/okteto-vs-mirrord-choosing-the-right-development-environment-solution-for-your-team/#how-okteto-works" class="hash-link" aria-label="Direct link to How Okteto Works" title="Direct link to How Okteto Works" translate="no">​</a></h2>
<p>Okteto takes a different architectural approach. Instead of running your code locally with an abstraction layer, Okteto runs your development process directly in Kubernetes, in actual pods within your cluster. When you develop with Okteto, you're working in the same runtime environment where your code will eventually run in production.</p>
<p>Okteto's flexibility comes from recognizing that different teams and different scenarios need different approaches. Your payments team testing a critical transaction flow doesn't need the same environment as your front-end team building a new dashboard. A developer fixing a bug in one service doesn't need the same setup as a platform engineer validating infrastructure changes across 50 microservices. Okteto adapts to match what each team actually needs, whether that's a single service connected to shared dependencies, a full environment replica, or something in between.</p>
<p>Beyond the development experience, Okteto provides the infrastructure for your entire development lifecycle: on-demand image builds, namespace management, preview environments for pull requests, testing capabilities, observability, and the governance features platform teams need to support hundreds of developers.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="quick-comparison-what-are-the-key-differences">Quick Comparison: What Are the Key Differences?<a href="https://www.okteto.com/blog/okteto-vs-mirrord-choosing-the-right-development-environment-solution-for-your-team/#quick-comparison-what-are-the-key-differences" class="hash-link" aria-label="Direct link to Quick Comparison: What Are the Key Differences?" title="Direct link to Quick Comparison: What Are the Key Differences?" translate="no">​</a></h2>
<p><em>The table shows what each solution offers. The rest of this guide explains why those differences matter for your decision.</em></p>
<p><img decoding="async" loading="lazy" alt="Comparison of Okteto vs mirrord development environment features" src="https://www.okteto.com/blog/assets/images/f6ab2a83b790-e269ee6ea186978b3b2b668b572cc0c6.webp" width="800" height="1123" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-the-strategic-differences">Understanding the Strategic Differences<a href="https://www.okteto.com/blog/okteto-vs-mirrord-choosing-the-right-development-environment-solution-for-your-team/#understanding-the-strategic-differences" class="hash-link" aria-label="Direct link to Understanding the Strategic Differences" title="Direct link to Understanding the Strategic Differences" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="architecture-where-your-code-actually-runs">Architecture: Where Your Code Actually Runs<a href="https://www.okteto.com/blog/okteto-vs-mirrord-choosing-the-right-development-environment-solution-for-your-team/#architecture-where-your-code-actually-runs" class="hash-link" aria-label="Direct link to Architecture: Where Your Code Actually Runs" title="Direct link to Architecture: Where Your Code Actually Runs" translate="no">​</a></h3>
<p>Here's a technical distinction that matters: when you use mirrord, your process isn't actually running on Kubernetes. There's an abstraction layer that replicates network calls, secrets, and other cluster behaviors. This works for many scenarios, but it means you're not testing against the actual runtime environment, access controls, and network patterns your code will face in production.</p>
<p>With Okteto, your development process runs in actual Kubernetes pods within your cluster. Same access management, same network policies, same runtime constraints. This matters more as your applications grow in complexity and your organization's compliance and security requirements mature.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scope-individual-speed-vs-organizational-velocity">Scope: Individual Speed vs. Organizational Velocity<a href="https://www.okteto.com/blog/okteto-vs-mirrord-choosing-the-right-development-environment-solution-for-your-team/#scope-individual-speed-vs-organizational-velocity" class="hash-link" aria-label="Direct link to Scope: Individual Speed vs. Organizational Velocity" title="Direct link to Scope: Individual Speed vs. Organizational Velocity" translate="no">​</a></h3>
<p>Now that you understand how each solution works, the strategic question becomes: what do you actually need?</p>
<p>mirrord is a focused tool built to solve one part of the development lifecycle exceptionally well: enabling individual developers to get fast feedback by running code locally while connecting to a remote Kubernetes environment.</p>
<p>Okteto is a complete platform built with the understanding that fast feedback loops are essential, but they're just the starting point. Building great developer experience for your organization means thinking beyond individual speed to organizational velocity. A platform handles your full development lifecycle: building images, running tests, generating preview environments, managing access and costs, and providing the visibility platform teams need to support hundreds of developers efficiently.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-day-one-and-day-two-story">The Day One and Day Two Story<a href="https://www.okteto.com/blog/okteto-vs-mirrord-choosing-the-right-development-environment-solution-for-your-team/#the-day-one-and-day-two-story" class="hash-link" aria-label="Direct link to The Day One and Day Two Story" title="Direct link to The Day One and Day Two Story" translate="no">​</a></h2>
<p>Both Okteto and mirrord excel at day one. You can start with a single service, connect it to a shared environment, and immediately give developers that fast feedback loop everyone wants.</p>
<p>The difference emerges after that initial win, when your team's needs expand:</p>
<p><strong>Months 1-3</strong>: A few developers are using the new workflow. Fast feedback is delivering value. Success stories are spreading.</p>
<p><strong>Months 6-12</strong>: More teams want in. You've gone from 10 to 40 to 100 developers. New questions surface: How do we manage access to shared environments? What's this costing us? Can we build images on-demand instead of depending on CI? How do developers run tests before opening a PR? What about preview environments for code review?</p>
<p><strong>Year 2+</strong>: You have multiple teams with completely different needs. The front-end team just needs API access. The payments team needs three specific microservices. The platform team needs to test changes across 50+ services. Your AI team needs environments to run and test hundreds of agents in parallel.</p>
<p>This is where the platform approach proves its value.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-an-environment-platform-actually-provides">What an Environment Platform Actually Provides<a href="https://www.okteto.com/blog/okteto-vs-mirrord-choosing-the-right-development-environment-solution-for-your-team/#what-an-environment-platform-actually-provides" class="hash-link" aria-label="Direct link to What an Environment Platform Actually Provides" title="Direct link to What an Environment Platform Actually Provides" translate="no">​</a></h2>
<p>When we talk about Okteto as a platform, here's what that means in practice:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="multiple-development-models-one-solution">Multiple Development Models, One Solution<a href="https://www.okteto.com/blog/okteto-vs-mirrord-choosing-the-right-development-environment-solution-for-your-team/#multiple-development-models-one-solution" class="hash-link" aria-label="Direct link to Multiple Development Models, One Solution" title="Direct link to Multiple Development Models, One Solution" translate="no">​</a></h3>
<p>Not every team in your organization will work the same way. Some teams need full environment deployments. Others work better with a single service connected to shared dependencies. Some need hybrid approaches depending on what they're building that day.</p>
<p>Okteto supports all three models:</p>
<ul>
<li class=""><strong>Divert mode</strong>: Run a single service with your changes while routing traffic from a shared environment (similar to mirrord's approach)</li>
<li class=""><strong>Full deployments</strong>: Spin up complete environment replicas when you need true end-to-end validation</li>
<li class=""><strong>Hybrid</strong>: Mix local and remote services based on what makes sense for your workflow</li>
</ul>
<p>You don't have to choose one model and force every team to adapt. Different teams can use different approaches, and individual developers can switch between them based on their current task.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="supporting-the-full-development-lifecycle">Supporting The Full Development Lifecycle<a href="https://www.okteto.com/blog/okteto-vs-mirrord-choosing-the-right-development-environment-solution-for-your-team/#supporting-the-full-development-lifecycle" class="hash-link" aria-label="Direct link to Supporting The Full Development Lifecycle" title="Direct link to Supporting The Full Development Lifecycle" translate="no">​</a></h3>
<p>Fast feedback on code changes is table stakes. But your developers also need:</p>
<p><strong>Build infrastructure</strong>: Build container images on-demand without depending on CI pipelines or running Docker Desktop locally. This becomes crucial as your team scales and build times impact everyone's velocity.</p>
<p><strong>Testing capabilities</strong>: Run integration tests, end-to-end tests, and validation against realistic data before your code reaches CI. Catch issues earlier in the cycle.</p>
<p><strong>Preview environments</strong>: Automatically generate shareable environments for every pull request. Your reviewers can see changes in action, not just read code diffs.</p>
<p><strong>Namespace management</strong>: Control who can access what, how long environments live, and how resources are allocated across teams. This isn't glamorous, but it's essential at scale.</p>
<p><strong>Observability and insights</strong>: Understand how your team actually works. Which microservices are build bottlenecks? How are teams using environments? Where are the friction points? This visibility helps you continuously improve your developer experience.</p>
<p><strong>Cost and resource management</strong>: Know what you're spending and where. Set policies for automatic cleanup and scale resources based on actual usage patterns.</p>
<p><strong>Enterprise readiness</strong>: SSO, audit logs, compliance controls, and the security features that enterprise organizations require.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="choosing-a-development-environment-solution-for-your-team">Choosing a Development Environment Solution For Your Team<a href="https://www.okteto.com/blog/okteto-vs-mirrord-choosing-the-right-development-environment-solution-for-your-team/#choosing-a-development-environment-solution-for-your-team" class="hash-link" aria-label="Direct link to Choosing a Development Environment Solution For Your Team" title="Direct link to Choosing a Development Environment Solution For Your Team" translate="no">​</a></h2>
<p>As you evaluate development environment solutions, look beyond the feature comparison chart. Consider where your team will be in 12 months, 24 months. Do you need just faster feedback loops, or complete development infrastructure? Will this solution grow with you, or will you need to migrate again as you scale?</p>
<p>Here's how to think about this decision:</p>
<p><strong>Choose a focused tool like mirrord if:</strong></p>
<ul>
<li class="">You have a small team with simple environment needs</li>
<li class="">Your development model is straightforward and unlikely to change</li>
<li class="">You have other solutions in place for builds, testing, and preview environments</li>
<li class="">Your primary concern is individual developer speed, not organizational velocity</li>
</ul>
<p><strong>Choose a platform like Okteto if:</strong></p>
<ul>
<li class="">Your team is growing or you expect significant growth</li>
<li class="">You need to support multiple development workflows across different teams</li>
<li class="">You're building or scaling a platform engineering function</li>
<li class="">You care about realistic Kubernetes environments, not abstraction layers</li>
<li class="">You want a solution that handles the entire development lifecycle</li>
<li class="">You need enterprise features like governance, observability, and cost management</li>
<li class="">You're thinking about developer experience as a long-term investment</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ready-to-see-the-difference">Ready to See the Difference?<a href="https://www.okteto.com/blog/okteto-vs-mirrord-choosing-the-right-development-environment-solution-for-your-team/#ready-to-see-the-difference" class="hash-link" aria-label="Direct link to Ready to See the Difference?" title="Direct link to Ready to See the Difference?" translate="no">​</a></h2>
<p>If you're building for growth, if you're investing in platform engineering, if you need flexibility to support diverse teams and workflows, Okteto is built for you.</p>
<p>Start with our free tier to see how easy it is to get up and running.</p>
<div class="button_B_vc"><a class="Button teal layout" href="https://bit.ly/4oFX1eC" target="_blank" rel="noopener noreferrer">Start free<!-- --> →</a></div>
<p>Want to discuss your specific environment strategy? Our team has helped organizations from 20 to 2,000 developers build platforms that actually scale. <a href="https://bit.ly/4478H2A" target="_blank" rel="noopener noreferrer" class="">Talk to our team →</a></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Three Pillars of Trust for AI in Software Development]]></title>
            <link>https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/</link>
            <guid>https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/</guid>
            <pubDate>Tue, 08 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Developer trust in AI is declining. Discover three foundational pillars platform teams need to build developer confidence in AI-assisted software development.]]></description>
            <content:encoded><![CDATA[<p>Here's the truth about AI agents being used in software development today: everyone's beginning to use them, but few really trust them.</p>
<!-- -->
<p>For platform teams, this trust gap represents both a challenge and a massive opportunity. Developers need a few key things to trust AI agents enough to rely on them for important work, and platform engineers are uniquely positioned to be the catalyst that makes it happen. This post shows you how to build that trust and accelerate AI adoption across your organization.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-trust-paradox-in-ai-assisted-software-development">The Trust Paradox in AI-assisted Software Development<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#the-trust-paradox-in-ai-assisted-software-development" class="hash-link" aria-label="Direct link to The Trust Paradox in AI-assisted Software Development" title="Direct link to The Trust Paradox in AI-assisted Software Development" translate="no">​</a></h2>
<p>The data tells an interesting story. <a href="https://survey.stackoverflow.co/2024/ai" target="_blank" rel="noopener noreferrer" class="">62% of developers are now using AI tools</a> (up from 44% last year), but favorability actually dropped from 77% to 72%.</p>
<p>This is the trust paradox of AI adoption. Usage is climbing while confidence is declining. Developers are adopting AI tools faster than ever, but they're also becoming more skeptical about the results.</p>
<p>Why? Because the current AI tools create a "trust but verify" problem that doesn't scale. They're great at generating code that looks smart, but they leave you doing all the validation work. You get code snippets without knowing if they actually work, if they handle edge cases properly, or will break when they hit real production constraints.</p>
<p>This creates a confidence erosion cycle where AI generates promising code, you find issues during manual testing, and you trust the agent less next time. Instead of building confidence through proven results, current tools are making developers second-guess what they produce.</p>
<p>Meanwhile, conversations are leaning into which LLM to use and how to craft the perfect prompt, but nobody's talking about giving AI agents the production-like environments they need to generate real results. To understand why this matters so much, let's first look at common friction points developers are experiencing.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-current-ai-tools-arent-meeting-developers-needs">Why Current AI Tools Aren't Meeting Developer’s Needs<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#why-current-ai-tools-arent-meeting-developers-needs" class="hash-link" aria-label="Direct link to Why Current AI Tools Aren't Meeting Developer’s Needs" title="Direct link to Why Current AI Tools Aren't Meeting Developer’s Needs" translate="no">​</a></h2>
<p>Developers are excited about AI, but they're also getting burned by it. Here's a few hurdles they are encountering.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-code-suggestion-trap">The "Code Suggestion Trap"<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#the-code-suggestion-trap" class="hash-link" aria-label="Direct link to The &quot;Code Suggestion Trap&quot;" title="Direct link to The &quot;Code Suggestion Trap&quot;" translate="no">​</a></h3>
<p>Most AI tools today are basically fancy autocomplete. They spit out code snippets, maybe even entire functions, then basically say "good luck!" and leave you to figure out the rest.</p>
<p>Now you're stuck doing all the verification work. Does this code actually work? Has it been tested? Will it break in production? Does it handle edge cases? Is it secure? You end up spending just as much time checking the agents homework as you saved by using it in the first place.</p>
<p>The promise was increased productivity, but the reality is increased validation overhead.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-local-development-wall">The Local Development Wall<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#the-local-development-wall" class="hash-link" aria-label="Direct link to The Local Development Wall" title="Direct link to The Local Development Wall" translate="no">​</a></h3>
<p>The next hurdle: AI agents running on your laptop are basically flying blind. They don't know about your internal APIs, your database schemas, your microservices, or any of the custom network policies that make your app actually work.</p>
<p>So the agent generates code that looks great locally but fails the moment it touches your real infrastructure. It's being put in a situation to make assumptions about your application that just aren't true.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-security-and-governance-gap">The Security and Governance Gap<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#the-security-and-governance-gap" class="hash-link" aria-label="Direct link to The Security and Governance Gap" title="Direct link to The Security and Governance Gap" translate="no">​</a></h3>
<p>Enterprise teams have additional concerns beyond just functionality. How do you audit what an AI agent did? How do you ensure it's not exposing sensitive data or violating compliance requirements? Most AI experiments are operating as black boxes without the enterprise-grade controls that organizations need.</p>
<p>When developers install AI tools on their laptops or use cloud-based services, there's often no visibility into what data the agent accessed, what actions it took, or whether it followed your security policies. For regulated industries or security-conscious organizations, this lack of governance makes AI adoption a non-starter for both adoption and trust.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-platform-engineering-opportunity">The Platform Engineering Opportunity<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#the-platform-engineering-opportunity" class="hash-link" aria-label="Direct link to The Platform Engineering Opportunity" title="Direct link to The Platform Engineering Opportunity" translate="no">​</a></h3>
<p>Developers are in experimentation mode with AI tools. Some are going out of bounds because they don’t know they have better options. They haven’t been trained or given the best practices for your organization. Sound familiar? It's the same pattern we've seen with cloud adoption where developers find tools that make them more productive, and if platform teams don't provide a path, they'll make their own.</p>
<p>The difference is, with AI agents, the stakes are higher. We're talking about internal code and secrets that have a high potential to be shared with external LLM providers. That’s.. not ideal.</p>
<p>But here's your chance. This isn't your first rodeo. The teams that get ahead of developer adoption by building better alternatives, or golden paths if you will, they win.</p>
<p>Right now, every developer is basically running their own AI solution with zero governance, zero observability, and zero standardization. That's a problem you can solve.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="three-essential-pillars-for-trustworthy-ai-in-software-development">Three Essential Pillars for Trustworthy AI in Software Development<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#three-essential-pillars-for-trustworthy-ai-in-software-development" class="hash-link" aria-label="Direct link to Three Essential Pillars for Trustworthy AI in Software Development" title="Direct link to Three Essential Pillars for Trustworthy AI in Software Development" translate="no">​</a></h2>
<p>Let's talk about what developers actually need to trust AI agents. It comes down to three things, and they're pretty simple when you think about it.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="empowerment-i-can-describe-what-i-want-and-it-actually-happens">Empowerment ("I can describe what I want, and it actually happens")<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#empowerment-i-can-describe-what-i-want-and-it-actually-happens" class="hash-link" aria-label="Direct link to Empowerment (&quot;I can describe what I want, and it actually happens&quot;)" title="Direct link to Empowerment (&quot;I can describe what I want, and it actually happens&quot;)" translate="no">​</a></h3>
<p>This is about going way beyond code suggestions. Developers need AI agents that can take a prompt like "add authentication to this API" and actually deliver a working, deployed, testable feature.</p>
<p>Not just code that might work. Not just suggestions you have to implement yourself. The goal should be a real endpoint you can reference, with proper database connections, that handles edge cases, and that you can immediately test and validate.</p>
<p>When an agent has access to your actual infrastructure (your databases, your APIs, your deployment tools), it stops making wild assumptions and starts making informed decisions. It knows your database schema, understands your API contracts, and can work within your actual constraints to produce trustworthy work like a real member of your team.</p>
<p>The empowerment comes from seeing results, not just savvy code. Click a link, test an endpoint, see it working. That's trust.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="safety-i-can-experiment-without-breaking-anything">Safety ("I can experiment without breaking anything")<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#safety-i-can-experiment-without-breaking-anything" class="hash-link" aria-label="Direct link to Safety (&quot;I can experiment without breaking anything&quot;)" title="Direct link to Safety (&quot;I can experiment without breaking anything&quot;)" translate="no">​</a></h3>
<p>Safety isn't just about preventing disasters (though that's important). It's about psychological safety - knowing you can let an AI agent loose on a complex task without worrying it'll take down production, expose sensitive data or mess up your local environment.</p>
<p>This is where we have strong opinions and where ephemeral environments become your best friend. Every AI agent needs its own completely isolated environment + your infrastructure. There should be no configuration drift, no weird state from previous runs, no chance of stepping on other people's (or agents) work.</p>
<p>Safety can't be an afterthought. Your governance, security policies, and access controls need to be baked right into these environments. The agent operates within the same boundaries you'd set for a new team member with appropriate access, proper monitoring, full audit trails.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="unblocked-i-dont-have-to-configure-anything">Unblocked ("I don't have to configure anything")<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#unblocked-i-dont-have-to-configure-anything" class="hash-link" aria-label="Direct link to Unblocked (&quot;I don't have to configure anything&quot;)" title="Direct link to Unblocked (&quot;I don't have to configure anything&quot;)" translate="no">​</a></h3>
<p>This is where platform comes in. Remember the difference between tools and workflows that get utilized and those that get abandoned often comes down to friction. The same is true for AI adoption.</p>
<p>Developers shouldn't have to become infrastructure experts to try AI workflows. The cognitive overhead of setup, configuration, and troubleshooting kills experimentation before it starts.</p>
<p>The most successful AI implementations remove barriers rather than adding them. When developers can focus on the problem they're trying to solve instead of wrestling with tooling, that's when you see real adoption and genuine productivity gains.</p>
<p>This isn't just about convenience. It's about enabling the kind of rapid experimentation that builds confidence in AI tools. When trying something new is easy, developers will actually try it. When it's complicated, they'll stick with what they know.</p>
<p>When you nail this, developers stop thinking about the infrastructure and start thinking about the problems they want to solve. That's when AI adoption can really take off.</p>
<aside class="highlight_CGlU"><h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ready-to-see-these-pillars-in-action">Ready to see these pillars in action?<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#ready-to-see-these-pillars-in-action" class="hash-link" aria-label="Direct link to Ready to see these pillars in action?" title="Direct link to Ready to see these pillars in action?" translate="no">​</a></h3><p>If you're a platform team thinking about how to drive trustworthy AI adoption in your organization, we'd love to show you what we're building. Our AI Agent Fleets beta gives you hands-on experience with the infrastructure foundation we've been discussing.</p><div class="button_B_vc"><a class="Button teal layout" href="https://www.okteto.com/ai/" target="_self">Try the Beta<!-- --> →</a></div><p>We'd love your feedback!</p></aside>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-infrastructure-gap-everyones-missing">The Infrastructure Gap Everyone's Missing<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#the-infrastructure-gap-everyones-missing" class="hash-link" aria-label="Direct link to The Infrastructure Gap Everyone's Missing" title="Direct link to The Infrastructure Gap Everyone's Missing" translate="no">​</a></h2>
<p>Building trust with agentic development requires a few things working together in tandem. You need solid models, great prompting, and the right infrastructure. Most teams are getting really good at the first two. They've figured out which LLMs work best for their use cases and how to write effective prompts.</p>
<p>But they're missing the third piece that makes realistic output possible.</p>
<p>When you give a capable AI model good prompts AND production-like context to work within, that's when you see the real breakthrough in trust and reliability.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-application-context-changes-everything">Why Application Context Changes Everything<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#why-application-context-changes-everything" class="hash-link" aria-label="Direct link to Why Application Context Changes Everything" title="Direct link to Why Application Context Changes Everything" translate="no">​</a></h3>
<p>Think about how modern applications actually work. It's not just code anymore. It's code, configuration, secrets, infrastructure, network policies, deployment workflows, monitoring, logging, and the fifteen other things that make your app actually run in production.</p>
<p>When an AI agent understands this full context, it generates fundamentally different output. Instead of creating a REST API that works in isolation, it builds one that properly integrates with your auth service, follows your database conventions, handles your error patterns, and deploys using your actual CI/CD pipeline.</p>
<p>The validation happens automatically because the agent is working in an environment that mirrors production. When it says "this works," you can actually trust that because it's been tested against real constraints.</p>
<p>And ultimately, trust builds when developers see working systems, not just clever code. An agent that can show a functioning output demonstrates competence in a way that code suggestions never could.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-strategic-role-as-a-platform-team">Your Strategic Role as a Platform Team<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#your-strategic-role-as-a-platform-team" class="hash-link" aria-label="Direct link to Your Strategic Role as a Platform Team" title="Direct link to Your Strategic Role as a Platform Team" translate="no">​</a></h3>
<p>This is where platform teams become the heroes of AI adoption.</p>
<p>Your role is expanding from infrastructure automation to AI experience enablement. You're creating the foundation that lets developers confidently delegate complex work to AI agents. You're building on the platform you already have and adding a new dimension that makes AI agents actually useful and safe for your teams.</p>
<p>The magic happens when you can abstract away all the complexity of AI infrastructure while maintaining the control and governance your organization needs. Developers get the simplicity of "just works" environments, while you ensure security policies, compliance requirements, and operational standards are automatically enforced.</p>
<p>This is about enabling developer velocity without sacrificing governance. When you get this balance right, AI adoption accelerates naturally because developers trust the guardrails you've built.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-network-effect-of-adoption">The Network Effect of Adoption<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#the-network-effect-of-adoption" class="hash-link" aria-label="Direct link to The Network Effect of Adoption" title="Direct link to The Network Effect of Adoption" translate="no">​</a></h3>
<p>The beautiful thing about getting this right is how success breeds more success. When some developers start having positive experiences with AI agents in proper environments, word spreads quickly. Other developers see working demos, successful deployments, and real productivity gains.</p>
<p>This creates a virtuous cycle. More developers want to try AI agents, which leads to more success stories, which drives even broader adoption. Instead of fighting skepticism and resistance, you're building momentum across the organization.</p>
<p>Plus, you get the visibility and control that's been missing from the current chaos of individual AI tool adoption. Instead of wondering what developers are doing with AI, you have observability, governance, and standardization built in.</p>
<p>Building this infrastructure foundation isn't just a technical challenge. It's a strategic opportunity that will define how your organization adopts AI.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-matters-more-than-you-think">Why This Matters More Than You Think<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#why-this-matters-more-than-you-think" class="hash-link" aria-label="Direct link to Why This Matters More Than You Think" title="Direct link to Why This Matters More Than You Think" translate="no">​</a></h2>
<p>The teams that solve AI infrastructure first are going to have a massive advantage. Not just in productivity, but in talent attraction, developer satisfaction, and business outcomes.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="youre-building-the-future-of-work">You're Building the Future of Work<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#youre-building-the-future-of-work" class="hash-link" aria-label="Direct link to You're Building the Future of Work" title="Direct link to You're Building the Future of Work" translate="no">​</a></h3>
<p>When developers trust (and enjoy) working with AI agents because they operate in properly governed, production-like environments, adoption stops being cautious and starts being aggressive. Teams begin tackling bigger problems, automating more complex workflows, and shipping faster than they ever thought possible.</p>
<p>Think bigger. You're not just enabling current AI capabilities. You're building the foundation for what's coming next.</p>
<p>Single agents are just the beginning. The real transformation happens when teams can orchestrate multiple specialized agents working together on complex, multi-step workflows. The infrastructure patterns you establish now (ephemeral environments, policy enforcement, observability) become the foundation for enterprise-scale AI orchestration.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="platform-teams-as-ai-enablers">Platform Teams as AI Enablers<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#platform-teams-as-ai-enablers" class="hash-link" aria-label="Direct link to Platform Teams as AI Enablers" title="Direct link to Platform Teams as AI Enablers" translate="no">​</a></h3>
<p>This positions platform teams at the center of organizational AI transformation. You become the team that makes ambitious AI projects possible by providing the infrastructure foundation that developers can build on confidently.</p>
<p>Developers start leveraging platform capabilities as competitive advantages rather than working around infrastructure limitations. Leadership sees platform investment as directly driving AI transformation rather than just keeping the lights on.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-bottom-line">The Bottom Line<a href="https://www.okteto.com/blog/the-three-pillars-of-trust-for-ai-in-software-development/#the-bottom-line" class="hash-link" aria-label="Direct link to The Bottom Line" title="Direct link to The Bottom Line" translate="no">​</a></h2>
<p>Trust in using AI agents in development lifecycle comes from having all the pieces working together. Great models and prompts get you started, but the infrastructure foundation is what makes developers confident enough to actually rely on AI for important work.</p>
<p>Get the infrastructure right, and AI adoption accelerates across your organization. Teams become more ambitious, developers become more confident, and platform teams become the heroes of AI-powered transformation.</p>
<p>The transformation is already happening. The only question is whether you'll lead it or spend the next few years trying to catch up.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Run AI Agents at Scale with Okteto AI]]></title>
            <link>https://www.okteto.com/blog/infrastructure-required-to-run-ai-agents-at-scale/</link>
            <guid>https://www.okteto.com/blog/infrastructure-required-to-run-ai-agents-at-scale/</guid>
            <pubDate>Wed, 18 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Okteto gives each AI agent a dedicated environment on your cloud infrastructure to build, test, and ship real code at scale.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="building-the-future-of-development-environments-for-ai-agents">Building the Future of Development Environments for AI Agents<a href="https://www.okteto.com/blog/infrastructure-required-to-run-ai-agents-at-scale/#building-the-future-of-development-environments-for-ai-agents" class="hash-link" aria-label="Direct link to Building the Future of Development Environments for AI Agents" title="Direct link to Building the Future of Development Environments for AI Agents" translate="no">​</a></h2>
<p>AI agents are moving fast. What started as single-agent experiments in terminal windows is quickly turning into something more ambitious like multi-agent systems that collaborate, take initiative, and run complex workflows in parallel. The future isn't one agent. It's fleets of them.</p>
<!-- -->
<p>But here’s the challenge: we need real infrastructure to support this, especially at enterprise scale.</p>
<p>Many teams are beginning to scale agent usage to broader adoption across engineering workflows. But the tools and infrastructure are lagging behind that ambition. Isolation becomes harder to maintain, policies are difficult to enforce, and managing agent deployment at scale introduces new overhead for platform teams.</p>
<p>What teams need is a way to give every agent its own remote environment that runs on their company infrastructure. These environments must be ephemeral, secure, and aligned with how your applications run in production. That unlocks real use cases for parallelism and scale. It enables teams to verify code rather than have agents simply suggest it. Most importantly, it supports agentic development in a way that meets enterprise standards.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Exploring how to roll out AI agent workflows in your organization? Okteto makes it safe and easy to run agents on your infrastructure.</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/ai/" target="_self">Learn more about Okteto AI</a></div></section>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-agentic-development-requires-infrastructure">Why Agentic Development Requires Infrastructure<a href="https://www.okteto.com/blog/infrastructure-required-to-run-ai-agents-at-scale/#why-agentic-development-requires-infrastructure" class="hash-link" aria-label="Direct link to Why Agentic Development Requires Infrastructure" title="Direct link to Why Agentic Development Requires Infrastructure" translate="no">​</a></h2>
<p>Scaling AI agents from a single instance to a functioning fleet is a shift that requires more than just the right logic or workflows. It requires an infrastructure orchestration layer.</p>
<p>We’re seeing a wave of multi-agent frameworks and building solid proof-of-concepts for local dev. You’ve probably even seen the workflow where developers are running five terminals with five different agents. It works, to a point. But when those agents need to run concurrently, access internal systems, or follow organizational policies, that approach begins to fall apart. We know that local setups and shared clusters are simply not built to support repeatability, security, and scale.</p>
<p>You start hitting familiar friction: configuration drift, lack of auditability, resource contention, and security concerns. These aren't signs of bad practice. They're symptoms of missing infrastructure.</p>
<p>So, the moment has arrived. We’re pushing the boundaries at a faster pace than we’ve seen in a very long time and we need to quickly solve for these limitations in order to unlock real agent adoption.</p>
<p>Jack Clark, cofounder of Anthropic, <a href="https://www.youtube.com/watch?v=U1ZMmKMMHgQ" target="_blank" rel="noopener noreferrer" class="">described the opportunity clearly</a>:</p>
<blockquote>
<p>"I think it's actually going to be the era of the manager nerds now, where being able to manage fleets of AI agents and orchestrate them is going to make people incredibly powerful."</p>
</blockquote>
<p>But to unlock that potential, you need ephemeral, isolated and reproducible environments for every agent. You need observability into what’s running and where. And you need automation that lowers the barrier for developers while keeping platform teams in control.</p>
<p>That’s the foundation we built Okteto AI on.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-okteto-ai">What is Okteto AI<a href="https://www.okteto.com/blog/infrastructure-required-to-run-ai-agents-at-scale/#what-is-okteto-ai" class="hash-link" aria-label="Direct link to What is Okteto AI" title="Direct link to What is Okteto AI" translate="no">​</a></h2>
<p>We built Okteto AI to help platform and engineering teams orchestrate, run and test agents at scale.</p>
<p>With Okteto AI, every AI agent gets its own fully provisioned environment, ready with the services, configs, and dependencies it needs. These environments are designed to be ephemeral: they spin up in seconds, run the task, and shut down when done.</p>
<p>Beyond just generating suggestions, agents can now build, deploy, and test code end-to-end inside these environments. That gives developers confidence in the output, and they no longer need to manually verify every change or review every line. When the agent completes its workflow, you know the code works because it’s already been validated in a production-like setting.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-okteto-environments-fit-agent-workflows">Why Okteto Environments Fit Agent Workflows<a href="https://www.okteto.com/blog/infrastructure-required-to-run-ai-agents-at-scale/#why-okteto-environments-fit-agent-workflows" class="hash-link" aria-label="Direct link to Why Okteto Environments Fit Agent Workflows" title="Direct link to Why Okteto Environments Fit Agent Workflows" translate="no">​</a></h2>
<p>As agents become an extension of our teams, they’ll need the same access and resources that developers need today such as code, infra, tests, network policies, etc. And they’ll need isolated spaces to experiment, fail, try again, and improve without the risk. Okteto environments provide exactly that with strong security baked in:</p>
<ul>
<li class=""><strong>Ephemeral by design:</strong> every agent gets a clean slate. No stale state or config bleed across runs. It also ensures every agent operates in a repeatable context, making tests more reliable and environments easier to debug and audit.</li>
<li class=""><strong>The power of your infra:</strong> maintain full control by running environments inside your own cloud or Kubernetes infrastructure. Ensures agents can interact safely with internal APIs and services, and allows platform teams to enforce organizational security policies while maintaining production parity.</li>
<li class=""><strong>Realistic and consistent:</strong> environments that give agents a place to actually run and verify their code, not just suggest it. Each action happens in real-time, in a space that reflects how your application behaves in production. You get tested, working code, not just output that looks right.</li>
<li class=""><strong>Instant provisioning:</strong> automate the provisioning of environments so platform teams can support hundreds of concurrent agent runs without bottlenecks.</li>
<li class=""><strong>Fully governed and observable:</strong> control access, set resource limits, monitor infrastructure usage, and track how many agents are running at any time. Platform teams get full visibility into activity and costs, making it easy to manage scale while maintaining oversight.</li>
</ul>
<p>These are the same capabilities already used by teams at <a href="http://monday.com/" target="_blank" rel="noopener noreferrer" class="">Monday.com</a>, LaunchDarkly, and Ruggable to power developer environments. Now, they’re available for AI agents too.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-use-cases-from-early-testing">Real Use Cases from Early Testing<a href="https://www.okteto.com/blog/infrastructure-required-to-run-ai-agents-at-scale/#real-use-cases-from-early-testing" class="hash-link" aria-label="Direct link to Real Use Cases from Early Testing" title="Direct link to Real Use Cases from Early Testing" translate="no">​</a></h2>
<p>Early users are already putting Okteto AI to work on real engineering projects. These aren’t demos or toy apps. They’re production-grade workflows powering real development.</p>
<p><strong>Parallel feature development:</strong> A backend engineer launched two agents in isolated dev environments to work on separate features. One agent refactored the billing service to support regional tax logic. The other scaffolded a new FastAPI service for fraud detection. Both agents ran independently, passed all tests, and opened pull requests with production-ready code. This enabled faster delivery across multiple initiatives without added complexity.</p>
<p><strong>Automated onboarding of a legacy Go service:</strong> A platform engineer used an agent to onboard a live billing API into Okteto. The agent generated an Okteto Manifest and Docker Compose file, spun up the full environment, connected a seeded Postgres database, ran tests, and opened a pull request with a preview environment. What normally took days was completed in minutes.</p>
<p><strong>Greenfield scaffolding for internal tools:</strong> A developer used an agent to scaffold a new FastAPI application for an employee directory. The agent generated the full project structure, wrote tests and configuration files, ran validation with Okteto Test, and launched a preview environment for internal review. This gave the team a production-like foundation to build on quickly.</p>
<p>These stories show the real potential of pairing agents with cloud-native infrastructure. Okteto makes it possible for agents to build, test, and ship working code inside environments that reflect your real application, not just generate suggestions.</p>
<p>As Sourcegraph’s <a href="https://sourcegraph.com/blog/revenge-of-the-junior-developer" target="_blank" rel="noopener noreferrer" class="">“Revenge of the Junior Developer”</a> puts it, the rise of agents levels the playing field. The right tools make anyone more productive, but only if the environment supports that progress.</p>
<p>That’s the opportunity in front of us. Okteto gives these agents the environment they need to go from limited experiments to productive contributors. Without infrastructure that supports experimentation and scale, agents won’t deliver results.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="100x-productivity-for-the-agent-era">100x Productivity for the Agent Era<a href="https://www.okteto.com/blog/infrastructure-required-to-run-ai-agents-at-scale/#100x-productivity-for-the-agent-era" class="hash-link" aria-label="Direct link to 100x Productivity for the Agent Era" title="Direct link to 100x Productivity for the Agent Era" translate="no">​</a></h2>
<p>Oketo AI represents a fundamental leap forward in how agents are used in modern software delivery, and in how developers interact and manage them.</p>
<p>If AI agents are already delivering a 10x improvement over traditional development for repetitive and routine tasks, teams have the opportunity to multiply that impact by another 10x with parallel agents and Okteto can help get them their faster. With one-click access to instant agent environments, developers can confidently delegate tasks to agents and immediately verify the output without switching contexts or troubleshooting broken setups.</p>
<p>This is not just a tooling upgrade. It is a reimagining of the developer experience. Okteto brings together infrastructure automation, agent orchestration, and production realism into a seamless, developer-first workflow</p>
<p>And while developers will love managing fleets of agents, others prefer deep focus solving a problem with a single agent. The future of development should make room for both. It should amplify strengths, and remove friction.</p>
<p>At Okteto, we’re building with that in mind. The Okteto Platform gives you infrastructure to scale dev, test, preview and agent environments without adding overhead so developers can do what they do best - build great products.</p>
<p>This is what 100x productivity can look like.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-okteto-ai">Try Okteto AI<a href="https://www.okteto.com/blog/infrastructure-required-to-run-ai-agents-at-scale/#try-okteto-ai" class="hash-link" aria-label="Direct link to Try Okteto AI" title="Direct link to Try Okteto AI" translate="no">​</a></h2>
<p>We’re looking for teams experimenting with multi-agent orchestration who want a safe place to run workflows and are ready to push AI in real infrastructure.</p>
<p>Okteto AI is included in your Okteto subscription. Once enabled, it takes seconds to spin up your first agent fleet.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="final-thoughts-the-era-of-the-manager-nerds">Final Thoughts: The Era of the Manager Nerds<a href="https://www.okteto.com/blog/infrastructure-required-to-run-ai-agents-at-scale/#final-thoughts-the-era-of-the-manager-nerds" class="hash-link" aria-label="Direct link to Final Thoughts: The Era of the Manager Nerds" title="Direct link to Final Thoughts: The Era of the Manager Nerds" translate="no">​</a></h2>
<p>Agentic AI is not a trend. It’s a paradigm shift in how software gets built.</p>
<p>Some developers will become managers of fleets, designing workflows, tuning behavior, and scaling outcomes. Others will stay heads-down, solving big problems. Both need agent environments that run on their infrastructure and don’t get in the way.</p>
<p>At Okteto, we’re building for both. And we’re ready to help you start today.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Why Flexibility Is Key to Scaling Development Environments]]></title>
            <link>https://www.okteto.com/blog/why-flexibility-is-key-to-scaling-development-environments/</link>
            <guid>https://www.okteto.com/blog/why-flexibility-is-key-to-scaling-development-environments/</guid>
            <pubDate>Tue, 22 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how flexible, ephemeral development environments enable faster testing, lower infra usage, and scalable cloud-native workflows]]></description>
            <content:encoded><![CDATA[<p>Let’s be honest: development environments haven’t kept up with how modern teams are building software.</p>
<!-- -->
<p>You’re either stuck spinning up a full application stack locally every time you want to test something, or dealing with shared environments that break the moment someone else merges their half-working code. Neither approach scales well. Neither option is built for how fast you want your team to move.</p>
<p>Meanwhile, AI is speeding up the development loop. Teams are growing. Infra budgets are shrinking. Expectations are higher than ever. But somehow… your dev environment is still the bottleneck?</p>
<p>It’s time for a better way.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="yesterdays-approach-where-most-teams-have-started">Yesterday’s Approach: Where Most Teams Have Started<a href="https://www.okteto.com/blog/why-flexibility-is-key-to-scaling-development-environments/#yesterdays-approach-where-most-teams-have-started" class="hash-link" aria-label="Direct link to Yesterday’s Approach: Where Most Teams Have Started" title="Direct link to Yesterday’s Approach: Where Most Teams Have Started" translate="no">​</a></h2>
<p>Traditional development environments usually follow one of these two models:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="local-development">Local Development<a href="https://www.okteto.com/blog/why-flexibility-is-key-to-scaling-development-environments/#local-development" class="hash-link" aria-label="Direct link to Local Development" title="Direct link to Local Development" translate="no">​</a></h3>
<p>Spinning up services on your laptop used to work, until your app needed 20 microservices, a message queue, two databases, and a bunch of cloud-specific configs. Now you’re juggling Docker Compose files and spending hours replicating production just to fix a bug.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="shared-environments">Shared Environments<a href="https://www.okteto.com/blog/why-flexibility-is-key-to-scaling-development-environments/#shared-environments" class="hash-link" aria-label="Direct link to Shared Environments" title="Direct link to Shared Environments" translate="no">​</a></h3>
<p>Everyone works in the same long-lived environment. These are easy to spin up, but delicate in use. One wrong push, and the whole team is debugging someone else’s mess. Testing is hit-or-miss. You never know what state you're in, and to top it off, they are likely <a href="https://www.okteto.com/blog/shared-environments-cost-millions/" target="_blank" rel="noopener noreferrer" class="">costing your team more in productivity and dollars</a> than you realize.</p>
<p>These environments can get teams started, but they don't scale well.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="todays-standard-full-ephemeral-environments">Today’s Standard: Full Ephemeral Environments<a href="https://www.okteto.com/blog/why-flexibility-is-key-to-scaling-development-environments/#todays-standard-full-ephemeral-environments" class="hash-link" aria-label="Direct link to Today’s Standard: Full Ephemeral Environments" title="Direct link to Today’s Standard: Full Ephemeral Environments" translate="no">​</a></h2>
<p>Most modern teams moving to Kubernetes or Cloud Native workflows adopt a <a href="https://www.okteto.com/kubernetes-development-environments/" target="_blank" rel="noopener noreferrer" class=""><strong>fully isolated dev environment per engineer</strong></a>. These environments are powerful. They’re realistic. And they let each developer move independently.</p>
<p>But as your team grows, keep an eye on how your environment strategy scales:</p>
<ul>
<li class="">Are boot times getting longer as your app complexity grows?</li>
<li class="">Are you seeing infra costs rise with every new engineer?</li>
<li class="">Are clusters starting to feel overloaded during peak dev cycles?</li>
</ul>
<p>These are common signals that it's time to evaluate and design how you're managing environments <em>at scale</em>.</p>
<p>Full environments are essential for modern teams. And Okteto makes it easy to create and manage these environments, making them a great default starting point for most teams.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-next-step-for-scale-ephemeral--divert">The Next Step For Scale: Ephemeral + Divert<a href="https://www.okteto.com/blog/why-flexibility-is-key-to-scaling-development-environments/#the-next-step-for-scale-ephemeral--divert" class="hash-link" aria-label="Direct link to The Next Step For Scale: Ephemeral + Divert" title="Direct link to The Next Step For Scale: Ephemeral + Divert" translate="no">​</a></h2>
<p>As teams grow and mature, they start looking for smarter ways to optimize their setup without sacrificing speed, flexibility or quality.</p>
<p>That’s where Divert comes in.</p>
<p><a href="https://www.okteto.com/docs/tutorials/divert/" target="_blank" rel="noopener noreferrer" class="">Divert is an Okteto feature</a> that lets you spin up just the services you're working on, while connecting them to shared, long-running services like databases, queues, or backend APIs.</p>
<p>With Divert:</p>
<ul>
<li class="">Teams operate with a standardized, shared environment model with all production-like configs and policies</li>
<li class="">As a dev, you only run the microservices you’re actively working on</li>
<li class="">Traffic to shared services is seamlessly routed between both environments</li>
<li class="">End-to-end testing still works with no mocks or patchwork</li>
<li class="">The experience is transparent to developers, just like working in a full environment</li>
</ul>
<p><img decoding="async" loading="lazy" alt="A diagram showing diverted traffic from staging to dev environment" src="https://www.okteto.com/blog/assets/images/77d3a0c8a4af-c984c30212d311353238b7f2603cfbc1.webp" width="1120" height="636" class="img_ev3q"></p>
<p>This approach unlocks a flexible model:</p>
<ul>
<li class="">You keep the realism and independence of full ephemeral environments</li>
<li class="">You reduce costs and boot times by sharing what doesn’t change as frequently</li>
<li class="">You enable faster collaboration without duplicating infrastructure</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-to-use-divert-vs-full-environments">When to Use Divert vs. Full Environments<a href="https://www.okteto.com/blog/why-flexibility-is-key-to-scaling-development-environments/#when-to-use-divert-vs-full-environments" class="hash-link" aria-label="Direct link to When to Use Divert vs. Full Environments" title="Direct link to When to Use Divert vs. Full Environments" translate="no">​</a></h2>
<p>Choosing between full environments and Divert isn’t just about features, it’s about understanding where your team sits on the environment maturity curve. The needs of your team today, require a different environment from two years ago and will be something else two years down the road. That’s why having a flexible strategy is critical for modern teams.</p>
<ul>
<li class="">Full environments are simpler to adopt and work great for small teams, smaller applications and specific use cases</li>
<li class="">Divert is more efficient at scale, but requires deeper knowledge of how services and data interact.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="final-thoughts">Final Thoughts<a href="https://www.okteto.com/blog/why-flexibility-is-key-to-scaling-development-environments/#final-thoughts" class="hash-link" aria-label="Direct link to Final Thoughts" title="Direct link to Final Thoughts" translate="no">​</a></h2>
<p>There’s no one-size-fits-all in dev environments.</p>
<p>You need full environments for some workflows, and shared resources for others. Okteto gives you both with the flexibility to evolve as your team and architecture scale.</p>
<p>Start with full environments. Layer in Divert for optimized resource sharing and infra usage. This is the recipe to scale with confidence.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Okteto helps platform teams and developers move fast without sacrificing control. Ready to give it a spin?</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/get-demo/" target="_self">Book a demo</a></div></section>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Shared Environments Could Be Costing Your Company Millions]]></title>
            <link>https://www.okteto.com/blog/shared-environments-cost-millions/</link>
            <guid>https://www.okteto.com/blog/shared-environments-cost-millions/</guid>
            <pubDate>Tue, 15 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Discover how single shared development environments drain your team's productivity and budget—and how ephemeral environments solve this costly bottleneck.]]></description>
            <content:encoded><![CDATA[<p>Testing code shouldn’t feel like booking a conference room. And yet, in many engineering teams, that’s exactly what it’s like.</p>
<!-- -->
<p>Modern software development has evolved quickly. We’ve embraced microservices, cloud-native infrastructure, and CI/CD pipelines. But there’s one area where many teams are still stuck in the past: development environments. In particular, giving developers realistic, production-like environments to test their changes end-to-end remains a huge bottleneck.</p>
<p>Let’s talk about why this happens and how giving developers <strong>self-service access to ephemeral environments</strong> is key to increasing the productivity of your engineering organization.</p>
<p><img decoding="async" loading="lazy" alt="Meme comparing unfavorable single shared environment with a more favorable ephemeral environment" src="https://www.okteto.com/blog/assets/images/9fc5831e7bbf-6d94a7e3382f0f797a392f32211da5dd.webp" width="540" height="462" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-hidden-cost-of-shared-environments">The Hidden Cost of Shared Environments<a href="https://www.okteto.com/blog/shared-environments-cost-millions/#the-hidden-cost-of-shared-environments" class="hash-link" aria-label="Direct link to The Hidden Cost of Shared Environments" title="Direct link to The Hidden Cost of Shared Environments" translate="no">​</a></h2>
<p>In many organizations, realistic testing environments are scarce. Developers rely on a handful of staging environments to validate their changes end-to-end. These environments are expensive to maintain and quickly become bottlenecks.</p>
<p>The result is a familiar but frustrating pattern:</p>
<ul>
<li class="">Developers queue up to use staging</li>
<li class="">Environments are hard to reset and often break due to leftover state</li>
<li class="">Feedback loops are slow, and confidence in test results is low</li>
<li class="">Teams lose hours (or days) debugging issues that stem from shared infra, not their code</li>
</ul>
<p>This doesn't just affect developer happiness, it directly impacts throughput and business outcomes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="quantifying-the-problem-exponential-cost-impact">Quantifying the Problem: Exponential Cost Impact<a href="https://www.okteto.com/blog/shared-environments-cost-millions/#quantifying-the-problem-exponential-cost-impact" class="hash-link" aria-label="Direct link to Quantifying the Problem: Exponential Cost Impact" title="Direct link to Quantifying the Problem: Exponential Cost Impact" translate="no">​</a></h2>
<p>To put some numbers behind this, let’s start simply. For baseline purposes, you have developers earning roughly $100,000 annually - that's about $50 per hour. With just 10 developers each losing about 8 productive hours a week, you're already looking at $4,000 per week in lost productivity. But here's the catch: as your team gets larger, the environment becomes more crowded. More developers mean more traffic, more waiting, more downtime, and far more troubleshooting. Think of it like a traffic jam, the bigger it gets, the slower everyone moves. That's why the costs don't just increase linearly; they grow exponentially.</p>
<p><img decoding="async" loading="lazy" alt="A graph depicting the exponential growth curve of larger teams increasing lost cost in productivity" src="https://www.okteto.com/blog/assets/images/3b9ad4a575c6-80fb6eb1c3734c4134fe30dd553e8f5d.webp" width="1800" height="1200" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-right-way-ephemeral-environments-on-demand">The Right Way: Ephemeral Environments on Demand<a href="https://www.okteto.com/blog/shared-environments-cost-millions/#the-right-way-ephemeral-environments-on-demand" class="hash-link" aria-label="Direct link to The Right Way: Ephemeral Environments on Demand" title="Direct link to The Right Way: Ephemeral Environments on Demand" translate="no">​</a></h2>
<p>Imagine a world where every developer can spin up their own development environment: on-demand, fully configured, and production-like. One command, and it’s live. One click and it’s gone.</p>
<p>These <strong>ephemeral environments</strong> are:</p>
<ul>
<li class="">Created automatically when needed</li>
<li class="">Destroyed when no longer in use</li>
<li class="">Consistent with production, eliminating environment drift and configuration mismatches.</li>
<li class="">Integrated with your existing Development and CI workflows</li>
</ul>
<p>They give developers a fresh, clean slate for every change. And the benefits are clear:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-faster-development-cycles">🔁 Faster Development Cycles<a href="https://www.okteto.com/blog/shared-environments-cost-millions/#-faster-development-cycles" class="hash-link" aria-label="Direct link to 🔁 Faster Development Cycles" title="Direct link to 🔁 Faster Development Cycles" translate="no">​</a></h3>
<p>No more waiting in line for a staging slot. Developers test immediately after they code. That translates into faster feedback loops, fewer context switches, and more momentum.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-higher-quality-code">✅ Higher Quality Code<a href="https://www.okteto.com/blog/shared-environments-cost-millions/#-higher-quality-code" class="hash-link" aria-label="Direct link to ✅ Higher Quality Code" title="Direct link to ✅ Higher Quality Code" translate="no">​</a></h3>
<p>Testing in a clean, isolated environment increases confidence in test results and reduces the risk of environment-specific bugs slipping into production.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-reduced-rework">🚫 Reduced Rework<a href="https://www.okteto.com/blog/shared-environments-cost-millions/#-reduced-rework" class="hash-link" aria-label="Direct link to 🚫 Reduced Rework" title="Direct link to 🚫 Reduced Rework" translate="no">​</a></h3>
<p>When bugs are caught earlier and in the right context, teams spend less time fixing regressions, patching hotfixes, or unraveling integration issues late in the pipeline.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-lower-infrastructure-costs">💸 Lower Infrastructure Costs<a href="https://www.okteto.com/blog/shared-environments-cost-millions/#-lower-infrastructure-costs" class="hash-link" aria-label="Direct link to 💸 Lower Infrastructure Costs" title="Direct link to 💸 Lower Infrastructure Costs" translate="no">​</a></h3>
<p>Instead of keeping large, expensive staging environments up 24/7, ephemeral environments spin up only when needed—and spin down automatically. You only pay for what you use.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-accelerated-time-to-market">📈 Accelerated Time-to-Market<a href="https://www.okteto.com/blog/shared-environments-cost-millions/#-accelerated-time-to-market" class="hash-link" aria-label="Direct link to 📈 Accelerated Time-to-Market" title="Direct link to 📈 Accelerated Time-to-Market" translate="no">​</a></h3>
<p>By eliminating bottlenecks and accelerating time-to-feedback, your team can ship value to customers faster with higher quality and less overhead.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-platform-engineering-advantage">The Platform Engineering Advantage<a href="https://www.okteto.com/blog/shared-environments-cost-millions/#the-platform-engineering-advantage" class="hash-link" aria-label="Direct link to The Platform Engineering Advantage" title="Direct link to The Platform Engineering Advantage" translate="no">​</a></h2>
<p>Shifting to ephemeral environments benefits not only developers but also the broader platform engineering team:</p>
<ul>
<li class="">Reduces the operational burden of maintaining fragile shared infra</li>
<li class="">Shifts environment ownership closer to developers (without giving up control)</li>
<li class="">Scales seamlessly with team growth</li>
<li class="">Demonstrates measurable impact on velocity and cost optimization</li>
</ul>
<p>It’s a clear win for developer productivity <em>and</em> platform efficiency.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/shared-environments-cost-millions/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The best teams remove friction from the development process. Shared staging environments were a necessary evil in the past, but they don’t scale with the complexity of today’s systems.</p>
<p>By giving developers access to <strong>self-service ephemeral environments</strong>, organizations can significantly reduce costs, improve productivity, and accelerate their delivery cycles.</p>
<p>Investing in ephemeral environments is not merely about developer experience. It's a strategic move toward increased profitability and innovation velocity.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Ultimate Platform Stack: GitLab CI/CD + Okteto Development Environments]]></title>
            <link>https://www.okteto.com/blog/gitlab-and-okteto-development-environments/</link>
            <guid>https://www.okteto.com/blog/gitlab-and-okteto-development-environments/</guid>
            <pubDate>Fri, 11 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Discover how platform teams use Okteto + GitLab to accelerate inner dev loops and streamline developer experience]]></description>
            <content:encoded><![CDATA[<p>In every software organization, platform teams sit at the intersection of innovation and scale. Your mission is to enable engineers to move faster without compromising security, reliability, or cost. But for many teams, development environments are still the weakest link in the software delivery chain.</p>
<!-- -->
<p>Code lives in GitLab. Pipelines run in GitLab. But developers? They’re often stuck debugging broken local setups or juggling inconsistent environments.</p>
<p>This is where Okteto + GitLab changes the game.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="gitlab-the-engine-of-modern-devops">GitLab: The Engine of Modern DevOps<a href="https://www.okteto.com/blog/gitlab-and-okteto-development-environments/#gitlab-the-engine-of-modern-devops" class="hash-link" aria-label="Direct link to GitLab: The Engine of Modern DevOps" title="Direct link to GitLab: The Engine of Modern DevOps" translate="no">​</a></h2>
<p>As a single platform for Source Code Management, CI/CD, and DevSecOps, GitLab helps platform teams consolidate tooling and enforce best practices across the org. It’s the backbone of efficient software delivery.</p>
<p>But even the best DevOps pipeline can’t fix a broken developer experience. If engineers are stuck troubleshooting local dependencies or waiting for staging deploys, velocity stalls.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="okteto-production-like-dev-environments-in-the-cloud">Okteto: Production-Like Dev Environments in the Cloud<a href="https://www.okteto.com/blog/gitlab-and-okteto-development-environments/#okteto-production-like-dev-environments-in-the-cloud" class="hash-link" aria-label="Direct link to Okteto: Production-Like Dev Environments in the Cloud" title="Direct link to Okteto: Production-Like Dev Environments in the Cloud" translate="no">​</a></h2>
<p>Okteto gives developers instant, isolated, cloud-based development environments that mirror production —no manual setup, no drift. Environments spin up automatically from GitLab branches and sync changes in real time, so devs stay in flow, shipping faster and with higher quality than ever before.</p>
<p>For platform leaders, Okteto brings four key advantages:</p>
<ul>
<li class=""><strong>Fast inner dev loop:</strong> Okteto keeps developers in flow by giving them immediate feedback on code changes—without waiting on CI or staging deploys. Developers test in real environments, iterate rapidly, and ship faster.</li>
<li class=""><strong>Standardization at scale:</strong> Okteto environments are declarative and version-controlled. You define your golden paths once and apply it org-wide.</li>
<li class=""><strong>Reduced cognitive overhead:</strong> Developers no longer waste cycles on setup or troubleshooting local issues. They get an environment that just works, every time.</li>
<li class=""><strong>Shift-left everything:</strong> Realistic environments mean more accurate testing, earlier feedback, and fewer surprises downstream. Less firefighting, more innovation.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-gitlab--okteto-works">Why GitLab + Okteto Works<a href="https://www.okteto.com/blog/gitlab-and-okteto-development-environments/#why-gitlab--okteto-works" class="hash-link" aria-label="Direct link to Why GitLab + Okteto Works" title="Direct link to Why GitLab + Okteto Works" translate="no">​</a></h2>
<p>Together, GitLab and Okteto offer a streamlined, consistent experience from commit to deploy:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-self-service-developer-platforms">📦 Self-Service Developer Platforms<a href="https://www.okteto.com/blog/gitlab-and-okteto-development-environments/#-self-service-developer-platforms" class="hash-link" aria-label="Direct link to 📦 Self-Service Developer Platforms" title="Direct link to 📦 Self-Service Developer Platforms" translate="no">​</a></h3>
<p>Let developers create and destroy <a href="https://www.okteto.com/kubernetes-development-environments/" target="_blank" rel="noopener noreferrer" class="">environments on demand</a>, but with guardrails. Okteto abstracts the complexity while GitLab remains the control plane.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="fast-inner-development-loops">🧪Fast Inner Development Loops<a href="https://www.okteto.com/blog/gitlab-and-okteto-development-environments/#fast-inner-development-loops" class="hash-link" aria-label="Direct link to 🧪Fast Inner Development Loops" title="Direct link to 🧪Fast Inner Development Loops" translate="no">​</a></h3>
<p>Developers write code, test it instantly in the cloud, and see live results without leaving their editor or waiting for CI to run. Ship value at the speed of the cloud.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-preview-environments-for-every-gitlab-mr">🔁 Preview Environments for Every GitLab MR<a href="https://www.okteto.com/blog/gitlab-and-okteto-development-environments/#-preview-environments-for-every-gitlab-mr" class="hash-link" aria-label="Direct link to 🔁 Preview Environments for Every GitLab MR" title="Direct link to 🔁 Preview Environments for Every GitLab MR" translate="no">​</a></h3>
<p>Integrate Okteto with Gitlab's Review Apps to get production-like live previews for every merge request without manual steps. Code reviews will become more thorough, collaboration will be more fluid, and confidence will be higher.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-streamlined-cicd-workflows">⚡ Streamlined CI/CD Workflows<a href="https://www.okteto.com/blog/gitlab-and-okteto-development-environments/#-streamlined-cicd-workflows" class="hash-link" aria-label="Direct link to ⚡ Streamlined CI/CD Workflows" title="Direct link to ⚡ Streamlined CI/CD Workflows" translate="no">​</a></h3>
<p>Pre-configured environments aligned with GitLab pipelines reduce flakiness and accelerate test cycles. You can even <a href="https://www.okteto.com/streamlined-kubernetes-testing/" target="_blank" rel="noopener noreferrer" class="">run the same tests from Gitlab CI and from Okteto</a> using the same configuration, reducing CI cycles.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-lower-tco-of-internal-tooling">📉 Lower TCO of Internal Tooling<a href="https://www.okteto.com/blog/gitlab-and-okteto-development-environments/#-lower-tco-of-internal-tooling" class="hash-link" aria-label="Direct link to 📉 Lower TCO of Internal Tooling" title="Direct link to 📉 Lower TCO of Internal Tooling" translate="no">​</a></h3>
<p>Your platform team can focus on higher-leverage work by removing the need to maintain bespoke scripts or homegrown environment managers.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="developer-productivity-starts-with-the-environment">Developer Productivity Starts with the Environment<a href="https://www.okteto.com/blog/gitlab-and-okteto-development-environments/#developer-productivity-starts-with-the-environment" class="hash-link" aria-label="Direct link to Developer Productivity Starts with the Environment" title="Direct link to Developer Productivity Starts with the Environment" translate="no">​</a></h2>
<p>If your developers are blocked by slow setup, broken local stacks, or inconsistent environments, your throughput suffers. GitLab gets your code to production and Okteto gets your team there faster.</p>
<p>The best platform teams don’t just optimize pipelines; they remove friction end-to-end.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it-yourself">Try It Yourself<a href="https://www.okteto.com/blog/gitlab-and-okteto-development-environments/#try-it-yourself" class="hash-link" aria-label="Direct link to Try It Yourself" title="Direct link to Try It Yourself" translate="no">​</a></h3>
<p>Modern platform teams are adopting GitLab and Okteto together to:</p>
<ul>
<li class="">Reduce cycle time across the SDLC</li>
<li class="">Empower developers with cloud-native workflows</li>
<li class="">Accelerate onboarding for new engineering hires</li>
<li class="">Enforce standards without slowing anyone down</li>
</ul>
<p>Ready to see what’s possible when your environments are as automated as your pipelines? <a href="https://www.okteto.com/get-demo/" target="_blank" rel="noopener noreferrer" class="">Book a demo with our team</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Okteto Development Environments Named High Performer By G2]]></title>
            <link>https://www.okteto.com/blog/g2-spring-2025-awards/</link>
            <guid>https://www.okteto.com/blog/g2-spring-2025-awards/</guid>
            <pubDate>Tue, 25 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Okteto earns 7 G2 badges for DevOps and Container Orchestration categories. Discover why users love our automated, production-like Kubernetes dev environments.]]></description>
            <content:encoded><![CDATA[<p>We’re thrilled to share that Okteto has earned 7 badges in G2’s Spring 2025 Reports, highlighting our leadership across DevOps and Container Orchestration categories. These awards recognize how Okteto helps engineering teams build faster and find real business value with automated, production-like development environments on Kubernetes.</p>
<!-- -->
<p>From developer experience to estimated ROI, these badges reflect what real users are saying—platform engineers, developers, and QA teams who trust Okteto to simplify development at scale.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-g2-spring-2025-badges-earned-by-okteto">🏅 G2 Spring 2025 Badges Earned by Okteto<a href="https://www.okteto.com/blog/g2-spring-2025-awards/#-g2-spring-2025-badges-earned-by-okteto" class="hash-link" aria-label="Direct link to 🏅 G2 Spring 2025 Badges Earned by Okteto" title="Direct link to 🏅 G2 Spring 2025 Badges Earned by Okteto" translate="no">​</a></h2>
<p>Here’s where Okteto stood out:</p>
<ul>
<li class="">Users Most Likely To Recommend</li>
<li class="">Best Estimated ROI</li>
<li class="">Best Support (in 2 categories)</li>
<li class="">Easiest To Do Business With</li>
<li class="">High Performer (in 2 categories)</li>
</ul>
<p>These awards are based on verified reviews evaluating everything from product ease of use to business value and customer support. We’re proud to be recognized but also for the feedback from users finding so much value and delivering results across the full developer lifecycle.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-our-customers-are-saying-about-developer-experience-with-okteto">What Our Customers Are Saying About Developer Experience With Okteto<a href="https://www.okteto.com/blog/g2-spring-2025-awards/#what-our-customers-are-saying-about-developer-experience-with-okteto" class="hash-link" aria-label="Direct link to What Our Customers Are Saying About Developer Experience With Okteto" title="Direct link to What Our Customers Are Saying About Developer Experience With Okteto" translate="no">​</a></h2>
<blockquote>
<p>“We use Okteto daily and it drastically shortened our cycles—everyone from QA to business stakeholders are now in the loop and can provide feedback before it hits our staging environment.”<br>
— Leonid M., CTO</p>
</blockquote>
<blockquote>
<p>“The whole process is automated—we hit merge and never have to worry about it. It just works.”<br>
— John C., Cofounder &amp; CTO</p>
</blockquote>
<blockquote>
<p>“It provides a modern, smooth, easy-to-use interface... Beyond the tool is the fantastic, personalized support and engagement from the Okteto team.”<br>
— Heath H., Lead Automation Engineer</p>
</blockquote>
<blockquote>
<p>“Today, engineers can spin up specific environments tailored to the areas of the product they need to work on, significantly improving development efficiency and reducing resource overhead. Our partnership with Okteto has been key in this transformation.”<br>
— Ants K., VP of Product Engineering</p>
</blockquote>
<p>Whether it’s setting up preview environments, eliminating local development setup pains, or enabling real-time feedback loops, our customers say it best: Okteto saves time, reduces overhead and cognitive load, and helps teams build with confidence.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Learn how Replicated streamlined inner loop development and unlocked 200% increase in developer productivity.</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/customers/replicated/" target="_self">Case Study</a></div></section>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-g2-recognition-matters-for-ephemeral-development-environments">Why G2 Recognition Matters For Ephemeral Development Environments<a href="https://www.okteto.com/blog/g2-spring-2025-awards/#why-g2-recognition-matters-for-ephemeral-development-environments" class="hash-link" aria-label="Direct link to Why G2 Recognition Matters For Ephemeral Development Environments" title="Direct link to Why G2 Recognition Matters For Ephemeral Development Environments" translate="no">​</a></h2>
<p>We’re not just building a tool—we’re redefining how teams build software on Kubernetes. With Okteto, developers and platform teams can:</p>
<ul>
<li class="">Instantly spin up ephemeral, production-like dev environments on Kubernetes</li>
<li class="">Eliminate manual setup and infrastructure bottlenecks</li>
<li class="">Improve collaboration across QA, product, and security teams before code hits staging</li>
<li class="">Boost developer productivity and accelerate iteration cycles</li>
</ul>
<p>These G2 badges validate what we’re hearing every day: Okteto delivers a modern, automated approach to the development experience that drives results.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="thank-you-to-our-customers-">Thank You to Our Customers 💙<a href="https://www.okteto.com/blog/g2-spring-2025-awards/#thank-you-to-our-customers-" class="hash-link" aria-label="Direct link to Thank You to Our Customers 💙" title="Direct link to Thank You to Our Customers 💙" translate="no">​</a></h2>
<p>To every customer who shared their feedback—we’re grateful. Your support powers our growth and pushes us to keep improving new areas of developer experience.</p>
<p>Want to see how Okteto can help your team ship software faster?<br>
Explore our <a href="https://www.okteto.com/kubernetes-development-environments/" target="_blank" rel="noopener noreferrer" class="">automated development environments</a> or <a href="https://www.okteto.com/get-demo/" target="_blank" rel="noopener noreferrer" class="">book a demo</a> for a deeper dive.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What Are Ephemeral Environments and Why Do Platform Teams Need Them?]]></title>
            <link>https://www.okteto.com/blog/what-are-ephemeral-environments/</link>
            <guid>https://www.okteto.com/blog/what-are-ephemeral-environments/</guid>
            <pubDate>Mon, 10 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how ephemeral environments streamline development, reduce bottlenecks, and improve DevOps efficiency with key benefits and real-world examples.]]></description>
            <content:encoded><![CDATA[<p>In today’s fast-paced development landscape, time is one of the most valuable resources for engineering teams. Technical leaders face constant pressure to deliver features faster, reduce bugs, and improve the developer experience, all while working with limited resources.</p>
<!-- -->
<p>Enter <strong>ephemeral environments</strong> – temporary, on-demand development spaces that enables teams to work smarter, not harder, by leveraging the flexibility of Kubernetes and cloud-native technologies.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-traditional-development-environments-fall-short">Why Traditional Development Environments Fall Short<a href="https://www.okteto.com/blog/what-are-ephemeral-environments/#why-traditional-development-environments-fall-short" class="hash-link" aria-label="Direct link to Why Traditional Development Environments Fall Short" title="Direct link to Why Traditional Development Environments Fall Short" translate="no">​</a></h2>
<p>For years, development environments have revolved around the developer’s laptop. While this approach has worked, increasing complexity has introduced limitations that slow down the entire software development lifecycle, resulting in:</p>
<ol>
<li class=""><strong>Slow Onboarding</strong>: Onboarding a new developer can take weeks. They need to set up dependencies, configure their environment, and ensure compatibility – all before they can even begin writing code.</li>
<li class=""><strong>Testing Bottlenecks</strong>: Engineers often wait hours or even days for access to a staging or test environment, slowing down feedback loops.</li>
<li class=""><strong>Bugs in Production</strong>: Local environments can’t perfectly replicate production, leading to bugs that go unnoticed until they’re live.</li>
<li class=""><strong>Developer Burnout</strong>: An inefficient setup creates frustration, increases cognitive load, and stifles innovation, ultimately impacting team morale and retention.</li>
</ol>
<p>These issues aren’t just a burden on large enterprises; they impact companies of all sizes. And the longer it takes to move from code to production, the higher the cost of rework, wasted resources, and missed opportunities.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-ephemeral-environments-and-how-do-they-work">What Are Ephemeral Environments and How Do They Work?<a href="https://www.okteto.com/blog/what-are-ephemeral-environments/#what-are-ephemeral-environments-and-how-do-they-work" class="hash-link" aria-label="Direct link to What Are Ephemeral Environments and How Do They Work?" title="Direct link to What Are Ephemeral Environments and How Do They Work?" translate="no">​</a></h2>
<p>Ephemeral environments are <strong>isolated, temporary deployments of an application in the cloud</strong>. Unlike traditional environments, they’re created on-demand and exist only for the duration of their intended use, such as testing a feature branch or running quality assurance checks. Think of them as disposable sandboxes—ready when you need them, gone when you don’t.</p>
<p>Ephemeral environments work by leveraging cloud infrastructure to create temporary, realistic development spaces that are provisioned automatically. Developers can create production-like instances of the application with a single command. This drastically reduces wait times, allowing every engineer to work independently in their own isolated environment.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Check out how Okteto connects your local machine to a Kubernetes cluster so you see the results of the code you write in a production-like environment as soon as you hit save!</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/kubernetes-development-environments/" target="_self">Okteto Development Environments</a></div></section>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-benefits-of-ephemeral-environments-for-development-teams">Key Benefits of Ephemeral Environments for Development Teams<a href="https://www.okteto.com/blog/what-are-ephemeral-environments/#key-benefits-of-ephemeral-environments-for-development-teams" class="hash-link" aria-label="Direct link to Key Benefits of Ephemeral Environments for Development Teams" title="Direct link to Key Benefits of Ephemeral Environments for Development Teams" translate="no">​</a></h2>
<p>By adopting ephemeral environments, teams can:</p>
<ul>
<li class=""><strong>Eliminate Bottlenecks</strong>: Developers no longer need to queue for shared environments. Instead, they have instant access to their own, personalized setup.</li>
<li class=""><strong>Streamline Onboarding</strong>: New developers can hit the ground running in hours rather than weeks because environments are pre-configured and match production scenarios. No need for developer configurations.</li>
<li class=""><strong>Enhance Collaboration and Feedback</strong>: Cloud-based environments allow the whole team to collaborate in real-time and catch issues earlier in the development process.</li>
<li class=""><strong>Ensure Consistency Across Stages</strong>: Ephemeral environments can mirror the production environment across all stages – code, preview, test, staging – providing reliable testing grounds and minimizing discrepancies.</li>
<li class=""><strong>Reduce Cognitive Load</strong>: Developers no longer need deep knowledge of Kubernetes or infrastructure setup, allowing them to focus on what they do best: writing code.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-platform-teams-benefit-from-ephemeral-environments">How Platform Teams Benefit from Ephemeral Environments<a href="https://www.okteto.com/blog/what-are-ephemeral-environments/#how-platform-teams-benefit-from-ephemeral-environments" class="hash-link" aria-label="Direct link to How Platform Teams Benefit from Ephemeral Environments" title="Direct link to How Platform Teams Benefit from Ephemeral Environments" translate="no">​</a></h2>
<p>While ephemeral environments improve developer workflows, they also provide significant advantages to platform teams by reducing operational overhead and enabling more efficient infrastructure management.</p>
<ul>
<li class=""><strong>Automated Environment Provisioning</strong>: Platform teams can eliminate the manual effort of setting up and managing development and staging environments by automating ephemeral environments.</li>
<li class=""><strong>Scalability Without Infrastructure Bloat</strong>: Since ephemeral environments are created and destroyed on demand or through automation policies, they prevent unnecessary resource consumption and reduce cloud costs.</li>
<li class=""><strong>Improved Security &amp; Compliance</strong>: Temporary, isolated environments reduce the risk of configuration drift and security vulnerabilities, ensuring better compliance with industry standards.</li>
<li class=""><strong>Standardized Developer Environments</strong>: By offering predefined, production-like environments, platform teams ensure that all developers work with consistent configurations, reducing variability and troubleshooting efforts.</li>
<li class=""><strong>Faster Incident Response &amp; Debugging</strong>: Platform teams can instantly spin up ephemeral replicas of production environments to diagnose and resolve incidents without disrupting live systems.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-use-cases-for-ephemeral-environments">Common Use Cases for Ephemeral Environments<a href="https://www.okteto.com/blog/what-are-ephemeral-environments/#common-use-cases-for-ephemeral-environments" class="hash-link" aria-label="Direct link to Common Use Cases for Ephemeral Environments" title="Direct link to Common Use Cases for Ephemeral Environments" translate="no">​</a></h2>
<p>Ephemeral environments are transforming how modern development teams operate. Here are some key scenarios where they provide the most impact:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="feature-development--testing">Feature Development &amp; Testing<a href="https://www.okteto.com/blog/what-are-ephemeral-environments/#feature-development--testing" class="hash-link" aria-label="Direct link to Feature Development &amp; Testing" title="Direct link to Feature Development &amp; Testing" translate="no">​</a></h3>
<p>Developers can quickly create isolated environments for each feature branch, allowing them to work in parallel without interfering with the main codebase. This also ensures that QA teams can thoroughly test new features in production-like conditions before they are merged, reducing unexpected issues in later stages.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="preview-environments-for-prs">Preview Environments for PRs<a href="https://www.okteto.com/blog/what-are-ephemeral-environments/#preview-environments-for-prs" class="hash-link" aria-label="Direct link to Preview Environments for PRs" title="Direct link to Preview Environments for PRs" translate="no">​</a></h3>
<p>Engineers and product managers can access a live version of a pull request, making it easier to review and validate changes before merging into production.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="onboarding-new-developers-faster">Onboarding New Developers Faster<a href="https://www.okteto.com/blog/what-are-ephemeral-environments/#onboarding-new-developers-faster" class="hash-link" aria-label="Direct link to Onboarding New Developers Faster" title="Direct link to Onboarding New Developers Faster" translate="no">​</a></h3>
<p>Instead of spending days setting up local environments, new team members can start coding immediately with pre-configured, cloud-based dev environments.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="load-testing--performance-validation">Load Testing &amp; Performance Validation<a href="https://www.okteto.com/blog/what-are-ephemeral-environments/#load-testing--performance-validation" class="hash-link" aria-label="Direct link to Load Testing &amp; Performance Validation" title="Direct link to Load Testing &amp; Performance Validation" translate="no">​</a></h3>
<p>Teams can spin up large-scale, disposable environments to test system performance under different conditions without affecting production resources. <a href="https://thenewstack.io/ephemeral-environments-are-better-for-scaling-devops-tests/" target="_blank" rel="noopener noreferrer" class="">The New Stack</a> adds that this method allows teams to scale testing more efficiently without being constrained by shared resources, ensuring faster iteration cycles and improved software quality</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="customer-replication--debugging">Customer Replication &amp; Debugging<a href="https://www.okteto.com/blog/what-are-ephemeral-environments/#customer-replication--debugging" class="hash-link" aria-label="Direct link to Customer Replication &amp; Debugging" title="Direct link to Customer Replication &amp; Debugging" translate="no">​</a></h3>
<p>Support and engineering teams can replicate customer-reported issues in an ephemeral environment that mirrors the customer’s setup, leading to faster debugging and resolution.</p>
<p>In a recent episode of the <a href="https://www.buzzsprout.com/2454212/episodes/16826998" target="_blank" rel="noopener noreferrer" class="">Cloud Native Testing Podcast</a>, Okteto CEO Ramiro Berrelleza shared how companies use ephemeral environments not only for streamlined testing but also for better customer support and collaboration. Ephemeral environments are evolving beyond testing, becoming a foundational component of modern DevOps workflows.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-world-success-stories">Real-World Success Stories<a href="https://www.okteto.com/blog/what-are-ephemeral-environments/#real-world-success-stories" class="hash-link" aria-label="Direct link to Real-World Success Stories" title="Direct link to Real-World Success Stories" translate="no">​</a></h2>
<p>Companies like Yotpo and LaunchDarkly have already seen substantial improvements after adopting ephemeral environments:</p>
<ul>
<li class=""><strong>Yotpo</strong>: By transitioning to ephemeral environments, Yotpo’s developers reduced cognitive load and increased focus on product development rather than environment management.</li>
<li class=""><strong>LaunchDarkly</strong>: Engineers went from weeks to nearly instant onboarding, fewer setup headaches, and increased productivity, all thanks to the <a href="https://www.okteto.com/customers/launchdarkly/" target="_blank" rel="noopener noreferrer" class="">flexibility of ephemeral setups</a>.</li>
</ul>
<p>For technical leaders, the message is clear: <strong>ephemeral environments can yield a significant return on investment (ROI)</strong>. <a href="https://thenewstack.io/how-a-devex-initiative-aims-to-save-500000-developer-hours/" target="_blank" rel="noopener noreferrer" class="">Block estimates they’ll save 500,000 developer hours</a> through their DevEx efforts this year, which identified “instant developer environments” as one of the top strategic initiatives for the company. Simply put, ephemeral Environments free up developer time, reduce errors, and enable a more agile and responsive development process for companies of any size.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Want to see how much ephemeral environments can save your engineering org in productivity hours and cost savings?</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/roi/" target="_self">ROI Calculator</a></div></section>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-future-is-ephemeral">The Future is Ephemeral<a href="https://www.okteto.com/blog/what-are-ephemeral-environments/#the-future-is-ephemeral" class="hash-link" aria-label="Direct link to The Future is Ephemeral" title="Direct link to The Future is Ephemeral" translate="no">​</a></h2>
<p>Embracing ephemeral environments represents both a technological and cultural shift. While the technical setup is crucial, the real change comes from aligning teams around a faster, leaner approach to development. By adopting this model, companies are positioning themselves to innovate faster and maintain a competitive edge, even with limited resources.</p>
<p>In a world where “doing more with less” is the new normal, ephemeral environments offer a path forward – a way to cut through the noise, reduce overhead, and empower your teams to do their best work. As cloud-native technologies continue to evolve, ephemeral environments may soon become the standard, providing developers the tools they need to innovate at the speed of modern business.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Platform Tooling Landscape | 21 Best Platform Engineering Tools in 2025]]></title>
            <link>https://www.okteto.com/blog/platform-tooling-landscape/</link>
            <guid>https://www.okteto.com/blog/platform-tooling-landscape/</guid>
            <pubDate>Tue, 07 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Explore the platform engineering tooling landscape for 2025 to streamline workflows, boost developer productivity, and optimize your tech stack.]]></description>
            <content:encoded><![CDATA[<p>If you’re a platform engineer or DevOps leader, you’ve likely felt overwhelmed by the sheer explosion of tools entering the market. The platform tooling landscape has grown exponentially in recent years, and figuring out the best stack for your team’s unique needs can feel like solving a puzzle with missing pieces.</p>
<!-- -->
<p>Today, having the right platform engineering tools in place isn’t just a “nice-to-have”—it’s a necessity. But navigating the platform tooling landscape is just the first step—making these tools work together in harmony is where the magic happens.</p>
<figure class="figure_HOu8 float-left_xnQ3"><img src="https://www.okteto.com/blog/assets/images/10cd67a463de-92dfb40a8f009be674962a4ccc099460.webp" alt="A diagram of platform tooling landscape provided by Platform Engineering" loading="lazy"></figure>
<p>A unified tooling strategy helps your team move faster, collaborate better, and stay ahead of challenges, whether you’re working on platform engineering solutions, DevOps tools, or other critical systems. Tools that empower your team to manage infrastructure effortlessly, accelerate development cycles, and innovate without friction are game-changers.</p>
<p>But here’s the catch: even the most promising emerging ecosystems often come with gaps.</p>
<p>Integration issues, scalability roadblocks, and clunky user experiences can slow your team down when you need them moving fast.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-platform-engineering-tooling-landscape-considerations">The Platform Engineering Tooling Landscape: Considerations<a href="https://www.okteto.com/blog/platform-tooling-landscape/#the-platform-engineering-tooling-landscape-considerations" class="hash-link" aria-label="Direct link to The Platform Engineering Tooling Landscape: Considerations" title="Direct link to The Platform Engineering Tooling Landscape: Considerations" translate="no">​</a></h2>
<p>It’s an exciting time for platform engineering featuring tools and solutions that promise automation, developer productivity, and operational stability. But here’s the reality—assembling a cohesive tech stack is harder than it looks.</p>
<p>Why? Because:</p>
<ul>
<li class=""><strong>Integration Gaps</strong>: Tools often operate in silos, creating friction when trying to integrate them into a unified workflow.</li>
<li class=""><strong>Scalability Issues</strong>: Some tools perform well in SMB environments but struggle at the enterprise level.</li>
<li class=""><strong>User Experience</strong>: Developers want intuitive and easy-to-use tools that fit into their daily workflows, yet many solutions prioritize functionality over usability.</li>
</ul>
<p>To build and drive adoption for a new platform, teams need tools that do more than function—they need solutions that unify workflows, promote collaboration, and scale with organizational growth.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Start by assessing where your team stands today. Use our DevX Starter Guide to identify first opportunities for improvement.</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/ebooks/guide-measuring-devx-roi/" target="_self">Download Development Experience Guide</a></div></section>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="21-best-platform-engineering-tools">21 Best Platform Engineering Tools<a href="https://www.okteto.com/blog/platform-tooling-landscape/#21-best-platform-engineering-tools" class="hash-link" aria-label="Direct link to 21 Best Platform Engineering Tools" title="Direct link to 21 Best Platform Engineering Tools" translate="no">​</a></h2>
<p>The right tools can make or break a platform engineering strategy. Whether you’re scaling a startup or managing the complexities of an enterprise, these tools stand out for their ability to help platform teams design and implement scalable developer experiences.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="infrastructure-management-tools">Infrastructure Management Tools<a href="https://www.okteto.com/blog/platform-tooling-landscape/#infrastructure-management-tools" class="hash-link" aria-label="Direct link to Infrastructure Management Tools" title="Direct link to Infrastructure Management Tools" translate="no">​</a></h3>
<p><a href="https://www.terraform.io/" target="_blank" rel="noopener noreferrer" class=""><strong>Terraform:</strong></a> As the cornerstone of Infrastructure as Code (IaC), Terraform has been defining how teams manage infrastructure for over a decade. By defining your infrastructure as code, Terraform ensures everything stays consistent across environments, reducing the risk of errors. Whether you’re managing a single app or scaling a multi-cloud environment, Terraform provides the governance and reliability teams need to stay efficient.</p>
<p><a href="https://www.pulumi.com/" target="_blank" rel="noopener noreferrer" class=""><strong>Pulumi:</strong></a> Unlike traditional IaC tools, Pulumi allows developers to use familiar programming languages like Python, TypeScript, or Go to manage infrastructure. This flexibility makes it a favorite among development teams looking for tighter integration between application code and infrastructure.</p>
<p><a href="https://www.crossplane.io/" target="_blank" rel="noopener noreferrer" class=""><strong>Crossplane.io:</strong></a> Crossplane.io enables teams to define and manage cloud-native resources using Kubernetes-native APIs. With Crossplane, platform teams can build custom resource definitions (CRDs) to standardize infrastructure provisioning while empowering developers with self-service capabilities.</p>
<p><a href="https://github.com/awslabs/kro" target="_blank" rel="noopener noreferrer" class=""><strong>kro (Kubernetes Resource Orchestrator) by AWS:</strong></a> New kid on the block, kro, is bringing a fresh approach to managing Kubernetes resources by turning complex configurations into reusable building blocks. kro’s controller takes care of the heavy lifting, figuring out the right order of operations and dynamically managing everything behind the scenes.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="development-environment-tools">Development Environment Tools<a href="https://www.okteto.com/blog/platform-tooling-landscape/#development-environment-tools" class="hash-link" aria-label="Direct link to Development Environment Tools" title="Direct link to Development Environment Tools" translate="no">​</a></h3>
<p><a href="https://www.okteto.com/kubernetes-development-environments/" target="_blank" rel="noopener noreferrer" class=""><strong>Okteto:</strong></a> Okteto delivers self-service Kubernetes development, test, and preview environments that mirror production. With a simple manifest, platform teams can offer single-click access to full environments with cloud resources, enabling new developers to be productive on day one.</p>
<figure class="quote_Y4Tu"><blockquote>With Okteto, we cut environment setup time by 90% and finally had time to focus on building features, not fixing environments.</blockquote></figure>
<p><a href="https://www.gitpod.io/" target="_blank" rel="noopener noreferrer" class=""><strong>Gitpod:</strong></a> A cloud-based IDE that automates development environments, Gitpod supports developers with prebuilt containers tailored to their projects. This is especially beneficial for developers and open-source contributors who want fast, disposable environments for quick tasks or contributions.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cicd-tools">CI/CD Tools<a href="https://www.okteto.com/blog/platform-tooling-landscape/#cicd-tools" class="hash-link" aria-label="Direct link to CI/CD Tools" title="Direct link to CI/CD Tools" translate="no">​</a></h3>
<p><a href="https://www.harness.io/" target="_blank" rel="noopener noreferrer" class=""><strong>Harness.io:</strong></a> Harness has gained in popularity with its focus on simplicity and intelligence. It combines powerful automation with AI/ML-driven insights to make building, testing, and deploying code faster and more reliable. With features like continuous delivery, feature flags, and cloud cost management, this is a great platform for teams looking to simplify DevOps workflows.</p>
<p><a href="https://www.jenkins.io/" target="_blank" rel="noopener noreferrer" class=""><strong>Jenkins:</strong></a> Jenkins has been around forever (in tech years), and there’s a reason for that: it’s powerful, flexible, and endlessly customizable. If you’re managing complex pipelines, Jenkins is a solid choice. The downside is that it does often require extensive customization.</p>
<p><a href="https://dagger.io/" target="_blank" rel="noopener noreferrer" class=""><strong>Dagger.io:</strong></a> Dagger reimagines CI/CD by offering a portable and declarative approach to building pipelines. With Dagger, teams can define their workflows as code using a single, repeatable configuration, making it easy to run pipelines consistently across environments—from local machines to CI/CD systems.</p>
<p><a href="https://github.com/features/actions" target="_blank" rel="noopener noreferrer" class=""><strong>GitHub Actions:</strong></a> Already living in GitHub? Actions allow teams to automate workflows directly within their repositories. It’s an excellent choice for smaller teams looking to accelerate releases.</p>
<p><a href="https://about.gitlab.com/" target="_blank" rel="noopener noreferrer" class=""><strong>GitLab:</strong></a> It wouldn’t be right to highlight CI/CD tools without mentioning this powerhouse. GitLab offers an all-in-one platform that integrates version control, CI/CD pipelines, and DevSecOps workflows. With its robust automation capabilities, GitLab empowers DevOps teams to manage the entire software development lifecycle in a single interface.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="monitoring-and-observability-tools">Monitoring and Observability Tools<a href="https://www.okteto.com/blog/platform-tooling-landscape/#monitoring-and-observability-tools" class="hash-link" aria-label="Direct link to Monitoring and Observability Tools" title="Direct link to Monitoring and Observability Tools" translate="no">​</a></h3>
<p><a href="https://prometheus.io/" target="_blank" rel="noopener noreferrer" class=""><strong>Prometheus:</strong></a> In today’s world of Cloud Native development, everything moves fast. So, keeping an eye on your systems is critical. Prometheus, with its powerful query language and integration with tools like Grafana, ensures you’re never in the dark about your infrastructure’s health.</p>
<p><a href="https://www.honeycomb.io/" target="_blank" rel="noopener noreferrer" class=""><strong>Honeycomb.io:</strong></a> Debugging distributed systems can feel like chasing a needle in a haystack. Honeycomb.io turns that haystack into a clear map of events, helping you visualize and troubleshoot issues in real time. Its event-driven approach allows teams to visualize and explore data in real time, pinpointing issues across complex architecture.</p>
<p><a href="https://www.datadoghq.com/" target="_blank" rel="noopener noreferrer" class=""><strong>Datadog:</strong></a> Why settle for just metrics or logs when you can have it all? Datadog combines monitoring, logging, and tracing into one platform, offering complete visibility into your applications and infrastructure.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-and-compliance-tools">Security and Compliance Tools<a href="https://www.okteto.com/blog/platform-tooling-landscape/#security-and-compliance-tools" class="hash-link" aria-label="Direct link to Security and Compliance Tools" title="Direct link to Security and Compliance Tools" translate="no">​</a></h3>
<p><a href="https://snyk.io/" target="_blank" rel="noopener noreferrer" class=""><strong>Snyk:</strong></a> Security shouldn’t slow you down. Snyk integrates directly into your workflows, helping you find and fix vulnerabilities in code dependencies, containers, and infrastructure configurations without disrupting your momentum.</p>
<p><a href="https://www.wiz.io/" target="_blank" rel="noopener noreferrer" class=""><strong>Wiz:</strong></a> Great, you’ve made it to the promised land of Cloud - now how do you ensure cloud environments are secure? Wiz provides an agentless approach to identifying vulnerabilities, misconfigurations, and risks across workloads, containers, and Kubernetes clusters. By prioritizing critical issues, Wiz helps teams stay ahead of security threats and maintain compliance with minimal disruption.</p>
<p><a href="https://www.vaultproject.io/" target="_blank" rel="noopener noreferrer" class=""><strong>HashiCorp Vault:</strong></a> Secrets management can be tricky but will become a necessity for many platform engineering teams. This tool securely manages API keys, credentials, and other sensitive information, giving you peace of mind that your data is locked down tight.</p>
<p><a href="https://www.armosec.io/" target="_blank" rel="noopener noreferrer" class=""><strong>ARMO:</strong></a> Keeping Kubernetes clusters secure doesn’t have to be a burden for DevOps teams. ARMO makes it easy by seamlessly integrating into your CI/CD workflows to detect vulnerabilities, enforce security policies, and maintain compliance—all without adding friction to your team’s processes.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cost-management-tools">Cost Management Tools<a href="https://www.okteto.com/blog/platform-tooling-landscape/#cost-management-tools" class="hash-link" aria-label="Direct link to Cost Management Tools" title="Direct link to Cost Management Tools" translate="no">​</a></h3>
<p><a href="https://www.kubecost.com/" target="_blank" rel="noopener noreferrer" class=""><strong>Kubecost:</strong></a> Managing Kubernetes costs can be a challenge, but Kubecost makes it simple by providing real-time insights into resource usage and spend across clusters. With Kubecost, teams can optimize workloads, identify inefficiencies, and take control of their cloud costs.</p>
<p><a href="https://www.okteto.com/docs/admin/okteto-insights/" target="_blank" rel="noopener noreferrer" class=""><strong>Okteto Resource Insights:</strong></a> Platform engineering teams use Okteto Insights to track environment usage trends, optimize infrastructure, and reduce unnecessary cloud costs by fine-tuning the resources allocated to your Kubernetes workloads. Ensuring resources are used efficiently can lead to uncovering opportunities to improve overall developer productivity and importantly find cost gains for organizations.</p>
<p><a href="https://stormforge.io/" target="_blank" rel="noopener noreferrer" class=""><strong>StormForge:</strong></a> StormForge simplifies the process of managing cloud resources with machine learning-powered optimization. By analyzing workload patterns, it identifies opportunities to reduce waste and improve performance, helping teams strike the perfect balance between cost and efficiency.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="closing-the-gaps-building-a-unified-tooling-strategy">Closing the Gaps: Building a Unified Tooling Strategy<a href="https://www.okteto.com/blog/platform-tooling-landscape/#closing-the-gaps-building-a-unified-tooling-strategy" class="hash-link" aria-label="Direct link to Closing the Gaps: Building a Unified Tooling Strategy" title="Direct link to Closing the Gaps: Building a Unified Tooling Strategy" translate="no">​</a></h2>
<p>The tools we’ve explored each represent a few key parts of the platform tooling landscape, but the real challenge lies in creating a cohesive ecosystem. A unified platform tooling strategy isn’t just about selecting the best individual tools—it’s about ensuring they work seamlessly together to support your team’s goals. Here are a few considerations for platform teams:</p>
<ol>
<li class=""><strong>Meet developers where they are:</strong> Choose solutions, including DevOps tooling, that fit naturally into your workflows so your team spends less time troubleshooting and more time building.</li>
<li class=""><strong>Automation Is Your Best Friend:</strong> Automate repetitive tasks wherever possible to free up your team’s time for high-impact work. The less manual intervention needed, the smoother your processes will run.</li>
<li class=""><strong>Think Long-Term:</strong> The platform tooling landscape will continue to grow and evolve, so choose solutions that can scale effortlessly with your team’s growth and future needs.</li>
<li class=""><strong>Focus on Developer Experience:</strong> The best tools are ones your team will actually use. Tools should make developers’ lives easier, so prioritize options that simplify workflows and free up time for innovation.</li>
</ol>
<p>A well planned approach doesn’t just smooth out the bumps in your process—it gives your team the confidence to tackle big challenges and deliver great results.</p>
<p>Ready to take the first step? We’ve put together a guide to start mapping your current platform landscape and DevOps tools, and pinpoint areas for improvement and investment.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Get your Development Experience Starter Guide and start measuring impact.</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/ebooks/guide-measuring-devx-roi/" target="_self">Download Guide</a></div></section>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Transforming Developer Productivity For Our Customers]]></title>
            <link>https://www.okteto.com/blog/transforming-developer-productivity-for-our-customers/</link>
            <guid>https://www.okteto.com/blog/transforming-developer-productivity-for-our-customers/</guid>
            <pubDate>Mon, 23 Dec 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Discover how Okteto helped customers improve developer productivity, increase security practices, optimize cloud resources and simplify Kubernetes workflows.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="okteto-highlights-2024">Okteto highlights 2024<a href="https://www.okteto.com/blog/transforming-developer-productivity-for-our-customers/#okteto-highlights-2024" class="hash-link" aria-label="Direct link to Okteto highlights 2024" title="Direct link to Okteto highlights 2024" translate="no">​</a></h2>
<p>At Okteto, our core focus this past year was on building features that directly solve critical challenges faced by platform engineering teams. We split our efforts into four main categories; enhance developer productivity, simplify cloud native development and Kubernetes workflows, improve security practices, and help organizations optimize their cloud resources. Below, we highlight some of the key innovations we’ve delivered and the actual impact they have for our customers.</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="smarter-resource-management-and-data">Smarter Resource Management and Data<a href="https://www.okteto.com/blog/transforming-developer-productivity-for-our-customers/#smarter-resource-management-and-data" class="hash-link" aria-label="Direct link to Smarter Resource Management and Data" title="Direct link to Smarter Resource Management and Data" translate="no">​</a></h3>
<p>We introduced <a href="https://www.okteto.com/docs/admin/okteto-insights/" target="_blank" rel="noopener noreferrer" class="">Okteto Insights</a> and the <a href="https://www.okteto.com/docs/admin/resource-manager/" target="_blank" rel="noopener noreferrer" class="">Resource Manager</a> to give platform teams visibility into their resource usage. These tools enable infrastructure optimization and help reduce unnecessary cloud costs by fine-tuning the resources allocated to your Kubernetes workloads.</p>
<p>Okteto Insights includes dashboards to visualize product usage and behavior data such as developer usage, as well as infrastructure utilization and performance data like infrastructure and platform activities. Okteto's Resource Manager is designed to optimize CPU and memory resource requests for your Kubernetes workloads on Okteto. By analyzing the actual utilization of resources in real-time, the Resource Manager adjusts the resource requests for your pods automatically, ensuring they are appropriately configured without the need for manual intervention.</p>
<p><img decoding="async" loading="lazy" alt="Okteto Insights Dashboard displaying metrics for CPU, memory and node counts" src="https://www.okteto.com/blog/assets/images/8c4135b0469f-b9daadf2000153bb0c395c22290c7082.webp" width="1904" height="1322" class="img_ev3q"></p>
<p>With better insights into usage and metrics, cloud-native teams can make informed decisions that lower infrastructure costs and optimize performance, ensuring that resources are allocated efficiently and effectively.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="accelerating-quality-with-okteto-test">Accelerating Quality with Okteto Test<a href="https://www.okteto.com/blog/transforming-developer-productivity-for-our-customers/#accelerating-quality-with-okteto-test" class="hash-link" aria-label="Direct link to Accelerating Quality with Okteto Test" title="Direct link to Accelerating Quality with Okteto Test" translate="no">​</a></h3>
<p><a href="https://www.okteto.com/docs/testing/" target="_blank" rel="noopener noreferrer" class="">Okteto Test</a> was designed to seamlessly integrate testing into your development workflow on the Okteto platform. Whether you're running unit tests or end-to-end (E2E) tests, Okteto Test ensures an efficient testing experience before and after making a pull request. This ensures that code is tested in real-world conditions, reducing the likelihood of bugs and improving the overall quality of applications before they go live.</p>
<p>Okteto Test helps teams ship high-quality code faster. This reduces time spent on debugging and minimizes the risk of production issues, which translates into a better developer experience and faster time to market.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="expanding-access-through-google-marketplace">Expanding Access Through Google Marketplace<a href="https://www.okteto.com/blog/transforming-developer-productivity-for-our-customers/#expanding-access-through-google-marketplace" class="hash-link" aria-label="Direct link to Expanding Access Through Google Marketplace" title="Direct link to Expanding Access Through Google Marketplace" translate="no">​</a></h3>
<p>By launching Okteto on the <a href="https://console.cloud.google.com/marketplace/product/okteto-public/okteto-bring-your-own-cloud?inv=1&amp;invt=AbkoGg" target="_blank" rel="noopener noreferrer" class="">Google Marketplace</a>, we’ve made it even easier for organizations to discover and adopt Okteto. This provides additional flexibility for large organizations by simplifying procurement processes. Teams can now purchase Okteto through the Google Cloud Marketplace, take advantage of flexible billing terms, and apply existing spend commitments or credits.</p>
<p>We are working on adding Okteto to AWS Marketplace in early 2025. If this is something you are interested in, <a href="https://www.okteto.com/contact/" target="_blank" rel="noopener noreferrer" class="">please reach out</a>!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enhanced-security-and-control">Enhanced Security and Control<a href="https://www.okteto.com/blog/transforming-developer-productivity-for-our-customers/#enhanced-security-and-control" class="hash-link" aria-label="Direct link to Enhanced Security and Control" title="Direct link to Enhanced Security and Control" translate="no">​</a></h3>
<p>Security is a priority for our customers. With <a href="https://www.okteto.com/docs/admin/dashboard/#admin-access-tokens" target="_blank" rel="noopener noreferrer" class="">Admin Access tokens</a>, we’ve enabled teams to manage access to their Okteto clusters more securely and efficiently. This feature allows granular control over who can interact with resources, making it easier for platform teams to enforce security best practices.</p>
<p><img decoding="async" loading="lazy" alt="View of Okteto admin dashboard displaying admin access tokens setting" src="https://www.okteto.com/blog/assets/images/f17952cbdc1c-d0c08e0fd9b742a8e2923e28634be4bb.webp" width="1904" height="992" class="img_ev3q"></p>
<p>We introduced updates to our <a href="https://www.okteto.com/docs/admin/registry-credentials/" target="_blank" rel="noopener noreferrer" class="">Registry Credentials</a>, <a href="https://www.okteto.com/docs/admin/cloud-credentials/" target="_blank" rel="noopener noreferrer" class="">Cloud Credentials</a>, and we will be making environments rootless by default in upcoming months. We also introduced <a href="https://www.okteto.com/docs/self-hosted/manage/air-gapped/" target="_blank" rel="noopener noreferrer" class="">air-gapped installation</a> for organizations that require a fully isolated network environment. This feature ensures that Okteto can be installed and operated without requiring direct internet access, providing an extra layer of security for customers with strict compliance or regulatory needs.</p>
<p>By improving credentials management and enhancing security protocols, Okteto gives security-conscious teams peace of mind that their environments are secure, helping them focus on development without worrying about breaches or unauthorized access.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="simplifying-cloud-native-development-amazon-eks-and-openshift-integration">Simplifying Cloud Native Development: Amazon EKS and OpenShift Integration<a href="https://www.okteto.com/blog/transforming-developer-productivity-for-our-customers/#simplifying-cloud-native-development-amazon-eks-and-openshift-integration" class="hash-link" aria-label="Direct link to Simplifying Cloud Native Development: Amazon EKS and OpenShift Integration" title="Direct link to Simplifying Cloud Native Development: Amazon EKS and OpenShift Integration" translate="no">​</a></h3>
<p>We built <a href="https://www.okteto.com/docs/get-started/install/amazon-eks/" target="_blank" rel="noopener noreferrer" class="">Amazon (EKS) installation guides</a>, made product improvements around installation, error messaging, support bundling and added <a href="https://www.okteto.com/docs/get-started/install/openshift/" target="_blank" rel="noopener noreferrer" class="">OpenShift support</a> to simplify the setup of cloud native development environments. Customers can now get up and running faster on platforms they already use, reducing setup time and operational overhead. This means teams can spend less time configuring environments and more time building the applications that drive business value.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pushing-forward-with-platform-engineering-teams-in-2025">Pushing forward with Platform Engineering teams in 2025<a href="https://www.okteto.com/blog/transforming-developer-productivity-for-our-customers/#pushing-forward-with-platform-engineering-teams-in-2025" class="hash-link" aria-label="Direct link to Pushing forward with Platform Engineering teams in 2025" title="Direct link to Pushing forward with Platform Engineering teams in 2025" translate="no">​</a></h3>
<p>As we look to the future, Okteto remains dedicated to helping platform engineering teams overcome their biggest challenges. From simplifying complexity of managing CI to enhancing teams ability to debug in real-time across distributed, cloud-native environments, we’re here to help platform and development teams remove friction in their workflows.</p>
<p><strong>Ready to tackle some of your platform challenges?</strong> <a href="https://www.okteto.com/get-demo/" target="_blank" rel="noopener noreferrer" class="">We’d love to chat</a>!</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">We’d love to chat about your team’s objectives for 2025 and see if Okteto can help.</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/get-demo/" target="_self">Let's chat</a></div></section>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Announcing Okteto CLI 3.0]]></title>
            <link>https://www.okteto.com/blog/cli-three-release/</link>
            <guid>https://www.okteto.com/blog/cli-three-release/</guid>
            <pubDate>Tue, 10 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[We are happy to announce the release of Okteto CLI 3.0! This release marks a significant milestone, bringing together the most impactful features we’ve developed recently. With this version, we’re focused on improving the developer experience (DevX) through thoughtful updates, including a few breaking changes and the removal of deprecated features to boost future efficiency. 😊]]></description>
            <content:encoded><![CDATA[<p>We are happy to announce the release of Okteto CLI 3.0! This release marks a significant milestone, bringing together the most impactful features we’ve developed recently. With this version, we’re focused on improving the developer experience (DevX) through thoughtful updates, including a few breaking changes and the removal of deprecated features to boost future efficiency. 😊</p>
<!-- -->
<p><strong>Okteto CLI 3.0 will be shipped in early October and integrated into the Okteto Chart 1.25 release</strong>. There are some potential breaking changes, so please keep reading below to make sure your workflows aren’t affected by this update.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="our-progress-over-the-last-12-months-leading-to-okteto-cli-30">Our progress over the last 12 months leading to Okteto CLI 3.0!<a href="https://www.okteto.com/blog/cli-three-release/#our-progress-over-the-last-12-months-leading-to-okteto-cli-30" class="hash-link" aria-label="Direct link to Our progress over the last 12 months leading to Okteto CLI 3.0!" title="Direct link to Our progress over the last 12 months leading to Okteto CLI 3.0!" translate="no">​</a></h3>
<p>The main features we have released during this period are:</p>
<ul>
<li class=""><a href="https://www.okteto.com/docs/core/remote-execution/" target="_blank" rel="noopener noreferrer" class="">Deploy on Remote</a>: Do you need custom tooling to run the deploy commands of your Okteto Manifest? You can now define a container image to serve as the runtime of your deploy commands, eliminating all the dependencies on your local machine configuration to deploy your Dev Environments.</li>
<li class=""><a href="https://www.okteto.com/docs/core/build-service/#smart-builds" target="_blank" rel="noopener noreferrer" class="">Smart Builds</a>: Are you tired of repeatedly building your container images? Smart builds detect repeated builds from other developers in your cluster and reuse them automatically, allowing you to deploy your Dev Environments in seconds.</li>
<li class=""><a href="https://www.okteto.com/docs/testing/" target="_blank" rel="noopener noreferrer" class="">Okteto Test</a>: Have you ever felt frustrated while troubleshooting a CI workflow? Say bye-bye to committing and waiting for minutes until CI fails. Okteto Test provides fast feedback and repeatability when running CI workflows on your local machine and on CI 😊</li>
<li class=""><a href="https://www.okteto.com/docs/development/containers/hybrid/" target="_blank" rel="noopener noreferrer" class="">Hybrid Development Mode</a>: There are situations when running a service locally is faster than synchronizing code with a remote Development Container. Hybrid development mode enables you to run the service in development locally while keeping the rest of your application components on Okteto to take advantage of your local machine hardware.</li>
<li class=""><a href="https://www.okteto.com/docs/reference/okteto-cli/#logs" target="_blank" rel="noopener noreferrer" class="">Okteto Logs</a>: Have you ever tried troubleshooting your application and felt frustrated running several <code>kubectl</code> commands to find an error condition? <code>okteto logs</code> gives you a single command to obtain all this information without imposing Kubernetes cognitive load.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-can-i-try-okteto-cli-30">How can I try Okteto CLI 3.0?<a href="https://www.okteto.com/blog/cli-three-release/#how-can-i-try-okteto-cli-30" class="hash-link" aria-label="Direct link to How can I try Okteto CLI 3.0?" title="Direct link to How can I try Okteto CLI 3.0?" translate="no">​</a></h3>
<p>Okteto CLI 3.0 has been shipped in early October and is integrated into the Okteto Chart 1.25 release. Before upgrading to Okteto Chart 1.25, make sure your workflows aren’t affected by Okteto CLI 3.0. To do that, we recommend installing Okteto CLI 3.0 by using the following command:</p>
<p><code>curl https://get.okteto.com -sSfL</code></p>
<p>💡 Go back to the previous Okteto CLI version with: <code>curl https://get.okteto.com -sSfL | OKTETO_VERSON=2.31.0 sh</code></p>
<p>Then, run <code>okteto deploy</code> and <code>okteto up</code> with your Okteto Manifests to ensure things keep working as expected.</p>
<p><strong>On Windows</strong></p>
<ol>
<li class=""><strong>Download the Okteto CLI 3.0 Executable:</strong>
<ul>
<li class="">Visit the <a href="https://github.com/okteto/okteto/releases/tag/3.0.0" target="_blank" rel="noopener noreferrer" class="">Okteto GitHub Releases page</a>.</li>
<li class="">Download the Windows executable directly using this link: <a href="https://github.com/okteto/okteto/releases/download/3.0.0/okteto.exe" target="_blank" rel="noopener noreferrer" class="">Download okteto.exe</a>.</li>
</ul>
</li>
<li class=""><strong>Move the Executable to a Preferred Location and add to your system PATH</strong>
<ul>
<li class="">To verify you’ve installed the CLI 3.0, you can run <code>okteto version</code></li>
</ul>
</li>
</ol>
<p>To go back to the previous version, download the Windows executable for 2.31.0 and use it to replace the current executable.</p>
<p>Verify your rollback by running <code>okteto version</code></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="full-list-of-breaking-changes">Full list of breaking changes<a href="https://www.okteto.com/blog/cli-three-release/#full-list-of-breaking-changes" class="hash-link" aria-label="Direct link to Full list of breaking changes" title="Direct link to Full list of breaking changes" translate="no">​</a></h3>
<p>A major release is a great opportunity to remove deprecated functionality, help us increase the quality of our code base, and more suitable for future feature development. This is the full list of breaking changes in Okteto CLI 3.0:</p>
<ul>
<li class="">Commands no longer available: <code>okteto init</code>, <code>okteto push</code>, <code>okteto stack</code>, <code>okteto login</code> (replaced by <code>okteto context</code>) and <code>okteto update</code> (replaced by <code>okteto version update</code>).</li>
<li class="">Okteto Stacks syntax has been removed in favor of Docker Compose syntax. If you are using the Okteto Stack filenames <code>okteto-stack.yaml</code> or <code>stack.yaml</code>, check out our <a href="https://community.okteto.com/t/important-update-migrating-from-okteto-stacks-to-docker-compose/1262" target="_blank" rel="noopener noreferrer" class="">guide to migrate from Okteto Stacks to Docker Compose</a>.</li>
<li class="">Local container registry credentials have less precedence than <a href="https://www.okteto.com/docs/admin/registry-credentials/" target="_blank" rel="noopener noreferrer" class="">Okteto Registry Credentials.</a> You can keep more precedence for your local registry credentials by setting the variable <code>OKTETO_LOCAL_REGISTRY_STORE_PRIORITY_ENABLED</code> to <code>true</code> in your terminal or as an Okteto Variable.</li>
<li class="">Changes in flags for <code>okteto deploy</code>:<!-- -->
<ul>
<li class=""><code>--build</code> is removed. By default, images will always be built unless you specify <code>--no-build</code> to skip the build process</li>
<li class=""><code>--f</code> no longer supports pointing to a folder, only regular files are allowed.</li>
<li class="">Removed positional argument to deploy individual services from a Docker Compose file. This functionality is supported at the <a href="https://www.okteto.com/docs/reference/okteto-manifest/#deploy-with-compose" target="_blank" rel="noopener noreferrer" class="">Okteto Manifest level</a>.</li>
</ul>
</li>
<li class="">Changes in flags for <code>okteto up</code>:<!-- -->
<ul>
<li class=""><code>--deploy</code> will also rebuild the container images</li>
<li class=""><code>--command</code> is removed in favor of the syntax <code>-- &lt;&lt;your command&gt;&gt;</code>
<ul>
<li class="">For example <code>okteto up api -- bash</code></li>
</ul>
</li>
</ul>
</li>
<li class="">Support for <code>devrc</code> file is removed. <code>devrc</code> allowed developers to overwrite the Okteto Manifest with custom configuration.</li>
<li class="">The commands <code>okteto pipeline deploy</code>, <code>okteto pipeline destroy</code>, <code>okteto preview deploy</code> and <code>okteto preview destroy</code> now default to <code>--wait=true</code></li>
<li class="">Drop support for Okteto Manifest v1. <a href="https://www.okteto.com/docs/reference/manifest-migration/" target="_blank" rel="noopener noreferrer" class="">Follow our guide to migrate from v1 to v2</a>.</li>
<li class="">Flags <code>--namespace</code> and <code>--context</code> always take precedence over environment variables <code>OKTETO_NAMESPACE</code> and <code>OKTETO_CONTEXT</code>. <code>namespace</code> and <code>context</code> are no longer supported at the Okteto Manifest level.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="updates-to-github-actions">Updates to GitHub Actions<a href="https://www.okteto.com/blog/cli-three-release/#updates-to-github-actions" class="hash-link" aria-label="Direct link to Updates to GitHub Actions" title="Direct link to Updates to GitHub Actions" translate="no">​</a></h3>
<p>Each GitHub Action supports the following tags:</p>
<ul>
<li class=""><code>latest</code>: this is the version running the last stable Okteto CLI release</li>
<li class=""><code>v3</code>: this is the version running the last stable Okteto CLI 3.x release</li>
<li class=""><code>v2</code>: this is the version running the last stable Okteto CLI 2.x release</li>
<li class=""><code>main</code>: this is our development version. <strong>Don't use this tag for production usage!</strong></li>
</ul>
<p>Finally, you can ping a specific Okteto CLI version in your GitHub Actions, for example, <code>okteto/context@2.31.0</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="keep-in-touch">Keep in touch!<a href="https://www.okteto.com/blog/cli-three-release/#keep-in-touch" class="hash-link" aria-label="Direct link to Keep in touch!" title="Direct link to Keep in touch!" translate="no">​</a></h3>
<p>We understand that changes like these may require some adjustments to your workflows, and we’re here to support you every step of the way. If you have any questions or need assistance transitioning to Okteto CLI 3.0, please don’t hesitate to contact our support team.</p>
<p>Thank you for your understanding and continued support as we strive to enhance the Okteto experience for all users.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Enhance CI Pipelines with Dagger and Okteto Preview Environments for a Better Developer Experience]]></title>
            <link>https://www.okteto.com/blog/ci-pipelines-dagger-okteto/</link>
            <guid>https://www.okteto.com/blog/ci-pipelines-dagger-okteto/</guid>
            <pubDate>Wed, 10 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Enhance your CI/CD pipelines with Dagger and Okteto Preview Environments. Improve developer experience with live previews and automated testing.]]></description>
            <content:encoded><![CDATA[<p>Continuous Integration (CI) is a cornerstone of modern software development, ensuring that code changes are automatically tested and merged, reducing the risk of introducing bugs into the main codebase. <a href="https://dagger.io/" target="_blank" rel="noopener noreferrer" class="">Dagger</a>, a programmable CI/CD engine, simplifies managing complex CI pipelines by running them in containers. However, an often overlooked but crucial aspect of CI is the ability to preview and interact with application changes before they are merged into production. This is where <a href="https://www.okteto.com/preview-environments/" target="_blank" rel="noopener noreferrer" class="">Okteto’s Preview Environments</a> shine, offering a significant enhancement to your CI workflow and overall Developer Experience (DevX).</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-current-challenge-visualizing-and-testing-changes-pre-merge">The Current Challenge: Visualizing and Testing Changes Pre-Merge<a href="https://www.okteto.com/blog/ci-pipelines-dagger-okteto/#the-current-challenge-visualizing-and-testing-changes-pre-merge" class="hash-link" aria-label="Direct link to The Current Challenge: Visualizing and Testing Changes Pre-Merge" title="Direct link to The Current Challenge: Visualizing and Testing Changes Pre-Merge" translate="no">​</a></h2>
<p>While Dagger simplifies CI pipelines, it doesn’t inherently solve the problem of previewing changes in a realistic environment before they are merged. Developers frequently face challenges like:</p>
<ol>
<li class=""><strong>Lack of Interactive Previews:</strong> Developers need a way to see and interact with their changes before merging. Traditional CI setups typically run tests but don't provide a live preview environment.</li>
<li class=""><strong>Environment Consistency:</strong> Ensuring that tests run in environments identical to production is critical for accurate feedback and the fastest workflow. Running code in pipelines often differs from production, leading to potential issues post-deployment.</li>
<li class=""><strong>Inclusive Feedback:</strong> CI workflows usually focus on developer feedback, leaving out crucial input from design, marketing, and product teams until changes reach staging or production.</li>
</ol>
<p>Ultimately, these challenges all make it harder for teams to iterate and ship fast and lead to poor development experience within organizations.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-solution-insert-okteto-preview-environments">The Solution: Insert Okteto Preview Environments<a href="https://www.okteto.com/blog/ci-pipelines-dagger-okteto/#the-solution-insert-okteto-preview-environments" class="hash-link" aria-label="Direct link to The Solution: Insert Okteto Preview Environments" title="Direct link to The Solution: Insert Okteto Preview Environments" translate="no">​</a></h2>
<p>By including Okteto Preview Environments into the CI process, DevOps teams can address these challenges by automating a shareable URL for each pull request, allowing reviews <em>before</em> merge. Code is deployed in your branch on an actual Kubernetes cluster using all the same configuration as production, ensuring you get the most reliable feedback on how your code would look when pushed to production.</p>
<p>This approach allows developers and stakeholders to interact with the application before merging, ensuring that feedback is gathered early and accurately. The consistency between the preview and production eliminates discrepancies, while inclusive feedback from all departments accelerates the review process and improves the overall quality of the code.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="integrating-okteto-preview-environments-with-dagger-cicd">Integrating Okteto Preview Environments with Dagger CI/CD<a href="https://www.okteto.com/blog/ci-pipelines-dagger-okteto/#integrating-okteto-preview-environments-with-dagger-cicd" class="hash-link" aria-label="Direct link to Integrating Okteto Preview Environments with Dagger CI/CD" title="Direct link to Integrating Okteto Preview Environments with Dagger CI/CD" translate="no">​</a></h2>
<p>If you're already using Dagger to manage the CI pipelines for your cloud native applications, you can instantly start leveraging the benefits of Preview Environments as well. The main benefits you get are:</p>
<ul>
<li class=""><strong>Better DevX:</strong> Your team members can now see a working copy of their code changes before it even gets merged. This makes it easy to get feedback from others and iterate faster.</li>
<li class=""><strong>Automated Testing:</strong> You can run your testing suite against these preview environment endpoints in your Dagger pipeline to be sure that your changes work as expected without having to wait for staging, test, or any other pre-prod environment. Dagger makes it very easy to integrate tests with Preview Environments using other modules like <a href="https://daggerverse.dev/mod/github.com/quartz-technology/daggerverse/cypress@627fc4df7de8ce3bd8710fa08ea2db6cf16712b3" target="_blank" rel="noopener noreferrer" class="">Cypress</a>, etc. You can even write your own module for any testing tool you might use if it’s not available on the <a href="https://daggerverse.dev/" target="_blank" rel="noopener noreferrer" class="">Daggerverse</a> already.</li>
<li class=""><strong>Broad Compatibility:</strong> Another great benefit of Dagger is that it runs on any CI engine. You can leverage the benefits of Okteto’s Preview Environments on popular CI providers/tools like <a href="https://docs.dagger.io/getting-started/ci-integrations/github-actions/" target="_blank" rel="noopener noreferrer" class="">GitHub Actions</a>, <a href="https://docs.dagger.io/getting-started/ci-integrations/gitlab-ci/" target="_blank" rel="noopener noreferrer" class="">GitLab CI</a>, <a href="https://docs.dagger.io/getting-started/ci-integrations/jenkins/" target="_blank" rel="noopener noreferrer" class="">Jenkins</a>, Circle CI, and all other providers Dagger supports!</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-get-started-with-okteto-and-dagger">How To Get Started with Okteto and Dagger<a href="https://www.okteto.com/blog/ci-pipelines-dagger-okteto/#how-to-get-started-with-okteto-and-dagger" class="hash-link" aria-label="Direct link to How To Get Started with Okteto and Dagger" title="Direct link to How To Get Started with Okteto and Dagger" translate="no">​</a></h2>
<p>To help Dagger users quickly adopt Preview Environments, we developed the Okteto Dagger Module. Here’s how you can get started:</p>
<ul>
<li class=""><strong>Explore the Module:</strong> Visit the <a href="https://daggerverse.dev/mod/github.com/okteto/dagger-module" target="_blank" rel="noopener noreferrer" class="">Okteto Dagger Module on Daggerverse</a> for detailed information.</li>
<li class=""><strong>Check Out Sample Pipelines:</strong> Review our <a href="https://github.com/okteto-community/okteto-dagger-sample" target="_blank" rel="noopener noreferrer" class="">sample GitHub Action pipeline</a> to see Preview Environments in action.</li>
<li class=""><strong>Join the Community:</strong> Engage with us in the <a href="https://community.okteto.com/" target="_blank" rel="noopener noreferrer" class="">Okteto community</a> to share your experiences and suggestions.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/ci-pipelines-dagger-okteto/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Incorporating Okteto Preview Environments into your Dagger CI/CD pipelines transforms your development workflow by enabling pre-merge previews, ensuring environment consistency, and fostering more cross-department feedback. This integration not only enhances the Developer Experience but also accelerates your team’s ability to iterate and ship high-quality software efficiently.</p>
<p>Try it out today and experience the benefits of combining Dagger and Okteto for a best-in-class CI/CD setup and DevX.</p>]]></content:encoded>
            <category>cicd</category>
        </item>
        <item>
            <title><![CDATA[Introducing Okteto Insights: Essential Metrics For Platform Teams]]></title>
            <link>https://www.okteto.com/blog/introducing-okteto-insights-essential-metrics-for-platform-teams/</link>
            <guid>https://www.okteto.com/blog/introducing-okteto-insights-essential-metrics-for-platform-teams/</guid>
            <pubDate>Tue, 28 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Discover Okteto Insights. Get critical metrics to understand developer usage, infrastructure demand, and improve your development experience. Try it now!]]></description>
            <content:encoded><![CDATA[<p>Platform Teams can’t succeed in improving the DevX unless they have clear metrics that help them understand the outcome of their initiatives. To help platform engineers achieve that, we’re very excited to launch Okteto’s latest feature: Insights.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-need-for-metrics">The Need For Metrics<a href="https://www.okteto.com/blog/introducing-okteto-insights-essential-metrics-for-platform-teams/#the-need-for-metrics" class="hash-link" aria-label="Direct link to The Need For Metrics" title="Direct link to The Need For Metrics" translate="no">​</a></h2>
<p>Metrics are critical fuel for any platform team. Usage data enables teams to measure how developers are using the platform, what parts are loved, and what needs attention and improvements. More importantly, this data helps determine the platform team’s overall success in improving the DevX and ensures that the platform continues to evolve in ways that truly benefit its users. With this goal in mind, we launched Okteto Insights to help provide visibility to platform teams adopting Okteto as their development platform.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-okteto-insights">What Is Okteto Insights?<a href="https://www.okteto.com/blog/introducing-okteto-insights-essential-metrics-for-platform-teams/#what-is-okteto-insights" class="hash-link" aria-label="Direct link to What Is Okteto Insights?" title="Direct link to What Is Okteto Insights?" translate="no">​</a></h2>
<p>Okteto generates a lot of data from developers using the platform, covering product usage, behavior data like developer activity, and performance metrics such as infrastructure utilization and platform operations.</p>
<p>Admin users can access this data through Okteto Insights via Prometheus Endpoints, enabling Okteto administrators to programmatically retrieve and analyze it. Subsequently, this data can be leveraged to create insightful dashboards using Grafana or similar tools to visualize platform usage patterns.</p>
<p><img decoding="async" loading="lazy" alt="Okteto Insights dashboard showing cluster and node usage metrics" src="https://www.okteto.com/blog/assets/images/cb1fcf0a6afd-a20e601811e9e1e3aaba30d4adc556c7.webp" width="1904" height="1000" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-do-these-metrics-tell">What Do These Metrics Tell?<a href="https://www.okteto.com/blog/introducing-okteto-insights-essential-metrics-for-platform-teams/#what-do-these-metrics-tell" class="hash-link" aria-label="Direct link to What Do These Metrics Tell?" title="Direct link to What Do These Metrics Tell?" translate="no">​</a></h2>
<p>Okteto Insights sheds light on various crucial aspects of the Okteto platform. The metrics provide a comprehensive view of:</p>
<ul>
<li class="">The load and demand on pods and nodes, helping the platform team decide whether to scale the development infrastructure up or down.</li>
<li class="">Developer usage patterns, which are key indicators of the degree of platform adoption.</li>
<li class="">Utilization of preview environments, showing how often features are tested before full deployment.</li>
<li class="">Trends in build and deployment times, which can highlight changes in application over time and the need for optimizations to speed up development cycles.</li>
</ul>
<p>These insights can collectively guide strategic decisions which help the platform team improve the overall development experience with Okteto.</p>
<p><img decoding="async" loading="lazy" alt="Okteto Insights dashboard displaying build metrics" src="https://www.okteto.com/blog/assets/images/017709839467-71d657be338296e4015162005626784f.webp" width="1904" height="779" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it-out">Try it out<a href="https://www.okteto.com/blog/introducing-okteto-insights-essential-metrics-for-platform-teams/#try-it-out" class="hash-link" aria-label="Direct link to Try it out" title="Direct link to Try it out" translate="no">​</a></h2>
<p>If you want to understand the impact and utility your developers are getting out of Okteto, you should definitely try Okteto Insights out. You can read the <a href="https://www.okteto.com/docs/admin/okteto-insights/" target="_blank" rel="noopener noreferrer" class="">complete feature documentation here</a>.</p>
<p>Start measuring and maximizing the success of your platform today!</p>]]></content:encoded>
            <category>features</category>
            <category>Development Experience</category>
        </item>
        <item>
            <title><![CDATA[Benefits of Platform Engineering]]></title>
            <link>https://www.okteto.com/blog/platform-engineering-benefits/</link>
            <guid>https://www.okteto.com/blog/platform-engineering-benefits/</guid>
            <pubDate>Wed, 28 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[In this article, we delve into the key reasons why engineering leaders must invest in a platform engineering team to foster organizational success.]]></description>
            <content:encoded><![CDATA[<p>In a world where technology advances at lightning speed, it is imperative for organizations to equip themselves with the best practices in the software development industry. If you've been keeping up, you may have heard about one of the latest cultural shifts that many companies are embracing: platform engineering.</p>
<!-- -->
<video controls="" preload="metadata" class="video_QmVR"><source src="https://cdn.sanity.io/files/6icyfeiq/production/fc7fdcd6f1c81eb4a28999691b8cca4bfead6ac5.mp4" type="video/mp4"></video>
<p>In this article, I will delve into the key reasons why engineering leaders must invest in a platform engineering team to foster organizational success. Let's first start by understanding what platform engineering is.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-platform-engineering">What Is Platform Engineering?<a href="https://www.okteto.com/blog/platform-engineering-benefits/#what-is-platform-engineering" class="hash-link" aria-label="Direct link to What Is Platform Engineering?" title="Direct link to What Is Platform Engineering?" translate="no">​</a></h2>
<p><a href="https://www.okteto.com/blog/platform-engineering-devops/" target="_blank" rel="noopener noreferrer" class="">Platform engineering</a> is transforming the way organizations approach software development, especially in the ever-evolving landscape of today. At its core, platform engineering focuses on providing robust and standardized internal tools and platforms that enable developers to concentrate on their primary task—writing and deploying code. By providing a suite of reusable tools, environments, and services, platform engineering significantly reduces the cognitive load on developers, allowing them to deliver value more efficiently. Let's see the benefits of platform engineering vs traditional <a href="https://www.atlassian.com/devops" target="_blank" rel="noopener noreferrer" class="">DevOps workflow</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="accelerating-time-to-market-with-platform-engineering">Accelerating Time-to-Market with Platform Engineering<a href="https://www.okteto.com/blog/platform-engineering-benefits/#accelerating-time-to-market-with-platform-engineering" class="hash-link" aria-label="Direct link to Accelerating Time-to-Market with Platform Engineering" title="Direct link to Accelerating Time-to-Market with Platform Engineering" translate="no">​</a></h2>
<p>Being able to ship quickly is a crucial factor for organizations. The faster you can roll out new features, bug fixes, and updates, the more value you can provide to your users and customers. However, being able to ship fast requires proper enablement of your developers. Let's delve into the nuances of this argument next.</p>
<p>There are many things that can kill <a href="https://www.okteto.com/blog/development-velocity/" target="_blank" rel="noopener noreferrer" class="">developer productivity</a>. At the top of that list is likely the cognitive load that comes from constant context switching. In high-focus tasks like writing code, it is essential for developers to remain in their focus zone and work on what they do best without having to worry about other things. This includes tasks such as setting up development infrastructure and environments, spinning up test and staging environments, among other tasks.</p>
<p>When application developers have to switch from writing code one moment to working with cloud services and containers the next, it creates an unnecessary cognitive load and hampers productivity. They end up spending time learning and debugging tools like Kubernetes, Terraform, and cloud provider platforms like AWS, GCP, etc. This time could be much better utilized for writing code for the application and delivering value. This, in my opinion, is the biggest benefit of platform engineering.</p>
<aside class="highlight_CGlU"><p>Research reveals that developers spend approximately 17% of their time shifting contexts between tasks. Read more in this paper <a href="https://www.researchgate.net/publication/317989659_Impact_of_task_switching_and_work_interruptions_on_software_development_processes" target="_blank" rel="noopener noreferrer" class="">here</a>.</p></aside>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="platform-engineering-teams-the-key-to-developer-productivity">Platform Engineering Teams: The Key to Developer Productivity<a href="https://www.okteto.com/blog/platform-engineering-benefits/#platform-engineering-teams-the-key-to-developer-productivity" class="hash-link" aria-label="Direct link to Platform Engineering Teams: The Key to Developer Productivity" title="Direct link to Platform Engineering Teams: The Key to Developer Productivity" translate="no">​</a></h3>
<p>This is where a platform engineering team comes into play. By packaging all the tools and resources that developers need under a unified platform which automates these productivity killing tasks, they make it easier for developers to focus on what they do best.</p>
<p>For example, Okteto is a development platform that allows developers to quickly create production-like development environments based on predefined configurations set by the platform engineering team. Similarly, there are service catalogs like <a href="https://backstage.io/" target="_blank" rel="noopener noreferrer" class="">Backstage</a> that serve as a platform for developers to easily discover all the different microservices and applications within an organization. Ultimately, a platform aims to empower developers by providing them with the necessary resources and information, eliminating the need for constant context switching.</p>
<p>To summarize, if you want to deliver value to your customers quickly, you need to ensure that your developers can focus on what they do best without having to juggle a thousand other things. And this is where platforms truly excel!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="easier-security-compliance-thanks-to-standardization">Easier Security Compliance Thanks to Standardization<a href="https://www.okteto.com/blog/platform-engineering-benefits/#easier-security-compliance-thanks-to-standardization" class="hash-link" aria-label="Direct link to Easier Security Compliance Thanks to Standardization" title="Direct link to Easier Security Compliance Thanks to Standardization" translate="no">​</a></h2>
<p>When a platform becomes the streamlined way for developers to get things done, it means there are no more ad hoc decisions being made by developers for different tasks. With everything now maintained by the platform engineering team, it becomes much easier to ensure security and compliance across the organization. The platform team can define standardized processes and tools and abstract away the implementation details under the platform. This is something I feel platform engineering does better as compared to the DevOps way of doing things.</p>
<p>This means all dev workflows by default work just like how the platform team defined them, and everything is standardized. This makes it so much easier for organizations to comply with security policies and minimize the chances of a breach of security due to human error. Instead of trusting each developer to follow the security best practices (which many times they might not even know about!), the platform engineering team can bake them into the platform itself and ensure a uniform and secure system across the board.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bonus-platform-engineering-benefit-cost-optimization">Bonus Platform Engineering Benefit: Cost Optimization<a href="https://www.okteto.com/blog/platform-engineering-benefits/#bonus-platform-engineering-benefit-cost-optimization" class="hash-link" aria-label="Direct link to Bonus Platform Engineering Benefit: Cost Optimization" title="Direct link to Bonus Platform Engineering Benefit: Cost Optimization" translate="no">​</a></h2>
<p>One of the often overlooked benefits of platform engineering is cost optimization. By automating tasks behind the scenes of the platform, it becomes easy to implement features like a garbage collector and auto scaling of resources and environments. These optimizations result in significant cost savings in the long run.</p>
<p>Let's consider <a href="https://www.okteto.com/blog/slash-your-kubernetes-costs-during-development/" target="_blank" rel="noopener noreferrer" class="">Okteto's Garbage Collector</a>, which allows platform engineers to define a time period for inactive development environments. After this period, the system automatically deletes these environments. This eliminates concerns about idle cloud resources that incur unnecessary costs each month. Additionally, the platform handles auto scaling of resources based on usage, ensuring that you only pay for what you actually use, rather than overprovisioned resources. You can find more information about this feature here.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/platform-engineering-benefits/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The narrative around Platform Engineering is, at its core, a story of faster development velocity, easier governance, and an effective use of resources. It's about abstracting and automating away the things that hamper developer experience and, in the process, achieving standardized and streamlined workflows.</p>
<p>For businesses seeking to invest in longevity, there's no better time than right now to give due recognition to this cultural shift and ensure that your development teams continue to function smoothly in the long run. Don’t just take my word for it, read about the success story at <a href="https://monday.com/" target="_blank" rel="noopener noreferrer" class="">monday.com</a> where they saw a 50% increase in developer velocity after investing in platform engineering!</p>
<div class="button_B_vc"><a class="Button teal layout" href="https://www.okteto.com/customers/monday-com/" target="_self">Read the case study<!-- --> →</a></div>]]></content:encoded>
            <category>platform engineering</category>
            <category>devx</category>
        </item>
        <item>
            <title><![CDATA[Platform Engineering Roadmap: Best Practices You Need To Know]]></title>
            <link>https://www.okteto.com/blog/platform-engineering-roadmap/</link>
            <guid>https://www.okteto.com/blog/platform-engineering-roadmap/</guid>
            <pubDate>Thu, 25 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[We will cover the best practices that a platform engineering team should follow in order to be successful.]]></description>
            <content:encoded><![CDATA[<p>In our <a href="https://www.okteto.com/blog/platform-engineering-devops/" target="_blank" rel="noopener noreferrer" class="">previous blog post</a>, we explored how cultivating a customer-centric mindset can help you become a better platform engineer. Now, let's delve into the practical implementation of this philosophy by giving you a roadmap for platform engineering. We will cover the essential best practices that a platform engineering team should follow in order to be successful. Furthermore, we will assess the advantages of adhering to these platform engineering principles and their potential impact on your team's efficiency and effectiveness.</p>
<!-- -->
<video controls="" preload="metadata" class="video_QmVR"><source src="https://cdn.sanity.io/files/6icyfeiq/production/a01b7556b741f3e93878c9aea4b24367fffb396f.mp4" type="video/mp4"></video>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="roadmap-to-follow-for-platform-engineering">Roadmap To Follow For Platform Engineering<a href="https://www.okteto.com/blog/platform-engineering-roadmap/#roadmap-to-follow-for-platform-engineering" class="hash-link" aria-label="Direct link to Roadmap To Follow For Platform Engineering" title="Direct link to Roadmap To Follow For Platform Engineering" translate="no">​</a></h2>
<p>As a <a href="https://www.okteto.com/blog/platform-engineering-devops/#understanding-the-evolution-devops-versus-platform-engineering" target="_blank" rel="noopener noreferrer" class="">platform engineer</a>, one of your main goals is to provide robust platforms that help the developers in your organization be more <a href="https://www.mckinsey.com/industries/technology-media-and-telecommunications/our-insights/yes-you-can-measure-software-developer-productivity" target="_blank" rel="noopener noreferrer" class="">productive</a>. To achieve this, you need a platform engineering roadmap that will guide your team towards success. Here are some recommended guidelines to follow when thinking about your dev platform:</p>
<ol>
<li class="">Self-Service Environments: Just as businesses offer user-friendly portals to their customers, platform engineers should provide developers with the ability to independently access what they need. This reduces the <a href="https://platformengineering.org/blog/cognitive-load" target="_blank" rel="noopener noreferrer" class="">cognitive load</a> and reliance on learning and installing additional tools (such as Terraform, Docker, etc.) or depending on other teams. Developers greatly appreciate the ability to easily develop and test their applications. Empowering them to launch environments which allow them to do this, without the need for assistance from other teams or long wait times, can significantly enhance efficiency!</li>
<li class="">Golden Paths: In platform engineering, the notion of "golden paths" offers developers pre-defined workflows and solutions, akin to a customer service representative guiding customers through a seamless experience. By automating repetitive tasks like creating dev infrastructure and image builds and uploads, valuable time is saved and the risk of human error is reduced. This empowers developers to concentrate on their primary task of writing code, rather than being burdened by manual repetitive tasks. These pathways also assist the platform team in maintaining standardization and having governance over all the services provided. This becomes crucial in making sure you meet your organization's compliance standards!</li>
<li class="">Better Collaboration: Microservices-based applications are hard to develop as a team by default because of their distributed nature. Platform teams need to be able to provide <a href="https://www.rookout.com/blog/the-financial-benefit-of-developer-tools/" target="_blank" rel="noopener noreferrer" class="">developers with the tools</a> and processes that enable better collaboration between different teams. This can include features like <a href="https://www.okteto.com/preview-environments/" target="_blank" rel="noopener noreferrer" class="">preview environments</a>, shared environments for development, and efficient workflows to facilitate seamless collaboration among not only developers but also developers and other teams like marketing, design, sales, etc.</li>
</ol>
<p>These are three things which we feel should be on your roadmap when approaching platform engineering. Starting a platform team can feel like a daunting task but if you break it down into these three areas it can start to feel approachable. It doesn't matter if you're building your own solution or adopting an existing one, you need to make sure that it fullfills these three needs: consumable in a self service manner, automate repetitive talks by providing golden paths, allow developers to collaborate with each other.</p>
<p>If you're able to provide these three things to your developers then consider yourself to be on the right way towards your end goal!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="benefits-of-following-platform-engineering-principles">Benefits of Following Platform Engineering Principles<a href="https://www.okteto.com/blog/platform-engineering-roadmap/#benefits-of-following-platform-engineering-principles" class="hash-link" aria-label="Direct link to Benefits of Following Platform Engineering Principles" title="Direct link to Benefits of Following Platform Engineering Principles" translate="no">​</a></h2>
<p>Following the above platform engineering roadmap can bring a multitude of <a href="https://www.okteto.com/blog/platform-engineering-benefits/" target="_blank" rel="noopener noreferrer" class="">benefits</a> to your organization as a whole. Just implementing the three things we discussed above can give the developers in your organization the following benefits:</p>
<ul>
<li class="">Enhanced <a href="https://www.okteto.com/blog/development-velocity/" target="_blank" rel="noopener noreferrer" class="">Development Experience</a>: Developers can concentrate exclusively on coding, free from the burden of operational and infrastructural complexities. This fosters greater job satisfaction, productivity, and overall workplace happiness. And everyone knows, happy developers write better code :)</li>
<li class="">Lower Cognitive Load: By abstracting away the complexities of environment setup and streamlining workflows, platform engineers are able to relieve developers of the mental burden associated with these peripheral tasks. This allows them to focus their mental energy more effectively on creative problem-solving and coding, leading to higher quality work and innovation. The less they have to juggle between tasks the more energy they'll be able to give to existing ones.</li>
<li class="">Faster Time-to-Market: With self-service environments, automated processes, and golden paths, developers can swiftly develop and test their applications. This results in increased development velocity, giving organizations a competitive edge. This often has a direct impact on customer satisfaction for companies.</li>
<li class="">Cost Savings: By streamlining processes and automating tasks, platform teams can reduce the time and resources required for application development. This leads to significant cost savings for organizations in the long run. Having features like a Garbage Collector be a part of your platform can further help with minimizing savings.</li>
<li class="">Better Collaboration and Teamwork: With better tools and processes, developers can collaborate more efficiently with each other. Additionally, platform features such as Preview Environments offer visibility into the development process for non-software development teams like product, marketing, sales, etc. This fosters stronger teamwork, effective communication, and ultimately results in better products for customers.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/platform-engineering-roadmap/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In conclusion, following best practices in platform engineering can have a positive impact on your organization's overall success. By implementing this roadmap of self-service environments, golden paths and promoting collaboration, you can create a development experience that is efficient, streamlined and makes developers more productive.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Playbook: learn more about development velocity and how platform engineering can make an impact</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/blog/development-velocity/" target="_self">Read more</a></div></section>
<p>You can get started reaping all the benefits we discussed from today itself! <a href="https://www.okteto.com/blog/empowering-teams-the-shift-in-okteto-development-focus/" target="_blank" rel="noopener noreferrer" class="">Okteto was built</a> with these platform engineering principles in mind and allows platform engineers to easily create self-service environments and provide golden paths to their developers. Try it out today by <a href="https://www.okteto.com/free-trial/" target="_blank" rel="noopener noreferrer" class="">signing up</a> for our free 30-day trial.</p>]]></content:encoded>
            <category>platform engineering</category>
        </item>
        <item>
            <title><![CDATA[Platform Engineering Versus Devops]]></title>
            <link>https://www.okteto.com/blog/platform-engineering-devops/</link>
            <guid>https://www.okteto.com/blog/platform-engineering-devops/</guid>
            <pubDate>Tue, 16 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn what Platform Engineering is and how it differs from DevOps.]]></description>
            <content:encoded><![CDATA[<p>Platform engineering has become an increasingly popular topic in the software development industry. But a lot of people are still confused on what's the difference between platform engineering and DevOps. In this blog, I want to share with you how platform engineering came to be, how it compares to <a href="https://www.atlassian.com/devops" target="_blank" rel="noopener noreferrer" class="">DevOps</a>, and the benefits of platform engineering.</p>
<!-- -->
<video controls="" preload="metadata" class="video_QmVR"><source src="https://cdn.sanity.io/files/6icyfeiq/production/543d9b61b922f17ee71efe18ea1afb42b882f29c.mp4" type="video/mp4"></video>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-the-evolution-devops-versus-platform-engineering">Understanding the Evolution: DevOps versus Platform Engineering<a href="https://www.okteto.com/blog/platform-engineering-devops/#understanding-the-evolution-devops-versus-platform-engineering" class="hash-link" aria-label="Direct link to Understanding the Evolution: DevOps versus Platform Engineering" title="Direct link to Understanding the Evolution: DevOps versus Platform Engineering" translate="no">​</a></h2>
<p>Historically, developers have been responsible for writing code and focusing solely on their applications. Once the code was written, it was handed over to operations teams for deployment. This separation of concerns made sense in a world where software was more monolithic and less complex.</p>
<p>However, with the advent of microservices, containers, and DevOps practices, developers started taking on additional responsibilities. They were expected to manage application builds, infrastructure, and more. This shift led to a blurred line between development and operations, often resulting in cognitive overload for developers. They were no longer solely focused on writing code, but also had to worry about infrastructure and deployment processes.</p>
<p>As developers embraced the new paradigm, they found themselves navigating a complex landscape of tools and technologies. They had to master containerization tools like Docker, orchestration tools like Kubernetes, and infrastructure as code tools like Terraform. This added an extra layer of complexity to their daily tasks, requiring developers to acquire new skills and stay updated with the latest trends in the rapidly evolving DevOps ecosystem.</p>
<p>I hope this historical context helped you understand the whole platform engineering vs DevOps debate. It should also make you appreciate the challenges faced by developers and the need for a more streamlined approach.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="platform-engineering-benefits-facilitating-a-focus-on-core-competencies">Platform Engineering Benefits: Facilitating a Focus on Core Competencies<a href="https://www.okteto.com/blog/platform-engineering-devops/#platform-engineering-benefits-facilitating-a-focus-on-core-competencies" class="hash-link" aria-label="Direct link to Platform Engineering Benefits: Facilitating a Focus on Core Competencies" title="Direct link to Platform Engineering Benefits: Facilitating a Focus on Core Competencies" translate="no">​</a></h2>
<p>The <a href="https://www.gartner.com/en/articles/what-is-platform-engineering" target="_blank" rel="noopener noreferrer" class="">rise of platform engineering</a> addresses these challenges. One of the <a href="https://www.okteto.com/blog/platform-engineering-benefits/" target="_blank" rel="noopener noreferrer" class="">benefits of platform engineering</a> is that there is now a dedicated team to act as an architect of shared infrastructure, tooling, and platforms for developers. By standardizing processes and providing consumable services, this team empower developers to focus on what they do best: writing code and delivering value.</p>
<p>In essence, a platform engineer needs to act as an enabler within the organization. By creating and managing a suite of consumable services that encompass everything developers require, platform teams dramatically reduce the cognitive load on developers. Developers can now access a standardized set of services for tasks like setting up dev and test environments, artifact building, etc., allowing them to concentrate primarily on coding. This is another way to compare platform engineering versus DevOps, since in the DevOps model developers were themselves expected to take care of a lot of these things.</p>
<p>Platform engineering tools not only streamline the development process but also benefits platform engineers by establishing standardization and governance across these services. The result is a more focused and efficient work environment for both developers and platform engineers which fosters innovation and fast shipping.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adopting-a-customer-centric-approach-the-key-to-excellence">Adopting a Customer-Centric Approach: The Key to Excellence<a href="https://www.okteto.com/blog/platform-engineering-devops/#adopting-a-customer-centric-approach-the-key-to-excellence" class="hash-link" aria-label="Direct link to Adopting a Customer-Centric Approach: The Key to Excellence" title="Direct link to Adopting a Customer-Centric Approach: The Key to Excellence" translate="no">​</a></h2>
<p>You can only start to reap the benefits of platform engineering when you have a deep understanding of the challenges faced by developers. Just as businesses conduct market research to identify customer needs and pain points, platform engineers must invest time and effort in understanding the daily obstacles developers encounter. Take the time to survey developers within your organization, familiarize yourself with their workflows, and see if they're able to focus on their core job of application development or not. Try to minimize or automate away any non-value-adding activities that distract them from their work and reduce their overall productivity.</p>
<p>The cornerstone of excelling in platform engineering versus DevOps lies in adopting this customer-centric approach towards developers. That in my opinion is the biggest difference between the two. Treating developers as your customers is all about active listening and understanding. By prioritizing their needs and experiences, you not only enhance your effectiveness as a platform engineer but also build a strong partnership with your developer colleagues. This alignment of interests can yield significant positive outcomes in terms of productivity, satisfaction, and the overall success of software teams within your organization.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/platform-engineering-devops/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>I hope this blog helped you understand the whole platform engineering vs DevOps paradigm better. With the right mindset towards Platform Engineering you can get significant improvements in developer experience. <a href="https://www.okteto.com/customers/monday-com/" target="_blank" rel="noopener noreferrer" class="">Read about</a> one of our customers, <a href="http://monday.com/" target="_blank" rel="noopener noreferrer" class="">monday.com</a>, who saw a 50% boost in developer productivity by focusing on the right problems to solve!</p>
<p>I also hope this blog helped you provide a good starting point in your journey towards building a platform team. If you're still not sold on the benefits I would recommend reading our other blog on the <a href="https://www.okteto.com/blog/platform-engineering-benefits/" target="_blank" rel="noopener noreferrer" class="">benefits of platform engineering</a>.</p>
<p>It's crucial to understand that this philosophy is not an isolated concept. Rather, it forms the foundation upon which the core tenets of platform engineering are built. The principles that guide exceptional platform engineering are, in essence, an extension and deepening of this customer-focused mindset.</p>
<p>In our next blog, I will talk about <a href="https://www.okteto.com/blog/platform-engineering-roadmap/" target="_blank" rel="noopener noreferrer" class="">best practices</a> when it comes to platform engineering. These practices include creating golden paths, self-serviced environments, and some other things which we will dive into next time :)</p>]]></content:encoded>
            <category>platform engineering</category>
        </item>
        <item>
            <title><![CDATA[Empowering Teams: The Shift in Okteto's Development Focus]]></title>
            <link>https://www.okteto.com/blog/empowering-teams-the-shift-in-okteto-development-focus/</link>
            <guid>https://www.okteto.com/blog/empowering-teams-the-shift-in-okteto-development-focus/</guid>
            <pubDate>Thu, 14 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[In the early stages of innovation, Okteto introduced a free SaaS tier, Okteto Cloud, to provide individual developers with a platform for remote development environments. From day one, our primary goal has been to simplify the developer experience, allowing devs to experience a fully automated Kubernetes development environment with just a single click.]]></description>
            <content:encoded><![CDATA[<p>In the early stages of innovation, Okteto introduced a free SaaS tier, Okteto Cloud, to provide individual developers with a platform for remote development environments. From day one, our primary goal has been to simplify the developer experience, allowing devs to experience a fully automated Kubernetes development environment with just a single click.</p>
<!-- -->
<p>While the core developer features and experience continue to shape our platform, it's clear from our customers and community that Okteto's strength lies in serving cloud native teams and that Okteto is not a viable fit for individual developer use cases.</p>
<p>Over the past year, Okteto has transformed into a comprehensive platform tailored for platform teams automating modern development on Kubernetes. We've learned that our commercial road to success is switching targets and serving these platform and development experience engineering teams who then design and deliver high value to their internal customers, the developers.</p>
<p>Along with the product evolution, our product and engineering teams have invested an exceptional amount of effort in maintaining a free, multi-tenant tool. Challenges such as managing fraud and abuse by unauthorized users and crypto mining, security concerns in multi-tenant environments, and the misalignment in Okteto usage as a free hosting provider, have led to diverting our attention and time away from delivering critical value to our customers and users.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's next?<a href="https://www.okteto.com/blog/empowering-teams-the-shift-in-okteto-development-focus/#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?" translate="no">​</a></h2>
<p>Because of these factors, we have decided to deprecate the free SaaS tier for individual accounts. On December 5, 2023 we stopped allowing new signups for the individual tier. Starting January 15, 2024 we will begin shutting down Okteto Cloud, the free tier of the SaaS product. We will be sending out a series of emails to affected users.</p>
<p>We remain focused and excited about delivering a great development experience to teams building cloud native applications and continue to work closely with platform engineering teams on increasing productivity and velocity and bringing joy to modern development. If you are interested in using Okteto’s platform, please reach out and we’ll help your team get started with Okteto Self-Hosted or <a href="https://www.okteto.com/docs/byoc/" target="_blank" rel="noopener noreferrer" class="">Bring Your Own Cloud</a>. You can also check out a <a href="https://www.okteto.com/free-trial/" target="_blank" rel="noopener noreferrer" class="">free 30-day trial</a> of our Self-Hosted offering of Okteto.</p>
<p>If you are ready to migrate your team to Okteto Self-Hosted or Bring Your Own Cloud, we will provide a license with 5 free users for the first year if you <a href="https://www.okteto.com/saas-sunset-offer" target="_blank" rel="noopener noreferrer" class="">reach out before Jan 15</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-big-thanks">A big thanks<a href="https://www.okteto.com/blog/empowering-teams-the-shift-in-okteto-development-focus/#a-big-thanks" class="hash-link" aria-label="Direct link to A big thanks" title="Direct link to A big thanks" translate="no">​</a></h2>
<p>Once again, we extend our sincere gratitude for your ongoing support and commitment to Okteto. Your early adoption and enthusiasm have been instrumental in shaping the evolution of our platform. Together, we've pushed forward what modern development experience should be. Thank you for being an integral part of our community. We're grateful for your understanding, and we hope you'll continue building with Okteto in the future.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Automating Development Environments and Infrastructure with Terraform and Okteto]]></title>
            <link>https://www.okteto.com/blog/automating-development-environments-and-infrastructure-with-terraform-and-okteto/</link>
            <guid>https://www.okteto.com/blog/automating-development-environments-and-infrastructure-with-terraform-and-okteto/</guid>
            <pubDate>Sun, 26 Nov 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to provision self service development environments that include any cloud resource, including Terraform.]]></description>
            <content:encoded><![CDATA[<p>If you're developing a modern cloud-native app, it's very likely that your app is leveraging some cloud resources. These could be things like storage buckets, messaging queues, or any of the numerous services that different cloud providers provide these days. The question that often arises is, how do you ensure that when your developers write code, they have access to these services and resources in a running cloud-native environment? In this blog, we will learn how you can automate this process and provide developers with development environments that take care of all this with the help of Terraform and Okteto!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem-when-developing-modern-apps">The Problem When Developing Modern Apps<a href="https://www.okteto.com/blog/automating-development-environments-and-infrastructure-with-terraform-and-okteto/#the-problem-when-developing-modern-apps" class="hash-link" aria-label="Direct link to The Problem When Developing Modern Apps" title="Direct link to The Problem When Developing Modern Apps" translate="no">​</a></h2>
<p>When approaching the problem we discussed above, organizations traditionally take one of these few approaches.</p>
<p>First is simply being unable to provide access to these resources. This case is farthest away from ideal because it means developers on your team just won't be able to develop properly. They would have to wait until staging to be sure that the changes they made are working or not.</p>
<p>The second approach is to teach developers how to create these resources manually. This isn't very ideal for two reasons:</p>
<ul>
<li class="">One, it involves developers learning different cloud providers and about their resources, thus adding to the cognitive load. Developers in many cases also don’t know how to configure things and how the infra is configured. This limits their ability to create production-like dev environments.</li>
<li class="">And second, it is very time-consuming and cumbersome to have to repeat this process manually each time.</li>
</ul>
<p>This is a problem people faced with their production infrastructure as well. And that is what led to the rise of Infrastructure as Code tools like Terraform. So what I want you to ask yourselves is, if you're already using Terraform scripts to create this infrastructure for production, why not use it for development as well? Now you might be tempted to just ask developers to run these Terraform scripts themselves. But that again suffers from more problems:</p>
<ul>
<li class="">It involves developers having some extent of Terraform knowledge and even installing and managing Terraform and the cloud credentials it needs on their own, which again adds to the cognitive load.</li>
<li class="">It again, at the end of the day, is a manual process because developers need to run the scripts and take care of deleting things when they're done.</li>
</ul>
<p>The first problem might be a big one from just a compliance and security perspective. Because you would need to ensure that you provide access to your cloud provider to developers in a secure way instead of them using any ad hoc credentials or IAM users/roles to create resources, thereby making managing things extremely tough in the long run. So what's the solution?</p>
<p>The solution is automating this problem away with Okteto. You can leverage your same Terraform scripts and automate this entire process with the help of Okteto. This means whenever a developer creates their development environment, the cloud resources will automatically be created for them using the right credentials that you, as platform engineers, have configured. Developers don't need to do anything themselves. In fact, they wouldn't even need Terraform installed locally.</p>
<p>On top of that, whenever they delete these ephemeral environments (or they remain unused for a fixed period), the resources will automatically get deleted for them. Pretty cool, right? This saves costs since you don't have to worry about resources running when nobody is using them.</p>
<p>If you would like to see this in action and learn about the value it provides, check out this webinar we recently did with our friend Richard, who is a HashiCorp Ambassador as well.</p>
<div class="embed_uCA2"><iframe src="https://www.youtube-nocookie.com/embed/tDVAlPhxwQI" title="YouTube video player" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-set-it-up">How To Set It Up<a href="https://www.okteto.com/blog/automating-development-environments-and-infrastructure-with-terraform-and-okteto/#how-to-set-it-up" class="hash-link" aria-label="Direct link to How To Set It Up" title="Direct link to How To Set It Up" translate="no">​</a></h2>
<p>The best part is that integrating Terraform with Okteto is pretty simple, thanks to Okteto External Resources feature. Check out this video, which walks through how you can do this in a few easy steps and automate the pains of developers away!</p>
<div class="embed_uCA2"><iframe src="https://www.youtube-nocookie.com/embed/H1H0mnE_xaE" title="YouTube video player" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/automating-development-environments-and-infrastructure-with-terraform-and-okteto/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>As platform and devX engineers, you want to be able to provide the best workflows that make developers' lives easier. This involves giving them access to the resources and running environments they need without adding any additional cognitive load. With Terraform and Okteto, you can now automate the creation of development environments and access to cloud resources, making it a seamless experience for developers. This is a win for platform teams as well, as the access is now provided in a secure and compliant way, giving them complete governance over resources.</p>
<p>So go ahead and try out this feature with Okteto. You can access our sample app, which demonstrates using Terraform and Okteto, <a href="https://github.com/okteto/oktetodo-terraform-s3" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<p>To get started, you can sign up for a free 30-day trial of Okteto <a href="https://www.okteto.com/free-trial/" target="_blank" rel="noopener noreferrer" class="">here</a>! And if you have any questions or need help setting this up, don't hesitate to reach out to us. Happy automating!</p>]]></content:encoded>
            <category>terraform</category>
        </item>
        <item>
            <title><![CDATA[Improving Development Velocity by Building a Better DevX]]></title>
            <link>https://www.okteto.com/blog/development-velocity/</link>
            <guid>https://www.okteto.com/blog/development-velocity/</guid>
            <pubDate>Fri, 17 Nov 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[This guide aims to help you increase the development velocity in your organization by improving the DevEx for your developers.]]></description>
            <content:encoded><![CDATA[<video controls="" preload="metadata" class="video_QmVR"><source src="https://cdn.sanity.io/files/6icyfeiq/production/31422695f66a635fbb2e593678540b64d3a4f115.mp4" type="video/mp4"></video>
<p><em>Before automating environments for the ultimate modern development experience, platform providers (builders) need a vision and game plan. This guide aims to streamline the process of improving the velocity of development in your organization by building a better DevEx.</em></p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-development-velocity">What is development velocity?<a href="https://www.okteto.com/blog/development-velocity/#what-is-development-velocity" class="hash-link" aria-label="Direct link to What is development velocity?" title="Direct link to What is development velocity?" translate="no">​</a></h2>
<p>Development velocity is the time it takes to complete building, testing, and releasing modern software products ready for customer usage. A product can be an entire cloud-native application, a new microservice feature, or a fix to a defect. The ability to maintain a continuous creative process and stream of high quality apps is the desired state of velocity for most software engineering teams.</p>
<p>Development velocity is a desired state and result of experiencing a continuous, high quality stream of creative value for the benefit of customers.  It is measured across the development lifecycle including developers, test execution, QA, and running live in production.</p>
<p>It is also often confused with developer velocity. Developer velocity refers to an individual developer's time to build, test, and release their specific work, whereas development velocity encompasses the broader efforts and output of the entire team. Increased developer velocity is often a byproduct of an organization's enhanced development velocity.</p>
<p>Developer Experience (DevX or DevEx) has a key role to play in development velocity. If you're able to provide a great experience for your developers by giving them the right tools to be productive, an increase in development velocity is sure to follow.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-the-current-roadblocks-to-development-velocity">What are the current roadblocks to development velocity?<a href="https://www.okteto.com/blog/development-velocity/#what-are-the-current-roadblocks-to-development-velocity" class="hash-link" aria-label="Direct link to What are the current roadblocks to development velocity?" title="Direct link to What are the current roadblocks to development velocity?" translate="no">​</a></h2>
<p>There is an automation gap between cloud-native development and production environments that significantly slows down creativity and development of <a href="https://www.okteto.com/blog/how-developers-can-seamlessly-collaborate-when-building-microservice-apps/" target="_blank" rel="noopener noreferrer" class="">microservices apps</a>, and consequently, is getting in the way of delivering innovation into the hands of real customers. There is no tooling made available that removes the friction and toil associated with creating cloud-native applications.</p>
<p>The most exciting project in platform engineering today is the automation of a modern development experience. The experience designs a new abstraction interface and modern development stages for developers to automate the execution of cloud-native environments that are production-like. This <a href="https://www.adaptavist.com/blog/why-self-service-is-key-to-your-developer-experience" target="_blank" rel="noopener noreferrer" class="">self-service development experience</a> is a critical foundation for speeding up the creativity and delivery of microservice applications, from development-to-production.</p>
<p>Development experience automation is the process of "productizing" a modern abstraction interface as the design centerpiece for unifying, executing, and governing cloud-native environments.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Ready to scope your cloud native DevX automation project?</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/ebooks/5-steps-to-scoping-your-cloud-native-devx-automation-project/" target="_self">5 step guide</a></div></section>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-automate-developer-experience-devx-and-increase-creativity">How to automate developer experience (DevX) and increase creativity?<a href="https://www.okteto.com/blog/development-velocity/#how-to-automate-developer-experience-devx-and-increase-creativity" class="hash-link" aria-label="Direct link to How to automate developer experience (DevX) and increase creativity?" title="Direct link to How to automate developer experience (DevX) and increase creativity?" translate="no">​</a></h2>
<p>Cloud architects and production teams are deploying cloud-native infrastructure platforms like <a href="https://thenewstack.io/streamline-platform-engineering-with-kubernetes/" target="_blank" rel="noopener noreferrer" class="">Kubernetes</a> to improve on-demand service delivery, scalability, and the quality of service.&nbsp; Now, platform teams are designing environments to mirror production environments and shift left the ability to preview, test and qualify features and microservices to development.</p>
<p>However, development teams must now reduce friction, shorten execution time, lower the complexity of <a href="https://www.okteto.com/blog/bring-any-cloud-resource-to-your-modern-app-dev-workflow/" target="_blank" rel="noopener noreferrer" class="">modern app development</a> and testing, and close the gaps between development and production environments. Using local platforms, DevOps pipelines, and scripted provisioning have lead to increased friction, development toil, and reduced velocity and confidence.</p>
<blockquote>
<p>"The ultimate goal is to create joyful development teams that can increase innovation for their customers."</p>
</blockquote>
<p><img decoding="async" loading="lazy" alt="Different stages of development which are encompassed by Automated Development environments and affect the developer experience" src="https://www.okteto.com/blog/assets/images/3db35732251f-20640480dda171cd11b5ac3a806c5a77.webp" width="1898" height="942" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="designing-a-self-service-devex">Designing a self-service DevEx<a href="https://www.okteto.com/blog/development-velocity/#designing-a-self-service-devex" class="hash-link" aria-label="Direct link to Designing a self-service DevEx" title="Direct link to Designing a self-service DevEx" translate="no">​</a></h3>
<p>The opportunity to automate environments in a self-service manner from dev-to-prod is now a reality. This is due to the new levels of abstraction and runtime architecture alignment resulting from the <a href="https://www.datadoghq.com/container-report/" target="_blank" rel="noopener noreferrer" class="">growing usage of containers</a>, microservices, Kubernetes, and cloud-native infrastructure tools and automation.</p>
<p>Platform engineers can design a new interface that provides a self-service, end-to-end developer experience and an environment execution architecture that is more unified, automated, and governed than previous versions of local, siloed environments.</p>
<p>Using a self-service modern interface frees both platform engineers and developers from the need to build and maintain custom automation software, which makes more time available for automating developer experiences.</p>
<p><img decoding="async" loading="lazy" alt="Showing Modern DevX first by design platform engineer environment definitions and an image of the Okteto Modern Development Interface" src="https://www.okteto.com/blog/assets/images/32d2396d8beb-e001dd78f1dc5149be38bd168ce1fca9.webp" width="1824" height="954" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-taking-a-devx-first-approach-enables-development-velocity">How taking a DevX first Approach enables Development Velocity<a href="https://www.okteto.com/blog/development-velocity/#how-taking-a-devx-first-approach-enables-development-velocity" class="hash-link" aria-label="Direct link to How taking a DevX first Approach enables Development Velocity" title="Direct link to How taking a DevX first Approach enables Development Velocity" translate="no">​</a></h2>
<p>Automating the <a href="https://www.okteto.com/blog/automate-provisioning-any-dev-resource-on-any-cloud-provider-with-pulumi-and-okteto/" target="_blank" rel="noopener noreferrer" class="">end-to-end provisioning</a> and de-provisioning lifecycle is just one aspect of achieving a modern DevX. You need to adopt an approach that focuses on bridging the gaps between developer creativity, application delivery, and full-stack application configuration administration. This design approach aims to standardize the user experience by using unified, intuitive, and automated concepts, functions, and lifecycle-specific workflows.&nbsp; The goal is to make the need for&nbsp; development environment administration totally automated and transparent.</p>
<p>With an automation platform, development-to-production environments can be managed without burdening developers, testers, and delivery engineering teams. By standardizing and modernizing the development experience, the interface and platform adoption increase the visibility, trust, and control of configured development-to-production environments for the entire development team. This allows "The Developers (i.e., the Consumers)" and "The <a href="https://www.okteto.com/blog/platform-engineering-devops/" target="_blank" rel="noopener noreferrer" class="">Platform Engineers</a> (i.e., the Providers)" to focus on increasing creativity, confidence, and collaboration.  <a href="https://www.okteto.com/blog/platform-engineering-benefits/" target="_blank" rel="noopener noreferrer" class="">The result</a> is increased development velocity and shipping modern apps.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-plan-for-the-devx-consumer-and-devx-provider">How to plan for the DevX Consumer and DevX Provider<a href="https://www.okteto.com/blog/development-velocity/#how-to-plan-for-the-devx-consumer-and-devx-provider" class="hash-link" aria-label="Direct link to How to plan for the DevX Consumer and DevX Provider" title="Direct link to How to plan for the DevX Consumer and DevX Provider" translate="no">​</a></h2>
<p><strong>DevEx Consumers (Users)</strong></p>
<p>DevEx consumers (users) include application and container developers, test and QA engineers, extended product team members, staging and SRE engineers, and production engineers. They all require environments for development, delivery, and production. Consumers also include automation software / tools that require runtime environment deployments via APIs. For example, provisioning environments enabled with every pull request (PR) for test automation.</p>
<p><strong>DevEx Providers</strong></p>
<p>DevEx providers are the platform/devX engineering teams that design and implement platform automation to deliver execution environments that provide the next modern development experience across every stage of the modern lifecycle. These providers are responsible for both provisioning environments to their entire development and deployment team and engineering the next modern experience platform.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary">Summary<a href="https://www.okteto.com/blog/development-velocity/#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no">​</a></h2>
<p>This playbook is a valuable tool for platform and DevX engineers and architects who are aiming to close gaps that slow down progress towards achieving a higher velocity in the development-to-production modern lifecycle. If you're looking to dive even deeper into the topic, check out this panel discussion:</p>
<div class="embed_uCA2"><iframe src="https://www.youtube-nocookie.com/embed/7Fty6qwhdtk" title="YouTube video player" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>
<p>This exciting <a href="https://www.okteto.com/blog/platform-engineering-roadmap/" target="_blank" rel="noopener noreferrer" class="">platform engineering practice</a> has the potential to reach a new level of development usability, ease-of-work environment, and environment automation for an entire modern, cloud-native experience. The guide highlights the need for:</p>
<ul>
<li class="">Creating a New Level of Abstraction (The Missing DevX Interface).  This presents an opportunity to automate environments with a modern development experience from development-to-production.</li>
<li class="">Taking a DevX-First Approach. Automating environments with the next modern development experience involves more than automating the end-to-end execution environment lifecycle.</li>
<li class="">Planning for both Development Experience Consumers (Users) and Providers.&nbsp; The “provider" of environments are the platform engineers.&nbsp; DevX consumers are the internal customers.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Image showing modern teams and how they interface with modern development environments" src="https://www.okteto.com/blog/assets/images/7d84a9a269fb-fdd16c61e6ebaaf9985e023bf2f782ab.webp" width="1667" height="567" class="img_ev3q"></p>
<blockquote>
<p><em>The ultimate platform engineering vision is a joyful development team continuously innovating for their team and customers.</em></p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="to-learn-more-get-these-playbooks">To learn more, get these playbooks:<a href="https://www.okteto.com/blog/development-velocity/#to-learn-more-get-these-playbooks" class="hash-link" aria-label="Direct link to To learn more, get these playbooks:" title="Direct link to To learn more, get these playbooks:" translate="no">​</a></h2>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">A quickstart guide to scoping your cloud native development experience automation project</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/ebooks/5-steps-to-scoping-your-cloud-native-devx-automation-project/" target="_self">Download Guide</a></div></section>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Templates to kickstart your DevX project, creating requirements and measuring results</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/ebooks/workbook-devx-projects/" target="_self">Download Workbook</a></div></section>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How To Speed Up Container Image Builds]]></title>
            <link>https://www.okteto.com/blog/how-to-speed-up-container-image-builds/</link>
            <guid>https://www.okteto.com/blog/how-to-speed-up-container-image-builds/</guid>
            <pubDate>Wed, 08 Nov 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Best practices for optimizing dockerfiles and container image builds]]></description>
            <content:encoded><![CDATA[<p>Okteto comes with a <a href="https://www.okteto.com/docs/cloud/build/" target="_blank" rel="noopener noreferrer" class="">build service</a> that enables developers to offload image building steps to the cloud. This eliminates the need for Docker to be running on their local machines during development. However, if the Dockerfiles for your application are not written correctly, remote image building can also be time-consuming. To avoid this, it is crucial to follow best practices when writing Dockerfiles and steer clear of common pitfalls. But how do you optimize your image builds and make them faster? This is a question which pops up in our <a href="https://community.okteto.com/" target="_blank" rel="noopener noreferrer" class="">community</a> often. Our CTO, <a href="https://twitter.com/pchico83" target="_blank" rel="noopener noreferrer" class="">Pablo</a>, wrote a community post on this topic, which can be found <a href="https://community.okteto.com/t/my-image-builds-are-slow-how-can-i-make-them-faster/1061" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<!-- -->
<p>In this article, we will explore those (and some additional) tips in greater detail which will help you enhance build times and, consequently, expedite the launch of your team’s development environments!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-how-image-builds-from-dockerfiles-work">Understanding How Image Builds From Dockerfiles Work<a href="https://www.okteto.com/blog/how-to-speed-up-container-image-builds/#understanding-how-image-builds-from-dockerfiles-work" class="hash-link" aria-label="Direct link to Understanding How Image Builds From Dockerfiles Work" title="Direct link to Understanding How Image Builds From Dockerfiles Work" translate="no">​</a></h2>
<p>Before we delve into enhancing build times, it would be beneficial to understand how Dockerfiles instructions are utilized by a build service (whether it's Okteto's build service or Docker running locally) to construct images. Each instruction in your Dockerfile gives rise to an image layer. Layers help optimize work and conserve bandwidth. These layers are cached and do not require recomputation if things don't change. This means that if you change one line in your Dockerfile, only the layers after that point are regenerated. The rest of the previously built image remains as is. Now that we have this foundational knowledge about how layer caching for Dockerfiles works, let's see how we can leverage it to achieve faster build times.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices-for-writing-efficient-dockerfiles">Best Practices for Writing Efficient Dockerfiles<a href="https://www.okteto.com/blog/how-to-speed-up-container-image-builds/#best-practices-for-writing-efficient-dockerfiles" class="hash-link" aria-label="Direct link to Best Practices for Writing Efficient Dockerfiles" title="Direct link to Best Practices for Writing Efficient Dockerfiles" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dont-copy-large-irrelevant-folders">Don't Copy Large Irrelevant Folders<a href="https://www.okteto.com/blog/how-to-speed-up-container-image-builds/#dont-copy-large-irrelevant-folders" class="hash-link" aria-label="Direct link to Don't Copy Large Irrelevant Folders" title="Direct link to Don't Copy Large Irrelevant Folders" translate="no">​</a></h3>
<p>To optimize the image build process, it's recommended to use a <code>.dockerignore</code> file. This file allows you to exclude irrelevant files and folders, reducing the time required to transfer your local files to the build service.</p>
<p>For instance, if you're working with a node app and copying the application code to the container, you can exclude copying the local <code>node_modules</code> folder to the container. This is because the <code>node_modules</code> will anyways be regenerated when you run <code>npm install</code> in the container. By doing so, you can improve the efficiency of the build process.</p>
<p>For more detailed guidance on using the <code>.dockerignore</code> file, you can refer to the official documentation <a href="https://docs.docker.com/engine/reference/builder/#dockerignore-file" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-minimizing-the-number-of-instructions-in-your-dockerfile">Try Minimizing the Number of Instructions in Your Dockerfile<a href="https://www.okteto.com/blog/how-to-speed-up-container-image-builds/#try-minimizing-the-number-of-instructions-in-your-dockerfile" class="hash-link" aria-label="Direct link to Try Minimizing the Number of Instructions in Your Dockerfile" title="Direct link to Try Minimizing the Number of Instructions in Your Dockerfile" translate="no">​</a></h3>
<p>As mentioned earlier, in a Dockerfile, each instruction plays a role in forming a new layer within the image. To optimize the efficiency of building the image, it is recommended to minimize the number of layers by combining multiple commands into a single RUN instruction. This can be achieved by utilizing the &amp;&amp; operator and ensuring that unnecessary files and dependencies are cleaned up within the same RUN instruction. By embracing this approach, you can significantly expedite the process of building images, resulting in faster and more efficient builds.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="arrange-your-instructions-properly">Arrange Your Instructions Properly<a href="https://www.okteto.com/blog/how-to-speed-up-container-image-builds/#arrange-your-instructions-properly" class="hash-link" aria-label="Direct link to Arrange Your Instructions Properly" title="Direct link to Arrange Your Instructions Properly" translate="no">​</a></h3>
<p>As we learned above, Dockerfile instructions are cached as layers. When making changes to an instruction, only the subsequent layers will be regenerated. This presents an opportunity to strategically order our instructions, ensuring that we avoid rebuilding unchanged layers. To achieve this, it is recommended to arrange Dockerfile instructions based on their frequency of change. Place the most stable and least frequently changing instructions at the top of your Dockerfile, while volatile or frequently changing instructions should be placed at the bottom. Here is an example of the recommended order of instructions:</p>
<ol>
<li class="">Install the necessary tools for building your application.</li>
<li class="">Install or update library dependencies.</li>
<li class="">Generate your application.</li>
</ol>
<p>By optimizing the order of instructions, we can improve the efficiency and speed of the Dockerfile build process.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="leverage-cache-mounts">Leverage Cache Mounts<a href="https://www.okteto.com/blog/how-to-speed-up-container-image-builds/#leverage-cache-mounts" class="hash-link" aria-label="Direct link to Leverage Cache Mounts" title="Direct link to Leverage Cache Mounts" translate="no">​</a></h3>
<p>Rebuilding the same layer for each image build can be a time-consuming process. However, with cache mounts, you can store intermediate layers from your Dockerfile and reuse them across multiple builds. Cache mounts work by mapping a specific directory within the container image's build context to a directory on the host system. This mapped directory becomes a storage space for intermediate files and dependencies. By utilizing cache mounts, you can avoid recreating these layers during each build, resulting in significantly reduced build times. If you're interested in learning more about using cache mounts with webpack/nodejs, check out our tutorial <a href="https://www.okteto.com/blog/building-docker-images-faster-for-webpack/" target="_blank" rel="noopener noreferrer" class="">here</a>. Additionally, you can find a list of cache folders used by various programming languages and frameworks by following <a href="https://github.com/actions/cache#implementation-examples" target="_blank" rel="noopener noreferrer" class="">this link</a>.</p>
<p>The following two recommendations for enhancing image builds are specific to <a href="https://www.okteto.com/docs/cloud/build/" target="_blank" rel="noopener noreferrer" class="">Okteto's Build service</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="increase-cpumemory-resources">Increase CPU/Memory Resources<a href="https://www.okteto.com/blog/how-to-speed-up-container-image-builds/#increase-cpumemory-resources" class="hash-link" aria-label="Direct link to Increase CPU/Memory Resources" title="Direct link to Increase CPU/Memory Resources" translate="no">​</a></h3>
<p>During the installation of Okteto Self Hosted, you have the option to configure the CPU and memory resources allocated for the Okteto Build service. This can be done by modifying the <a href="https://www.okteto.com/docs/self-hosted/administration/configuration/#buildkit" target="_blank" rel="noopener noreferrer" class="">buildkit section</a> in your Okteto helm values file. For example, the following configuration reserves 1 CPU and 4 GB of memory for the Okteto Build service, with a limit of 2 CPUs and 8 GB of memory:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">buildkit</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">resources</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">requests</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">cpu</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">memory</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> 4GB</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">limits</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">cpu</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">memory</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> 8GB</span><br></div></code></pre></div></div>
<p>Please note that the performance of the Okteto Build service can be influenced by the type of processor it runs on. Different virtual machines (VMs) may have processors with varying capabilities. To enhance performance, you can configure the Okteto Build service to run on a dedicated node pool with a high-speed processor. This can be achieved by using the <a href="https://www.okteto.com/docs/self-hosted/administration/configuration/#tolerations" target="_blank" rel="noopener noreferrer" class="">tolerations.buildPool</a> section in the Okteto helm values.</p>
<p>Furthermore, for further optimization of performance, you can scale the Okteto Build service instances based on CPU utilization. This can be done either by configuring more instances with <code>buildkit.replicaCount</code> or by utilizing <code>buildkit.hpa</code> to implement a Horizontal Pod Autoscaler based on CPU utilization.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configure-better-storage">Configure Better Storage<a href="https://www.okteto.com/blog/how-to-speed-up-container-image-builds/#configure-better-storage" class="hash-link" aria-label="Direct link to Configure Better Storage" title="Direct link to Configure Better Storage" translate="no">​</a></h3>
<p>Choosing the right storage for the Okteto Build service is a crucial configuration setting that can greatly enhance image build speed. Since image builds require intensive I/O operations, opting for SSDs instead of standard disks can have a significant impact on build performance. You can configure the storage class of the Okteto Build service by setting the <code>buildkit.persistence.storageClass field</code>. Additionally, the <code>buildkit.persistence.size</code> and <code>buildkit.persistence.cache</code> fields allow you to adjust the size of the storage and cache folders for Okteto's Build service.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/how-to-speed-up-container-image-builds/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In conclusion, the ability to expedite the image build process plays a significant role in enhancing the overall development experience. By minimizing the number of instructions, arranging them properly, leveraging cache mounts, and optimizing resources and storage, you can realize notable improvements in your build times and efficiency. Okteto's Build service, with its flexible configuration options and dedicated resources, is designed to further streamline this process. We encourage you to explore and leverage these strategies in your development workflow and experience the difference. So why wait? Give <a href="https://www.okteto.com/" target="_blank" rel="noopener noreferrer" class="">Okteto</a> a try today and elevate your development experience!</p>]]></content:encoded>
            <category>containers</category>
        </item>
        <item>
            <title><![CDATA[Simplifying Launching Development Environments With Okteto Catalog]]></title>
            <link>https://www.okteto.com/blog/simplifying-launching-development-environments-with-okteto-catalog/</link>
            <guid>https://www.okteto.com/blog/simplifying-launching-development-environments-with-okteto-catalog/</guid>
            <pubDate>Tue, 24 Oct 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Creating a great development experience is now simplified when platform engineers build a pre-defined environment catalog. Learn how to design in this post.]]></description>
            <content:encoded><![CDATA[<p>Platform engineering is all about creating "golden paths" for developers. These golden paths are streamlined processes that allow developers to focus on building products and creating value, without getting bogged down by complexities of configuring their development environments. In this article, we'll explore how Okteto Catalog can enable platform engineers to simplify this process for developers and help them get started faster.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-the-catalog">What Is the Catalog<a href="https://www.okteto.com/blog/simplifying-launching-development-environments-with-okteto-catalog/#what-is-the-catalog" class="hash-link" aria-label="Direct link to What Is the Catalog" title="Direct link to What Is the Catalog" translate="no">​</a></h2>
<p>The Catalog feature empowers platform engineers to pre-configure a list of applications directly from the intuitive Okteto web interface. As a result, developers gain effortless access to their applications with all the correct configuration settings already applied when they launch a development environment from the Catalog. This convenient functionality streamlines the process of accessing different versions with different configurations of applications, eliminating the need for developers to manually configure anything themselves. It helps platform engineers have better governance over the environments, making sure all applications are configured in a consistent and secure way that is compliant with all your organization's policies.</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/05ea33ab6711-8855b4cb6b235e1309cd4626bee6c784.webp" width="710" height="763" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-value-it-provides">The Value It Provides<a href="https://www.okteto.com/blog/simplifying-launching-development-environments-with-okteto-catalog/#the-value-it-provides" class="hash-link" aria-label="Direct link to The Value It Provides" title="Direct link to The Value It Provides" translate="no">​</a></h2>
<p>By pre-configuring Catalog entries, platform engineers can toil from the lives of developers so they can focus on what they do best: writing code and creating value! This saves time that would have traditionally been wasted by developers in trying to get the correct configuration and apply it to their environments.</p>
<p>Consider the following example: your application relies on a RDS database that needs to be provisioned on your cloud provider or you maybe you need to get a secret from Vault. While Okteto will automate the actual processes (checkout our <a href="https://www.okteto.com/blog/bring-any-cloud-resource-to-your-modern-app-dev-workflow/" target="_blank" rel="noopener noreferrer" class="">External Resources</a> feature!), it still requires the appropriate credentials. Depending on individual credentials or multiple ad hoc user roles created by developers isn't ideal, as they might lack the correct permissions or be forgotten, posing security risks. As a platform engineer, you've established a single role with the necessary permissions to be used for all development needs of this particular application. The Catalog feature allows you to add these credentials as environment variables, ensuring they are included in each developer's environment in a secure way while keeping the scope specific to the app launched from the Catalog.</p>
<p>Just like this example, there are multiple use cases where you need standardization and governance over the configuration that developers use as part of their environments. And the Catalog shines in these scenarios: it seamlessly facilitates governance and standardization for development environments. It allows you, as the platform admins, to predefine the options available to the developers on your team, so that they don't need to spend time configuring their environment settings manually, and can instead focus on creating value.</p>
<p>By empowering platform engineers with granular control over the developer experience, Okteto enables teams to accelerate their development process and deliver high-quality software with utmost efficiency. Benefits for Platform Engineers:</p>
<ul>
<li class="">Pre-configure catalog entries to reduce developers' time to get to the coding phase.</li>
<li class="">Eliminate concerns about misconfigurations by developers when launching development environments.</li>
<li class="">Provides greater control over the developement experience by ensuring that the deployment environment is pre-configured as intended.</li>
<li class="">Ensures standardization across all developer environments by making sure every environment is running with the same configuration as intended.</li>
<li class="">Facilitates easy governance of applications and versions by allowing to specify the exact branch for each catalog entry with the correct environment variables already set.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-it-works">How It Works<a href="https://www.okteto.com/blog/simplifying-launching-development-environments-with-okteto-catalog/#how-it-works" class="hash-link" aria-label="Direct link to How It Works" title="Direct link to How It Works" translate="no">​</a></h2>
<p>Configuring the Catalog to display different applications with different configurations based on your requirements is a straightforward process. By accessing the admin interface in the settings, you only need to complete a few fields to add a Catalog entry.</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/2592a3bcb70a-c20b39bc80df6fd73fef4a69a5497ca1.webp" width="1341" height="665" class="img_ev3q"></p>
<ul>
<li class="">Name (required) - Provide a unique and recognizable name for your catalog entry. If you're adding multiple versions of the same application, specify the configuration differences.</li>
<li class="">Repository URL (required) - Include the URL to your Git repository.</li>
<li class=""><a href="https://www.okteto.com/docs/administration/catalog/#define-a-default-branch" target="_blank" rel="noopener noreferrer" class="">Default Branch</a> - Specify the default branch to be used if no specific branch is mentioned when launching a development environment. Developers will still have the option to change this when launching a development environment from the Catalog.</li>
<li class=""><a href="https://www.okteto.com/docs/administration/catalog/#define-a-manifest-path" target="_blank" rel="noopener noreferrer" class="">Manifest Path</a> - Specify the relative path to your Okteto manifest file if it's not located in the root of your repository. This is particularly useful if you have multiple Okteto manifests for your application based on your use case.</li>
<li class=""><a href="https://www.okteto.com/docs/administration/catalog/#add-environment-variables" target="_blank" rel="noopener noreferrer" class="">Environment Variables</a> - Configure the necessary environment variables for your application using key-value pairs. Each environment variable will be injected into the containers running the application and any development containers launched by developers.</li>
</ul>
<p>That's it! This is all the configuration required to add an entry to the Okteto Catalog. Once you're finished, save the changes and the developers on your team will see the newly added entry when launching a development environment from the Catalog.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary">Summary<a href="https://www.okteto.com/blog/simplifying-launching-development-environments-with-okteto-catalog/#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no">​</a></h2>
<p>In conclusion, the Okteto Catalog is a feature that empowers both platform engineers and developers, facilitating pre-configurations of applications and significantly reducing the time to dive into coding. It ensures standardization across all developer environments, eradicates worries about misconfigurations, and removes friction from the development process. With a seamless workflow, Okteto enables teams to accelerate their development process and deliver quality software efficiently.</p>
<p>We highly encourage you to explore this feature out youself. Why not take advantage of our free trial and see firsthand how the Catalog can simplify your development processes? <a href="https://www.okteto.com/free-trial/" target="_blank" rel="noopener noreferrer" class="">Sign up for our free trial</a> today and let Okteto take care of the rest. Happy coding!</p>]]></content:encoded>
            <category>features</category>
            <category>platform</category>
        </item>
        <item>
            <title><![CDATA[Automate Provisioning Any Dev Resource on Any Cloud Provider With Pulumi and Okteto]]></title>
            <link>https://www.okteto.com/blog/automate-provisioning-any-dev-resource-on-any-cloud-provider-with-pulumi-and-okteto/</link>
            <guid>https://www.okteto.com/blog/automate-provisioning-any-dev-resource-on-any-cloud-provider-with-pulumi-and-okteto/</guid>
            <pubDate>Thu, 19 Oct 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Production-like development envrionments include external cloud resources. Learn how to achieve this with Pulumi and Okteto]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-value">The Value<a href="https://www.okteto.com/blog/automate-provisioning-any-dev-resource-on-any-cloud-provider-with-pulumi-and-okteto/#the-value" class="hash-link" aria-label="Direct link to The Value" title="Direct link to The Value" translate="no">​</a></h2>
<p>It is common in today's landscape to build microservices-based applications that leverage resources like RDS databases, storage buckets, etc from different cloud platforms. Consequently, it becomes imperative to grant developers access to these resources during the development phase. Failing to do so would mean expecting developers to code in an unrealistic environment, which often leads to difficulties and introduces bugs.</p>
<!-- -->
<p>However, teams frequently encounter challenges in efficiently and effectively implementing this practice. Developers are often burdened with manually configuring resources themselves, relying on makeshift bash scripts or constantly seeking assistance from the platform team. This not only wastes valuable time, but also creates a subpar development experience, as any dependency on the platform team by developers inevitably leads to delays.</p>
<p>To tackle this challenge, platform engineers should prioritize automating the process. This will empower developers to effortlessly provision self-service environments that also include any cloud resources required by the application. In this article, we will delve into how this can be facilitated effortlessly with the aid of Pulumi and Okteto.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-pulumi">What is Pulumi?<a href="https://www.okteto.com/blog/automate-provisioning-any-dev-resource-on-any-cloud-provider-with-pulumi-and-okteto/#what-is-pulumi" class="hash-link" aria-label="Direct link to What is Pulumi?" title="Direct link to What is Pulumi?" translate="no">​</a></h2>
<p><a href="https://www.pulumi.com/" target="_blank" rel="noopener noreferrer" class="">Pulumi</a> is an open source infrastructure as code tool that allows you to define, deploy and manage cloud resources on any cloud provider using popular programming languages like Python, TypeScript, Go, etc. This means that instead of replying on hacky bash scripts or typical configuration manifests, platform engineers can use the languages they are already familiar with to define the infrastructure for developers. Another benefit is that since developers are already familiar with these languages it is easier for them as well to understand and make changes as needed. Pulumi also provides a consistent workflow across different clouds including AWS, Azure, and Google Cloud Platform, making it a versatile tool for any team.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-okteto">What is Okteto?<a href="https://www.okteto.com/blog/automate-provisioning-any-dev-resource-on-any-cloud-provider-with-pulumi-and-okteto/#what-is-okteto" class="hash-link" aria-label="Direct link to What is Okteto?" title="Direct link to What is Okteto?" translate="no">​</a></h2>
<p>Okteto is a cloud-native automation platform that empowers platform engineers to automate the modern development experience. It enables them to effortlessly create self-serviced, production-like development environments for developers. With Okteto, developers can easily replicate their production environment, including all necessary cloud resources. This eliminates the need for manual resource configuration or reliance on the platform team, as developers can have their own self-service development environments. Our <a href="https://www.okteto.com/blog/bring-any-cloud-resource-to-your-modern-app-dev-workflow/" target="_blank" rel="noopener noreferrer" class="">recent launch</a> of "<a href="https://www.okteto.com/docs/cloud/external-resources/" target="_blank" rel="noopener noreferrer" class="">External Resources</a>" introduces a new feature that allows platform engineers to define the provisioning and deprovisioning of any cloud resource as well during development.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-pulumi-and-okteto-work-together">How Pulumi and Okteto Work Together<a href="https://www.okteto.com/blog/automate-provisioning-any-dev-resource-on-any-cloud-provider-with-pulumi-and-okteto/#how-pulumi-and-okteto-work-together" class="hash-link" aria-label="Direct link to How Pulumi and Okteto Work Together" title="Direct link to How Pulumi and Okteto Work Together" translate="no">​</a></h2>
<p>Pulumi and Okteto seamlessly gel together to automate the creation of development infrastructure for microservices-based applications. Okteto's "External Resources" feature allows you to utilize any existing Pulumi configuration you have for production for creating the development infrastructure as well. Let's explore this further by examining the sample app I have prepared.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">See Sample App</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://github.com/okteto/todolist-pulumi-s3" target="_self">GitHub</a></div></section>
<p>If you check out the app, you'll see that it's a todo list app with a backup feature. When you hit the "Save" button, all your current todos get saved in an S3 bucket.</p>
<p>Before diving into the code, to make this app work, you have to define the following <a href="https://www.okteto.com/docs/cloud/secrets/" target="_blank" rel="noopener noreferrer" class="">Okteto Secrets</a> on your dashboard:</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/feab6129fc31-e41dcb4d3ddb56d16ef3f24b38f9ce46.webp" width="1904" height="640" class="img_ev3q"></p>
<p>The first three are for Pulumi to communicate with your AWS account and create resources. The last one is the <a href="https://www.pulumi.com/docs/pulumi-cloud/access-management/access-tokens/" target="_blank" rel="noopener noreferrer" class="">Pulumi access token</a> needed to create the stack and communicate with Pulumi cloud.</p>
<p>If you take a look at the code, you'll see that the Pulumi configuration for creating the S3 bucket is in the <code>pulumi-aws-s3</code> folder, specifically in the <code>index.ts</code> file. I personally used TypeScript to write the code, but the cool thing about Pulumi is that it supports multiple languages, so feel free to use whichever language you're comfortable with!</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token comment" style="color:rgb(106, 153, 85)">// index.ts</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">*</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">as</span><span class="token plain"> pulumi </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"@pulumi/pulumi"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">*</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">as</span><span class="token plain"> aws </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"@pulumi/aws"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// Define Pulumi config variables</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> config </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">pulumi</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">Config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> bucketName </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token keyword" style="color:rgb(86, 156, 214)">require</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"bucketName"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)">// You can set this in your Pulumi config</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// Create an AWS S3 bucket</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> todosBucket </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">aws</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">s3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">Bucket</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"todos_bucket"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    bucket</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> bucketName</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    forceDestroy</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// Export the bucket name for reference</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> bucketNameOutput </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> todosBucket</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">id</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>Here, we have a crucial requirement: the "bucketName" needs to be passed in via config values. Remember this, as it will become relevant later on. Now, let's dive into our Okteto Manifest and explore further!</p>
<p>When using Okteto, all the configuration for your development environment is stored in a single file called okteto.yaml. A typical okteto.yaml has three sections:</p>
<ul>
<li class="">build: This part tells how to build images for different services in your application.</li>
<li class="">deploy: Here, you specify how Okteto deploys your application to set up your development environment.</li>
<li class="">dev: This section has the configuration for development containers for each of your microservices.</li>
</ul>
<p>We won't dive into all the details of the entire Okteto manifest for this application in this blog. Instead, let's focus only on the Pulumi relevant sections. If you want to learn more about how the Okteto manifest for this application was written, you can check out this other blog.</p>
<p>If you check out the first command in the deploy section, you'll see that's where all the magic happens for automating the creation of the bucket with Pulumi:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token comment" style="color:rgb(106, 153, 85)"># okteto.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Create the AWS S3 Bucket</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">command</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">|</span><span class="token scalar string" style="color:rgb(206, 145, 120)"></span><br></div><div class="token-line" style="color:white"><span class="token scalar string" style="color:rgb(206, 145, 120)">      set -e</span><br></div><div class="token-line" style="color:white"><span class="token scalar string" style="color:rgb(206, 145, 120)">      cd pulumi-aws-s3</span><br></div><div class="token-line" style="color:white"><span class="token scalar string" style="color:rgb(206, 145, 120)">      resourceName="${OKTETO_NAMESPACE}-todolist-pulumi"</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><br></div><div class="token-line" style="color:white"><span class="token plain">      pulumi stack init "$</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain">OKTETO_NAMESPACE</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain">"</span><br></div><div class="token-line" style="color:white"><span class="token plain">      yarn install</span><br></div><div class="token-line" style="color:white"><span class="token plain">      pulumi config set bucketName $resourceName</span><br></div><div class="token-line" style="color:white"><span class="token plain">      pulumi up </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">yes</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token comment" style="color:rgb(106, 153, 85)"># create the URL for the Pulumi Dashboard</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      pulumi_about_json=$(pulumi about </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">json)</span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">fully_qualified_name=$(echo "$pulumi_about_json" | grep -o '"fullyQualifiedName"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"[^"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token important">*'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">|</span><span class="token plain"> awk </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token key atrule" style="color:rgb(86, 156, 214)">F'"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> "' '</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain">print $2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain">')</span><br></div><div class="token-line" style="color:white"><span class="token plain">      stack_url="https</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">//app.pulumi.com/$fully_qualified_name"</span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><br></div><div class="token-line" style="color:white"><span class="token plain">      s3Dashboard="https</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">//s3.console.aws.amazon.com/s3/buckets/$</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain">resourceName</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain">"</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token comment" style="color:rgb(106, 153, 85)"># make the values available to the following steps and the dashboard</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        echo "OKTETO_EXTERNAL_S3_ENDPOINTS_BUCKET_URL=$s3Dashboard"</span><br></div><div class="token-line" style="color:white"><span class="token plain">        echo "OKTETO_EXTERNAL_PULUMI_ENDPOINTS_STACK_URL=$stack_url"</span><br></div><div class="token-line" style="color:white"><span class="token plain">        echo "S3_BUCKET_NAME=$resourceName"</span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"> "$OKTETO_ENV"</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">...</span><br></div></code></pre></div></div>
<p>The script is pretty straightforward to understand. All we need to do is navigate to the folder containing our Pulumi configuration and execute the commands as usual to create the resources. One useful trick here is leveraging the <code>${OKTETO_NAMESPACE}</code> variable. It allows us to generate a unique name for the stack we create part of each each development environment. This variable is automatically populated by Okteto with the name of the current namespace where the developer deploys the application.</p>
<p>After that, we generate the URL for the stack on the Pulumi cloud dashboard using some clever bash techniques. Another important point to note is that once all the commands are executed, we export the bucket name, S3 dashboard, and Pulumi dashboard URL to the <code>${OKTETO_ENV}</code> variable. This special variable allows us to reference the exported values in subsequent commands and set up external resources. If you're interested in learning more about configuring External Resources with Okteto, please refer to our <a href="https://www.okteto.com/docs/cloud/external-resources/" target="_blank" rel="noopener noreferrer" class="">documentation</a>.</p>
<p>If you look at the commands after this step, you’ll see that we proceed by creating a secret using AWS credentials. This will allow our application code to establish communication with the newly created bucket and deploy the microservices component of our application. Make sure to also review the <code>destroy</code> section in the code, which functions similarly to <code>deploy</code>, but is specifically responsible for deleting the bucket and associated stack when a developer is terminating their development environment. This step is crucial in ensuring that no unused buckets are <a href="https://www.okteto.com/blog/slash-your-kubernetes-costs-during-development/" target="_blank" rel="noopener noreferrer" class="">left behind</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="seeing-it-in-action">Seeing It In Action<a href="https://www.okteto.com/blog/automate-provisioning-any-dev-resource-on-any-cloud-provider-with-pulumi-and-okteto/#seeing-it-in-action" class="hash-link" aria-label="Direct link to Seeing It In Action" title="Direct link to Seeing It In Action" translate="no">​</a></h2>
<p>Once you have prepared your Okteto manifest and added the AWS credentials and Pulumi access token as Secrets in your Okteto dashboard, you are ready to deploy the application. It is worth noting that as Platform Engineers, Okteto also offers the option of setting these Secrets at a cluster level, eliminating the need for each developer to log into any cloud provider console. When it comes to deploying the application, you can make it available by preconfiguring it as part of the <a href="https://www.okteto.com/docs/administration/catalog/" target="_blank" rel="noopener noreferrer" class="">Catalog</a> of applications. For the purpose of this tutorial, we can simply use the <a href="https://www.okteto.com/docs/cloud/deploy-from-git/" target="_blank" rel="noopener noreferrer" class="">Git URL</a> option:</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/4d289acd2c93-94f2d4ec35bc0dff4b7788d1a3a9272b.webp" width="1634" height="1688" class="img_ev3q"></p>
<p>Notice how Okteto seamlessly handles the execution of Pulumi configuration and the creation of the S3 bucket. But that's not all, the developer dashboard also provides direct access to the S3 console and Pulumi stack dashboard. Furthermore, I've incorporated <a href="https://github.com/okteto/todolist-pulumi-s3/blob/main/okteto.yaml#L57" target="_blank" rel="noopener noreferrer" class="">READMEs</a> to provide information about the bucket and Pulumi dashboard. You can add any product-specific configuration here. This approach greatly simplifies onboarding for new developers by consolidating all the necessary information in one convenient location.</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/6826fa8118cf-881f37d83bc0538b6b338f23b5a1607c.webp" width="1904" height="1163" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/automate-provisioning-any-dev-resource-on-any-cloud-provider-with-pulumi-and-okteto/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>And that's it! This is how simple it is to use Pulumi with Okteto to automate the creation of any infrastructure your application requires and provide developers with the necessary access during development. It is crucial to provide developers with a realistic environment that automates the creation and deletion of application resources, and both Pulumi and Okteto excel at this task. With Pulumi, you can write the infrastructure configuration in languages familiar to both platform engineers and developers. Meanwhile, Okteto takes care of automating the creation and deletion of this infrastructure. If you found this article interesting, why not try deploying the <a href="https://github.com/okteto/todolist-pulumi-s3" target="_blank" rel="noopener noreferrer" class="">sample app</a> and witness it in action for yourself? Get started by signing up for a <a href="https://www.okteto.com/free-trial/" target="_blank" rel="noopener noreferrer" class="">free trial</a> of Okteto!</p>]]></content:encoded>
            <category>cloud-native</category>
            <category>external resources</category>
        </item>
        <item>
            <title><![CDATA[How Developers Can Seamlessly Collaborate When Building Microservice Apps]]></title>
            <link>https://www.okteto.com/blog/how-developers-can-seamlessly-collaborate-when-building-microservice-apps/</link>
            <guid>https://www.okteto.com/blog/how-developers-can-seamlessly-collaborate-when-building-microservice-apps/</guid>
            <pubDate>Tue, 10 Oct 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Building microservices based applications is inherently challenging. Given the multitude of components involved, it is unrealistic to expect any individual to possess comprehensive knowledge of all the different technology stacks. Therefore, collaboration with other team members becomes absolutely essential. However, this collaboration is not always straightforward either. In this article, we will delve into the common issues that teams encounter when developing cloud-native applications with a distributed microservices architecture, and explore how Okteto can help address these challenges.]]></description>
            <content:encoded><![CDATA[<p>Building microservices based applications is inherently challenging. Given the multitude of components involved, it is unrealistic to expect any individual to possess comprehensive knowledge of all the different technology stacks. Therefore, collaboration with other team members becomes absolutely essential. However, this collaboration is not always straightforward either. In this article, we will delve into the common issues that teams encounter when developing cloud-native applications with a distributed microservices architecture, and explore how Okteto can help address these challenges.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="problems-teams-run-into-when-building-apps">Problems Teams Run Into When Building Apps<a href="https://www.okteto.com/blog/how-developers-can-seamlessly-collaborate-when-building-microservice-apps/#problems-teams-run-into-when-building-apps" class="hash-link" aria-label="Direct link to Problems Teams Run Into When Building Apps" title="Direct link to Problems Teams Run Into When Building Apps" translate="no">​</a></h2>
<p>Effective collaboration is absolutely essential for shipping fast. However, when it comes to applications with a microservices-based architecture, there are certain obstacles that can hinder this process.</p>
<p>In a distributed architecture, each microservice operates independently and communicates with other services through APIs. This poses a challenge as it becomes difficult for team members to understand the entire system at once. Additionally, as each service can be built using a different technology stack, it becomes challenging for team members to communicate effectively and understand the code written in different languages.</p>
<p>Therefore, when developer David is working on microservice A and needs assistance or a change in microservice B, they typically have two options:</p>
<ol>
<li class="">They can ask developer Tom, who is knowledgeable about microservice B, to make the necessary modifications. This process involves Tom first pulling David's changes, making their own changes, and then pushing them for David to pull again. As you can probably imagine, this is quite inconvenient and time-consuming, resulting in a poor overall development experience.</li>
<li class="">Alternatively, they can request Tom to engage in pair programming and guide them through the code changes via synchronous communication. It is indeed a commendable approach, although it can be challenging to consistently execute due to factors such as time zones and availability.</li>
</ol>
<p>As you can see, collaborating on a team for a microservices-based application can be incredibly challenging. The good news is that Okteto helps address and overcome these types of problems!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-okteto-makes-collaborative-development-easier">How Okteto Makes Collaborative Development Easier<a href="https://www.okteto.com/blog/how-developers-can-seamlessly-collaborate-when-building-microservice-apps/#how-okteto-makes-collaborative-development-easier" class="hash-link" aria-label="Direct link to How Okteto Makes Collaborative Development Easier" title="Direct link to How Okteto Makes Collaborative Development Easier" translate="no">​</a></h2>
<p>Okteto is a cloud-native development platform that speeds up the development of applications with a microservices architecture. Okteto allows developers to provision self-service development environments where a copy of the entire application they want to work on is deployed for them automatically on a K8s cluster. Each developer works in their namespace, and the code changes they make get reflected live on the endpoints shown to them on their Dashboard as soon as they hit save.</p>
<p>How does Okteto facilitate collaborative development? There are two features that make this possible. The first one is Live Endpoints, which you can learn more about in our <a href="https://www.okteto.com/blog/the-modern-way-of-sharing-dev-work-with-your-team/" target="_blank" rel="noopener noreferrer" class="">other blog post</a>. In this blog, we will focus on the second feature: "Sharing Namespaces!”</p>
<p>When a developer shares their namespace with another developer, they instantly gain access to the deployed application, complete with all the necessary settings and security configurations. This also encompasses any infrastructure, metadata, logs, and deployment information that have been created. This is incredibly beneficial as it eliminates the need for the second developer to set up their development environment whenever they want to assist someone. What's even more fascinating is that once two developers <em>share</em> a namespace, they can each launch a development session for different microservices simply by executing <code>okteto up</code>.</p>
<p>If you're not familiar, <code>okteto up</code> launches a remote development container that synchronizes code between developers' local machine and the cluster. This means any changes developers make locally are instantly reflected at the live endpoints. By sharing a namespace, developers can collaborate in real time, tackling the same bugs or adding new features. Each developer has the freedom to make changes to any individual microservice, with those changes immediately available to other team members to see at the endpoints. Just imagine the boost in productivity when developers can iterate quickly without the need to commit or pull code, or go through the entire build process to see each other's changes. Once developers are satisfied with their overall changes, they can commit their work to the same branch or pull request. This streamlined workflow makes a significant difference in productivity and collaboration and allows teams to ship value faster.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/how-developers-can-seamlessly-collaborate-when-building-microservice-apps/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Collaborative development plays a vital role in the success of any organization when developing microservices-based applications. With Okteto, platform engineers can empower developers to collaborate in real-time, eliminating delays. By removing time-consuming processes like committing and pulling code to see each other's changes, Okteto enables teams to focus on efficiently building high-quality applications. It provides the means to iterate and ship rapidly. So why not try and experience the transformative power of enhanced collaboration in your team? <a href="https://www.okteto.com/free-trial/" target="_blank" rel="noopener noreferrer" class="">Sign up</a> for our free trial today!</p>]]></content:encoded>
            <category>kubernetes</category>
            <category>developer-experience</category>
        </item>
        <item>
            <title><![CDATA[Slash Your Kubernetes Costs During Development]]></title>
            <link>https://www.okteto.com/blog/slash-your-kubernetes-costs-during-development/</link>
            <guid>https://www.okteto.com/blog/slash-your-kubernetes-costs-during-development/</guid>
            <pubDate>Tue, 26 Sep 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Using Kubernetes can be quite costly, to be frank. Regardless of the cloud provider you choose for your cluster, there are expenses associated with the deployed applications and the cloud resources they consume. If you're considering adopting Kubernetes-based development and preview environments, you may wonder how to effectively manage these costs. Let's delve deeper into the topic and explore Okteto's Garbage Collector feature, which automates resource management to help reduce cloud infrastructure expenditures.]]></description>
            <content:encoded><![CDATA[<p>Using Kubernetes can be quite costly, to be frank. Regardless of the cloud provider you choose for your cluster, there are expenses associated with the deployed applications and the cloud resources they consume. If you're considering adopting Kubernetes-based development and preview environments, you may wonder how to effectively manage these costs. Let's delve deeper into the topic and explore Okteto's Garbage Collector feature, which automates resource management to help reduce cloud infrastructure expenditures.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-the-garbage-collector">What Is the Garbage Collector?<a href="https://www.okteto.com/blog/slash-your-kubernetes-costs-during-development/#what-is-the-garbage-collector" class="hash-link" aria-label="Direct link to What Is the Garbage Collector?" title="Direct link to What Is the Garbage Collector?" translate="no">​</a></h2>
<p>Firstly, let's demystify this cool sounding term - Garbage Collector. If you're picturing a physical bin truck rummaging through your Kubernetes cluster, you're not far off the mark. Except, this truck is virtual, and its job is to smartly <strong>scale down</strong> applications during periods of <strong>inactivity</strong>. This ensures your cluster isn't bloated with unused resources, keeping your costs manageable.</p>
<p>The beauty of Okteto's Garbage Collector is that it's fully automated, so you don't have to lift a finger. Gone are the days of meticulously tracking which developer's environment is utilizing unnecessary resources while they're on vacation, and constantly reminding them to discard it. The Garbage Collector effortlessly handles these tasks, granting you peace of mind and valuable time to focus on other crucial responsibilities. This powerful feature benefits both Platform Engineers and Developers in multiple ways:</p>
<ul>
<li class="">Platform Engineers are relieved of the burden of continuously monitoring developers' environments and manually shutting down unused ones.</li>
<li class="">Developers are freed from the cognitive load of remembering to destroy their environments once they've completed their work.</li>
</ul>
<p>With Okteto's Garbage Collector, efficiency and productivity are maximized, allowing everyone to thrive.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-it-works">How It Works<a href="https://www.okteto.com/blog/slash-your-kubernetes-costs-during-development/#how-it-works" class="hash-link" aria-label="Direct link to How It Works" title="Direct link to How It Works" translate="no">​</a></h2>
<p>The Garbage Collector in Okteto operates through two configurable policies:</p>
<ol>
<li class="">The first policy determines the duration of inactivity required to scale all Kubernetes resources in a development or preview environment to zero, effectively putting the namespace to sleep.</li>
<li class="">The second policy specifies when the environment should be completely destroyed, including all Kubernetes and external resources associated with it.</li>
</ol>
<p>Configuring the sleep duration before destruction offers the benefit of allowing developers to effortlessly resume their work without the need for redeployment. Okteto simply wakes up their environment by scaling up all their Kubernetes resources to their specified values.</p>
<p>You might be wondering what qualifies as inactivity. According to the Garbage Collector, an application or its resources are considered inactive if a developer hasn't performed any of the following actions during the specified <code>inactivity</code> period:</p>
<ul>
<li class="">Upgrading or redeploying via the UI or command line.</li>
<li class="">Launching a development container with <code>okteto up</code>.</li>
<li class="">Deploying the latest version of their code using <code>okteto deploy</code>.</li>
</ul>
<p>There are a couple of ways to wake up an environment that has been put to sleep. Developers can do this either through the user interface (UI) or via the command line interface (CLI). Another great feature is that if any of the endpoints associated with the development or preview environment receive traffic, Okteto will automatically wake up the environment. This comes in handy when developers share the URL with someone on their team for testing or feedback, and that person or team accesses it after a few days. The garbage collector will ensure that the environment goes to sleep when there is no activity, but as soon as someone accesses that endpoint, it wakes up again.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-can-you-configure-it">How Can You Configure It<a href="https://www.okteto.com/blog/slash-your-kubernetes-costs-during-development/#how-can-you-configure-it" class="hash-link" aria-label="Direct link to How Can You Configure It" title="Direct link to How Can You Configure It" translate="no">​</a></h2>
<p>If you're aiming to optimize your cloud usage and reduce costs, consider configuring the garbage collector for your Okteto installation. You can find detailed steps on how to do this in the accompanying video.</p>
<div class="embed_uCA2"><iframe src="https://www.youtube-nocookie.com/embed/iyYGsHQ2J3w" title="YouTube video player" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>
<p>For more information about this feature, please refer to our <a href="https://www.okteto.com/docs/self-hosted/administration/configuration/#gc" target="_blank" rel="noopener noreferrer" class="">documentation</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/slash-your-kubernetes-costs-during-development/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In conclusion, managing infrastructure costs associated with Kubernetes can be quite a challenge. However, with Okteto's Garbage Collector, you can smartly automate resource management, scaling down applications during periods of inactivity, and ensuring your cluster isn't running with unused workloads. This not only saves costs but also improves efficiency, allowing Platform Engineers and Developers to focus on more important tasks. So why wait? Start optimizing your cloud usage and cut back on unnecessary expenses by configuring the Garbage Collector for your Okteto installation today! For detailed steps on how to do this, refer to our accompanying video and documentation.</p>]]></content:encoded>
            <category>kubernetes</category>
        </item>
        <item>
            <title><![CDATA[Making Your Helm-Packaged Applications Ready for Cloud Native Development with Okteto]]></title>
            <link>https://www.okteto.com/blog/making-your-helm-packaged-applications-ready-for-cloud-native-development-with-okteto/</link>
            <guid>https://www.okteto.com/blog/making-your-helm-packaged-applications-ready-for-cloud-native-development-with-okteto/</guid>
            <pubDate>Fri, 01 Sep 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[In this article, we will explore how you can leverage existing Helm Charts for your apps to spin up cloud native dev environments with the help of Okteto.]]></description>
            <content:encoded><![CDATA[<p>Helm, often referred to as the "package manager for Kubernetes," is a powerful tool that streamlines the installation and management of cloud native applications with Kubernetes. It simplifies deployment complexities and brings efficiency to release your applications for Kubernetes. By packaging applications as Helm Charts, platform engineers can create reusable components that encapsulate all the Kubernetes resources needed for an application and its runtime configuration.</p>
<!-- -->
<p>In this article, we will explore how you can leverage existing Helm Charts for your applications to spin up cloud native development environments for the developers on your team with the help of Okteto.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-okteto-can-do-for-you">What Okteto Can Do for You<a href="https://www.okteto.com/blog/making-your-helm-packaged-applications-ready-for-cloud-native-development-with-okteto/#what-okteto-can-do-for-you" class="hash-link" aria-label="Direct link to What Okteto Can Do for You" title="Direct link to What Okteto Can Do for You" translate="no">​</a></h2>
<p>Okteto empowers platform engineers to automate and streamline the modern development experience, by enabling provisioning of self-service dev environments for developers that closely resemble production. These environments cater to all stages of the development lifecycle, from coding until deployment.</p>
<p>By deploying applications for development on Kubernetes and automating the provisioning of any necessary additional resources, Okteto bridges the gap between dev and prod. If your applications are already packaged as Helm Charts, you can effortlessly leverage them to create dev environments for every developer and stage across the lifecycle. This ensures two things that make a significant impact on the speed of the development experience:</p>
<ul>
<li class="">Developers have the ability to work in a realistic production-like environment and not waste time configuration environments. By utilizing the same helm charts for both spinning up development environments and deploying applications to production, you ensure that the development team operates in an environment that closely mirrors the production setup. This eliminates the occurrence of bugs and security vulnerabilities that often arise due to configuration discrepancies between development and production. Say goodbye to late-stage surprises in the software development lifecycle.</li>
<li class="">Developers are freed from the cognitive load of setting up these environments and worrying about managing Kubernetes. With Okteto's manifest-driven development environments, once platform engineers write all the configuration for creating a developer environment, developers simply need to log into their Okteto instance and click the launch button. This eliminates the need for them to do anything else to get things up and running. It also ensures they don't have to deal with Kubernetes themselves and spend time learning it.</li>
</ul>
<p>Okteto comes with a ready-to-use Manifest for effortless platform automation, allowing you to easily define, automate, and govern all your environments. Let's explore how we can create an Okteto Manifest to set up modern development environments for a todo list application that has already been packaged as a helm chart.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://www.okteto.com/blog/making-your-helm-packaged-applications-ready-for-cloud-native-development-with-okteto/#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<p>Before diving into writing the Okteto manifest, let me provide some details about the application we'll be working with. This will help you draw parallels with your own application and make it easier for you to write your own Okteto manifest.</p>
<p>Our <a href="https://github.com/okteto/oktetodo" target="_blank" rel="noopener noreferrer" class="">sample todo list application</a> consists of three microservices placed in one repository:</p>
<ol>
<li class="">A React Frontend (<a href="https://github.com/okteto/oktetodo/tree/main/client" target="_blank" rel="noopener noreferrer" class="">client</a>) responsible for the UI.</li>
<li class="">A Node.js Express (<a href="https://github.com/okteto/oktetodo/tree/main/server" target="_blank" rel="noopener noreferrer" class="">server</a>) backend that communicates with the UI and the database.</li>
<li class="">A Postgres Database (<a href="https://github.com/okteto/oktetodo/tree/main/db" target="_blank" rel="noopener noreferrer" class="">db</a>) used to store the todos</li>
</ol>
<p>Within the directory for each service, you will find a folder named <code>chart</code> that contains the helm chart for deploying the respective service. It is important to note that in the <code>deployment.yaml</code>, the container image for the client and server service is kept configurable instead of being hardcoded. Pay close attention to this detail as we will come back to this later.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token comment" style="color:rgb(106, 153, 85)"># oktetodo/client/chart/templates/client-deployment.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">spec</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">containers</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> client</span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">image</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> .Values.image </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">ports</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">containerPort</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3000</span><br></div></code></pre></div></div>
<p>This is crucial because it provides you with the flexibility to pass different versions of the container (such as prod or a branch) while maintaining the same manifest, rather than being stuck with a fixed hardcoded image that was pushed to your image registry weeks ago. The best part is that Okteto automates the image building and pushing steps, freeing developers from these tasks. We will delve into more details on this topic later when we explore how we pass the built image to these deployments.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="writing-the-okteto-manifest-for-helm-packaged-applications">Writing the Okteto Manifest for Helm Packaged Applications<a href="https://www.okteto.com/blog/making-your-helm-packaged-applications-ready-for-cloud-native-development-with-okteto/#writing-the-okteto-manifest-for-helm-packaged-applications" class="hash-link" aria-label="Direct link to Writing the Okteto Manifest for Helm Packaged Applications" title="Direct link to Writing the Okteto Manifest for Helm Packaged Applications" translate="no">​</a></h2>
<p>Now that you're familiar with the application's appearance, let's move on to creating our <a href="https://www.okteto.com/docs/reference/manifest/" target="_blank" rel="noopener noreferrer" class="">Okteto Manifest</a>. This manifest encompasses three key sections that configure your development environments and the experience:</p>
<ol>
<li class="">Build: This section outlines the instructions for building images for various services within your application.</li>
<li class="">Deploy: Here, you define how Okteto deploys your application, setting up your development environment.</li>
<li class="">Dev: This section contains the configuration for remote development containers for each of your microservices.</li>
</ol>
<p>The Okteto manifest offers <a href="https://www.okteto.com/docs/reference/manifest/#dev-object-optional" target="_blank" rel="noopener noreferrer" class="">numerous options</a> to customize the behavior of your development containers. However, for simplicity's sake, let's explore a simple Okteto Manifest for this application to start with.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">build</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">server</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">context</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> server</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">client</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">context</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> client</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">deploy</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Deploy the DB</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">command</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> helm upgrade </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">install db db/chart</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Deploy the Node.js Backend</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">command</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> helm upgrade </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">install server server/chart </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">set image=$</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain">OKTETO_BUILD_SERVER_IMAGE</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Deploy the React Frontend</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">command</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> helm upgrade </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">install client client/chart </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">set image=$</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain">OKTETO_BUILD_CLIENT_IMAGE</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">dev</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">server</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">command</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> bash</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">sync</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> server</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">/app</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">client</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">command</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> bash</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">sync</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> client</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">/app</span><br></div></code></pre></div></div>
<p>In the build section, we define the location of the Dockerfile for each of our microservices. This allows Okteto to build container images using the latest code from the repository when developers launch their development environments. We use the <code>context</code> parameter to specify the folders where the Dockerfile for each microservice resides. Additionally, you can utilize the <code>dockerfile</code> key to precisely indicate the exact location of the Dockerfile.</p>
<p>The deploy section is where we execute the Helm commands to deploy our application's Helm charts to the Kubernetes cluster used for development. Remember our earlier discussion about not hardcoding the container image name in the deployment YAMLs for our application's microservices?</p>
<p>Here, we define values for those container images. With Okteto, you can reference the images it builds in the <code>build</code> step within the deploy section using the <code>$OKTETO_BUILD_SERVICENAME_IMAGE</code> variable. To reiterate, the benefit of this approach is that the development environments are always set up with the latest code, rather than relying on older images that were built and pushed a long time ago. And like we discussed earlier, all the image building and pushing is handled by Okteto so developers don't have to worry about anything.</p>
<p>In the dev section, we define the configuration of the dev containers for each of the microservices. The <code>command</code> key tells Okteto what command to run by default when developers replace the running container for the service with a dev container by running <code>okteto up</code>. And the <code>sync</code> key tells Okteto what folders on your local machine to sync with the folders inside the container. You would usually sync where your service's code lives locally to the working directory you specified in the Dockerfile for your service.</p>
<p>That's it! You've completed all the necessary configuration to make your Helm packaged application ready for development on Okteto. You can try running <code>okteto deploy</code> from the root of your cloned repo to see if everything is working as expected. Once you've done this, you can make your application available for cloud native development to your developers by adding it to your <a href="https://www.okteto.com/docs/cloud/launch-from-catalog/" target="_blank" rel="noopener noreferrer" class="">Okteto Catalog</a>.</p>
<p>Please note that if you wish Okteto to automatically generate endpoints for your application services, you will need to include the following annotation in your application's ingress YAML file:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">annotations</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">dev.okteto.com/generate-host</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"true"</span><br></div></code></pre></div></div>
<p>You can read more about this <a href="https://www.okteto.com/docs/cloud/ssl/" target="_blank" rel="noopener noreferrer" class="">here</a> in the docs.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/making-your-helm-packaged-applications-ready-for-cloud-native-development-with-okteto/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In this article, we explored how easily you can prepare your Helm packaged applications for cloud native development using Okteto. This approach offers numerous platform benefits, such as unified, automated, and governed environments throughout your modern software delivery lifecycle. If you're interested in learning more about the advantages Okteto brings to your organization's development experience, be sure to check out our <a href="https://www.okteto.com/platform-features/" target="_blank" rel="noopener noreferrer" class="">Platform Features</a>.</p>
<p>If you're convinced that enabling a modern, cloud-native development experience for your team is the way to go, <a href="https://www.okteto.com/free-trial/" target="_blank" rel="noopener noreferrer" class="">sign up</a> for our free self-hosted trial and get started today.</p>]]></content:encoded>
            <category>helm</category>
            <category>kubernetes</category>
        </item>
        <item>
            <title><![CDATA[Five Challenges with Developing Locally Using Docker Compose]]></title>
            <link>https://www.okteto.com/blog/five-challenges-with-developing-locally-using-docker-compose/</link>
            <guid>https://www.okteto.com/blog/five-challenges-with-developing-locally-using-docker-compose/</guid>
            <pubDate>Tue, 15 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[After the popularization of containers, a lot of the development workflow started leaning on Docker Compose. Developers would have a Docker Compose file which defined how to build the container images for all their services, what ports to expose, and have volumes attached to their containers. They would then run the containers locally and leverage the attached volumes to develop their application. However, there are a lot of limitations in this flow which not only hamper developer productivity but can also cause security issues and bugs. Let's discuss some of these and see how using Okteto you can fix these problems.]]></description>
            <content:encoded><![CDATA[<p>After the popularization of containers, a lot of the development workflow started leaning on Docker Compose. Developers would have a Docker Compose file which defined how to build the container images for all their services, what ports to expose, and have volumes attached to their containers. They would then run the containers locally and leverage the attached volumes to develop their application. However, there are a lot of limitations in this flow which not only hamper developer productivity but can also cause security issues and bugs. Let's discuss some of these and see how using Okteto you can fix these problems.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="running-things-locally-isnt-practical-for-modern-development">Running Things Locally Isn't Practical for Modern Development<a href="https://www.okteto.com/blog/five-challenges-with-developing-locally-using-docker-compose/#running-things-locally-isnt-practical-for-modern-development" class="hash-link" aria-label="Direct link to Running Things Locally Isn't Practical for Modern Development" title="Direct link to Running Things Locally Isn't Practical for Modern Development" translate="no">​</a></h2>
<p>When dealing with just a couple of containers running simple microservices, developers might not encounter any issues. However, as they scale up the number of microservices or run more demanding workloads, even the most powerful development machine will start experiencing bottlenecks. This is especially true for modern cloud-native applications we develop today. They typically consist of 10 to 50 different microservices, which is impractical to run locally. Not only does it slow down development, but restarting or spinning up everything again severely hampers productivity.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="this-is-not-how-you-run-containers-in-production">This is Not How You Run Containers in Production<a href="https://www.okteto.com/blog/five-challenges-with-developing-locally-using-docker-compose/#this-is-not-how-you-run-containers-in-production" class="hash-link" aria-label="Direct link to This is Not How You Run Containers in Production" title="Direct link to This is Not How You Run Containers in Production" translate="no">​</a></h2>
<p>One significant issue is that running containers with Docker Compose on local machines differs from how it's done in production. Instead of directly running containers, production environments leverage Kubernetes resources like Deployments or StatefulSets. Consequently, developing locally with Docker Compose means working in an environment that deviates from production. This discrepancy increases the likelihood of bugs that are difficult to identify, such as misspelt environment variables or other similar issues. To ensure stability and avoid unexpected surprises upon deployment, it is crucial to develop in a realistic environment.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="environments-arent-reproducible">Environments Aren't Reproducible<a href="https://www.okteto.com/blog/five-challenges-with-developing-locally-using-docker-compose/#environments-arent-reproducible" class="hash-link" aria-label="Direct link to Environments Aren't Reproducible" title="Direct link to Environments Aren't Reproducible" translate="no">​</a></h2>
<p>When developers launch their application using `docker-compose up`, they cannot launch another instance of the application to experiment or try out a different version or commit. Technically, they could rename things and then run them again, but not only is that inconvenient, it also significantly impacts the performance of the local machine. Consequently, the developer's creativity and freedom become restricted.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sharing-work-is-tough">Sharing Work is Tough<a href="https://www.okteto.com/blog/five-challenges-with-developing-locally-using-docker-compose/#sharing-work-is-tough" class="hash-link" aria-label="Direct link to Sharing Work is Tough" title="Direct link to Sharing Work is Tough" translate="no">​</a></h2>
<p>After implementing a feature or bug fix for the application, sharing it with someone on the team instantly and effortlessly becomes a challenge. Engineers need to commit and push their changes, and then someone else on the team has to pull them and run `docker compose up` to see the updates. If any further changes are requested, they have to repeat the entire process. This inefficient iteration process significantly slows down the velocity at which developers can deliver code. Additionally, this approach excludes team members from other departments such as product, sales, and marketing, who may not have the expertise to run Docker on their local machines. As a result, feedback from these teams is delayed in the software delivery cycle. However, with Okteto (as we'll soon explore), this feedback can be provided much sooner, streamlining the entire development process.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="end-to-end-tests">End to End Tests<a href="https://www.okteto.com/blog/five-challenges-with-developing-locally-using-docker-compose/#end-to-end-tests" class="hash-link" aria-label="Direct link to End to End Tests" title="Direct link to End to End Tests" translate="no">​</a></h2>
<p>While Docker Compose is useful for bringing up all the services of your application locally, it doesn't replicate the realistic environment of production. As a result, running end-to-end tests on your application using Docker Compose may not yield the expected results. Furthermore, only the developer running the application locally can test it, making it difficult to share endpoints for testing with other teams.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-okteto-fixes-these-problems-and-improves-the-docker-compose-workflow">How Okteto Fixes These Problems and Improves the Docker Compose Workflow<a href="https://www.okteto.com/blog/five-challenges-with-developing-locally-using-docker-compose/#how-okteto-fixes-these-problems-and-improves-the-docker-compose-workflow" class="hash-link" aria-label="Direct link to How Okteto Fixes These Problems and Improves the Docker Compose Workflow" title="Direct link to How Okteto Fixes These Problems and Improves the Docker Compose Workflow" translate="no">​</a></h2>
<p>Okteto takes your Docker Compose application and translates your application services into Kubernetes resources, deploying them on a cluster. This ensures that developers can begin development in an environment that closely resembles production. Additionally, by not running any containers locally, the local machine's resources are not constrained, regardless of the demands of the application. What's even better is that developers can deploy their application, or different versions of it, to different Okteto Namespaces, allowing for multiple copies. This approach treats each environment as ephemeral, enabling them to quickly spin up new instances as needed.</p>
<p>Okteto solves another pain point by creating endpoints instead of providing access to your application on localhost. These endpoints reflect live changes you make to your code, enabling you to easily share your work and receive feedback from your team. No need for developers to commit their changes or for other team members to run Docker on their machines. Moreover, these endpoints allow you to run realistic E2E tests on your application. If you'd like to learn more, check out <a href="https://www.okteto.com/blog/the-modern-way-of-sharing-dev-work-with-your-team/" target="_blank" rel="noopener noreferrer" class="">this</a> article.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="trying-out-okteto">Trying Out Okteto!<a href="https://www.okteto.com/blog/five-challenges-with-developing-locally-using-docker-compose/#trying-out-okteto" class="hash-link" aria-label="Direct link to Trying Out Okteto!" title="Direct link to Trying Out Okteto!" translate="no">​</a></h2>
<p>Running your Docker Compose applications on the cloud with Okteto is a breeze. Sign up for our self-hosted free trial <a href="https://www.okteto.com/signup/" target="_blank" rel="noopener noreferrer" class="">here</a>. Once you have Okteto installed on your cluster, check out this video to learn how to get your Docker Compose applications up and running with Okteto!</p>
<div class="embed_uCA2"><iframe src="https://www.youtube-nocookie.com/embed/h_DuH9xkxDQ" title="YouTube video player" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>]]></content:encoded>
            <category>docker-compose</category>
            <category>docker</category>
        </item>
        <item>
            <title><![CDATA[The Way You're Using Kubernetes Clusters During Development Is Killing Productivity!]]></title>
            <link>https://www.okteto.com/blog/the-way-you-re-using-kubernetes-clusters-during-development-is-killing-productivity/</link>
            <guid>https://www.okteto.com/blog/the-way-you-re-using-kubernetes-clusters-during-development-is-killing-productivity/</guid>
            <pubDate>Thu, 27 Jul 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Transitioning from development to production is always challenging. There's that underlying fear of overlooking something crucial, such as misconfigurations or misspelled environment variables, which can lead to broken systems. The advent of Kubernetes and other cloud-native technologies has further compounded this complexity. In this article, we will delve into the prevalent strategies that organizations employ to tackle these challenges, examine their possible limitations, and explore how Okteto not only resolves those issues but also provides valuable additional features!]]></description>
            <content:encoded><![CDATA[<p>Transitioning from development to production is always challenging. There's that underlying fear of overlooking something crucial, such as misconfigurations or misspelled environment variables, which can lead to broken systems. The advent of Kubernetes and other cloud-native technologies has further compounded this complexity. In this article, we will delve into the prevalent strategies that organizations employ to tackle these challenges, examine their possible limitations, and explore how Okteto not only resolves those issues but also provides valuable additional features!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-organizations-have-tried-to-keep-up">How Organizations Have Tried to Keep Up<a href="https://www.okteto.com/blog/the-way-you-re-using-kubernetes-clusters-during-development-is-killing-productivity/#how-organizations-have-tried-to-keep-up" class="hash-link" aria-label="Direct link to How Organizations Have Tried to Keep Up" title="Direct link to How Organizations Have Tried to Keep Up" translate="no">​</a></h2>
<p>The most common approach involves setting up a shared cluster, allowing developers to deploy and test their applications before moving them to production. Although organizations may use different terms like "staging environments," "preview clusters," or "testing clusters," they essentially serve the same purpose. It may appear promising on paper, but in reality, it falls short. Let me explain why.</p>
<ul>
<li class="">Limited clusters can lead to waiting times as teams have to take turns using them. This can cause delays in fast shipping, as one team's use of a cluster prevents another team from accessing it.</li>
<li class="">Shared environments also carry the risk of one team's changes affecting another team's project, potentially causing unexpected bugs or system instabilities. Additionally, resetting the application and environment after each team's usage to start anew can be a time-consuming task.</li>
<li class="">Moreover, assuming that developers possess the necessary expertise in Kubernetes for application deployment and troubleshooting is unfair. This expectation also adds to the cognitive burden on developers, diverting their focus from working on the application itself.</li>
<li class="">It is crucial to alleviate this cognitive burden on developers. Yet, the alternative should not be a constant reliance on Platform or DevOps engineers for support. Always having to depend on another team member inevitably leads to delays and slows the delivery cycle.</li>
</ul>
<p>When these issues are combined, they result in a bad development experience. This not only causes dissatisfaction among developers and platform engineers but also hampers productivity.</p>
<aside class="highlight_CGlU"><p>Homa Games, a prominent platform in the "hypercasual" mobile games category, encountered similar challenges. Discover more about their obstacles and the strategies they implemented to overcome them by clicking <a href="https://www.okteto.com/customers/homa-games/#the-challenge" target="_blank" rel="noopener noreferrer" class="">here</a>.</p></aside>
<p>While it may seem like granting each developer access to their own dedicated cluster is a viable solution, it is not a practical approach. It can incur significant costs for an organization and still encounter the same issues mentioned earlier. So, what does the ideal solution look like?</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-okteto-helps-boost-productivity-and-provides-a-great-development-experience">How Okteto Helps Boost Productivity and Provides a Great Development Experience<a href="https://www.okteto.com/blog/the-way-you-re-using-kubernetes-clusters-during-development-is-killing-productivity/#how-okteto-helps-boost-productivity-and-provides-a-great-development-experience" class="hash-link" aria-label="Direct link to How Okteto Helps Boost Productivity and Provides a Great Development Experience" title="Direct link to How Okteto Helps Boost Productivity and Provides a Great Development Experience" translate="no">​</a></h2>
<p>Okteto addresses this challenge by enabling platform engineers to unify and automate the provisioning of self-serviced ephemeral environments for developers. These environments deploy the application on Kubernetes and allow developers to develop and test it there directly. There's quite a lot to unpack in that first statement. Let's explore the details:</p>
<ul>
<li class=""><strong>Unified</strong>: Okteto unifies development and production environments, bridging the gap between the two. With Okteto you can spin up development and preview environments using the same manifests you use to deploy to producion, ensuring developers on your team are always wotking in realisitic environments. This minimizes bugs and enhances security.</li>
<li class=""><strong>Automated</strong>: Using Okteto, platform engineers can describe everything about how a development environment should be provisioned in the Okteto manifest. This means once this manifest has been created, they no longer have to do anything manually to deploy the application for developers on Kubernetes and spin up dev environments.</li>
<li class=""><strong>Self-Serviced</strong>: With Okteto, each developer gets access to as many namespaces as they need in a Kubernetes cluster, allowing them to effortlessly deploy, develop, and test any application they want at the click of a button - <strong>whenever they want</strong>, without having to rely on DevOps engineers to do any provisioning. Additionally, it automatically puts these namespaces to sleep when they are not actively being developed, ensuring optimal resource utilization.</li>
<li class=""><strong>Ephemeral</strong>: The environments provisioned by Okteto are designed to be ephemeral. After completing their work and merging the code, developers can delete the environment and launch a new one with the latest commits. This eliminates the need for developers to manually keep their environment up to date with the latest code, as is often required when developing locally. This also makes it easier for developers to do experiments and try different things out fast. With the ability to maintain multiple environments in different states (including long term testing and different branches in development), developers now have the flexibility to iterate and innovate with ease. With Okteto, developers can effortlessly spin up a new environment based on the exact commit and version of the application they want.</li>
</ul>
<p>It is these features that make it a better option than having a cluster that gets shared among different teams. Platform engineers can simply install Okteto on a cluster and then give access to their developers and get rid of all the problems we discussed earlier.</p>
<p>The cherry on top is that you also get a bunch of other useful features. With Okteto, development teams can experience the ultimate "shift left" approach. Okteto eliminates the need for developers to wait until they have pushed all their commits and cut a release to test their code on a production-like Kubernetes environment. Okteto exposes endpoints after deploying your application, which allows you to see the changes of the code you write as soon as you hit save. This is great for testing things <strong>as you develop</strong> instead of having to wait till you've committed and pushed your code. Additionally, it provides the reassurance that your changes won't cause any issues when you do push them, as you're developing in an environment identical to production. If you're interested in delving deeper into this topic, I recommend checking out this <a href="https://www.okteto.com/blog/the-modern-way-of-sharing-dev-work-with-your-team/" target="_blank" rel="noopener noreferrer" class="">other article</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/the-way-you-re-using-kubernetes-clusters-during-development-is-killing-productivity/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Developing and testing cloud native applications has always been complex. Traditional methods bring pitfalls - shipping delays, system instabilities, and reliance on DevOps and cloud expertise. Okteto changes the game! It automates the provisioning of self-served ephemeral Kubernetes environments, eliminating the need for sharing clusters and waiting for other teams. Developers can spin up Kubernetes-based dev environments with a click! But that's not all. Okteto offers the ultimate "shift left" experience. Develop and test your code in real-time, in a production-like environment, without waiting to commit and push. Exciting, right?</p>
<p>If you're interested in seeing firsthand the impact of Okteto in boosting organizations’ developer productivity, take a look at our <a href="https://www.okteto.com/customers/monday-com/" target="_blank" rel="noopener noreferrer" class="">case study</a> on <a href="http://monday.com/" target="_blank" rel="noopener noreferrer" class="">monday.com</a>. <a href="https://www.okteto.com/customers/monday-com/" target="_blank" rel="noopener noreferrer" class="">Discover</a> how Okteto played a pivotal role in accelerating their developer velocity by an impressive 50%!</p>
<p>So what are you waiting for? Try Okteto today and experience the difference firsthand!</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Ready to see the magic of Okteto yourself?</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/free-trial/" target="_self">Try Free</a></div></section>]]></content:encoded>
            <category>Development Experience</category>
        </item>
        <item>
            <title><![CDATA[Okteto Achieves SOC 2 Type 1 Compliance]]></title>
            <link>https://www.okteto.com/blog/okteto-soc-2-type-1/</link>
            <guid>https://www.okteto.com/blog/okteto-soc-2-type-1/</guid>
            <pubDate>Mon, 24 Jul 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[We’re excited to announce that Okteto has successfully passed a third-party audit and received a SOC 2® Type I report.]]></description>
            <content:encoded><![CDATA[<p>We’re excited to announce that Okteto has successfully passed a third-party audit and received a SOC 2® Type I report. This achievement is more than just an accolade; it's a testament to our unwavering commitment to safeguarding our customers' data.</p>
<!-- -->
<p>We completed an independent audit, with the support of Strike Graph, confirming Okteto's controls related to our information security practices, policies, procedures and operations met the rigorous SOC 2 standards for security, availability, processing, integrity, confidentiality, and privacy as developed by the American Institute of Certified Public Accountants (AICPA).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-does-soc-2-compliance-mean-for-you">What Does SOC 2 Compliance Mean for You?<a href="https://www.okteto.com/blog/okteto-soc-2-type-1/#what-does-soc-2-compliance-mean-for-you" class="hash-link" aria-label="Direct link to What Does SOC 2 Compliance Mean for You?" title="Direct link to What Does SOC 2 Compliance Mean for You?" translate="no">​</a></h2>
<p>SOC 2 is a technical audit designed to ensure that service providers securely manage your data to protect the interests of your organization and the privacy of your customers. By achieving this compliance, we have demonstrated that we have reliable and effective controls in place to safeguard your sensitive data.</p>
<p>In addition, SOC 2 compliance gives you confidence that Okteto is dependable and secure. It means that our solutions are built with security measures to protect your data from unauthorized access and use. Moreover, it demonstrates that Okteto takes data security seriously and is dedicated to keeping customers' trust and loyalty.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-trust-our-priority">Your Trust, Our Priority<a href="https://www.okteto.com/blog/okteto-soc-2-type-1/#your-trust-our-priority" class="hash-link" aria-label="Direct link to Your Trust, Our Priority" title="Direct link to Your Trust, Our Priority" translate="no">​</a></h2>
<p>At Okteto, we understand the trust you place in us when you entrust us with your critical data. We value your security and prioritize your privacy above all else. We thank you for choosing Okteto and assure you that we will continue to serve you with the highest standards of security and trust.</p>
<p>"At Okteto, we are deeply committed to providing a secure and reliable platform for our customers," said Ramiro Berrelleza, CEO of Okteto. We're proud to have successfully achieved this compliance and will continue our commitment to providing a secure platform and processes for our customers. With SOC 2 compliance, you can trust that Okteto is the right choice for your cloud native development needs."</p>
<p>While we take a moment to celebrate this achievement, we understand that maintaining and enhancing our security posture is a continuous journey in guiding our customers to <a href="https://www.okteto.com/build-development-experiences/" target="_blank" rel="noopener noreferrer" class="">building world-class development experiences</a> for their organizations. We will continue to invest in robust security measures and prioritize transparency in our processes.</p>
<p>Thank you for being a part of our journey. Here's to many more milestones together!</p>]]></content:encoded>
            <category>SOC 2</category>
            <category>compliance</category>
        </item>
        <item>
            <title><![CDATA[Using ArgoCD With Okteto for a Unified Kubernetes Development Experience]]></title>
            <link>https://www.okteto.com/blog/using-argocd-with-okteto-for-a-unified-kubernetes-development-experience/</link>
            <guid>https://www.okteto.com/blog/using-argocd-with-okteto-for-a-unified-kubernetes-development-experience/</guid>
            <pubDate>Thu, 13 Jul 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[ArgoCD is a powerful tool for continuous deployment that leverages Git repositories as the ultimate source of truth for managing Kubernetes deployments. As a CNCF project, it has garnered tremendous popularity in recent years due to its user-friendly interface, adherence to GitOps principles, and enhancements to the software delivery lifecycle. In this article, let's explore the capabilities of ArgoCD, the benefits of incorporating it into your dev lifecycle, and understand how it can help create a unified development experience with Okteto!]]></description>
            <content:encoded><![CDATA[<p>ArgoCD is a powerful tool for continuous deployment that leverages Git repositories as the ultimate source of truth for managing Kubernetes deployments. As a CNCF project, it has garnered tremendous popularity in recent years due to its user-friendly interface, adherence to GitOps principles, and enhancements to the software delivery lifecycle. In this article, let's explore the capabilities of ArgoCD, the benefits of incorporating it into your dev lifecycle, and understand how it can help create a unified development experience with Okteto!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-does-argocd-actually-do">What Does ArgoCD Actually Do?<a href="https://www.okteto.com/blog/using-argocd-with-okteto-for-a-unified-kubernetes-development-experience/#what-does-argocd-actually-do" class="hash-link" aria-label="Direct link to What Does ArgoCD Actually Do?" title="Direct link to What Does ArgoCD Actually Do?" translate="no">​</a></h2>
<p>GitOps principles advocate for the use of Git repositories as the sole source of truth for application infrastructure and configuration. The concept revolves around storing all application-related files and manifests in a Git repository and using it as the central management hub for deployments. ArgoCD aligns with these principles by treating the configuration stored in a Git repository as the desired state for the application deployment, effortlessly deploying it to the specified target environment. What sets it apart is the inclusion of a Controller that continuously monitors the deployed application, ensuring synchronization with the manifests in the repository. In case of inconsistencies, ArgoCD empowers you to reconcile the differences through a single command or the click of a button.</p>
<p>Using ArgoCD for application deployment offers several benefits:</p>
<ol>
<li class="">It maintains an up-to-date documentation of your application's deployment configuration in a version control system.</li>
<li class="">Rollbacks are as simple as reverting a commit, making it easy to undo changes.</li>
<li class="">It enables effortless modifications to deployments simply by merging pull requests.</li>
<li class="">It monitors the cluster to ensure that the deployed application aligns with the manifests in the git repositories, maintaining the desired state accurately.</li>
</ol>
<p>As you delve into the rising popularity of ArgoCD, it becomes evident that its appeal is no surprise. However, it prompts an important question: if you're already leveraging ArgoCD for production deployments, why not extend its usage to manage your development deployments as well?</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-integrate-argocd-with-okteto">Why Integrate ArgoCD with Okteto<a href="https://www.okteto.com/blog/using-argocd-with-okteto-for-a-unified-kubernetes-development-experience/#why-integrate-argocd-with-okteto" class="hash-link" aria-label="Direct link to Why Integrate ArgoCD with Okteto" title="Direct link to Why Integrate ArgoCD with Okteto" translate="no">​</a></h2>
<p>In the industry, it has been widely believed that exactly replicating production environments during development is impractical, mainly due to cost, resource, and technological constraints. This notion became even more daunting with the shift towards distributed architectures and cloud services, as complexity continued to rise. Microservices and containerization have heightened the significance of bridging the gap between development and production. The complexity of microservice-based applications amplifies the likelihood of issues arising in production if not caught early on. But fear not, there is a solution: Okteto.</p>
<p>Okteto empowers platform engineers to automate the modern development experience by provisioning self-serviced production-like dev environments. These environments are for all stages of the dev lifecycle: from coding, until deployment. Okteto comes with ready-to-use Manifest and platform automation to make environments easy to define, control, and govern.</p>
<p>These environments deploy applications on Kubernetes and provision any additional necessary resources. If you're already using ArgoCD to manage your production deployments, it can seamlessly integrate with Okteto. This means you don't have to put in extra effort to recreate your production configuration. This approach ensures a single source of truth for both production and development configuration. And the benefits of ArgoCD, such as easy deployment changes through PR merges and seamless rollback options, extend to the development phase as well.</p>
<p>By leveraging Okteto's capabilities, you gain a faster inner loop in your development workflow. With Okteto, you can make changes to your code and test them quickly, without the need for committing to the repository right away. This allows you to iterate and validate your changes faster, ensuring a smoother development experience. Once you're satisfied with your changes, you can commit them, triggering the ArgoCD deployment logic, and exercise your deployment workflow as intended. This combination of Okteto and ArgoCD provides the best of both worlds: the speed and flexibility of Okteto's fast inner loop development, and the reliability and consistency of ArgoCD's GitOps model tied to commits and deployment logic.</p>
<p>By embracing the Okteto Experience and aligning your development and production environments, you can bridge the gap and create a unified, modern development experience for your team.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Interested?</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/get-demo/" target="_self">Get a demo</a></div></section>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-use-argocd-with-okteto">How to Use ArgoCD with Okteto<a href="https://www.okteto.com/blog/using-argocd-with-okteto-for-a-unified-kubernetes-development-experience/#how-to-use-argocd-with-okteto" class="hash-link" aria-label="Direct link to How to Use ArgoCD with Okteto" title="Direct link to How to Use ArgoCD with Okteto" translate="no">​</a></h2>
<p>Now that you recognize the value of using ArgoCD for your development environments as well, let's explore how you can achieve this with Okteto. When utilizing Okteto, all the configuration for your development environment resides in a single manifest known as <code>okteto.yaml</code>. A typical <code>okteto.yaml</code> consists of three sections:</p>
<ul>
<li class=""><code>build</code>: This section specifies how to build images for different services as part of your application.</li>
<li class=""><code>deploy</code>: Here, you define how Okteto deploys your application to set up your development environment.</li>
<li class=""><code>dev</code>: This section contains the configuration for development containers for each of your microservices.</li>
</ul>
<p>As the name implies, the deploy section is where we leverage ArgoCD to deploy our application to the development environment, mirroring the production setup. If you have prior experience using ArgoCD for production deployments, you are familiar with the typical flow:</p>
<ol>
<li class="">Running <code>argocd app create</code> to create your application.</li>
<li class="">Running <code>argocd app sync</code> to fetch manifests from the specified repository and deploy them to your Kubernetes cluster.</li>
</ol>
<p>We will follow this exact process in the deploy section of our Okteto manifest. To demonstrate, we have created a "Hello, World!" Go server. You can find the code and detailed instructions in the repository <a href="https://github.com/RinkiyaKeDad/simple-go-server" target="_blank" rel="noopener noreferrer" class="">here</a>. Upon examining the deploy section in the Okteto manifest, you will notice the following commands:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">deploy</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> argocd app create simple</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">go</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">server </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">repo https</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">//github.com/rinkiyakedad/simple</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">go</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">server.git </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">path k8s </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">dest</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">server https</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">//kubernetes.default.svc </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">dest</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">namespace $OKTETO_NAMESPACE</span><br></div><div class="token-line" style="color:white"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> argocd app sync simple</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">go</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">server</span><br></div></code></pre></div></div>
<p>For the <code>argocd app create</code> we specify the location of our manifests by providing the <code>--repo</code> and <code>--path</code> flags. You should replace these with the location of your application manifests.</p>
<p>As the name suggests, the <code>--dest-namespace</code> flag tells ArgoCD which namespace to deploy your application to. Since we want this namespace to be the one that the developers specify when running <code>okteto up</code> we use the <code>$OKTETO_NAMESPACE</code> environment variable here. The installation job automatically populates this variable with the namespace you specify when running <code>okteto up</code> (or your default dev namespace if you don’t specify anything).</p>
<p>This is the only configuration that platform engineers need to do in order to use their production manifests for development environments. ArgoCD will ensure that each developer's environment matches the state specified in the manifests from the designated repository.</p>
<p>While the example application is a single microservice and assumes that ArgoCD and Okteto are installed in the same cluster, the core concept of using ArgoCD with Okteto remains the same: adding your ArgoCD deploy commands to the <code>deploy</code> section of the Okteto manifest. Regardless of your specific configuration, this approach holds true!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/using-argocd-with-okteto-for-a-unified-kubernetes-development-experience/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In this article, we explored how ArgoCD enhances the practices of continuous delivery by introducing GitOps into the workflow. We examined the benefits it offers through its approach of treating Git as the source of truth and continuously monitoring and reconciling the deployed application state with the one specified in Git repositories. Additionally, we discussed how ArgoCD, together with Okteto, simplifies the replication of production infrastructure during development. We delved into the advantages of this approach and examined a simple application that demonstrated how easily it can be accomplished.</p>
<p>In conclusion, integrating ArgoCD with Okteto can significantly streamline your modern development flow, ensuring that your development and production environment configurations are aligned seamlessly. By applying the same ArgoCD commands in the Okteto Manifest that you use for production deployments, you automate a standard, unified modern environment for the developers in your team. Remember, a well-structured and consistent development environment is a key foundation for successful modern app delivery.</p>
<p>Tools like ArgoCD are increasingly prevalent in the Kubernetes production ecosystem. That's why it's crucial for platform teams to utilize these very tools to seamlessly bridge the gap between development and production for their developers. Okteto not only provides platform teams with an easy, ready-to-use modern development experience but also enables them to unify development and production environments.</p>
<p>To explore the full potential of our platform, sign up for our <a href="https://www.okteto.com/free-trial/" target="_blank" rel="noopener noreferrer" class="">free 30-day trial</a>!</p>]]></content:encoded>
            <category>remote-development-environments</category>
            <category>kubernetes</category>
        </item>
        <item>
            <title><![CDATA[Okteto 1.8 Chart Release, CLI 2.16 and Support for Kubernetes 1.25]]></title>
            <link>https://www.okteto.com/blog/product-update-may-2023/</link>
            <guid>https://www.okteto.com/blog/product-update-may-2023/</guid>
            <pubDate>Fri, 02 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[We're excited to bring you another product update with several great new features and improvements to the Okteto experience.]]></description>
            <content:encoded><![CDATA[<p>We're excited to bring you another product update with several great new features and improvements to the Okteto experience.</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="may-highlights">May highlights<a href="https://www.okteto.com/blog/product-update-may-2023/#may-highlights" class="hash-link" aria-label="Direct link to May highlights" title="Direct link to May highlights" translate="no">​</a></h3>
<ul>
<li class="">Okteto 1.8 Chart Release</li>
<li class="">Change to ingress architecture that affects customers using their own ingress-controller</li>
<li class="">Okteto CLI 2.16 Release</li>
<li class="">Support for Kubernetes 1.25</li>
<li class="">Dropped support for Kubernetes 1.22</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="before-you-upgrade">Before you upgrade<a href="https://www.okteto.com/blog/product-update-may-2023/#before-you-upgrade" class="hash-link" aria-label="Direct link to Before you upgrade" title="Direct link to Before you upgrade" translate="no">​</a></h3>
<p>Okteto 1.8 includes a change in the ingress architecture. If you're using your own ingress controller instead of the ingress-controller embedded with Okteto chart, please checkout the updated section about <a href="https://www.okteto.com/docs/1.9/self-hosted/administration/configuration/#using-your-own-ingress-controller" target="_blank" rel="noopener noreferrer" class="">"How to use your own ingress controller"</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-features--improvements">New features &amp; improvements<a href="https://www.okteto.com/blog/product-update-may-2023/#new-features--improvements" class="hash-link" aria-label="Direct link to New features &amp; improvements" title="Direct link to New features &amp; improvements" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="updated-the-okteto-cli-to-version-216">Updated the Okteto CLI to version 2.16<a href="https://www.okteto.com/blog/product-update-may-2023/#updated-the-okteto-cli-to-version-216" class="hash-link" aria-label="Direct link to Updated the Okteto CLI to version 2.16" title="Direct link to Updated the Okteto CLI to version 2.16" translate="no">​</a></h3>
<p>The latest version of the Okteto CLI includes several new features and some bug fixes. You can find a more thorough overview of what's new in versions 2.15 and 2.16 in our documentation link below.</p>
<div class="button_B_vc"><a class="Button light layout" href="https://github.com/okteto/okteto/releases" target="_blank" rel="noopener noreferrer">Documentation<!-- --> →</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="added-support-for-kubernetes-125">Added support for Kubernetes 1.25<a href="https://www.okteto.com/blog/product-update-may-2023/#added-support-for-kubernetes-125" class="hash-link" aria-label="Direct link to Added support for Kubernetes 1.25" title="Direct link to Added support for Kubernetes 1.25" translate="no">​</a></h3>
<p>As part of our goal to maintain N-2 version support for Kubernetes, we've now added support for v1.25 to remain aligned with cloud infrastructure providers and the regular channel releases from the CNCF and Kubernetes community.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="added-an-installation-guide-to-the-okteto-ui-for-self-hosted-customers">Added an installation guide to the Okteto UI for Self-Hosted customers<a href="https://www.okteto.com/blog/product-update-may-2023/#added-an-installation-guide-to-the-okteto-ui-for-self-hosted-customers" class="hash-link" aria-label="Direct link to Added an installation guide to the Okteto UI for Self-Hosted customers" title="Direct link to Added an installation guide to the Okteto UI for Self-Hosted customers" translate="no">​</a></h3>
<p>We've added an in-app experience to the Okteto Admin UI showing the main steps in the Okteto installation process. You now have a source of truth within the Admin UI to gather necessary access credentials or other information to get Okteto installed within your environment even faster than before.</p>
<p>Each step in the guide is optional and can be skipped if it does not apply to your situation and provides documentation to help complete the step to ensure success with the process.</p>
<div class="button_B_vc"><a class="Button light layout" href="https://www.okteto.com/docs/1.9/administration/dashboard/#installation" target="_self">Documentation<!-- --> →</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="destroy-external-resources-from-the-okteto-ui">Destroy External Resources from the Okteto UI<a href="https://www.okteto.com/blog/product-update-may-2023/#destroy-external-resources-from-the-okteto-ui" class="hash-link" aria-label="Direct link to Destroy External Resources from the Okteto UI" title="Direct link to Destroy External Resources from the Okteto UI" translate="no">​</a></h3>
<p>You can now manually destroy External Resources from the Okteto UI that you provisioned as part of your <strong>deploy</strong> configuration, in the Okteto manifest, to ensure those resources don't remain active and idle when development of your application is complete.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="added-additional-icons-for-external-resources">Added additional icons for External Resources<a href="https://www.okteto.com/blog/product-update-may-2023/#added-additional-icons-for-external-resources" class="hash-link" aria-label="Direct link to Added additional icons for External Resources" title="Direct link to Added additional icons for External Resources" translate="no">​</a></h3>
<p>We've added additional icons to External Resources to improve the developer experience when interpreting the resources that are part of an application in Okteto. New icons include:</p>
<ul>
<li class="">AWS</li>
<li class="">GCP</li>
<li class="">LaunchDarkly</li>
<li class="">MongoDB</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="catalog-items-now-sorted-the-same-in-admin-and-developer-views">Catalog items now sorted the same in admin and developer views<a href="https://www.okteto.com/blog/product-update-may-2023/#catalog-items-now-sorted-the-same-in-admin-and-developer-views" class="hash-link" aria-label="Direct link to Catalog items now sorted the same in admin and developer views" title="Direct link to Catalog items now sorted the same in admin and developer views" translate="no">​</a></h3>
<p>Previously the two Catalog modals were sorted differently. Now both the admin and developer views should be defaulted sorted in the same way: alphabetically.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-added-for-bitbucket-personal-repositories">Support added for Bitbucket personal repositories<a href="https://www.okteto.com/blog/product-update-may-2023/#support-added-for-bitbucket-personal-repositories" class="hash-link" aria-label="Direct link to Support added for Bitbucket personal repositories" title="Direct link to Support added for Bitbucket personal repositories" translate="no">​</a></h3>
<p>We've improved the integration with Bitbucket to now support personal repositories. This gives customers an additional option to bring code repositories into Okteto for faster development.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="persistent-namespaces-can-no-longer-be-put-to-sleep-by-admins">Persistent namespaces can no longer be put to sleep by admins<a href="https://www.okteto.com/blog/product-update-may-2023/#persistent-namespaces-can-no-longer-be-put-to-sleep-by-admins" class="hash-link" aria-label="Direct link to Persistent namespaces can no longer be put to sleep by admins" title="Direct link to Persistent namespaces can no longer be put to sleep by admins" translate="no">​</a></h3>
<p>We've removed the option for admins to sleep a namespace that had been set to <strong>Keep Awake</strong> previously. This ensures that when a namespace is intended to persist garbage collection it cannot still be put in a sleep state and cause a confusing experience for developers of that namespace.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://www.okteto.com/blog/product-update-may-2023/#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="changed-default-value-for-buildkits-service-session-affinity">Changed default value for buildkit's service session affinity<a href="https://www.okteto.com/blog/product-update-may-2023/#changed-default-value-for-buildkits-service-session-affinity" class="hash-link" aria-label="Direct link to Changed default value for buildkit's service session affinity" title="Direct link to Changed default value for buildkit's service session affinity" translate="no">​</a></h3>
<p>This value has changed to <strong>None</strong> by default and will break your Okteto experience if you do not make a change to your buildkit configuration.</p>
<p>To keep using <strong>ClientIP</strong> as <strong>sessionAffinity</strong> you must set <strong>service.sessionAffinity: Client IP</strong> in your buildkit configuration.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-a-more-detailed-list">See a more detailed list<a href="https://www.okteto.com/blog/product-update-may-2023/#see-a-more-detailed-list" class="hash-link" aria-label="Direct link to See a more detailed list" title="Direct link to See a more detailed list" translate="no">​</a></h2>
<p>For a more detailed list of improvements, bug fixes, breaking changes, and deprecation notices please see <a href="https://www.okteto.com/docs/self-hosted/install/releases/#180" target="_blank" rel="noopener noreferrer" class="">our documentation</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Modern Way of Sharing Dev Work With Your Team]]></title>
            <link>https://www.okteto.com/blog/the-modern-way-of-sharing-dev-work-with-your-team/</link>
            <guid>https://www.okteto.com/blog/the-modern-way-of-sharing-dev-work-with-your-team/</guid>
            <pubDate>Fri, 02 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Collaboration is essential in modern application development. To iterate quickly, an efficient way to show and receive feedback on changes from everyone across your organization is necessary. This includes not only developers, but also product, sales, marketing, and design teams.]]></description>
            <content:encoded><![CDATA[<p>Collaboration is essential in modern application development. To iterate quickly, an efficient way to show and receive feedback on changes from everyone across your organization is necessary. This includes not only developers, but also product, sales, marketing, and design teams.</p>
<!-- -->
<p>In this article, we will examine how development teams traditionally share their work across the organization, the problems they encounter, and how switching to Okteto can solve these issues and unlock greater productivity for developers.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="problems-with-current-methods-of-sharing">Problems With Current Methods of Sharing<a href="https://www.okteto.com/blog/the-modern-way-of-sharing-dev-work-with-your-team/#problems-with-current-methods-of-sharing" class="hash-link" aria-label="Direct link to Problems With Current Methods of Sharing" title="Direct link to Problems With Current Methods of Sharing" translate="no">​</a></h2>
<p>Traditionally, if you're a developer who has just written code for your microservices-based application, getting feedback from someone can be a tedious process. Typically, it involves the following steps:</p>
<ul>
<li class="">Commit and push your code</li>
<li class="">Wait for CI processes to ensure your code hasn't broken the application</li>
<li class="">Your team member clones the code</li>
<li class="">They build and run the application</li>
</ul>
<p>Each of these steps takes time and slows down the inner development loop, making it difficult to receive fast feedback and iterate quickly. Additionally, these steps assume you're only seeking feedback from other developers. If you need to share changes with the design or product team, the process becomes even more complex, as they may not know how to build and run the application and even what environment to use for that.</p>
<p>So, how can we optimize for fast feedback loops and improve this process?</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-okteto-simplifies-sharing-changes-and-getting-feedback">How Okteto Simplifies Sharing Changes and Getting Feedback<a href="https://www.okteto.com/blog/the-modern-way-of-sharing-dev-work-with-your-team/#how-okteto-simplifies-sharing-changes-and-getting-feedback" class="hash-link" aria-label="Direct link to How Okteto Simplifies Sharing Changes and Getting Feedback" title="Direct link to How Okteto Simplifies Sharing Changes and Getting Feedback" translate="no">​</a></h2>
<p>Okteto is a development experience platform that automates both the experience and the environment. Its goal is to simplify development and make collaboration a breeze when working on modern applications. When developing applications using Okteto, developers are provided with endpoints where they can access a version of the application deployed just for them, specifically for development purposes. Any changes they make to the code will be reflected live at these endpoints as soon as they hit save, without having to wait for a build or deployment process to complete. See it in action for yourself!</p>
<p>With Okteto, the complicated process of showing your changes gets reduced to just two steps:</p>
<ol>
<li class="">Saving your work</li>
<li class="">Sharing the endpoint shown on your dashboard with any team member</li>
</ol>
<p>This makes collaboration extremely simple, as these endpoints can be shared with anyone in your organization to give them a preview of what you’ve been working on and get feedback. The platform takes care of provisioning full-stack environments for everyone so nobody has to do any configuration or create any additional environments to see the changes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="enable-sharing-by-default-in-the-experience">Enable Sharing By Default in the Experience<a href="https://www.okteto.com/blog/the-modern-way-of-sharing-dev-work-with-your-team/#enable-sharing-by-default-in-the-experience" class="hash-link" aria-label="Direct link to Enable Sharing By Default in the Experience" title="Direct link to Enable Sharing By Default in the Experience" translate="no">​</a></h2>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="developers-need-to-be-provided-with-the-right-tools-for-development-to-make-collaboration-easier">Developers need to be provided with the right tools for development to make collaboration easier<a href="https://www.okteto.com/blog/the-modern-way-of-sharing-dev-work-with-your-team/#developers-need-to-be-provided-with-the-right-tools-for-development-to-make-collaboration-easier" class="hash-link" aria-label="Direct link to Developers need to be provided with the right tools for development to make collaboration easier" title="Direct link to Developers need to be provided with the right tools for development to make collaboration easier" translate="no">​</a></h4>
<p>Whether you are working on a small project with just a few team members or a larger project with dozens of developers, Okteto enables platform engineers to automate modern environments that make it easy for developers to share and collaborate as part of the development experience. This allows developers to get feedback from their peers and collaborate seamlessly.</p>
<p>In addition, Okteto provides a secure environment for sharing and collaborating across the entire software development lifecycle. Platform engineers can control who has access to these live endpoints, ensuring that their intellectual property is protected at all times. This is particularly important for sensitive projects where confidentiality is key.</p>
<p>Okteto doesn’t just simplify modern application development for developers, but also across the entire organization. With Okteto, platform engineers are able to introduce a platform that allows product, design, marketing, and sales teams to see the changes to the application developers are making in real-time, giving them better visibility into the development process and allowing them to provide timely feedback.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="preview-environments-vs-endpoints--when-to-use-what">Preview Environments vs Endpoints – When To Use What<a href="https://www.okteto.com/blog/the-modern-way-of-sharing-dev-work-with-your-team/#preview-environments-vs-endpoints--when-to-use-what" class="hash-link" aria-label="Direct link to Preview Environments vs Endpoints – When To Use What" title="Direct link to Preview Environments vs Endpoints – When To Use What" translate="no">​</a></h2>
<p>In addition to endpoints on the Okteto platform, Platform Engineers can also configure <a href="https://www.okteto.com/docs/cloud/preview-environments/preview-environments/" target="_blank" rel="noopener noreferrer" class="">Preview Environments</a> for their code repositories. While Endpoints enable developers to share each small change they make and receive feedback as soon as they hit save, Preview Environments, on the other hand, automatically create an environment for every <strong>Pull Request</strong> and provide a URL that anyone can use to view them. Each of them has its utility in different phases of development.</p>
<p>Endpoints are useful during the phase when <strong>developers are writing the code</strong> and want instant feedback from a person or team closely involved in the development of the feature they’re working on. Preview environments come into the picture when developers have <strong>completed working</strong> on a feature or bug fix and <strong>make a pull request</strong>. They are meant to provide a broader set of people visibility into what change is going to be merged in the application codebase. Another key difference between the two is that while Endpoints deploy only the code a developer has written when working, Preview environments deploy <strong>all the commits</strong> in a pull request regardless of who has made them. Preview environments have a broader scope and are meant to be used for feedback when a feature or bug fix is ready to be shipped, whereas endpoints are meant for instant feedback on small iterations developers might be making when they’re writing code.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/the-modern-way-of-sharing-dev-work-with-your-team/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In conclusion, Okteto provides a modern and fast way to share development work and collaborate with your team. Its endpoints make it easy for developers to see changes in real-time. The ability to share these endpoints enables seamless collaboration across the organization, including teams like sales, marketing, and design that traditionally got involved much later in the review process.</p>
<p>If you're looking for a better way to work with your team, give Okteto a try and see how it can improve your productivity and the speed of your team’s workflow!</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Ready to see the magic of Okteto yourself?</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/free-trial/" target="_self">Try Free</a></div></section>]]></content:encoded>
            <category>dev-environments</category>
        </item>
        <item>
            <title><![CDATA[Developing Cloud-Native Apps With MongoDB Atlas and Kubernetes]]></title>
            <link>https://www.okteto.com/blog/developing-cloud-native-apps-with-mongodb-atlas-and-kubernetes/</link>
            <guid>https://www.okteto.com/blog/developing-cloud-native-apps-with-mongodb-atlas-and-kubernetes/</guid>
            <pubDate>Wed, 17 May 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[What Is MongoDB Atlas]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-mongodb-atlas">What Is MongoDB Atlas<a href="https://www.okteto.com/blog/developing-cloud-native-apps-with-mongodb-atlas-and-kubernetes/#what-is-mongodb-atlas" class="hash-link" aria-label="Direct link to What Is MongoDB Atlas" title="Direct link to What Is MongoDB Atlas" translate="no">​</a></h2>
<p>MongoDB Atlas is a cloud database service that allows teams to deploy and manage MongoDB databases with ease. Its streamlined experience simplifies application building by providing data distribution and mobility across AWS, Azure, and Google Cloud. The service has built-in automation for resource and workload optimization and features like automatic scaling, backup and recovery, and a robust security model, ensuring that data is always safe and available.</p>
<!-- -->
<p>Many teams are already using MongoDB Atlas to build modern applications. But the question is if you're using MongoDB in cloud production platforms, why not leverage it during cloud-native app development as well?</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-does-okteto-do">What Does Okteto Do<a href="https://www.okteto.com/blog/developing-cloud-native-apps-with-mongodb-atlas-and-kubernetes/#what-does-okteto-do" class="hash-link" aria-label="Direct link to What Does Okteto Do" title="Direct link to What Does Okteto Do" translate="no">​</a></h2>
<p>Okteto is a platform for modern development experience automation. Platform and Development Experience teams define, control, and govern modern development experience and environments. One of the features we offer is provisioning and de-provisioning full stack Kubernetes dev environments that are exactly like production. At Okteto, we've always believed in providing developers with a realistic development environment that's set up instantly and has everything they need for modern app development.</p>
<p>This means that if your microservices are dependent on a cloud database service like MongoDB Atlas, you should be able to work with it during development and testing as well. As part of this philosophy, we recently launched a new feature to our platform: Okteto External Resources. This feature makes working with any resources and cloud service outside of the running Kubernetes development cluster during development a breeze.</p>
<aside class="highlight_CGlU"><p>Read our blog announcing the release of Okteto External Resources <a href="https://www.okteto.com/blog/how-platform-teams-can-deliver-a-great-development-experience-for-modern-app-developers/" target="_blank" rel="noopener noreferrer" class="">here</a>.</p></aside>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-mongodb-atlas-with-okteto-during-development">Using MongoDB Atlas With Okteto During Development<a href="https://www.okteto.com/blog/developing-cloud-native-apps-with-mongodb-atlas-and-kubernetes/#using-mongodb-atlas-with-okteto-during-development" class="hash-link" aria-label="Direct link to Using MongoDB Atlas With Okteto During Development" title="Direct link to Using MongoDB Atlas With Okteto During Development" translate="no">​</a></h2>
<p>If your microservices based application relies on a MongoDB Atlas, it's important to make this service available to developers with their Kubernetes development environment to execute a full production like stack. However, platform and DevX teams often struggle with implementing this in an efficient and effective way. They often end up writing hacky bash scripts for spinning up and down the cloud database service, which developers are then left to make work and debug. With Okteto, microservices deployed in Kubernetes can access MongoDB Atlas as the production cloud service and manage all your data workloads during dev and test. Then the developer experience is extended for offering easier management and better metrics for the data part of your application.</p>
<p>Using MongoDB Atlas with Okteto governed Kubernetes development environments provides even more benefits to the development experience:</p>
<ul>
<li class="">It allows developers to work with realistic production data during development by easily cloning databases. This is difficult to replicate when working locally with a non-cloud-based database.</li>
<li class="">It simplifies the management and sharing of databases between developers. With MongoDB Atlas and Okteto, you can easily and securely share access to different databases during development according to your needs.</li>
<li class="">It provides full control over the lifecycle of the database during microservice development. This means that if you want to, you can have your MongoDB Atlas database deleted whenever you delete your development or preview environment. This makes it easier to manage resources without having to worry about chasing people around.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-use-mongodb-atlas-as-an-external-resource-in-okteto">How To Use MongoDB Atlas As an External Resource in Okteto<a href="https://www.okteto.com/blog/developing-cloud-native-apps-with-mongodb-atlas-and-kubernetes/#how-to-use-mongodb-atlas-as-an-external-resource-in-okteto" class="hash-link" aria-label="Direct link to How To Use MongoDB Atlas As an External Resource in Okteto" title="Direct link to How To Use MongoDB Atlas As an External Resource in Okteto" translate="no">​</a></h2>
<p>To demonstrate how you can use MongoDB Atlas databases as external resources, we have prepared a sample cloud-native application for you: <a href="https://github.com/okteto/voting-app-with-external-resources" target="_blank" rel="noopener noreferrer" class="">https://github.com/okteto/voting-app-with-external-resources</a></p>
<p>This app mimics modern applications in Kubernetes and highlights the power of Okteto External Resources. The application is a voting portal consisting of three microservices:</p>
<ul>
<li class="">The voting service for casting your vote</li>
<li class="">The worker service to process the votes</li>
<li class="">The result service to show the final results</li>
</ul>
<p>The vote services interacts with an API Gateway in AWS to store the data in a MongoDB Atlas database.</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/66d94ed41d91-9813de37c9fabfc3771be32e86cfebf9.webp" width="762" height="631" class="img_ev3q"></p>
<p>Once you spin up a modern environment for the application using Okteto, the Atlas database will be deployed for you. You will also see endpoints that you can visit to see these resources.</p>
<aside class="highlight_CGlU"><p>Depending on your needs, you can even configure the newly created database to be pre-populated with sample data that is relevant to your application.</p></aside>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/d4d1fadaf8b9-7b23c435cb91e7a2efb1b44ca7767697.webp" width="1537" height="702" class="img_ev3q"></p>
<p>The power of this feature is that developers can work in a running Kubernetes development environment that already has all the resources that the application uses, without needing to set anything up. They don't have to create the Atlas database or the Lambda function in AWS every time. Another benefit of Okteto External Resources is that they're ephemeral, just like your development environments. This means that when you destroy your dev environment, the resources created will also be destroyed with it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/developing-cloud-native-apps-with-mongodb-atlas-and-kubernetes/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Enabling any cloud database like MongoDB Atlas with Okteto during modern development can help platform and DevX teams deliver the best development experience freeing developers from wasting time on services and resources set-up and control. By using MongoDB Atlas as an external resource in Okteto, developers can:</p>
<ul>
<li class="">Work with realistic data in a production-like Kubernetes environment.</li>
<li class="">Be more confident in their code and ensure that their application is working correctly before pushing it to production.</li>
<li class="">Save time and effort during development by easily connecting to resources that their application depends on without having to set them up manually each time.</li>
</ul>
<aside class="highlight_CGlU"><p>If you find this interesting and are more curious, you can try out the sample application for yourself and play around with it: <a href="https://github.com/okteto/voting-app-with-external-resources" target="_blank" rel="noopener noreferrer" class="">https://github.com/okteto/voting-app-with-external-resources</a></p></aside>
<p>For more information about Okteto External Resources:</p>
<ul>
<li class="">check out our <a href="https://www.okteto.com/blog/okteto-extends-developer-experience-to-all-resources/" target="_blank" rel="noopener noreferrer" class="">press release</a> announcing the feature</li>
<li class="">read the <a href="https://www.okteto.com/docs/cloud/external-resources/" target="_blank" rel="noopener noreferrer" class="">documentation</a></li>
</ul>]]></content:encoded>
            <category>external resources</category>
        </item>
        <item>
            <title><![CDATA[Bring Any Cloud Resource to Your Modern App Dev Workflow]]></title>
            <link>https://www.okteto.com/blog/bring-any-cloud-resource-to-your-modern-app-dev-workflow/</link>
            <guid>https://www.okteto.com/blog/bring-any-cloud-resource-to-your-modern-app-dev-workflow/</guid>
            <pubDate>Wed, 10 May 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[How Modern Applications Use Cloud Resources]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-modern-applications-use-cloud-resources">How Modern Applications Use Cloud Resources<a href="https://www.okteto.com/blog/bring-any-cloud-resource-to-your-modern-app-dev-workflow/#how-modern-applications-use-cloud-resources" class="hash-link" aria-label="Direct link to How Modern Applications Use Cloud Resources" title="Direct link to How Modern Applications Use Cloud Resources" translate="no">​</a></h2>
<p>It is very common for the cloud-native microservices we code these days to utilize resources deployed on different cloud platforms, be it AWS, GCP, Azure or any other. Some common resources which we see being used in modern applications are:</p>
<!-- -->
<ul>
<li class="">Databases services like Amazon RDS, Google Cloud SQL or Azure SQL Database</li>
<li class="">Object storage services like Amazon S3, Google Cloud Storage or Azure Blob Storage</li>
<li class="">Message queue services like AWS SQS, Google Cloud Pub/Sub or Azure Service Bus</li>
</ul>
<p>These resources have become such an integral part of the applications we work on that it is impossible to imagine how we can develop and deploy microservices without them. But using these resources complicate things during development because providing access to them for every developement and test environment isn’t an easy task.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-does-okteto-do">What Does Okteto Do<a href="https://www.okteto.com/blog/bring-any-cloud-resource-to-your-modern-app-dev-workflow/#what-does-okteto-do" class="hash-link" aria-label="Direct link to What Does Okteto Do" title="Direct link to What Does Okteto Do" translate="no">​</a></h2>
<p>Okteto is a platform for modern development experience automation. Platform and Development Experience teams define, control, and govern modern development experience and environments. One of the features we offer is provisioning and de-provisioning full stack Kubernetes dev environments that are exactly like production. At Okteto, we've always believed in providing developers with a realistic development environment that’s set up instantly and has everything they need for modern app development.</p>
<p>This means that if your Kubernetes deployed microservices are dependent on resources by any cloud provider, you should be able to work with them during development and testing as well. As part of this philosophy, we recently launched a new feature to our platform: Okteto External Resources. This feature makes working with resources outside of your Kubernetes development cluster a breeze.</p>
<aside class="highlight_CGlU"><p>Read our blog annoucing the release of Okteto External Resources <a href="https://www.okteto.com/blog/how-platform-teams-can-deliver-a-great-development-experience-for-modern-app-developers/" target="_blank" rel="noopener noreferrer" class="">here</a>.</p></aside>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-use-cloud-resources-with-okteto-during-development">Why Use Cloud Resources With Okteto During Development<a href="https://www.okteto.com/blog/bring-any-cloud-resource-to-your-modern-app-dev-workflow/#why-use-cloud-resources-with-okteto-during-development" class="hash-link" aria-label="Direct link to Why Use Cloud Resources With Okteto During Development" title="Direct link to Why Use Cloud Resources With Okteto During Development" translate="no">​</a></h2>
<p>If your microservices use resources from a cloud platform, it makes sense to make these resources available to developers during development as well. However, teams often struggle with implementing this in a way that's efficient and effective. Developers are often forced to manually configure these resources themselves, using makeshift bash scripts or seeking help from the platform team. This not only wastes time, but also creates a bad development experience. Additionally, debugging becomes more difficult when developers are working with multiple cloud providers they may not be experts in.</p>
<p>Okteto's External Resources can help alleviate these issues. Here's how:</p>
<ul>
<li class="">They allow platform engineers to automate a development experience that automatically provisions and de-provisions cloud resources for developers. Developers get Kubernetes development environments with one click, and all the necessary cloud resources are already configured for them.</li>
<li class="">They give the platform and DevX team full control over the lifecycle of these resources. This means developers can have their cloud resources automatically deleted whenever they delete their development or preview environment. This makes it easier to manage resources without having to worry about chasing people around.</li>
<li class="">They also ensure secure access to these cloud resources, only allowing access for those who need it. This is especially important when working with user data stored in cloud resources needed during development.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-use-cloud-resources-as-external-resources">How To Use Cloud Resources As External Resources<a href="https://www.okteto.com/blog/bring-any-cloud-resource-to-your-modern-app-dev-workflow/#how-to-use-cloud-resources-as-external-resources" class="hash-link" aria-label="Direct link to How To Use Cloud Resources As External Resources" title="Direct link to How To Use Cloud Resources As External Resources" translate="no">​</a></h2>
<p>To demonstrate how you can use cloud resources as external resources, we have prepared a sample application running on Kubernetes development cluster for you. This app mimics modern applications and highlights the power of External Resources. The application is a restaurant portal consisting of three microservices:</p>
<ul>
<li class="">The menu service for ordering food</li>
<li class="">The kitchen service to track order completion</li>
<li class="">The cheque service to generate the bill for the order</li>
</ul>
<p>We have prepared two different versions of this application to show the flexibility external resources offer. One uses resources from AWS: <a href="https://github.com/okteto/external-resources-aws" target="_blank" rel="noopener noreferrer" class="">https://github.com/okteto/external-resources-aws</a></p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/6199a1fcefde-8a6b74f4fa4b82e17319269383592d21.webp" width="938" height="740" class="img_ev3q"></p>
<p>and the other uses GCP: <a href="https://github.com/okteto/external-resources-gcp" target="_blank" rel="noopener noreferrer" class="">https://github.com/okteto/external-resources-gcp</a></p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/3a238e4f2a2c-eaca3f7992755b3f838784f3a8f8462a.webp" width="938" height="740" class="img_ev3q"></p>
<p>The application uses a message queue and object storage from both cloud providers. Once you launch an environment for the application using Okteto, these cloud services will be deployed for you. You will also see endpoints that you can visit to see these services.</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/861a92d492b0-8b6e3929196d337e491df951d984156e.webp" width="1904" height="716" class="img_ev3q"></p>
<p>The power of this feature is that developers can work in a running Kubernetes development environment that already has all the cloud resources that the application uses, without needing to set anything up. They don't have to create the message queue or object storage every time. Another benefit of External Resources is that they're ephemeral, just like your Okteto development environments. This means that when you destroy your dev environment, the cloud resources created will also be destroyed with it. This makes it easier for platform engineers and team leads to manage resources without having to worry about chasing people around.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/bring-any-cloud-resource-to-your-modern-app-dev-workflow/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Being able to use any cloud resource during development with Okteto can help teams work in realistic environemnts Without wasting any time on setting up services and resources or controlling them. By using cloud resources as External Resources in Okteto:</p>
<ul>
<li class="">save a lot of time and effort during development by allowing developers to connect to resources that their application depends on without having to set them up manually each time</li>
<li class="">work in an exactly production like modern environment</li>
<li class="">be more confident in the code quality and ensure that their application is working correctly before pushing the code</li>
</ul>
<aside class="highlight_CGlU"><p>If you find this interesting and are more curious, you can try out the sample application for yourself and play around with it:</p><ul>
<li class="">AWS: <a href="https://github.com/okteto/external-resources-aws" target="_blank" rel="noopener noreferrer" class="">https://github.com/okteto/external-resources-aws</a></li>
<li class="">GCP: <a href="https://github.com/okteto/external-resources-gcp" target="_blank" rel="noopener noreferrer" class="">https://github.com/okteto/external-resources-gcp</a></li>
</ul></aside>
<p>For more information about Okteto External Resources, check out:</p>
<ul>
<li class="">our <a href="https://www.okteto.com/blog/okteto-extends-developer-experience-to-all-resources/" target="_blank" rel="noopener noreferrer" class="">press release</a> announcing the feature</li>
<li class="">read the <a href="https://www.okteto.com/docs/cloud/external-resources/" target="_blank" rel="noopener noreferrer" class="">documentation</a></li>
</ul>]]></content:encoded>
            <category>external resources</category>
        </item>
        <item>
            <title><![CDATA[Using LaunchDarkly and Okteto To Automate Modern Feature Flag Management]]></title>
            <link>https://www.okteto.com/blog/using-launchdarkly-and-okteto-to-automate-modern-feature-flag-management/</link>
            <guid>https://www.okteto.com/blog/using-launchdarkly-and-okteto-to-automate-modern-feature-flag-management/</guid>
            <pubDate>Tue, 02 May 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[What Are Feature Flags]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-feature-flags">What Are Feature Flags<a href="https://www.okteto.com/blog/using-launchdarkly-and-okteto-to-automate-modern-feature-flag-management/#what-are-feature-flags" class="hash-link" aria-label="Direct link to What Are Feature Flags" title="Direct link to What Are Feature Flags" translate="no">​</a></h2>
<p>Feature flags allow developers to enable or disable features in an application without deploying a new version. This enables teams to release new features gradually and test them with a subset of users before rolling them out completely. In today's world, feature flagging has become a standard practice in modern software development. <a href="https://launchdarkly.com/" target="_blank" rel="noopener noreferrer" class="">LaunchDarkly</a> is a popular feature flagging service that allows developers to manage their features and rollouts with ease.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-does-okteto-do">What Does Okteto Do<a href="https://www.okteto.com/blog/using-launchdarkly-and-okteto-to-automate-modern-feature-flag-management/#what-does-okteto-do" class="hash-link" aria-label="Direct link to What Does Okteto Do" title="Direct link to What Does Okteto Do" translate="no">​</a></h2>
<p>Okteto is a platform for modern development experience automation on Kubernetes. One of the features we offer is provisioning and de-provisioning environments that are exactly like production. At Okteto, we've always believed in providing developers with a realistic development environment that's set up instantly and has everything they need for development. Our goal is to give developers the ultimate experience when developing modern applications.</p>
<p>This means that if you use feature flags in production, you should be able to work with them during development as well. As part of this philosophy, we recently launched a new feature to our platform: External Resources. This feature makes working with LaunchDarkly during development a breeze.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-develop-using-launchdarkly-with-okteto">Why Develop Using LaunchDarkly With Okteto<a href="https://www.okteto.com/blog/using-launchdarkly-and-okteto-to-automate-modern-feature-flag-management/#why-develop-using-launchdarkly-with-okteto" class="hash-link" aria-label="Direct link to Why Develop Using LaunchDarkly With Okteto" title="Direct link to Why Develop Using LaunchDarkly With Okteto" translate="no">​</a></h2>
<p>Developers are already using LaunchDarkly's SDK to write code with feature flags. However, a common problem they face is the difficulty of testing these feature flags during development. A major issue is having to manually set up a LaunchDarkly environment with pre-populated flags for every developer who wants to work on the application or test features. This process takes time away from coding and can lead to a poor developer experience. Additionally, there is no easy way to replicate the same feature flags present in the production environment for each developer.</p>
<p>Using LaunchDarkly dashboards as External Resources with Okteto solves both of these problems by:</p>
<ul>
<li class="">Automatically provisioning (and deprovisioning) feature flag dashboards</li>
<li class="">Cloning existing environments, which ensures that the LaunchDarkly environment during development is pre-populated with all necessary flags</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-use-launchdarkly-dashboards-as-external-resources">How To Use LaunchDarkly Dashboards As External Resources<a href="https://www.okteto.com/blog/using-launchdarkly-and-okteto-to-automate-modern-feature-flag-management/#how-to-use-launchdarkly-dashboards-as-external-resources" class="hash-link" aria-label="Direct link to How To Use LaunchDarkly Dashboards As External Resources" title="Direct link to How To Use LaunchDarkly Dashboards As External Resources" translate="no">​</a></h2>
<p>You can configure a feature flag dashboard in LaunchDarkly to be set up for each developer when they spin up their development environment. This dashboard is already configured to work with the application being developed and requires no configuration from the developer’s side. It has all the flags you want to include from your existing production environments.</p>
<aside class="highlight_CGlU"><p>To demonstrate the power of using LaunchDarkly as an External Resource in your development environments, we’ve put together a sample application for you to try out: <a href="https://github.com/okteto/external-resources-launchdarkly" target="_blank" rel="noopener noreferrer" class="">https://github.com/okteto/external-resources-launchdarkly</a></p></aside>
<p>This simple application demonstrates how easy External Resources make working with services that live outside your Kubernetes cluster, a LaunchDarkly dashboard in this case.</p>
<p>The application displays some text with an emoji. If you look at the code, you’ll see we use LaunchDarkly’s SDK to change the text and emoji when the feature flag is enabled. When you deploy the application using Okteto, Okteto not only deploys the app itself but also provisions a feature flag dashboard for you in LaunchDarkly. You can view this right from your Okteto dashboard.</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/238d6a6f4c05-d217e16a1cfceb672aec4df3bee9caf6.webp" width="1904" height="732" class="img_ev3q"></p>
<p>If you visit the endpoint shown for the LaunchDarkly dashboard, you should be able to toggle the “Use new emojis” feature flag on and off. Refreshing your application should show you the replaced text and emoji.</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/381b7c0db472-f2549be0993cf3fa1c33b47021c48bf7.webp" width="1904" height="403" class="img_ev3q"></p>
<p>The power of this feature is that developers can work in a running development environment that already has all the feature flags that the application uses without needing to set anything up. They don't have to create a dashboard in LaunchDarkly every time or manually clone all the flags they need from the production environment. Another benefit of External Resources is that, like your dev environments, they're ephemeral. This means that when you destroy your dev environment, the LaunchDarkly dashboard will also be destroyed with it. This makes it easier for platform engineers and team leads to manage resources without having to worry about chasing people around.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/using-launchdarkly-and-okteto-to-automate-modern-feature-flag-management/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Leveraging feature flags during development with LaunchDarkly and Okteto can help teams release new features gradually and test them with a subset of users before rolling them out completely. By using this combination:</p>
<ul>
<li class="">developers can easily manage feature flags in their development environments</li>
<li class="">ensure that their code is working correctly before releasing it to production</li>
<li class="">save a lot of time and effort during development by allowing developers to connect to resources that their application depends on without having to set them up locally.</li>
</ul>
<p>Check out this video demonstrating the benefits you get from using LaunchDarkly dashboards as an External Resource in Okteto:</p>
<div class="embed_uCA2"><iframe src="https://www.youtube-nocookie.com/embed/FdD7Tw1ZgXQ" title="YouTube video player" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Find this interesting?</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://github.com/okteto/external-resources-launchdarkly" target="_self">Try out the sample!</a></div></section>
<p>For more information about External Resources, check out our <a href="https://www.okteto.com/blog/okteto-extends-developer-experience-to-all-resources/" target="_blank" rel="noopener noreferrer" class="">press release post</a> announcing the feature or head to the <a href="https://www.okteto.com/docs/cloud/external-resources/" target="_blank" rel="noopener noreferrer" class="">docs</a>!</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How Platform Teams Can Deliver a Great Development Experience for Modern App Developers]]></title>
            <link>https://www.okteto.com/blog/how-platform-teams-can-deliver-a-great-development-experience-for-modern-app-developers/</link>
            <guid>https://www.okteto.com/blog/how-platform-teams-can-deliver-a-great-development-experience-for-modern-app-developers/</guid>
            <pubDate>Tue, 18 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Introducing Okteto External Resources, enabling platform engineers to provide a streamlined development experience to their developers.]]></description>
            <content:encoded><![CDATA[<p>Modern applications have a microservices-based architecture, are containerized, and run on Kubernetes clusters in production. However, most of these applications require access to services deployed outside the cluster, such as cloud databases, message queues, storage buckets, etc. This creates problems for developers since, during development, they spend time configuring all these things instead of focusing on writing code.</p>
<!-- -->
<p>Okteto's latest feature, External Resources, enables platform engineers to provide a streamlined development experience to their developers who work on modern applications. In this article, we'll explore how External Resources can help you take your developer workflow to the next level!</p>
<figure class="figure_HOu8"><img src="https://www.okteto.com/blog/assets/images/5f5e17076216-11f63b514bcdca9611cf5da233affca9.webp" alt="" loading="lazy"><figcaption>Okteto modern development environment with Microservices on Kubernetes using External Resources on AWS</figcaption></figure>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-external-resources-and-how-does-it-help-devx">What Are External Resources and how does it help DevX?<a href="https://www.okteto.com/blog/how-platform-teams-can-deliver-a-great-development-experience-for-modern-app-developers/#what-are-external-resources-and-how-does-it-help-devx" class="hash-link" aria-label="Direct link to What Are External Resources and how does it help DevX?" title="Direct link to What Are External Resources and how does it help DevX?" translate="no">​</a></h3>
<p>Modern development platforms must evolve rapidly to meet the needs of modern applications. One common thing we hear from our users is that the applications they are developing not only rely on Kubernetes resources, but also on resources deployed outside the cluster, such as cloud databases like MongoDB Atlas, S3 buckets on AWS, and PubSub queues on GCP, to name a few. They need a way to make these resources easily accessible to developers and testers during development without having to configure them for each developer every time. They also need a way to keep track of all these resources and access them from the same dashboard for easier management. To solve these problems, we have launched our latest feature: External Resources.</p>
<p>With Okteto, you can now seamlessly integrate External Resources into your development experience, eliminating the need for separate, manual tasks. The platform team can define any resource that microservices use and which are deployed outside the Kubernetes cluster by defining the <code>external</code> section in the Okteto Manifest. Once the resources have been defined and any required deploy and destroy configurations are set, they will be available to everyone in development when an environment is launched.</p>
<p>This provides platform engineers with a way to automate the provisioning (and deprovisioning) of an application's resources for the developers on their team, without requiring any effort from the developers and testers themselves. External Resources also provide a way to easily control the lifecycle for all microservices and application-specific dependencies from the Okteto Admin Interface once environments are deployed.</p>
<aside class="highlight_CGlU"><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="external-resources-are-highly-adaptable-and-can-be-used-in-various-scenarios">External Resources are highly adaptable and can be used in various scenarios.<a href="https://www.okteto.com/blog/how-platform-teams-can-deliver-a-great-development-experience-for-modern-app-developers/#external-resources-are-highly-adaptable-and-can-be-used-in-various-scenarios" class="hash-link" aria-label="Direct link to External Resources are highly adaptable and can be used in various scenarios." title="Direct link to External Resources are highly adaptable and can be used in various scenarios." translate="no">​</a></h4><ul>
<li class="">If your application database resides somewhere else, such as MongoDB Atlas or on a cloud provider like AWS or GCP, you can provision the creation (and deletion!) of that database by adding it as an External Resource in Okteto.</li>
<li class="">Testing tools like Postman and documentation pages on Confluence can be made as part of the environments, allowing developers to access all the resources they need from their Okteto Interface without searching for them.</li>
<li class="">If your team uses LaunchDarkly for feature flag management, you can configure LaunchDarkly dashboards to be automatically created for each developer or tester when they spin up their environments. This saves them the trouble of manually configuring things.</li>
</ul></aside>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="benefits-of-standardizing-external-resources-in-the-devx">Benefits of Standardizing External Resources in the DevX<a href="https://www.okteto.com/blog/how-platform-teams-can-deliver-a-great-development-experience-for-modern-app-developers/#benefits-of-standardizing-external-resources-in-the-devx" class="hash-link" aria-label="Direct link to Benefits of Standardizing External Resources in the DevX" title="Direct link to Benefits of Standardizing External Resources in the DevX" translate="no">​</a></h3>
<p>The goal of External Resources is to enable platform engineers to automate the smoothest possible experience for the developers on their team. External Resources simplify the developer’s workflow by:</p>
<ul>
<li class="">Allowing for quick and easy configuration and control of connections to any resource which lives outside the K8s cluster</li>
<li class="">Providing unified, standard control of the lifecycle of external resources and the environments</li>
<li class="">Making it easy for the entire team to find and manage the application resources during development and testing</li>
<li class="">Automatically garbage collecting resources when no longer used, ensuring efficient use of resources</li>
<li class="">Saving time and removing risks and deployment errors from developers trying to set up application resources themselves</li>
<li class="">Managing access to External Resources securely, ensuring only authorized users have access to the provisioned resources</li>
<li class="">Giving flexibility for the application to grow and evolve by allowing you to bring any resource from any provider to your environments</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it-out-now">Try It Out Now!<a href="https://www.okteto.com/blog/how-platform-teams-can-deliver-a-great-development-experience-for-modern-app-developers/#try-it-out-now" class="hash-link" aria-label="Direct link to Try It Out Now!" title="Direct link to Try It Out Now!" translate="no">​</a></h3>
<p>In conclusion, External Resources are a valuable addition to Modern Development Experience Automation. By leveraging Okteto, platform engineers can enable developers to focus on building better, more secure, and more efficient applications, without having to worry about setting up application resources. The benefits of External Resources are truly boundless.</p>
<figure class="figure_HOu8"><img src="https://www.okteto.com/blog/assets/images/e9a00e2fd2b2-ee78efcce9d388d06c48a52a6943bba8.webp" alt="" loading="lazy"><figcaption>Okteto modern development environment with Microservices on Kubernetes using External Resources on AWS and MongoDB Atlas</figcaption></figure>
<p>We have reference sample applications that showcase the power of External Resources. These samples demonstrate how External Resources can be used to build distributed, modern applications. Developers can try them to get a sense of how easy their workflow becomes once they don't have to deal with the admin and management headaches of provisioning and managing cloud resources that their application depends on. By trying out these samples, platform engineers can familiarize themselves with the capabilities of External Resources and learn how to control and govern the ultimate development experience that is fast and high-quality for their developers.</p>
<p>So what are you waiting for? Go give the samples a try!</p>
<div class="logos_Z1jg"><p><a href="https://github.com/okteto/external-resources-aws" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="AWS" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCA3NiA0NCIgaGVpZ2h0PSI0NCIgd2lkdGg9Ijc2Ij4KPHBhdGggZmlsbD0iIzI1MkYzRSIgZD0iTTIxLjY4MjQgMTUuOTc1NUMyMS42ODI0IDE2Ljg4NTkgMjEuNzg0NyAxNy42MjU3IDIxLjk2IDE4LjE1MkMyMi4xNDk5IDE4LjY5MjYgMjIuMzk4MiAxOS4yOTAxIDIyLjc0ODggMTkuOTE2QzIyLjg4MDMgMjAuMTE1MiAyMi45MjQxIDIwLjMxNDMgMjIuOTI0MSAyMC40ODVDMjIuOTI0MSAyMC43MjY5IDIyLjc3OCAyMC45Njg3IDIyLjQ1NjYgMjEuMjI0OEwyMC44NzkgMjIuMjQ5QzIwLjY1OTggMjIuMzkxMyAyMC40NDA3IDIyLjQ2MjQgMjAuMjM2MiAyMi40NjI0QzE5Ljk4NzkgMjIuNDYyNCAxOS43Mzk1IDIyLjM0ODYgMTkuNDkxMiAyMi4xMjFDMTkuMTQwNiAyMS43NTExIDE4Ljg0ODUgMjEuMzY3IDE4LjYwMDEgMjAuOTY4N0MxOC4zNTE4IDIwLjU1NjIgMTguMTAzNCAyMC4wODY3IDE3LjgyNTkgMTkuNTMxOUMxNS44ODMgMjEuNzc5NiAxMy40NDM1IDIyLjkwMzQgMTAuNTA3MyAyMi45MDM0QzguNDE4MzQgMjIuOTAzNCA2Ljc1MzAyIDIyLjMyMDIgNS41NDA1NiAyMS4xMzk0QzQuMzEzNDkgMTkuOTcyOSAzLjY5OTk1IDE4LjQwODEgMy42OTk5NSAxNi40NDQ5QzMuNjk5OTUgMTQuMzY4IDQuNDQ0OTYgMTIuNjc1MSA1Ljk2NDE5IDExLjQwOUM3LjQ4MzQzIDEwLjEyODcgOS40OTkzMyA5LjUwMjc5IDEyLjA1NTcgOS41MDI3OUMxMi45MDMgOS41MDI3OSAxMy43NjQ5IDkuNTczOTIgMTQuNjg1MiA5LjY4NzcyQzE1LjYwNTUgOS44MTU3NSAxNi41NTUgMTAuMDE0OSAxNy41NDgzIDEwLjIyODNWOC40NTAwOUMxNy41NDgzIDYuNTg2NTEgMTcuMTUzOSA1LjI5MTk3IDE2LjM3OTcgNC41MzgwMUMxNS41OTA5IDMuNzY5ODIgMTQuMjQ2OSAzLjM5OTk1IDEyLjMzMzMgMy4zOTk5NUMxMS40NTY4IDMuMzk5OTUgMTAuNTY1NyAzLjQ5OTUzIDkuNjQ1NDEgMy43MjcxNEM4LjcyNTExIDMuOTQwNTMgNy44MzQwMiA0LjIxMDgxIDYuOTU3NTQgNC41NTIyM0M2LjU2MzEyIDQuNzIyOTQgNi4yNTYzNSA0LjgyMjUyIDYuMDgxMDYgNC44Nzk0M0M1LjkwNTc2IDQuOTIyMSA1Ljc4ODkgNC45NTA1NSA1LjY4NjY0IDQuOTUwNTVDNS4zMzYwNSA0Ljk1MDU1IDUuMTYwNzUgNC43MDg3MiA1LjE2MDc1IDQuMTgyMzdWMi45ODc0MUM1LjE2MDc1IDIuNjAzMzEgNS4yMTkxOCAyLjMwNDU3IDUuMzM2MDUgMi4xMzM4NkM1LjQ2NzUyIDEuOTYzMTUgNS42ODY2NCAxLjc5MjQ1IDYuMDM3MjMgMS42MjE3NEM2LjkxMzcxIDEuMTgwNzQgNy45NTA4OCAwLjgxMDg2OSA5LjE3Nzk2IDAuNTEyMTI2QzEwLjM5MDQgMC4xOTkxNjIgMTEuNjkwNSAwLjA1NjkwMjkgMTMuMDQ5MSAwLjA1NjkwMjlDMTYuMDE0NSAwLjA1NjkwMjkgMTguMTc2NSAwLjcxMTI4OSAxOS41NjQyIDIuMDM0MjhDMjAuOTM3NCAzLjM1NzI3IDIxLjYzODYgNS4zNjMxIDIxLjYzODYgOC4wNTE3NlYxNS45NzU1SDIxLjY4MjRaTTExLjU3MzcgMTkuNzAyNkMxMi40MDYzIDE5LjcwMjYgMTMuMjUzNiAxOS41NDYyIDE0LjE0NDcgMTkuMjYxNkMxNS4wMzU4IDE4Ljk2MjkgMTUuODM5MiAxOC40MjIzIDE2LjUxMTIgMTcuNjk2OEMxNi45MDU2IDE3LjIyNzQgMTcuMTk3OCAxNi43MTUyIDE3LjM1ODQgMTYuMTMyQzE3LjUwNDUgMTUuNTM0NSAxNy42MDY4IDE0LjgyMzIgMTcuNjA2OCAxMy45OTgxVjEyLjk3MzlDMTYuODc2NCAxMi44MDMyIDE2LjEwMjEgMTIuNjQ2NyAxNS4zMTMzIDEyLjU2MTNDMTQuNTA5OSAxMi40NjE3IDEzLjc1MDMgMTIuNDA0OCAxMi45NzYgMTIuNDA0OEMxMS4zMTA3IDEyLjQwNDggMTAuMDgzNiAxMi43MzIgOS4yNjU2IDEzLjM4NjRDOC40NDc1NSAxNC4wNDA4IDguMDUzMTQgMTQuOTc5NyA4LjA1MzE0IDE2LjIwMzFDOC4wNTMxNCAxNy4zNTU0IDguMzQ1MyAxOC4yMDg5IDguOTczNDQgMTguNzkyMkM5LjU3MjM3IDE5LjQwMzkgMTAuNDM0MiAxOS43MDI2IDExLjU3MzcgMTkuNzAyNlpNMzEuNTU3NCAyMi4zNDg2QzMxLjEwNDYgMjIuMzQ4NiAzMC44MTI0IDIyLjI2MzMgMzAuNjA3OSAyMi4wOTI2QzMwLjQxOCAyMS45NTAzIDMwLjI0MjcgMjEuNjA4OSAzMC4wODIgMjEuMTM5NEwyNC4yMzg4IDIuMjMzNDRDMjQuMDkyNyAxLjc0OTc3IDI0LjAxOTcgMS40MjI1NyAyNC4wMTk3IDEuMjUxODZDMjQuMDE5NyAwLjg2Nzc2OCAyNC4yMjQyIDAuNjQwMTU4IDI0LjYxODYgMC42NDAxNThIMjcuMDU4MkMyNy41MjU2IDAuNjQwMTU4IDI3Ljg0NyAwLjcxMTI5IDI4LjAyMjMgMC44ODE5OTlDMjguMjI2OCAxLjAzODQ4IDI4LjM3MjkgMS4zNzk5IDI4LjUxOSAxLjgzNTEyTDMyLjY5NjggMTguMDM4MkwzNi41ODI2IDEuODM1MTJDMzYuNjk5NCAxLjM1MTQ1IDM2Ljg2MDEgMS4wMzg0OCAzNy4wNSAwLjg4MTk5OUMzNy4yNTQ1IDAuNzM5NzM5IDM3LjYwNTEgMC42NDAxNTggMzguMDQzNCAwLjY0MDE1OEg0MC4wNDQ3QzQwLjUxMjEgMC42NDAxNTggNDAuODMzNSAwLjcxMTI5IDQxLjAzOCAwLjg4MTk5OUM0MS4yMjc5IDEuMDM4NDggNDEuNDAzMiAxLjM3OTkgNDEuNTA1NSAxLjgzNTEyTDQ1LjQzNSAxOC4yMzc0TDQ5Ljc0NDQgMS44MzUxMkM0OS44OTA1IDEuMzUxNDUgNTAuMDY1OCAxLjAzODQ4IDUwLjI0MTEgMC44ODE5OTlDNTAuNDMxIDAuNzM5NzM5IDUwLjc1MjMgMC42NDAxNTggNTEuMjA1MiAwLjY0MDE1OEg1My41Mjc5QzUzLjkyMjMgMC42NDAxNTggNTQuMTQxNCAwLjgzOTMxOSA1NC4xNDE0IDEuMjUxODZDNTQuMTQxNCAxLjM3OTkgNTQuMTEyMiAxLjQ5MzcgNTQuMDk3NiAxLjY1MDE4QzU0LjA2ODQgMS43OTI0NCA1NC4wMjQ1IDEuOTkxNiA1My45MjIzIDIuMjYxODlMNDcuOTE4NCAyMS4xNjc5QzQ3Ljc3MjMgMjEuNjUxNiA0Ny41OTcgMjEuOTc4OCA0Ny40MDcxIDIyLjEyMUM0Ny4yMDI2IDIyLjI2MzMgNDYuODgxMiAyMi4zNjI4IDQ2LjQ1NzYgMjIuMzYyOEg0NC4zMTAyQzQzLjg0MjggMjIuMzYyOCA0My41MjE0IDIyLjI5MTcgNDMuMzE2OSAyMi4xMjFDNDMuMTI3IDIxLjk1MDMgNDIuOTUxNyAyMS42MzczIDQyLjg0OTQgMjEuMTM5NEwzOC45OTI5IDUuMzYzMUwzNS4xNjU2IDIxLjEyNTJDMzUuMDM0MSAyMS42MDg5IDM0Ljg4ODEgMjEuOTIxOCAzNC42OTgxIDIyLjA5MjZDMzQuNDkzNiAyMi4yNjMzIDM0LjE0MyAyMi4zNDg2IDMzLjY5MDIgMjIuMzQ4NkgzMS41NTc0Wk02My41MTk3IDIzLjAwM0M2Mi4yMzQyIDIzLjAwMyA2MC45MzQxIDIyLjg2MDcgNTkuNjkyNCAyMi41NjJDNTguNDUwOCAyMi4yNjMzIDU3LjQ3MiAyMS45NTAzIDU2LjgyOTMgMjEuNTgwNEM1Ni40MzQ5IDIxLjM2NyA1Ni4xNTczIDIxLjEyNTIgNTYuMDU1IDIwLjg5NzZDNTUuOTUyOCAyMC42ODQyIDU1LjkwOSAyMC40MjgxIDU1LjkwOSAyMC4yMTQ4VjE4Ljk2MjlDNTUuOTA5IDE4LjQ1MDggNTYuMTEzNSAxOC4yMDg5IDU2LjQ3ODcgMTguMjA4OUM1Ni42MjQ4IDE4LjIwODkgNTYuNzg1NSAxOC4yMzc0IDU2LjkzMTUgMTguMjgwMUM1Ny4wNzc2IDE4LjMzNyA1Ny4yOTY3IDE4LjQyMjMgNTcuNTQ1MSAxOC41MjE5QzU4LjM5MjMgMTguODkxOCA1OS4zMTI2IDE5LjE5MDUgNjAuMjkxNCAxOS4zNzU0QzYxLjI4NDcgMTkuNTc0NiA2Mi4yNDg4IDE5LjY3NDIgNjMuMjQyMiAxOS42NzQyQzY0LjgxOTkgMTkuNjc0MiA2Ni4wMzIzIDE5LjQwMzkgNjYuODc5NiAxOC44NjMzQzY3LjcyNjkgMTguMzIyNyA2OC4xNjUxIDE3LjU0MDMgNjguMTY1MSAxNi41NDQ1QzY4LjE2NTEgMTUuODYxNyA2Ny45NDYgMTUuMjkyNyA2Ny41MDc3IDE0LjgyMzJDNjcuMDU0OSAxNC4zNjggNjYuMjA3NiAxMy45NTU0IDY0Ljk5NTIgMTMuNTU3MUw2MS4zODcgMTIuNDYxN0M1OS41NjEgMTEuODkyNyA1OC4yMTcgMTEuMDY3NiA1Ny4zOTkgOS45NTgwMUM1Ni41ODA5IDguODkxMDggNTYuMTU3MyA3LjY4MTg5IDU2LjE1NzMgNi40MTU4QzU2LjE1NzMgNS4zOTE1NSA1Ni4zNzY0IDQuNDgxMSA1Ni44MjkzIDMuNjk4NjlDNTcuMjgyMSAyLjkxNjI3IDU3Ljg4MTEgMi4yMzM0NCA1OC42MjYxIDEuNjkyODZDNTkuMzcxMSAxLjEyMzgzIDYwLjIxODMgMC43MTEyODkgNjEuMjExNyAwLjQxMjU0NkM2Mi4yMDUgMC4xMjgwMzUgNjMuMjQyMiAwIDY0LjMzNzggMEM2NC44OTI5IDAgNjUuNDYyNiAwLjAyODQ1NDEgNjYuMDAzMSAwLjA5OTU4MThDNjYuNTg3NCAwLjE3MDcxIDY3LjA5ODcgMC4yNzAyOTEgNjcuNjI0NiAwLjM2OTg3MkM2OC4xMjEzIDAuNDk3OTAzIDY4LjYwMzMgMC42MTE3MDkgNjkuMDQxNiAwLjc2ODE5M0M2OS40OTQ0IDAuOTEwNDQ4IDY5Ljg0NSAxLjA1MjcxIDcwLjA5MzMgMS4xOTQ5NkM3MC40NDM5IDEuMzk0MTIgNzAuNjkyMyAxLjU5MzI4IDcwLjgzODQgMS44MDY2N0M3MC45ODQ0IDIuMDA1ODMgNzEuMDU3NSAyLjI3NjEyIDcxLjA1NzUgMi42MTc1M1YzLjc2OTgyQzcxLjA1NzUgNC4yODE5NCA3MC44Njc2IDQuNTUyMjMgNzAuNDg3OCA0LjU1MjIzQzcwLjI4MzIgNC41NTIyMyA2OS45NjE5IDQuNDUyNjYgNjkuNTM4MiA0LjI2NzcyQzY4LjEyMTMgMy42Mjc1NiA2Ni41MjkgMy4zMDAzNyA2NC43NjE0IDMuMzAwMzdDNjMuMzQ0NCAzLjMwMDM3IDYyLjIzNDIgMy41Mjc5OCA2MS40NiAzLjk5NzQzQzYwLjY4NTggNC40NTI2NiA2MC4yOTE0IDUuMTYzOTQgNjAuMjkxNCA2LjE3Mzk3QzYwLjI5MTQgNi44NTY4IDYwLjUzOTcgNy40NDAwNiA2MS4wMzY0IDcuOTA5NUM2MS41MzMxIDguMzY0NzMgNjIuNDUzNCA4LjgzNDE4IDYzLjc2ODEgOS4yNDY3M0w2Ny4zMDMyIDEwLjM1NjNDNjkuMSAxMC45MTExIDcwLjM4NTUgMTEuNjkzNSA3MS4xNTk3IDEyLjcwMzZDNzEuOTM0IDEzLjY5OTQgNzIuMjk5MiAxNC44NTE3IDcyLjI5OTIgMTYuMTMyQzcyLjI5OTIgMTcuMTg0NyA3Mi4wOCAxOC4xMzc4IDcxLjY1NjQgMTguOTYyOUM3MS4yMDM2IDE5LjgwMjIgNzAuNjE5MiAyMC41Mjc3IDY5Ljg0NSAyMS4xMTFDNjkuMDcwOCAyMS43MjI3IDY4LjE1MDUgMjIuMTYzNyA2Ny4wODQxIDIyLjQ5MDlDNjUuOTU5MyAyMi44MzIzIDY0Ljc5MDYgMjMuMDAzIDYzLjUxOTcgMjMuMDAzWiI+PC9wYXRoPgo8cGF0aCBmaWxsPSIjRkY5OTAwIiBkPSJNNjguMjIzOSAzNC44OTUyQzYwLjA0MzQgNDAuODQxNSA0OC4xNTI1IDQzLjk5OTcgMzcuOTI2OSA0My45OTk3QzIzLjU5NjQgNDMuOTk5NyAxMC42ODI5IDM4Ljc3ODggMC45Mzk0MDQgMzAuMTE1M0MwLjE2NTE3NyAyOS40MzI1IDAuODUxNzU1IDI4LjUwNzggMS43ODY2NyAyOS4wNDg0QzEyLjMzMzcgMzUuMDY1OSAyNS4zMzQ4IDM4LjcwNzcgMzguNzg4OCAzOC43MDc3QzQ3Ljg3NDkgMzguNzA3NyA1Ny44NTIyIDM2Ljg1ODMgNjcuMDI2IDMzLjAzMTZDNjguMzk5MiAzMi40MTk5IDY5LjU2NzggMzMuOTEzNiA2OC4yMjM5IDM0Ljg5NTJaTTcxLjYyNzYgMzEuMDgyN0M3MC41OTA0IDI5Ljc1OTcgNjQuNzE4IDMwLjQ0MjUgNjIuMDU5MyAzMC43NTU1QzYxLjI1NTkgMzAuODU1MSA2MS4xMzkgMzAuMTcyMiA2MS44NTQ4IDI5LjY2MDFDNjYuNTI5NCAyNi40MzA5IDc0LjIxMzIgMjcuMzU1NiA3NS4xMTg5IDI4LjQzNjdDNzYuMDEgMjkuNTMyMSA3NC44NzA1IDM3LjEwMDIgNzAuNDg4MSA0MC43MTM1QzY5LjgxNjIgNDEuMjgyNSA2OS4xNzM0IDQwLjk4MzggNjkuNDY1NiA0MC4yNDQxQzcwLjQ1ODkgMzcuODI1NyA3Mi42NzkzIDMyLjM3NzIgNzEuNjI3NiAzMS4wODI3WiI+PC9wYXRoPgo8L3N2Zz4K" width="76" height="44" class="img_ev3q"></a>
<a href="https://github.com/okteto/external-resources-launchdarkly" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="LaunchDarkly" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCA1NjgyIDg3NyIgaGVpZ2h0PSI4NzciIHdpZHRoPSI1NjgyIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzVfMikiPgo8cGF0aCBmaWxsPSJibGFjayIgZD0iTTMzOS45NDIgNjg0LjIzVjYwMS4xNThIOTQuMjA3OFYxOTIuNzdIMFY2ODQuMjNIMzM5Ljk0MlpNNTc1Ljg5NyA2NjkuMjIzQzU5Ni43NTkgNjUzLjY1NyA2MTIuNzQ3IDYzMi40NjQgNjIxLjk4NSA2MDguMTI5VjY4NC4yM0g3MTIuMDI5VjQ0Ni45MjNDNzEyLjM2MSA0MjIuOTIyIDcwNS42MjcgMzk5LjM1MiA2OTIuNjY1IDM3OS4xNDlDNjc5LjU0NiAzNTkuMDggNjYwLjkyNCAzNDMuMjE0IDYzOS4wMjUgMzMzLjQ1QzYxMi43MzYgMzIxLjk2MSA1ODQuMjQ3IDMxNi4zNzUgNTU1LjU2NSAzMTcuMDg3QzUzOC40ODggMzE3LjAxNiA1MjEuNDQxIDMxOC41MDYgNTA0LjYzNiAzMjEuNTQxQzQ4OC43NiAzMjQuNDgyIDQ3My4xOTkgMzI4LjkyMyA0NTguMTYyIDMzNC44MDVDNDQ0LjI2NSAzNDAuMzE4IDQzMC44NTYgMzQ2Ljk5IDQxOC4wNzcgMzU0Ljc1TDQyMC43ODkgNDM5LjE3OEM0NDEuMDQ0IDQyNS41ODQgNDYyLjg1NSA0MTQuNDY3IDQ4NS43NTYgNDA2LjA2NUM1MDguNDEyIDM5OC4xOTMgNTMyLjI1OSAzOTQuMjk1IDU1Ni4yNDMgMzk0LjU0M0M1NzMuNjA4IDM5My40NzYgNTkwLjc4MiAzOTguNjYzIDYwNC42NTQgNDA5LjE2M0M2MTAuMjU4IDQxMy43MDEgNjE0Ljc0NCA0MTkuNDY2IDYxNy43NjYgNDI2LjAxM0M2MjAuNzg3IDQzMi41NjEgNjIyLjI2NCA0MzkuNzE1IDYyMi4wODIgNDQ2LjkyM1Y0NzEuMzIySDU0Mi4yMDNDNDk0LjI0NCA0NzEuMzIyIDQ1Ni4zMjIgNDgxLjQ1NiA0MjguNDM3IDUwMS43MjRDNDE0Ljk2NSA1MTEuMDk1IDQwNC4wNjQgNTIzLjcwMiAzOTYuNzM4IDUzOC4zODhDMzg5LjQxMiA1NTMuMDczIDM4NS44OTYgNTY5LjM2NCAzODYuNTEzIDU4NS43NjRDMzg2LjI2IDYwNC43MjQgMzkxLjA3MyA2MjMuNDA4IDQwMC40NTYgNjM5Ljg4N0M0MTAuMDQzIDY1Ni4wODYgNDI0LjA0OCA2NjkuMjE3IDQ0MC44MzEgNjc3Ljc0M0M0NTkuNSA2ODcuMzMzIDQ4MC4yNjQgNjkyLjEyNCA1MDEuMjQ4IDY5MS42ODZDNTI3LjkxMyA2OTIuNTI4IDU1NC4xMjUgNjg0LjY0MSA1NzUuODk3IDY2OS4yMjNWNjY5LjIyM1pNNDk0LjU2NyA2MDguMTI5QzQ4OS42MTcgNjA0LjQxNiA0ODUuNjU5IDU5OS41NDEgNDgzLjA0MiA1OTMuOTM1QzQ4MC40MjQgNTg4LjMyOCA0NzkuMjI4IDU4Mi4xNjMgNDc5LjU1OSA1NzUuOTg1QzQ3OS4zMzIgNTY4LjQwNiA0ODEuMTU1IDU2MC45MDYgNDg0LjgzNiA1NTQuMjc3QzQ4OC41MTcgNTQ3LjY0OCA0OTMuOTIgNTQyLjEzNiA1MDAuNDczIDUzOC4zMjJDNTE5LjU4OCA1MjguMjk1IDU0MS4wODkgNTIzLjcwNyA1NjIuNjMzIDUyNS4wNTdINjIwLjcyNlY1MzlDNjIwLjUxMyA1NTEuNDk3IDYxNy4xODUgNTYzLjc0MyA2MTEuMDQ0IDU3NC42M0M2MDMuODcyIDU4Ny42MDQgNTkzLjUwNyA1OTguNTM1IDU4MC45MzIgNjA2LjM4N0M1NjcuMjAyIDYxNS4zMDkgNTUxLjEyIDYxOS45MjggNTM0Ljc0OCA2MTkuNjUxQzUyMC40NTggNjIwLjI4NCA1MDYuMzUgNjE2LjIzOSA0OTQuNTY3IDYwOC4xMjlWNjA4LjEyOVpNOTk4LjkxMyA2NjguMDYxQzEwMjEuMDIgNjQ3Ljk0OCAxMDM3LjE5IDYyMi4xNjQgMTA0NS42OCA1OTMuNTFWNjg0LjIzSDExMzcuMTdWMzI4LjIyMUgxMDQ1LjY4VjQ5NC4zNjVDMTA0Ni4wMyA1MTYuMTc4IDEwNDIuMjUgNTM3Ljg2IDEwMzQuNTQgNTU4LjI2N0MxMDI4LjExIDU3NS42OTIgMTAxNi44NiA1OTAuOTM1IDEwMDIuMTEgNjAyLjIyM0M5ODcuODM4IDYxMi43IDk3MC41MjYgNjE4LjIxIDk1Mi44MjYgNjE3LjkwOEM5NDQuMTg0IDYxOC40NSA5MzUuNTI0IDYxNy4xNjEgOTI3LjQxNSA2MTQuMTI0QzkxOS4zMDYgNjExLjA4NyA5MTEuOTMgNjA2LjM3MiA5MDUuNzcgNjAwLjI4N0M4OTMuOTA1IDU4Ni4wNCA4ODguMDA3IDU2Ny43NTcgODg5LjMxIDU0OS4yNjNWMzI4LjIyMUg3OTcuOTFWNTUwLjkwOUM3OTcuOTEgNTk2Ljk5NSA4MDguODUxIDYzMi40OTYgODMwLjczMyA2NTcuNDExQzg0MS43NjUgNjcwLjAzNSA4NTUuNTA2IDY4MC4wMDUgODcwLjkzIDY4Ni41NzdDODg2LjM1MyA2OTMuMTQ5IDkwMy4wNjIgNjk2LjE1MyA5MTkuODA5IDY5NS4zNjVDOTQ4LjY1MyA2OTYuNDA1IDk3Ni44NTIgNjg2LjY3MiA5OTguOTEzIDY2OC4wNjFaTTEzMjguMTEgNjg0LjQyNFY1MTguMDg2QzEzMjcuNzUgNDk2LjI3NCAxMzMxLjUzIDQ3NC41OTIgMTMzOS4yNCA0NTQuMTg1QzEzNDUuNjQgNDM2LjgyIDEzNTYuNzggNDIxLjU5MyAxMzcxLjM5IDQxMC4yMjhDMTM4NS40OSAzOTkuNzE1IDE0MDIuNjkgMzk0LjE5NyAxNDIwLjI4IDM5NC41NDNDMTQyOC45MSAzOTMuOTc2IDE0MzcuNTYgMzk1LjIzNSAxNDQ1LjY3IDM5OC4yMzhDMTQ1My43OCA0MDEuMjQxIDE0NjEuMTYgNDA1LjkyMSAxNDY3LjM0IDQxMS45NzFDMTQ3OS4xOSA0MjYuMTg4IDE0ODUuMDkgNDQ0LjQzNSAxNDgzLjggNDYyLjg5OVY2ODQuMjNIMTU3NS45N1Y0NjEuNTQzQzE1NzUuOTcgNDE1LjQ1NyAxNTY0LjkgMzc5Ljk1NiAxNTQyLjc2IDM1NS4wNDFDMTUzMS42NiAzNDIuNTQzIDE1MTcuOTIgMzMyLjY3NyAxNTAyLjUzIDMyNi4xNjFDMTQ4Ny4xMyAzMTkuNjQ2IDE0NzAuNDggMzE2LjY0NSAxNDUzLjc4IDMxNy4zNzdDMTQyNC44NiAzMTYuMjQ0IDEzOTYuNTggMzI2LjA2MyAxMzc0LjU4IDM0NC44NzVDMTM1Mi43MiAzNjUuMDYxIDEzMzYuNjcgMzkwLjczOCAxMzI4LjExIDQxOS4yMzNWMzI4LjIyMUgxMjM2LjcxVjY4NC4yM0wxMzI4LjExIDY4NC40MjRaTTE4ODMuMzggNjkyLjA3M0MxODk0LjY0IDY5MC4zOTcgMTkwNS43NCA2ODcuODQgMTkxNi41OSA2ODQuNDI0QzE5MjYuODYgNjgxLjEzMiAxOTM1Ljk2IDY3Ny45MzcgMTk0NS42NCA2NzQuNzQyTDE5NDYuMzIgNTg4LjE4NEMxOTMxLjU1IDU5NS42MDQgMTkxNS45NSA2MDEuMjI3IDE4OTkuODQgNjA0LjkzNEMxODgzLjcyIDYwOC43MDIgMTg2Ny4yMSA2MTAuNTg2IDE4NTAuNjYgNjEwLjU1QzE4MjkuMjQgNjExLjI5NCAxODA3Ljk5IDYwNi41OTcgMTc4OC44OCA1OTYuODk4QzE3NzMuMDYgNTg4LjU2IDE3NjAuMjQgNTc1LjQ5NiAxNzUyLjE5IDU1OS41MjZDMTc0NC4zNSA1NDIuODY3IDE3NDAuMjkgNTI0LjY4NCAxNzQwLjI5IDUwNi4yNzRDMTc0MC4yOSA0ODcuODY0IDE3NDQuMzUgNDY5LjY4MSAxNzUyLjE5IDQ1My4wMjNDMTc2MC4zIDQzNy4wMjYgMTc3My4xIDQyMy44ODYgMTc4OC44OCA0MTUuMzZDMTgwNy40OCA0MDUuNTY2IDE4MjguMjkgNDAwLjc2MiAxODQ5LjMgNDAxLjQxOEMxODY2LjYgNDAxLjMzMiAxODgzLjg1IDQwMy40NDcgMTkwMC42MiA0MDcuNzExQzE5MTYuMzYgNDExLjc5MyAxOTMxLjY2IDQxNy40MDMgMTk0Ni4zMiA0MjQuNDYxTDE5NDUuNjQgMzM1Ljc3M0MxOTM1Ljg1IDMzMS44OTkgMTkyNS44MyAzMjguNjY1IDE5MTUuNjIgMzI2LjA5MUMxODkyLjgxIDMyMC4yNTYgMTg2OS4zNiAzMTcuMzI5IDE4NDUuODIgMzE3LjM3N0MxODA5IDMxNi40NjcgMTc3Mi41NyAzMjUuMDAxIDE3MzkuOTkgMzQyLjE2NEMxNzEwLjkgMzU3LjcyOSAxNjg2LjgzIDM4MS4yMzEgMTY3MC41NyA0MDkuOTM4QzE2NTQgNDM5LjgwMiAxNjQ1LjU2IDQ3My40ODUgMTY0Ni4wNyA1MDcuNjNDMTY0NS41MyA1NDEuNTM4IDE2NTQuMDkgNTc0Ljk3MSAxNjcwLjg2IDYwNC40NUMxNjg3LjMxIDYzMi43NzEgMTcxMS41NCA2NTUuNzg2IDE3NDAuNjcgNjcwLjc3MkMxNzcyLjk5IDY4Ny4xMDMgMTgwOC44MyA2OTUuMjQ4IDE4NDUuMDQgNjk0LjQ5M0MxODU3Ljc0IDY5NC41ODEgMTg3MC40MyA2OTMuNzA3IDE4ODIuOTkgNjkxLjg3OUwxODgzLjM4IDY5Mi4wNzNaTTIxMTkuMDUgNjg0LjQyNFY1MTguMDg2QzIxMTguNjkgNDk2LjI3NCAyMTIyLjQ3IDQ3NC41OTIgMjEzMC4xOCA0NTQuMTg1QzIxMzYuNjIgNDM2Ljc1OSAyMTQ3Ljg2IDQyMS41MTcgMjE2Mi42MiA0MTAuMjI4QzIxNzYuNjEgMzk5Ljg2MiAyMTkzLjYxIDM5NC4zNTQgMjIxMS4wMyAzOTQuNTQzQzIyMTkuNzYgMzkzLjkzNCAyMjI4LjUzIDM5NS4xNzIgMjIzNi43NSAzOTguMTc0QzIyNDQuOTcgNDAxLjE3NyAyMjUyLjQ3IDQwNS44NzggMjI1OC43NiA0MTEuOTcxQzIyNzAuNjEgNDI2LjE4OCAyMjc2LjUxIDQ0NC40MzUgMjI3NS4yMiA0NjIuODk5VjY4NC4yM0gyMzY2LjYyVjQ2MS41NDNDMjM2Ni42MiA0MTUuNDU3IDIzNTUuNjggMzc5Ljk1NiAyMzMzLjggMzU1LjA0MUMyMzIyLjc5IDM0Mi41MzUgMjMwOS4xMiAzMzIuNjU5IDIyOTMuNzggMzI2LjE0QzIyNzguNDUgMzE5LjYyMiAyMjYxLjg1IDMxNi42MjcgMjI0NS4yMSAzMTcuMzc3QzIyMTYuMTcgMzE2LjI2OSAyMTg3Ljc4IDMyNi4wOCAyMTY1LjYyIDM0NC44NzVDMjE0My41OCAzNjQuOTY3IDIxMjcuNDIgMzkwLjY2OCAyMTE4Ljg1IDQxOS4yMzNWMTkyLjc3SDIwMjguODFWNjg0LjIzTDIxMTkuMDUgNjg0LjQyNFpNMjY2MC43NyA2ODQuNDI0QzI3MDcuMDIgNjg1Ljc5NCAyNzUyLjg4IDY3NS40NyAyNzk0LjA5IDY1NC40MUMyODMwLjAyIDYzNS4xODggMjg1OS4yNCA2MDUuNDY2IDI4NzcuODQgNTY5LjIwOEMyODk3LjczIDUyOC44NzcgMjkwNy41MyA0ODQuMzI0IDI5MDYuNCA0MzkuMzcxQzI5MDcuNDYgMzk0LjMzMiAyODk3LjY2IDM0OS43MDEgMjg3Ny44NCAzMDkuMjQ1QzI4NTkuMjcgMjcyLjc5MyAyODMwLjA2IDI0Mi44NDQgMjc5NC4wOSAyMjMuMzY1QzI3NTIuOTUgMjAyLjA4MiAyNzA3LjA3IDE5MS42MiAyNjYwLjc3IDE5Mi45NjNIMjQ3MS44N1Y2ODQuMjNMMjY2MC43NyA2ODQuNDI0Wk0yNTY1Ljc4IDYwMS4xNThWMjc1Ljg0MkgyNjU5LjMxQzI3MDYuMzcgMjc1Ljg0MiAyNzQzLjI2IDI5MC4xNzEgMjc2OS45OCAzMTguODNDMjc5Ni43IDM0Ny40ODkgMjgxMC4xIDM4Ny42MDUgMjgxMC4xNiA0MzkuMTc4QzI4MTAuMTYgNDkwLjgxNSAyNzk2Ljc3IDUzMC43MzggMjc2OS45OCA1NTguOTQ1QzI3NDMuMTkgNTg3LjE1MiAyNzA2LjMgNjAxLjIyMyAyNjU5LjMxIDYwMS4xNThIMjU2NS43OFpNMzE0NS45NCA2NjguOTMzQzMxNjYuNzcgNjUzLjMzNiAzMTgyLjc1IDYzMi4xNTIgMzE5Mi4wMyA2MDcuODM5VjY4My45NEgzMjgyLjI3VjQ0Ni45MjNDMzI4Mi43NCA0MjIuOTcxIDMyNzYuMTggMzk5LjQwNSAzMjYzLjM5IDM3OS4xNDlDMzI1MC4xMiAzNTkuMDE5IDMyMzEuMzMgMzQzLjE1IDMyMDkuMjYgMzMzLjQ1QzMxODMgMzIxLjk3MiAzMTU0LjU1IDMxNi4zODYgMzEyNS45IDMxNy4wODdDMzEwOC43OSAzMTcuMDE0IDMwOTEuNzEgMzE4LjUwNSAzMDc0Ljg3IDMyMS41NDFDMzA1OS4wMyAzMjQuNDgxIDMwNDMuNSAzMjguOTIzIDMwMjguNSAzMzQuODA1QzMwMTQuNTYgMzQwLjI5OSAzMDAxLjEyIDM0Ni45NzEgMjk4OC4zMiAzNTQuNzVMMjk5MS4xMiA0MzkuMTc4QzMwMTEuMzcgNDI1LjU2NiAzMDMzLjE4IDQxNC40NDggMzA1Ni4wOSA0MDYuMDY1QzMwNzguNzQgMzk4LjE4NSAzMTAyLjU5IDM5NC4yODcgMzEyNi41OCAzOTQuNTQzQzMxNDMuOTUgMzkzLjQ1IDMxNjEuMTMgMzk4LjYzOSAzMTc0Ljk5IDQwOS4xNjNDMzE4MC42IDQxMy42OTYgMzE4NS4xIDQxOS40NTggMzE4OC4xNCA0MjYuMDA1QzMxOTEuMTggNDMyLjU1MSAzMTkyLjY4IDQzOS43MDggMzE5Mi41MSA0NDYuOTIzVjQ3MS4zMjJIMzExMi45MkMzMDY0LjUxIDQ3MS4zMjIgMzAyNy4wNCA0ODEuMDA0IDI5OTkuMDYgNTAxLjcyNEMyOTg1LjYxIDUxMS4xMTIgMjk3NC43NCA1MjMuNzI2IDI5NjcuNDMgNTM4LjQwOUMyOTYwLjEyIDU1My4wOTIgMjk1Ni42MiA1NjkuMzc0IDI5NTcuMjMgNTg1Ljc2NEMyOTU2Ljk4IDYwNC43MjQgMjk2MS43OSA2MjMuNDA4IDI5NzEuMTggNjM5Ljg4N0MyOTgwLjY0IDY1Ni4wNTEgMjk5NC41MSA2NjkuMTg0IDMwMTEuMTYgNjc3Ljc0M0MzMDI5LjggNjg3LjM0IDMwNTAuNTMgNjkyLjEzMyAzMDcxLjQ5IDY5MS42ODZDMzA5OC4zNSA2OTIuNjQ5IDMxMjQuNzggNjg0Ljc1NiAzMTQ2LjcyIDY2OS4yMjNMMzE0NS45NCA2NjguOTMzWk0zMDY0LjYxIDYwNy44MzlDMzA1OS43NCA2MDQuMTQgMzA1NS44NSA1OTkuMzAxIDMwNTMuMjggNTkzLjc0N0MzMDUwLjcyIDU4OC4xOTMgMzA0OS41NSA1ODIuMDk0IDMwNDkuODkgNTc1Ljk4NUMzMDQ5LjY3IDU2OC40MDYgMzA1MS40OSA1NjAuOTA2IDMwNTUuMTcgNTU0LjI3N0MzMDU4Ljg1IDU0Ny42NDggMzA2NC4yNSA1NDIuMTM2IDMwNzAuODEgNTM4LjMyMkMzMDg5LjkyIDUyOC4yODYgMzExMS40MiA1MjMuNjk3IDMxMzIuOTcgNTI1LjA1N0gzMTkxLjA2VjUzOUMzMTkwLjggNTUxLjQ5IDMxODcuNDcgNTYzLjcyNSAzMTgxLjM4IDU3NC42M0MzMTc0LjIzIDU4Ny41OTMgMzE2My45IDU5OC41MjIgMzE1MS4zNiA2MDYuMzg3QzMxMzcuNTggNjE1LjM0MSAzMTIxLjQyIDYxOS45NjEgMzEwNC45OSA2MTkuNjUxQzMwOTAuNzMgNjIwLjI4NCAzMDc2LjY1IDYxNi4yMzggMzA2NC45IDYwOC4xMjlMMzA2NC42MSA2MDcuODM5Wk0zNDY2LjIzIDY4NC4yM1Y1MzIuNTEzQzM0NjYuMjMgNDkzLjAxIDM0NzQuNTYgNDYyLjgwMiAzNDkxLjMxIDQ0Mi4xNzlDMzQ5OS4zNyA0MzIuMDQ3IDM1MDkuNzEgNDIzLjk1NSAzNTIxLjQ5IDQxOC41NTZDMzUzMy4yNiA0MTMuMTU3IDM1NDYuMTQgNDEwLjYwMyAzNTU5LjA4IDQxMS4xQzM1NzEuODQgNDEwLjk5NSAzNTg0LjU1IDQxMi44NTYgMzU5Ni43NCA0MTYuNjE4VjMyOS4xOUMzNTkwLjkzIDMyNy4zOTcgMzU4NC45NyAzMjYuMTMzIDM1NzguOTMgMzI1LjQxNEMzNTcyLjUxIDMyNC42MzIgMzU2Ni4wNCAzMjQuMjc2IDM1NTkuNTcgMzI0LjM0OUMzNTQ4Ljg3IDMyNC4yNiAzNTM4LjI2IDMyNi4zNjEgMzUyOC40IDMzMC41MjRDMzUxOC41NSAzMzQuNjg2IDM1MDkuNjQgMzQwLjgyMiAzNTAyLjI1IDM0OC41NTRDMzQ4NC45OSAzNjYuODE0IDM0NzIuNiAzODkuMTIyIDM0NjYuMjMgNDEzLjQyM1YzMjguMjIxSDMzNzQuNzNWNjg0LjIzSDM0NjYuMjNaTTM3NDYuMTQgNjg0LjIzVjU2OS4wMTRMMzc3OC45NiA1MzcuNjQ0TDM4ODUuNDcgNjg0LjIzSDM5OTIuOTRMMzg0MC44MyA0NzYuMTYzTDM5OTAuMTMgMzI4LjIyMUgzODc1LjY5TDM3NDUuODUgNDU1LjA1NlYxOTMuNjQxSDM2NTUuODFWNjg0LjIzSDM3NDYuMTRaTTQxNDAuNTkgNjg0LjIzVjE5Mi43N0g0MDQ5Ljc3VjY4NC4yM0g0MTQwLjU5Wk00Mjc5LjUzIDgxNi44NzRDNDMwOC4zOCA4MTguMDgxIDQzMzYuOTYgODEwLjkxOSA0MzYxLjgzIDc5Ni4yNTJDNDM4My4yIDc4Mi41MDMgNDQwMC44OCA3NTguNjUzIDQ0MTQuODkgNzI0LjcwMUw0NTc4LjYyIDMyOC4yMjFINDQ4NS4wOUw0Mzg4LjI2IDU3Ny40MzdMNDI5MC4zOCAzMjguMjIxSDQxOTYuODVMNDM0My40NCA2ODMuNTUzTDQzMzUuNjkgNzAxLjY1OEM0MzMyLjEyIDcxMi4yODQgNDMyNS4zNiA3MjEuNTUgNDMxNi4zMyA3MjguMTg3QzQzMDUuMjMgNzM0LjU1MyA0MjkyLjQ5IDczNy40ODQgNDI3OS43MyA3MzYuNjFINDIwMy43MlY4MTYuODc0SDQyNzkuNTNaIj48L3BhdGg+CjxwYXRoIGZpbGw9ImJsYWNrIiBkPSJNNTI0OC43MiA4NzdDNTI0NS4wOSA4NzcuMDA3IDUyNDEuNTMgODc1Ljk5NCA1MjM4LjQ1IDg3NC4wNzdDNTIzNS4zNyA4NzIuMTYgNTIzMi44OSA4NjkuNDE1IDUyMzEuMjkgODY2LjE1NkM1MjI5Ljc1IDg2My4wODggNTIyOS4wOSA4NTkuNjQ3IDUyMjkuNCA4NTYuMjI1QzUyMjkuNzEgODUyLjgwMyA1MjMwLjk3IDg0OS41MzUgNTIzMy4wNCA4NDYuNzkyTDU0MzkuMDcgNTYzLjEwOEw1MDc4LjMxIDcxMC40NjlDNTA3NS44NyA3MTEuNTMyIDUwNzMuMjQgNzEyLjA5MiA1MDcwLjU3IDcxMi4xMTVDNTA2Ni40IDcxMi4wOTQgNTA2Mi4zNCA3MTAuNzI1IDUwNTkuMDEgNzA4LjIxM0M1MDU1LjY4IDcwNS43MDEgNTA1My4yNCA3MDIuMTc5IDUwNTIuMDggNjk4LjE3M0M1MDUwLjg4IDY5NC4yNTcgNTA1MS4wMSA2OTAuMDU3IDUwNTIuNDUgNjg2LjIyM0M1MDUzLjg4IDY4Mi4zODkgNTA1Ni41NCA2NzkuMTM2IDUwNjAuMDIgNjc2Ljk2OUw1Mzc3LjMgNDg5LjYyMUw0ODE4LjY0IDQ1Ny40NzdDNDgxNC4xNSA0NTYuNjkxIDQ4MTAuMDggNDU0LjM0NyA0ODA3LjE1IDQ1MC44NThDNDgwNC4yMiA0NDcuMzcgNDgwMi42MiA0NDIuOTU5IDQ4MDIuNjIgNDM4LjQwM0M0ODAyLjYyIDQzMy44NDcgNDgwNC4yMiA0MjkuNDM3IDQ4MDcuMTUgNDI1Ljk0OEM0ODEwLjA4IDQyMi40NTkgNDgxNC4xNSA0MjAuMTE2IDQ4MTguNjQgNDE5LjMzTDUzNzcuNTkgMzg3LjI4Mkw1MDYwLjIxIDE5OS45MzRDNTA1Ni43NCAxOTcuNzY3IDUwNTQuMDcgMTk0LjUxNSA1MDUyLjY0IDE5MC42ODFDNTA1MS4yIDE4Ni44NDcgNTA1MS4wNyAxODIuNjQ2IDUwNTIuMjcgMTc4LjczMUM1MDUzLjQzIDE3NC43NCA1MDU1Ljg1IDE3MS4yMyA1MDU5LjE2IDE2OC43MTlDNTA2Mi40OCAxNjYuMjA4IDUwNjYuNTEgMTY0LjgzIDUwNzAuNjcgMTY0Ljc4OEM1MDczLjM1IDE2NC43NzkgNTA3NS45OSAxNjUuMzc1IDUwNzguNDEgMTY2LjUzMUw1NDM5LjI3IDMxNC4wODZMNTIzMy4yMyAzMC40OTg1QzUyMzEuMTYgMjcuNzU1NyA1MjI5LjkgMjQuNDg3OSA1MjI5LjU5IDIxLjA2NTVDNTIyOS4yOCAxNy42NDMgNTIyOS45NCAxNC4yMDI3IDUyMzEuNDkgMTEuMTM0NEM1MjMzLjA0IDcuODM1NzkgNTIzNS40OCA1LjA0MTA5IDUyMzguNTUgMy4wNzE0N0M1MjQxLjYyIDEuMTAxODQgNTI0NS4xNyAwLjAzNzIzMzMgNTI0OC44MiAwQzUyNTEuMzQgMC4wMTY3MzgyIDUyNTMuODMgMC41Mzk2MzggNTI1Ni4xNCAxLjUzNzYxQzUyNTguNDUgMi41MzU1OCA1MjYwLjU0IDMuOTg4MjQgNTI2Mi4yOCA1LjgwOTIzTDU2NzIuOSA0MTYuMzI4QzU2NzguNzMgNDIyLjE3MyA1NjgyLjAxIDQzMC4wOTUgNTY4Mi4wMSA0MzguMzU1QzU2ODIuMDEgNDQ2LjYxNCA1Njc4LjczIDQ1NC41MzYgNTY3Mi45IDQ2MC4zODFMNTI2Mi4wOCA4NzEuMzg0QzUyNjAuMzQgODczLjE2MyA1MjU4LjI2IDg3NC41NzYgNTI1NS45NyA4NzUuNTRDNTI1My42NyA4NzYuNTA1IDUyNTEuMjEgODc3LjAwMSA1MjQ4LjcyIDg3N1Y4NzdaIj48L3BhdGg+CjwvZz4KPGRlZnM+CjxjbGlwUGF0aCBpZD0iY2xpcDBfNV8yIj4KPHJlY3QgZmlsbD0id2hpdGUiIGhlaWdodD0iODc3IiB3aWR0aD0iNTY4MiI+PC9yZWN0Pgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=" width="5682" height="877" class="img_ev3q"></a>
<a href="https://github.com/okteto/voting-app-with-external-resources" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="MongoDB" src="https://www.okteto.com/blog/assets/images/2f7abac43678-11ef3155d659cc70fe43b2d2eea1ac74.webp" width="1102" height="278" class="img_ev3q"></a>
<a href="https://github.com/okteto/external-resources-gcp" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="GCP" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCA3MiA1OCIgaGVpZ2h0PSI1OCIgd2lkdGg9IjcyIj4KPHBhdGggZmlsbD0iI0VBNDMzNSIgZD0iTTQ1LjY4NzIgMTUuOTU2MUg0Ny44ODMzTDU0LjE0MTkgOS42OTc0NUw1NC40NDk0IDcuMDQwMjdDNTAuODY0IDMuODc1NzEgNDYuNTMxMSAxLjY3NzQgNDEuODU5OSAwLjY1Mjk5OUMzNy4xODg3IC0wLjM3MTQgMzIuMzMzNSAtMC4xODgwNjcgMjcuNzUyOSAxLjE4NTY4QzIzLjE3MjMgMi41NTk0MiAxOS4wMTc1IDUuMDc4MjMgMTUuNjgxIDguNTA0MTZDMTIuMzQ0NSAxMS45MzAxIDkuOTM2NDYgMTYuMTUgOC42ODQzMyAyMC43NjU0QzkuMzgxNTcgMjAuNDc5NiAxMC4xNTM5IDIwLjQzMzMgMTAuODgwMyAyMC42MzM2TDIzLjM5NzcgMTguNTY5NEMyMy4zOTc3IDE4LjU2OTQgMjQuMDM0NSAxNy41MTUzIDI0LjM2MzkgMTcuNTgxMkMyNy4wNDYgMTQuNjM1NiAzMC43NTI1IDEyLjgyNjYgMzQuNzI0NyAxMi41MjQ1QzM4LjY5NyAxMi4yMjIzIDQyLjYzNDUgMTMuNDUgNDUuNzMxMiAxNS45NTYxSDQ1LjY4NzJaIj48L3BhdGg+CjxwYXRoIGZpbGw9IiM0Mjg1RjQiIGQ9Ik02My4wNTc3IDIwLjc2NTRDNjEuNjE5MSAxNS40Njc4IDU4LjY2NTQgMTAuNzA1MyA1NC41NTkxIDcuMDYyMjZMNDUuNzc1IDE1Ljg0NjNDNDcuNjA1NyAxNy4zNDIyIDQ5LjA3MjggMTkuMjM0MiA1MC4wNjU3IDIxLjM3OTdDNTEuMDU4NSAyMy41MjUyIDUxLjU1MTIgMjUuODY4MiA1MS41MDY2IDI4LjIzMTlWMjkuNzkxQzUyLjUzMzIgMjkuNzkxIDUzLjU0OTggMjkuOTkzMyA1NC40OTgzIDMwLjM4NjFDNTUuNDQ2OCAzMC43NzkgNTYuMzA4NyAzMS4zNTQ5IDU3LjAzNDYgMzIuMDgwOEM1Ny43NjA2IDMyLjgwNjggNTguMzM2NCAzMy42Njg2IDU4LjcyOTMgMzQuNjE3MUM1OS4xMjIyIDM1LjU2NTYgNTkuMzI0NCAzNi41ODIyIDU5LjMyNDQgMzcuNjA4OUM1OS4zMjQ0IDM4LjYzNTUgNTkuMTIyMiAzOS42NTIxIDU4LjcyOTMgNDAuNjAwNkM1OC4zMzY0IDQxLjU0OTEgNTcuNzYwNiA0Mi40MTEgNTcuMDM0NiA0My4xMzY5QzU2LjMwODcgNDMuODYyOSA1NS40NDY4IDQ0LjQzODcgNTQuNDk4MyA0NC44MzE2QzUzLjU0OTggNDUuMjI0NSA1Mi41MzMyIDQ1LjQyNjcgNTEuNTA2NiA0NS40MjY3SDM1Ljg3MDlMMzQuMzExOCA0Ny4wMDc4VjU2LjM4NDhMMzUuODcwOSA1Ny45NDRINTEuNTA2NkM1NS44NzI4IDU3Ljk3OCA2MC4xMzQgNTYuNjA1NyA2My42NTk4IDU0LjAzMDJDNjcuMTg1NyA1MS40NTQ3IDY5Ljc4ODkgNDcuODEyNyA3MS4wODQ0IDQzLjY0MjlDNzIuMzc5OSAzOS40NzMyIDcyLjI5ODggMzQuOTk3MyA3MC44NTMzIDMwLjg3NzJDNjkuNDA3NyAyNi43NTcxIDY2LjY3NDQgMjMuMjExNiA2My4wNTc3IDIwLjc2NTRaIj48L3BhdGg+CjxwYXRoIGZpbGw9IiMzNEE4NTMiIGQ9Ik0yMC4yMTM3IDU3Ljg1NjFIMzUuODQ5NFY0NS4zMzg4SDIwLjIxMzdDMTkuMDk5OCA0NS4zMzg2IDE3Ljk5ODkgNDUuMDk4OSAxNi45ODU2IDQ0LjYzNjFMMTQuNzg5NiA0NS4zMTY5TDguNDg2OTkgNTEuNTc1NUw3LjkzNzk5IDUzLjc3MTVDMTEuNDcyMyA1Ni40NDA0IDE1Ljc4NSA1Ny44NzU0IDIwLjIxMzcgNTcuODU2MVoiPjwvcGF0aD4KPHBhdGggZmlsbD0iI0ZCQkMwNSIgZD0iTTIwLjIxMzcgMTcuMjUyQzE1Ljk3NzIgMTcuMjc3MyAxMS44NTQzIDE4LjYyNTEgOC40MjEwMyAyMS4xMDczQzQuOTg3NzMgMjMuNTg5NSAyLjQxNTQxIDI3LjA4MiAxLjA2MzM2IDMxLjA5N0MtMC4yODg2OTYgMzUuMTEyMSAtMC4zNTI5NzIgMzkuNDQ5MiAwLjg3OTUxIDQzLjUwMjVDMi4xMTE5OSA0Ny41NTU5IDQuNTc5NjggNTEuMTIzMSA3LjkzNzkyIDUzLjcwNTlMMTcuMDA3NSA0NC42MzYzQzE1Ljg1NDkgNDQuMTE1NiAxNC44NDU5IDQzLjMyMyAxNC4wNjcgNDIuMzI2NkMxMy4yODgxIDQxLjMzMDIgMTIuNzYyNiA0MC4xNTk3IDEyLjUzNTUgMzguOTE1NUMxMi4zMDg0IDM3LjY3MTQgMTIuMzg2NiAzNi4zOTA3IDEyLjc2MzMgMzUuMTgzNEMxMy4xNCAzMy45NzYgMTMuODAzOSAzMi44NzgxIDE0LjY5ODIgMzEuOTgzOEMxNS41OTI1IDMxLjA4OTUgMTYuNjkwNCAzMC40MjU2IDE3Ljg5NzggMzAuMDQ4OUMxOS4xMDUxIDI5LjY3MjIgMjAuMzg1OCAyOS41OTQgMjEuNjI5OSAyOS44MjExQzIyLjg3NDEgMzAuMDQ4MiAyNC4wNDQ2IDMwLjU3MzcgMjUuMDQxIDMxLjM1MjZDMjYuMDM3NCAzMi4xMzE1IDI2LjgzIDMzLjE0MDUgMjcuMzUwNyAzNC4yOTMxTDM2LjQyMDMgMjUuMjIzNUMzNC41MTY3IDIyLjczNDkgMzIuMDYzMiAyMC43MjA0IDI5LjI1MTcgMTkuMzM3NUMyNi40NDAyIDE3Ljk1NDYgMjMuMzQ2OCAxNy4yNDA4IDIwLjIxMzcgMTcuMjUyWiI+PC9wYXRoPgo8L3N2Zz4K" width="72" height="58" class="img_ev3q"></a></p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Okteto Extends Developer Experience to All Resources]]></title>
            <link>https://www.okteto.com/blog/okteto-extends-developer-experience-to-all-resources/</link>
            <guid>https://www.okteto.com/blog/okteto-extends-developer-experience-to-all-resources/</guid>
            <pubDate>Tue, 18 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Okteto announces Okteto Release 1.7 with External Resources that integrate any resource with Kubernetes development environments.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="platform-builders-can-automate-lifecycle-control-for-every-environment">Platform Builders Can Automate Lifecycle Control for Every Environment<a href="https://www.okteto.com/blog/okteto-extends-developer-experience-to-all-resources/#platform-builders-can-automate-lifecycle-control-for-every-environment" class="hash-link" aria-label="Direct link to Platform Builders Can Automate Lifecycle Control for Every Environment" title="Direct link to Platform Builders Can Automate Lifecycle Control for Every Environment" translate="no">​</a></h2>
<p>San Francisco, CA - April 18, 2023 - Okteto, the leader in modern development experience automation, announced today at KubeCon Europe 2023 a new Okteto Release 1.7 with External Resources that integrate any resource with Kubernetes development environments. <strong>External Resources</strong> are used to access any resource including applications, databases, message brokers, serverless functions, security infrastructure, reporting dashboards, etc that are not available as containerized services and can be hosted anywhere. Once an External Resource is defined in Okteto, developers can instantly deploy, run, and test cloud native microservices without concern for configuring support for external dependencies with a single-click. Okteto Release 1.7 with External Resources is available in Okteto Self-Hosted and Bring Your Own Cloud.</p>
<!-- -->
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Platform teams can now deliver a great development experience for modern app developers with External Resources</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/blog/how-platform-teams-can-deliver-a-great-development-experience-for-modern-app-developers/" target="_self">Read the blog post</a></div></section>
<p>Typically Platform and DevOps teams are required to install and configure applications, execute custom admin scripts just to keep up with provisioning and de-provisioning infrastructure for development. As a result, developers are often stuck waiting for environments, when they could be developing applications. Now Platform and Development Experience teams can build a single development experience to govern the environments for all microservices and development resources and continuously automate a modern experience for all developers.</p>
<figure class="quote_Y4Tu"><blockquote>When customers are in production with microservices and Kubernetes, many want to develop on Kubernetes.&nbsp; When microservices are dependent on any external resources this significantly slows down development and the lifecycle control for environments.&nbsp; Our goal with External Resources is to enable platform engineering teams with all the necessary features to deliver a complete modern lifecycle and a developer experience for any resource anywhere</blockquote><figcaption><img src="https://www.okteto.com/blog/assets/images/67ef91355b6b-38b4d3e629bdf9385c1a6255a1c886d1.webp" alt=""><span><strong>Ramiro Berrelleza</strong><span>CEO &amp; Co-founder, Okteto</span></span></figcaption></figure>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="customers-are-evolving-to-microservices-and-kubernetes-platforms">Customers are evolving to Microservices and Kubernetes Platforms<a href="https://www.okteto.com/blog/okteto-extends-developer-experience-to-all-resources/#customers-are-evolving-to-microservices-and-kubernetes-platforms" class="hash-link" aria-label="Direct link to Customers are evolving to Microservices and Kubernetes Platforms" title="Direct link to Customers are evolving to Microservices and Kubernetes Platforms" translate="no">​</a></h4>
<p>Modern application development teams can now speed the adoption of Kubernetes-ready architecture with support for existing non-container workloads. Not all required application resources are implemented in containers nor hosted on Kubernetes which can be a blocker to releasing new applications. Now that Okteto has released External Resources, many legacy applications, infrastructure, as well as, modern applications services can be automated with every development environment to speed productivity and delivery. Customers and technology partners will be using Okteto to provide a robust, incremental path to cloud native microservice applications.</p>
<figure class="quote_Y4Tu"><blockquote>Okteto and LaunchDarkly share a common vision to provide developers the ultimate modern software development experience.&nbsp; Okteto's External Resources allows our developers and our broader community to fully integrate LaunchDarkly in their development environment and gain the benefits of feature flags as soon as they start developing.</blockquote><figcaption><img src="https://www.okteto.com/blog/assets/images/2d9399c8e3de-6d7e6c1ac75badc631715923c3e03858.webp" alt=""><span><strong>John Kodumal</strong><span>CTO and Co-founder, LaunchDarkly</span></span></figcaption></figure>
<figure class="quote_Y4Tu"><blockquote>Modern app developers using Okteto can use best-in-category services like MongoDB Atlas directly from their development environments with scalable and secure data environments for any cloud. We are excited about how our customers can leverage this cutting edge development experience automation.</blockquote><figcaption><img src="https://www.okteto.com/blog/assets/images/e15af25e0210-356a5df88e07e6f422852a8c7cb570c4.webp" alt=""><span><strong>Andrew Davidson</strong><span>SVP, Products, MongoDB</span></span></figcaption></figure>
<figure class="quote_Y4Tu"><blockquote>Customers developing applications need access to secure, consistent, and high integrity production-like data.&nbsp; Especially during development and testing, it’s critical to execute modern apps with a modern production-like environment. Developers can now use Okteto External Resources with Privacy Dynamics to automatically spin-up the exact production like app and data environments without any additional headaches for the developer or test engineers.&nbsp; We are excited about partnering with Okteto to enable great development experiences.</blockquote><figcaption><img src="https://www.okteto.com/blog/assets/images/f788897ce6a8-e0c32438b231fbcf110af2fd789dfb78.webp" alt=""><span><strong>John Craft</strong><span>CTO &amp; Co-Founder, Privacy Dynamics</span></span></figcaption></figure>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="external-resources-extend-modern-development-experience-automation">External Resources Extend Modern Development Experience Automation<a href="https://www.okteto.com/blog/okteto-extends-developer-experience-to-all-resources/#external-resources-extend-modern-development-experience-automation" class="hash-link" aria-label="Direct link to External Resources Extend Modern Development Experience Automation" title="Direct link to External Resources Extend Modern Development Experience Automation" translate="no">​</a></h4>
<p>Platform and Development Experience Engineers are able to provision environments in Kubernetes that can now access resources anywhere with a single-click experience. Okteto External Resources includes:</p>
<ul>
<li class="">Defining any external resource in your Okteto manifest from any cloud or or service provider</li>
<li class="">Leverage a single approach to govern development environments for modern apps</li>
<li class="">Manage resources deployed outside the Okteto Kubernetes cluster</li>
<li class="">Adds robust, lifecycle control for microservice dependencies / when needed / if required</li>
<li class="">“external” includes any resource like: Applications, databases, message brokers, serverless functions, reporting dashboards, any resource, everywhere..</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="platform-and-development-experience-engineering-benefits">Platform and Development Experience Engineering Benefits<a href="https://www.okteto.com/blog/okteto-extends-developer-experience-to-all-resources/#platform-and-development-experience-engineering-benefits" class="hash-link" aria-label="Direct link to Platform and Development Experience Engineering Benefits" title="Direct link to Platform and Development Experience Engineering Benefits" translate="no">​</a></h4>
<ul>
<li class="">For Platform / Development Experience engineering teams - A robust, graceful way of taking control of the lifecycle of external dependencies as part of the development experience</li>
<li class="">For Modern Development teams - Less time and risk implementing microservice app dependencies, runtime configurations, and debugging</li>
<li class="">For Modern Architects - Easier and faster way to evolve and execute distributed applications (legacy and microservices) and the automation for distributed resources/systems/apps/security, any resource, any where.</li>
</ul>
<p>With Okteto, the entire team can enjoy benefits such as increased visibility, improved trust, and more governance and control. The team can quickly find and manage app dependencies and mitigate the risk of manual deployment errors.</p>
<p>With the addition of External Resources, the Okteto experience enables faster and higher quality transition to cloud native apps and platforms, providing more innovation and value to developers and startups.</p>
<p>Learn more about <a href="https://www.okteto.com/docs/tutorials/external-resources" target="_blank" rel="noopener noreferrer" class="">External Resources</a> and <a href="https://www.okteto.com/blog/how-platform-teams-can-deliver-a-great-development-experience-for-modern-app-developers/" target="_blank" rel="noopener noreferrer" class="">how Platform teams can deliver a great development experience for modern developers</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Okteto Chart 1.6, 1.7 & CLI 2.14 released with Kubernetes 1.24 support]]></title>
            <link>https://www.okteto.com/blog/product-update-april-2023/</link>
            <guid>https://www.okteto.com/blog/product-update-april-2023/</guid>
            <pubDate>Wed, 12 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Okteto's April product update contains many improvements to the Okteto Experience including new CLI version, support for dynamic endpoints and more!]]></description>
            <content:encoded><![CDATA[<p>We're excited about March's product update because it contains many improvements to the Okteto product experience. We've updated our CLI to version 2.14, added support for dynamic endpoints for external resources, and more!</p>
<!-- -->
<p>Below is a detailed list of the features and improvements that shipped in March with links to the documentation to learn more.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-features">New features<a href="https://www.okteto.com/blog/product-update-april-2023/#new-features" class="hash-link" aria-label="Direct link to New features" title="Direct link to New features" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="added-support-for-kubernetes-124">Added support for Kubernetes 1.24<a href="https://www.okteto.com/blog/product-update-april-2023/#added-support-for-kubernetes-124" class="hash-link" aria-label="Direct link to Added support for Kubernetes 1.24" title="Direct link to Added support for Kubernetes 1.24" translate="no">​</a></h3>
<p>Okteto is striving for N-2 version support for Kubernetes to ensure we remain aligned with cloud infrastructure providers and the regular channel releases from the CNCF and Kubernetes community.</p>
<p>This change, and our broader effort to stay current with new Kubernetes versions, will ensure a consistent and stable experience on Okteto.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="updated-the-okteto-cli-version-to-214">Updated the Okteto CLI version to 2.14<a href="https://www.okteto.com/blog/product-update-april-2023/#updated-the-okteto-cli-version-to-214" class="hash-link" aria-label="Direct link to Updated the Okteto CLI version to 2.14" title="Direct link to Updated the Okteto CLI version to 2.14" translate="no">​</a></h3>
<p>The latest version of the Okteto CLI includes several new features and some bug fixes. We continue to invest in the CLI to provide a great developer experience to our customers and end users because it is the entry point for most developers and is core to the Okteto product experience.</p>
<div class="button_B_vc"><a class="Button light layout" href="https://github.com/okteto/okteto/releases/tag/2.14.0" target="_blank" rel="noopener noreferrer">Documentation<!-- --> →</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="customize-endpoints-shown-in-the-okteto-ui">Customize endpoints shown in the Okteto UI<a href="https://www.okteto.com/blog/product-update-april-2023/#customize-endpoints-shown-in-the-okteto-ui" class="hash-link" aria-label="Direct link to Customize endpoints shown in the Okteto UI" title="Direct link to Customize endpoints shown in the Okteto UI" translate="no">​</a></h3>
<p>You can now use the <strong>dev.okteto.com/endpoints</strong> annotation in your <strong>Ingress</strong> or <strong>VirtualServices</strong> resource to define a list of endpoints (separated by commas) that will replace the default endpoints used by Okteto.</p>
<p>This change also expands the <strong>OKTETO_NAMESPACE</strong> and <strong>OKTETO_DOMAIN</strong> environment variables to make endpoints portable between namespaces.</p>
<div class="button_B_vc"><a class="Button light layout" href="https://www.okteto.com/docs/core/endpoints/automatic-ssl#customizing-the-endpoints-shown-in-the-okteto-dashboard" target="_self">Documentation<!-- --> →</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-for-configuring-the-buildkit-service-account">Support for configuring the buildkit service account<a href="https://www.okteto.com/blog/product-update-april-2023/#support-for-configuring-the-buildkit-service-account" class="hash-link" aria-label="Direct link to Support for configuring the buildkit service account" title="Direct link to Support for configuring the buildkit service account" translate="no">​</a></h3>
<p>Buildkit is the build service used in conjunction with <strong>okteto build</strong> to build containers directly in the cluster. The service account for buildkit is now configurable to provide you with more flexibility and control over your Okteto implementation.</p>
<div class="button_B_vc"><a class="Button light layout" href="https://www.okteto.com/docs/self-hosted/administration/configuration/#buildkit" target="_self">Documentation<!-- --> →</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="token-based-authentication-for-simpler-self-hosted-installation">Token-based authentication for simpler self-hosted installation<a href="https://www.okteto.com/blog/product-update-april-2023/#token-based-authentication-for-simpler-self-hosted-installation" class="hash-link" aria-label="Direct link to Token-based authentication for simpler self-hosted installation" title="Direct link to Token-based authentication for simpler self-hosted installation" translate="no">​</a></h3>
<p>When installing <a href="https://www.okteto.com/docs/self-hosted/" target="_blank" rel="noopener noreferrer" class="">Okteto Self-Hosted</a>, we now default to token-based authentication. This simplifies the installation process by removing the need to initially implement more complex authentication systems, seeking internal approvals to get access to those systems, and reducing the time to first exploration of Okteto.</p>
<p>Once you've explored Okteto with this initial implementation, you can switch to another authentication method that is more ideal for expanding to multiple users and production environments.</p>
<div class="button_B_vc"><a class="Button light layout" href="https://www.okteto.com/docs/self-hosted/administration/configuration/#token" target="_self">Documentation<!-- --> →</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="added-automatic-personal-access-token-expiration">Added automatic Personal Access Token expiration<a href="https://www.okteto.com/blog/product-update-april-2023/#added-automatic-personal-access-token-expiration" class="hash-link" aria-label="Direct link to Added automatic Personal Access Token expiration" title="Direct link to Added automatic Personal Access Token expiration" translate="no">​</a></h3>
<p>Starting in Okteto 1.7, Personal Access Tokens (PAT) will have a default, automatic expiration of <strong>180 days</strong>. We made this change to align ourselves with information security best practices and balancing the developer experience within Okteto. When a PAT expires, it can no longer be used to authenticate a user or for API requests. It is also not possible to restore an expired token; you must create a new token.</p>
<p><strong>Note:</strong> Existing tokens are not affected by this change unless or until the Okteto instance is upgraded to 1.7 or newer. At that point, the expiration timer begins from the day the instance is upgraded.</p>
<div class="button_B_vc"><a class="Button light layout" href="https://www.okteto.com/docs/core/credentials/personal-access-tokens#token-expiration" target="_self">Documentation<!-- --> →</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="changed-self-hosted-registry-storage-default-to-container-filesystem">Changed self-hosted registry storage default to container filesystem<a href="https://www.okteto.com/blog/product-update-april-2023/#changed-self-hosted-registry-storage-default-to-container-filesystem" class="hash-link" aria-label="Direct link to Changed self-hosted registry storage default to container filesystem" title="Direct link to Changed self-hosted registry storage default to container filesystem" translate="no">​</a></h3>
<p>When installing Okteto self-hosted, you are no longer required to use external storage for the registry. Now the installer defaults to using the <strong>container filesystem storage.</strong> This change simplifies the self-hosted installation process further to help you get setup faster.</p>
<div class="button_B_vc"><a class="Button light layout" href="https://www.okteto.com/docs/self-hosted/administration/configuration/#filesystem" target="_self">Documentation<!-- --> →</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-custom-quotas-for-node-port-and-load-balancer-service-types">Support custom quotas for node port and load balancer service types<a href="https://www.okteto.com/blog/product-update-april-2023/#support-custom-quotas-for-node-port-and-load-balancer-service-types" class="hash-link" aria-label="Direct link to Support custom quotas for node port and load balancer service types" title="Direct link to Support custom quotas for node port and load balancer service types" translate="no">​</a></h3>
<p>Previously customers would specify desired quotas in the <strong>values.yaml</strong> file but Okteto would ignore values that were not defined as configurable. We've now added <strong>maxNodePorts</strong> and <strong>maxLoadBalancers</strong> to the list of configurable options at the namespace level for your Okteto instance.</p>
<div class="button_B_vc"><a class="Button light layout" href="https://www.okteto.com/docs/self-hosted/administration/configuration/#quotas" target="_self">Documentation<!-- --> →</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="public-override-support-for-self-signed-certificates-and-bring-your-own-certificate">Public override support for self-signed certificates and bring your own certificate<a href="https://www.okteto.com/blog/product-update-april-2023/#public-override-support-for-self-signed-certificates-and-bring-your-own-certificate" class="hash-link" aria-label="Direct link to Public override support for self-signed certificates and bring your own certificate" title="Direct link to Public override support for self-signed certificates and bring your own certificate" translate="no">​</a></h3>
<p>We now support the definition of a <strong>publicOverride</strong> option in your chart configuration, which enables you to customize the domain your developers use to access your Okteto instance. This does not affect the (sub)domains used for development environment endpoints within Okteto.</p>
<p>For example, if <strong>publicOverride</strong> is set to <strong>okteto.schrutefarms.com</strong>, your developers would access your Okteto instance using <strong>okteto.schrutefarms.com</strong> but your developer endpoints would still remain <strong>movies-dwight.example.com</strong>.</p>
<div class="button_B_vc"><a class="Button light layout" href="https://www.okteto.com/docs/self-hosted/administration/configuration/#publicoverride" target="_self">Documentation<!-- --> →</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="improved-the-wake-operation">Improved the wake operation<a href="https://www.okteto.com/blog/product-update-april-2023/#improved-the-wake-operation" class="hash-link" aria-label="Direct link to Improved the wake operation" title="Direct link to Improved the wake operation" translate="no">​</a></h3>
<p>The Okteto wake operation running behind the scenes now prioritizes waking dependency services first to ensure your environment is brought back up without any issues. This change aligns the wake operation with the development environment creation process by using the same order of operations.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="added-support-for-dynamic-endpoints-for-external-resources">Added support for dynamic endpoints for external resources<a href="https://www.okteto.com/blog/product-update-april-2023/#added-support-for-dynamic-endpoints-for-external-resources" class="hash-link" aria-label="Direct link to Added support for dynamic endpoints for external resources" title="Direct link to Added support for dynamic endpoints for external resources" translate="no">​</a></h3>
<p>You can now use dynamic endpoints for external resources you include in your Okteto manifest. This means you can create a complete list of services for your application that exists within Okteto and provides a convenient link to relevant service endpoints along with documentation to help other developers collaborating in the same namespace.</p>
<p>This feature supports:</p>
<ul>
<li class="">Static endpoints (a hardcoded URL in the <strong>external</strong> section)</li>
<li class="">Hybrid endpoints (a mix of static + $ENV_VARS)</li>
<li class="">Dynamic endpoints (completely dynamic using $ENV_VARS)</li>
</ul>
<div class="button_B_vc"><a class="Button light layout" href="https://www.okteto.com/docs/reference/manifest/#use-dynamic-endpoints-for-an-external-url" target="_self">Documentation<!-- --> →</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://www.okteto.com/blog/product-update-april-2023/#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="changed-the-default-ingress-class-for-ingresses-managed-by-okteto">Changed the default ingress class for ingresses managed by okteto<a href="https://www.okteto.com/blog/product-update-april-2023/#changed-the-default-ingress-class-for-ingresses-managed-by-okteto" class="hash-link" aria-label="Direct link to Changed the default ingress class for ingresses managed by okteto" title="Direct link to Changed the default ingress class for ingresses managed by okteto" translate="no">​</a></h3>
<p>In the March release we've changed the default ingress class for ingresses managed by Okteto from <strong>nginx</strong> to <strong>okteto-nginx</strong>. We made this change to prevent collisions with other controllers that may already be installed on a cluster.</p>
<p>There is no action required from our users and all ingresses managed by Okteto will be automatically updated as part of this change.</p>
<div class="button_B_vc"><a class="Button light layout" href="https://www.okteto.com/docs/self-hosted/install/releases/#breaking-changes" target="_self">Documentation<!-- --> →</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-a-more-detailed-list">See a more detailed list<a href="https://www.okteto.com/blog/product-update-april-2023/#see-a-more-detailed-list" class="hash-link" aria-label="Direct link to See a more detailed list" title="Direct link to See a more detailed list" translate="no">​</a></h2>
<p>For a more detailed list of improvements, bug fixes, breaking changes, and deprecation notices please see <a href="https://www.okteto.com/docs/self-hosted/install/releases/#170" target="_blank" rel="noopener noreferrer" class="">our documentation</a>.</p>
<div class="button_B_vc"><a class="Button teal layout" href="https://www.okteto.com/docs/self-hosted/install/releases/#170" target="_self">Release Notes</a></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[5 Reasons to Prioritize a Positive Developer Experience]]></title>
            <link>https://www.okteto.com/blog/5-reasons-to-prioritize-a-positive-developer-experience/</link>
            <guid>https://www.okteto.com/blog/5-reasons-to-prioritize-a-positive-developer-experience/</guid>
            <pubDate>Thu, 23 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[5 Reasons to Prioritize a Positive Developer Experience]]></description>
            <content:encoded><![CDATA[<p><strong>5 Reasons to Prioritize a Positive Developer Experience</strong></p>
<!-- -->
<p>Is building and maintaining an internal development platform negatively impacting developer happiness and retention? If your innovative developers are burdened with the administrative tasks of maintaining a development platform, your company may have unhappy developers. And unhappy developers can really negatively impact product productivity.</p>
<p>When unhappy cloud app developers leave the organization because of a negative developer experience, the cost can be significant — both in direct and indirect costs. Here's a double whammy: When developers go, it can demoralize the rest of the team. This exodus can lead to decreased engagement, lower productivity, and increased turnover as other team members seek new opportunities.</p>
<p>Now here's a triple whammy: if you build your development platform and that development team leaves, they'll take their knowledge of the development platform's systems tech with them. This departure of information can lead to knowledge gaps and potentially costly mistakes as new team members learn the ropes of this new system. So now you're down developers and a development platform.</p>
<p>Ugh!</p>
<p><strong>Retaining talented developers</strong></p>
<p>Developers in general dislike organizational red tape, emails, meetings, and resource allocation, which hinder their productivity. Hence, a great developer experience (DX) can boost performance and productivity. Companies that prioritize DX can gain improvements in areas, such as talent retention and attraction, productivity, consistency, quality, security, compliance, and speed.</p>
<p>By providing a user-friendly platform, reducing time wastage, standardizing tooling, embedding security and compliance, and automating production, organizations can increase developers' job satisfaction, decrease costs, enhance product quality, meet compliance standards, and achieve faster deployment times. Furthermore, such investments in DX can result in high returns on investment, making them worth the effort.</p>
<p>Pro Tip: ask how happy your developers are with your existing in-house development platform. Many companies discover that buying a development platform increases a positive developer experience and accelerates productivity. So, what are the benefits of prioritizing a positive developer experience? Here are five things to consider:</p>
<ol>
<li class=""><strong>Attracting and retaining top talent.</strong> Keeping developers happy is a key benefit of prioritizing DX in organizations. The best engineers in the industry seek out companies with strong tech culture, high employee satisfaction, and a reputation for excellence. In such organizations, developers are able to focus on their core skills and build great software with the latest tools, while minimizing bureaucracy and unproductive work.</li>
<li class=""><strong>Increase productivity and reduce costs.</strong> By streamlining processes and reducing the time spent on mundane tasks like searching for resources and handling administrative work, developers can bring customer solutions from idea to code in a matter of minutes, rather than months. This targeted investment in a positive developer experience (DX) can produce a high return on investment.</li>
<li class=""><strong>Improved product quality.</strong> By standardizing and productizing the entire tool stack for developers can contribute to better developer experience (DX), as well as improve the overall quality of digital products. By building with high-quality components and tools, developers can more easily create products that meet customer needs and are free from errors or glitches. Additionally, having easy-to-find and integrated tooling allows developers to focus on what truly matters, rather than spending time figuring out how to use unfamiliar tools.</li>
<li class=""><strong>Better security makes developers more secure.</strong> By incorporating security testing as part of the enterprise-wide continuous integration/continuous delivery (CI/CD) pipeline or embedding default compliance policies in all cloud environments, compliance is established from the outset, reducing the team's efforts on routine work and meeting the organization's audit, security, and risk requirements.</li>
<li class=""><strong>Reduce scrap and rework.</strong> Early feedback on quality checks, such as testing, code quality, and controls, reducing handovers and coordination between teams, and full automation of the production process can eliminate rework and allow developers to cover more ground quickly. Consequently, organizations can achieve multiple deployments a day, rather than waiting weeks or months between deployments. Thus, prioritizing developer experience can lead to more efficient and effective development processes, ensuring the organization's success.</li>
</ol>
<p><strong>Why outsourcing software development fosters a great developer experience</strong></p>
<p>Building a development platform can provide – in some isolated cases - benefits, but it's essential to consider the opportunity costs that come with it. You might miss out on other projects or initiatives with a higher ROI or limit your flexibility and scalability. Therefore, it's crucial to carefully weigh the potential benefits and costs and make an informed decision.</p>
<p>Buying a cloud development platform can offer several benefits compared to building one in-house. First, it can save the company significant time and resources, allowing them to get to market faster. With a pre-built platform, the company can immediately start using the platform rather than spending time and resources developing one from scratch. Developers want to innovate, they don’t want to delegate and administrate.</p>
<p>The building of a platform keeps them from doing what they love: building killer applications. Buying can give the company a competitive advantage by allowing developers to bring new products and services to market quickly and efficiently. That’s a recipe for a happy developer.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Four Opportunity Costs of Building vs. Buying Software for Development]]></title>
            <link>https://www.okteto.com/blog/four-opportunity-costs-of-building-vs-buying-software-for-development/</link>
            <guid>https://www.okteto.com/blog/four-opportunity-costs-of-building-vs-buying-software-for-development/</guid>
            <pubDate>Thu, 23 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Four Opportunity Costs of Building vs. Buying Software for Development]]></description>
            <content:encoded><![CDATA[<p>At first glance, creating an internal cloud development experience platform may appear to be a sage business choice. Hey, a custom solution allows teams to manage specifications and control the release process to meet their immediate needs.</p>
<!-- -->
<p>That’s pretty cool, right?</p>
<p>However, building an in-house platform also means that your team will be <a href="https://www.okteto.com/blog/total-cost-of-ownership-tco-of-building-versus-buying-software-for-development/" target="_blank" rel="noopener noreferrer" class="">accountable for future development expenditures, ongoing research, maintenance, bug fixes, platform updates, and support</a>. These tasks can be expensive and time-consuming, removing valuable resources from your core business activities.</p>
<p>That’s not so cool.</p>
<p>Remember that things in high-tech move fast. If you’ve got a prospect with unique or urgent needs — and your engineering team must first make modifications to your platform in order to meet this customer's exotic  feature requirements —&nbsp;you might lose out on the deal. But a third-party vendor with a suite of out-of-the-box modern development platform features lets you turn disruptive change into business opportunities.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Should You Buy or Build a Development Platform?</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/build-versus-buy/" target="_self">Watch the Build vs. Buy Webinar Recording</a></div></section>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-opportunity-cost-of-in-house-software-development-tools"><a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/" target="_blank" rel="noopener noreferrer" class="">The Opportunity Cost of In-house Software Development Tools</a><a href="https://www.okteto.com/blog/four-opportunity-costs-of-building-vs-buying-software-for-development/#the-opportunity-cost-of-in-house-software-development-tools" class="hash-link" aria-label="Direct link to the-opportunity-cost-of-in-house-software-development-tools" title="Direct link to the-opportunity-cost-of-in-house-software-development-tools" translate="no">​</a></h3>
<p>When considering building a development platform, it's essential to consider the opportunity costs that come with it. Opportunity cost refers to the potential benefits you might miss by choosing one option over another. Here are some of the opportunity costs that you might encounter when building a development platform:</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-time-and-money">1. Time and money<a href="https://www.okteto.com/blog/four-opportunity-costs-of-building-vs-buying-software-for-development/#1-time-and-money" class="hash-link" aria-label="Direct link to 1. Time and money" title="Direct link to 1. Time and money" translate="no">​</a></h4>
<p>Building a development platform takes time, resources, and effort. The opportunity cost spent building the platform could be spent on projects that have a higher ROI. As you think about building your platform, consider this: It took an entire dedicated team of engineers a year to build the first version of a leading development platform vendor. This effort represented around 1 MM in payroll expenses to get the platform up and running. Throw in a few other priorities and distractions, and you're easily looking at 2X that.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-preventing-developers-from-delivering-value">2. Preventing Developers from Delivering Value<a href="https://www.okteto.com/blog/four-opportunity-costs-of-building-vs-buying-software-for-development/#2-preventing-developers-from-delivering-value" class="hash-link" aria-label="Direct link to 2. Preventing Developers from Delivering Value" title="Direct link to 2. Preventing Developers from Delivering Value" translate="no">​</a></h4>
<p>Building a development platform requires a team of experts with specific skills and knowledge. <a href="https://www.okteto.com/blog/5-technical-challenges-of-building-software-for-modern-cloud-development/" target="_blank" rel="noopener noreferrer" class="">The developers you devote to building the platform could be better used to design killer cloud applications that will grow your business by driving revenue.</a> That’s a huge opportunity cost because it’s an opportunity lost. Pro Tip: Ask yourself if building in-house software is at the expense of developing, qa, and implementing and rolling-out core features to grow your business. What is the opportunity cost of using your developers to maintain an in-house solution instead of delivering value?</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-missing-out-on-critical-features">3. Missing Out on Critical Features<a href="https://www.okteto.com/blog/four-opportunity-costs-of-building-vs-buying-software-for-development/#3-missing-out-on-critical-features" class="hash-link" aria-label="Direct link to 3. Missing Out on Critical Features" title="Direct link to 3. Missing Out on Critical Features" translate="no">​</a></h4>
<p>You might assume you’ve gained a competitive advantage by building your own platform but ask yourself the following questions:</p>
<ul>
<li class="">Is your feature roadmap comparable to what you get out of the box with a vendor?</li>
<li class="">Can you manage multiple moving parts, such as IDEs, Docker, code repos, and endless tooling options?</li>
<li class="">Can you connect to another developer's branch on its local frontend without spinning up that instance?</li>
<li class="">Can you troubleshoot issues globally across namespaces and shared environments? If the answer to these questions is "no," you may be at a competitive disadvantage.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-inability-to-pivot-quickly-to-seize-big-roi-opportunities">4. Inability to Pivot Quickly to Seize Big ROI Opportunities<a href="https://www.okteto.com/blog/four-opportunity-costs-of-building-vs-buying-software-for-development/#4-inability-to-pivot-quickly-to-seize-big-roi-opportunities" class="hash-link" aria-label="Direct link to 4. Inability to Pivot Quickly to Seize Big ROI Opportunities" title="Direct link to 4. Inability to Pivot Quickly to Seize Big ROI Opportunities" translate="no">​</a></h4>
<p>Building a development experience platform can limit your ability to scale quickly and the flexibility to adapt to changing business needs. The inability to pivot fast is itself an opportunity cost as the limitations of your in-house platform could compromise the desire to turn disruptive change into the next big thing. If you need to pivot your strategy or change direction, you might have to invest more time and money into the platform. <a href="https://www.okteto.com/blog/5-technical-challenges-of-building-software-for-modern-cloud-development/" target="_blank" rel="noopener noreferrer" class="">The technical challenges of building an in-house platform</a> are daunting and the total cost of ownership <a href="https://www.okteto.com/blog/total-cost-of-ownership-tco-of-building-versus-buying-software-for-development/" target="_blank" rel="noopener noreferrer" class="">(TCO) of maintaining the solution</a> often results in sticker shock. Pro Tip: when it comes to scalability and flexibility, ask yourself the following:</p>
<ul>
<li class="">What's the opportunity cost of using your cross-functional resources to provide ongoing bug fixes, maintenance, and platform updates at scale?</li>
<li class="">Can you test the code before merging, and can your solution manage multiple microservices in parallel?</li>
<li class="">Does your solution provide flexibility to allow developers to use their favorite tools and is it easy for both Kubernetes pros and newbies to collaborate?</li>
</ul>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">The Ultimate Build vs Buy Self Evaluation Guide</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/" target="_self">The Build vs. Buy Software Guide to Development Platforms</a></div></section>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-benefits-of-outsourcing-software-development-for-dev-platforms">The Benefits of Outsourcing Software Development for Dev Platforms<a href="https://www.okteto.com/blog/four-opportunity-costs-of-building-vs-buying-software-for-development/#the-benefits-of-outsourcing-software-development-for-dev-platforms" class="hash-link" aria-label="Direct link to The Benefits of Outsourcing Software Development for Dev Platforms" title="Direct link to The Benefits of Outsourcing Software Development for Dev Platforms" translate="no">​</a></h3>
<p>When building, it's essential to consider the opportunity costs. For example, you might miss out on other projects or initiatives with a higher ROI, or your flexibility and scalability might be limited. Therefore, it's crucial to carefully weigh the potential benefits and costs.</p>
<p>Buying a cloud development experience platform can offer several benefits compared to building one in-house. First, it can save significant time and resources, allowing you to market faster. With a pre-built platform, you can immediately start using it rather than spending time and resources developing it from scratch.</p>
<p>Buying offers a tremendous competitive advantage by allowing platform and development engineering teams to bring software to market quickly and efficiently.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Total Cost of Ownership (TCO) of Building Versus Buying Software for Development]]></title>
            <link>https://www.okteto.com/blog/total-cost-of-ownership-tco-of-building-versus-buying-software-for-development/</link>
            <guid>https://www.okteto.com/blog/total-cost-of-ownership-tco-of-building-versus-buying-software-for-development/</guid>
            <pubDate>Thu, 23 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[5 Maintenance Requirements of In-house Software Development]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-maintenance-requirements-of-in-house-software-development">5 Maintenance Requirements of In-house Software Development<a href="https://www.okteto.com/blog/total-cost-of-ownership-tco-of-building-versus-buying-software-for-development/#5-maintenance-requirements-of-in-house-software-development" class="hash-link" aria-label="Direct link to 5 Maintenance Requirements of In-house Software Development" title="Direct link to 5 Maintenance Requirements of In-house Software Development" translate="no">​</a></h3>
<p>Building an in-house development platform can provide several benefits, such as customizability, better control over the development process, and increased efficiency (at least initially). But when looking at the bigger business picture —i.e., the total cost of ownership (TCO) of building software in-house — companies often experience sticker shock when they realize how much they've spent. Specifically, the costly ongoing maintenance of building an in-house development platform is always an unpleasant surprise.</p>
<!-- -->
<p>TCO is the total cost of owning software over its entire lifecycle, including the initial building price and ongoing charges, such as maintenance, human capital investments, resource allocation, and opportunity costs.</p>
<p><a href="https://www.okteto.com/blog/four-opportunity-costs-of-building-vs-buying-software-for-development/" target="_blank" rel="noopener noreferrer" class="">Opportunity cost</a> is what you give up when you chose to build a platform with features that very well could be obsolete in a few months.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Should You Buy or Build a Development Platform?</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/build-versus-buy/" target="_self">Watch the Build vs. Buy Webinar Recording</a></div></section>
<p>If you build, you bear the entire cost burden of homegrown software. That includes paying for the initial buildout, ongoing support, bug fixes, upgrades, platform migrations, and keeping up with software industry trends. <a href="https://www.okteto.com/blog/5-technical-challenges-of-building-software-for-modern-cloud-development/" target="_blank" rel="noopener noreferrer" class="">Mucking around with these complex technical challenges mean that your developers aren't developing - they're administering.</a></p>
<p>Opportunity costs of building are a time-monopolizing buzzkill for developers whose time is now stuck maintaining the platform instead of innovating and delivering value. Making matters worst is that unhappy engineers often leave a company.</p>
<p>Let's look at the five unforeseen maintenance costs that come with building an in-house development platform:</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-infrastructure-architecture-maintenance">1. Infrastructure architecture maintenance<a href="https://www.okteto.com/blog/total-cost-of-ownership-tco-of-building-versus-buying-software-for-development/#1-infrastructure-architecture-maintenance" class="hash-link" aria-label="Direct link to 1. Infrastructure architecture maintenance" title="Direct link to 1. Infrastructure architecture maintenance" translate="no">​</a></h4>
<p>To build an in-house development platform, you must set up and maintain the infrastructure required for development, such as servers, storage devices, and networking equipment. This infrastructure requires ongoing maintenance, upgrades, and replacements, which can be costly.</p>
<ul>
<li class=""><strong>Pro Tip:</strong> Ask if you or a vendor can keep up with maintenance and regular updates for new features and functionality to provide unparalleled speed, reliability, and scalability. A first-class architecture offers several layers of redundancy and ensures consistency and enterprise-ready security with every update.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-technical-maintenance">2. Technical maintenance<a href="https://www.okteto.com/blog/total-cost-of-ownership-tco-of-building-versus-buying-software-for-development/#2-technical-maintenance" class="hash-link" aria-label="Direct link to 2. Technical maintenance" title="Direct link to 2. Technical maintenance" translate="no">​</a></h4>
<p>The in-house development platform must be compatible with various tools, frameworks, and programming languages. Maintaining and updating these technologies can be a significant cost driver.</p>
<ul>
<li class=""><strong>Pro Tip:</strong> Ask if your platform is built with pre-configured development images for the following languages: dotnetcore, golang, java, node, php, python, Ruby on Rails. Also, ask if your platform works with existing Helm charts, docker-compose, or Kubernetes manifests.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-security-maintenance">3. Security maintenance<a href="https://www.okteto.com/blog/total-cost-of-ownership-tco-of-building-versus-buying-software-for-development/#3-security-maintenance" class="hash-link" aria-label="Direct link to 3. Security maintenance" title="Direct link to 3. Security maintenance" translate="no">​</a></h4>
<p>Developing an in-house development platform means you are responsible for ensuring its security. Maintenance includes upgrades to access controls, data encryption, and security testing.</p>
<ul>
<li class=""><strong>Pro Tip:</strong> <a href="https://www.okteto.com/build-versus-buy/#features-and-functionality" target="_blank" rel="noopener noreferrer" class="">Ask if your solution is secure enough to support SOCII or ISO27001 security, and can it effectively protect PII, or can it cross borders for GDPR compliance?</a> If you say no to any of these questions, then consider the cost of a potential security breach. Don’t lose sleep.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-feature-customization-maintenance">4. Feature customization maintenance<a href="https://www.okteto.com/blog/total-cost-of-ownership-tco-of-building-versus-buying-software-for-development/#4-feature-customization-maintenance" class="hash-link" aria-label="Direct link to 4. Feature customization maintenance" title="Direct link to 4. Feature customization maintenance" translate="no">​</a></h4>
<p>One of the benefits of building an in-house development platform is customizability. However, the total cost of ownership (TCO) of software customizations can require ongoing maintenance, especially when updating or upgrading the platform.</p>
<ul>
<li class=""><strong>Pro Tip:</strong> And will the customized features you build today be out-of-date tomorrow? And what features will you need in the future?</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-integration-maintenance">5. Integration maintenance<a href="https://www.okteto.com/blog/total-cost-of-ownership-tco-of-building-versus-buying-software-for-development/#5-integration-maintenance" class="hash-link" aria-label="Direct link to 5. Integration maintenance" title="Direct link to 5. Integration maintenance" translate="no">​</a></h4>
<p>Your in-house development platform must integrate with other systems, such as databases, applications, and APIs. The TCO of maintaining these software integrations can be complex and require ongoing effort and cost.</p>
<ul>
<li class=""><strong>Pro Tip:</strong> How much time and resources are needed to increase collaboration with the DevOps teams to ensure the end-to-end platform executes?</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-benefits-of-outsourcing-a-software-development-platform"><a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/" target="_blank" rel="noopener noreferrer" class="">The Benefits of Outsourcing a Software Development Platform</a><a href="https://www.okteto.com/blog/total-cost-of-ownership-tco-of-building-versus-buying-software-for-development/#the-benefits-of-outsourcing-a-software-development-platform" class="hash-link" aria-label="Direct link to the-benefits-of-outsourcing-a-software-development-platform" title="Direct link to the-benefits-of-outsourcing-a-software-development-platform" translate="no">​</a></h3>
<p>Planning and budgeting for ongoing maintenance, updates, and upgrades are essential to mitigate building costs. But increasingly, companies realize that the potential risks of building an in-house development platform aren't worth it.</p>
<p>Buying a cloud development platform that is already built and tested can make it easier to scale your operations as your business grows, and you'll gain access to the expertise of the platform's developers and support staff. This can help you troubleshoot issues, optimize your platform use, and get the most value from your investment. This expertise can also help you stay updated with the latest trends and best practices in cloud development.</p>
<p>What's the cost of not knowing what you don't know? For example, does your platform have the capability to support pair programming across multiple services? Can it provide easy access to Kubernetes? These are questions some of the most innovative development organizations forget to ask when going down the build path.</p>
<p>Ultimately, the TCO of building a software development platform is like the iceberg that sank the Titanic. From the horizon,&nbsp; it looks harmless until you look under the water and realize that the TOC of building a development platform is costly enough to sink your boat.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[5 Technical Challenges of Building Software for Modern Cloud Development]]></title>
            <link>https://www.okteto.com/blog/5-technical-challenges-of-building-software-for-modern-cloud-development/</link>
            <guid>https://www.okteto.com/blog/5-technical-challenges-of-building-software-for-modern-cloud-development/</guid>
            <pubDate>Mon, 20 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[5 Technical challenges of building software for modern cloud development]]></description>
            <content:encoded><![CDATA[<p>While developing a purpose-built in-house development environment may appear like an obvious way to address specific development challenges, the introduction of Kubernetes, containers, and microservices has made designing and maintaining a modern development environment problematic.</p>
<!-- -->
<p>Building an in-house development platform is no longer a technically trivial task.</p>
<p>Some of the most sophisticated engineering companies in the world, including Replicated, LaunchDarkly, monday.com and many more, have come to the conclusion that the technical difficulties of building just weren’t worth it.</p>
<p>"We tried to build it in-house, but that failed," said a Staff Site Reliability Engineer at a high-profile healthcare unicorn. "Companies don't understand the complexity of what's under the hood when building their cloud dev environments, such as the custom resource definitions and technical design needed to work with Kubernetes. Of course, you can create your development portal from scratch, but companies overlook that you need a dedicated team to manage this tool."</p>
<p>Likewise, Replicated, a company that provides delivery and management of Kubernetes applications, discovered building a technically-complicated development platform <a href="https://www.okteto.com/blog/the-cost-and-complications-of-in-house-development-environments/" target="_blank" rel="noopener noreferrer" class="">distracted the team from delivering more essential business value. The platform was also buggy, expensive and costly to maintain.</a></p>
<p>"Our homegrown solution took a massive investment of our engineering to keep Kubernetes, Docker, and all kinds of cutting edge technologies updated and supported," says Marc Campbell, Replicated co-founder and CTO. "It was difficult, taking our engineering team’s time to support because every day something was broken."</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Should You Buy or Build a Development Platform?</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/build-versus-buy/" target="_self">Watch the Build vs. Buy Webinar Recording</a></div></section>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-technical-challenges-of-building-software-internally">5 Technical Challenges of Building Software Internally<a href="https://www.okteto.com/blog/5-technical-challenges-of-building-software-for-modern-cloud-development/#5-technical-challenges-of-building-software-internally" class="hash-link" aria-label="Direct link to 5 Technical Challenges of Building Software Internally" title="Direct link to 5 Technical Challenges of Building Software Internally" translate="no">​</a></h3>
<p>If you’re still not convinced that building a cloud development platform is a Herculean task, here are five technical software development challenges that may change your mind:</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-supporting-different-development-tools-and-languages">1. Supporting different development tools and languages<a href="https://www.okteto.com/blog/5-technical-challenges-of-building-software-for-modern-cloud-development/#1-supporting-different-development-tools-and-languages" class="hash-link" aria-label="Direct link to 1. Supporting different development tools and languages" title="Direct link to 1. Supporting different development tools and languages" translate="no">​</a></h4>
<p>Building a cloud development platform that supports a wide range of development tools and languages can be technically challenging. Each tool and language has its own unique requirements and may require different versions of runtime environments, libraries, and dependencies. This requires careful planning and coordination to ensure that all tools and languages work seamlessly together.</p>
<ul>
<li class=""><strong>Pro Tip:</strong> Ask if your platform is technically built with pre-configured development images for the following languages: dotnetcore, golang, java, node, php, python, ruby and rust. Additionally, does your development platform work with existing Helm charts, docker-compose, or Kubernetes manifests.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-integrating-with-kubernetes"><a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/" target="_blank" rel="noopener noreferrer" class="">2. Integrating with Kubernetes</a><a href="https://www.okteto.com/blog/5-technical-challenges-of-building-software-for-modern-cloud-development/#2-integrating-with-kubernetes" class="hash-link" aria-label="Direct link to 2-integrating-with-kubernetes" title="Direct link to 2-integrating-with-kubernetes" translate="no">​</a></h4>
<p>Kubernetes is a popular container orchestration platform used for deploying, managing, and scaling containerized applications. Integrating a cloud development platform with Kubernetes can be technically challenging, especially if you're dealing with complex applications and environments. This requires a deep understanding of Kubernetes architecture and best practices, which is a common technical challenge in software development.</p>
<ul>
<li class=""><strong>Pro Tip:</strong> What’s the cost to technically troubleshoot your in-house solution’s security vulnerabilities and Kubernetes-related updates?</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-scaling">3. Scaling<a href="https://www.okteto.com/blog/5-technical-challenges-of-building-software-for-modern-cloud-development/#3-scaling" class="hash-link" aria-label="Direct link to 3. Scaling" title="Direct link to 3. Scaling" translate="no">​</a></h4>
<p>Scaling as your needs grow requires careful planning and architecture. You need to ensure that your environment can handle increased traffic, data storage, and compute resources without impacting performance. This requires a deep understanding of cloud infrastructure and architecture, as well as expertise in scaling techniques and tools — another technical challenge in software development.</p>
<ul>
<li class=""><strong>Pro Tip:</strong> Ask if your platform can technically manage multiple moving parts, such as IDEs, Docker, code repos, and endless tooling options?</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-security">4. Security<a href="https://www.okteto.com/blog/5-technical-challenges-of-building-software-for-modern-cloud-development/#4-security" class="hash-link" aria-label="Direct link to 4. Security" title="Direct link to 4. Security" translate="no">​</a></h4>
<p>Security means you need to ensure that your platform is secure from unauthorized access, data breaches, and other security threats. This requires expertise in cloud security and best practices, as well as a deep understanding of security threats and mitigation strategies.</p>
<ul>
<li class=""><strong>Pro Tip:</strong> Ask these questions: Is your solution technically secure enough to support SOCII or ISO27001 security? Can you effectively protect PII? Can your solution cross borders for GDPR compliance?</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-costs"><a href="https://www.okteto.com/blog/total-cost-of-ownership-tco-of-building-versus-buying-software-for-development/" target="_blank" rel="noopener noreferrer" class="">5. Costs</a><a href="https://www.okteto.com/blog/5-technical-challenges-of-building-software-for-modern-cloud-development/#5-costs" class="hash-link" aria-label="Direct link to 5-costs" title="Direct link to 5-costs" translate="no">​</a></h4>
<p>Building a cloud development environment can be costly, especially if you're starting from scratch. You need to factor in the cost of infrastructure, licensing, and ongoing maintenance and support. This requires careful budgeting and cost analysis, as well as a deep understanding of cloud economics and pricing models.</p>
<ul>
<li class=""><strong>Pro Tip:</strong> Ask if the technical challenges of building in-house software a constraint to develop, qa, implement and roll-out core features to grow your business?</li>
</ul>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">The Ultimate Build vs Buy Self Evaluation Guide</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/build-versus-buy/" target="_self">Four key points of consideration for every would-be builder</a></div></section>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-ways-buying-overcomes-the-technical-challenges-of-building">4 Ways Buying Overcomes the Technical Challenges of Building<a href="https://www.okteto.com/blog/5-technical-challenges-of-building-software-for-modern-cloud-development/#4-ways-buying-overcomes-the-technical-challenges-of-building" class="hash-link" aria-label="Direct link to 4 Ways Buying Overcomes the Technical Challenges of Building" title="Direct link to 4 Ways Buying Overcomes the Technical Challenges of Building" translate="no">​</a></h3>
<p>Each of these technical challenges requires a different set of skills and expertise to overcome. And while building a cloud development platform can provide you with more control and customization, the technical challenges involved can make buying a better option for many organizations, especially those that want to focus on their core business and get to market faster. The benefits of buying include the following:</p>
<ul>
<li class=""><strong>Time to market:</strong> Development experiences need significant planning, design, and development time, which can delay the rollout of new applications and features. By purchasing an existing cloud development platform, development teams can save time and quickly begin building and deploying applications.</li>
<li class=""><strong>Expertise:</strong> Building requires a deep understanding of software architecture, engineering, and security. By purchasing a platform, development teams can leverage the expertise of the platform provider, who has already invested significant time and resources in building a robust, secure, and scalable platform.</li>
<li class=""><strong>Cost:</strong> Building requires costly investments in hardware, software, and personnel. By purchasing a platform, development teams can avoid these costs and instead pay a subscription fee to use the platform.</li>
<li class=""><a href="https://www.okteto.com/blog/total-cost-of-ownership-tco-of-building-versus-buying-software-for-development/" target="_blank" rel="noopener noreferrer" class=""><strong>Maintenance and support:</strong></a> It’s an endless challenge providing ongoing maintenance and support, including updates, bug fixes, and security patches. By purchasing a platform, development teams can leverage the expertise and resources of the platform provider to ensure that the platform remains up-to-date and secure.</li>
</ul>
<p>At the end of the day ask yourself this: is attempting to overcome the technical challenges of building a cloud development platform your core business? Building requires significant technical expertise, time, and resources. Purchasing a platform can provide the platform engineering team with a more technically modern solution ready for delivering development experiences from dev to deployment.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Myths Around Preview Environments]]></title>
            <link>https://www.okteto.com/blog/myths-around-preview-environments/</link>
            <guid>https://www.okteto.com/blog/myths-around-preview-environments/</guid>
            <pubDate>Tue, 14 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Preview environments are rapidly becoming a crucial part of the development experience when building cloud native applications. They provide everyone in your organization a way to see new features, test bug fixes, and provide early feedback by deploying the changes in a Pull Request before it gets merged. In the previous article, we looked at four reasons Preview environments are a must-have for platform and development experience organizations looking to boost developer productivity. This time, we will debunk some of the common myths associated with them, which will help us understand their utility even better!]]></description>
            <content:encoded><![CDATA[<p>Preview environments are rapidly becoming a crucial part of the development experience when building cloud native applications. They provide everyone in your organization a way to see new features, test bug fixes, and provide early feedback by deploying the changes in a <a href="https://www.okteto.com/docs/previews/using-github-actions" target="_blank" rel="noopener noreferrer" class="">Pull Request</a> before it gets merged. In the <a href="https://www.okteto.com/docs/previews/using-github-actions" target="_blank" rel="noopener noreferrer" class="">previous article</a>, we looked at four reasons Preview environments are a must-have for platform and development experience organizations looking to boost developer productivity. This time, we will debunk some of the common myths associated with them, which will help us understand their utility even better!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="myth-1-preview-environments-are-only-for-frontend-applications">Myth 1: Preview Environments Are Only for Frontend Applications<a href="https://www.okteto.com/blog/myths-around-preview-environments/#myth-1-preview-environments-are-only-for-frontend-applications" class="hash-link" aria-label="Direct link to Myth 1: Preview Environments Are Only for Frontend Applications" title="Direct link to Myth 1: Preview Environments Are Only for Frontend Applications" translate="no">​</a></h2>
<p>One of the most common myths surrounding preview environments is that they are only useful when working on frontend applications. However, this is not true. Preview environments can be used to deploy any or all of the microservices that make up your application.</p>
<p>For instance, let's assume you're working on a backend API, and you've added code for a new endpoint in your latest pull request. Preview environments deploy this change to the API and provide you with a link that you can share with other teams in your organization that consume this API. This allows them to test and verify if the changes you've made are compatible with existing systems or not. This provides an excellent way to receive feedback from all the teams that could be affected by this API change! So, if you're working on cloud-native applications, you can rest assured that your team will benefit greatly from the use of preview environments.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="myth-2-preview-environments-are-expensive">Myth 2: Preview Environments Are Expensive<a href="https://www.okteto.com/blog/myths-around-preview-environments/#myth-2-preview-environments-are-expensive" class="hash-link" aria-label="Direct link to Myth 2: Preview Environments Are Expensive" title="Direct link to Myth 2: Preview Environments Are Expensive" translate="no">​</a></h2>
<p>Another common myth regarding preview environments is that they are costly to set up and maintain. This is not entirely true. While setting up preview environments may require some initial investment, they are not as expensive as most people believe. Since they follow the lifecycle of a pull request (PR), they are only active until the PR is up and are deleted as soon as the PR is merged or closed. This ensures that cloud resources are utilized in a cost-effective manner. In fact, preview environments can save money in the long run by helping identify potential issues early on, which can ultimately save both time and money.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="myth-3-preview-environments-are-difficult-to-set-up">Myth 3: Preview Environments Are Difficult To Set Up<a href="https://www.okteto.com/blog/myths-around-preview-environments/#myth-3-preview-environments-are-difficult-to-set-up" class="hash-link" aria-label="Direct link to Myth 3: Preview Environments Are Difficult To Set Up" title="Direct link to Myth 3: Preview Environments Are Difficult To Set Up" translate="no">​</a></h2>
<p>Some people believe that setting up preview environments is a complicated process that requires a lot of configuration. However, Okteto's Preview Environments are very simple to set up. If you're already using Okteto's Development Environments, you just need to create the YAML file for the <a href="https://www.okteto.com/docs/previews/using-github-actions#step-1-create-the-github-workflow" target="_blank" rel="noopener noreferrer" class="">Preview Environments GitHub Action</a> (or create a <a href="https://www.okteto.com/docs/previews/using-gitlab-cicd#step-2-configure-the-preview-environment-on-the-repository" target="_blank" rel="noopener noreferrer" class="">GitLab CI/CD job</a>), and you're good to go! If you're not already using <a href="https://www.okteto.com/development-environments/" target="_blank" rel="noopener noreferrer" class="">Development Environments</a>, you'll have to perform just one additional step of writing your <a href="https://www.okteto.com/docs/reference/manifest/" target="_blank" rel="noopener noreferrer" class="">Okteto Manifest</a>. This is also a very simple process since it relies on the same manifests you already use in production (Helm charts, Kustomize, Docker Compose, etc.). You won't need to write any additional configuration files or create any infrastructure or cloud resources! Detailed instructions on how to set up Preview Environments can be found in our <a href="https://www.okteto.com/docs/previews/using-github-actions" target="_blank" rel="noopener noreferrer" class="">documentation</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="myth-4-preview-environments-are-only-for-developers">Myth 4: Preview Environments Are Only for Developers<a href="https://www.okteto.com/blog/myths-around-preview-environments/#myth-4-preview-environments-are-only-for-developers" class="hash-link" aria-label="Direct link to Myth 4: Preview Environments Are Only for Developers" title="Direct link to Myth 4: Preview Environments Are Only for Developers" translate="no">​</a></h2>
<p>Preview Environments are an invaluable tool for developers, but they are not limited to this group alone. Anyone in an organization can access the endpoints provided by Preview Environments, making them an excellent way to receive feedback from all teams, including sales, marketing, and design, that could be affected by a change.</p>
<p>For example, product managers can use Preview Environments to see how new features will look and function and provide feedback on their user experience. With Preview Environments, a product manager can test how a new feature will integrate with the current product and provide feedback on potential improvements or changes that could be made to improve the user experience.</p>
<p>Preview environments also provide a way for non-engineering stakeholders to understand the changes being made in a pull request. This doesn't have to be limited to people in your own organization. You can even choose to share the endpoints with some of your users or customers to give them a sneak peek of a coming feature or to get feedback from them as well!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="myth-5-preview-environments-are-not-secure">Myth 5: Preview Environments Are Not Secure<a href="https://www.okteto.com/blog/myths-around-preview-environments/#myth-5-preview-environments-are-not-secure" class="hash-link" aria-label="Direct link to Myth 5: Preview Environments Are Not Secure" title="Direct link to Myth 5: Preview Environments Are Not Secure" translate="no">​</a></h2>
<p>There is a common misconception that the endpoints provided by Preview Environments can be accessed by unauthorized parties, potentially leading to breaches. This couldn’t be farther away from the truth. Okteto's Preview Environments have the same level of security as production or staging environments. You can easily restrict access to published endpoints on pull requests by configuring <a href="https://www.okteto.com/docs/core/endpoints/private-endpoints" target="_blank" rel="noopener noreferrer" class="">Private Endpoints</a>. This ensures that only people with access to your <a href="https://www.okteto.com/docs/core/namespaces" target="_blank" rel="noopener noreferrer" class="">Okteto namespace</a> can access the endpoints, and they will need to provide their credentials before being granted access.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="myth-6-preview-environments-are-only-for-large-scale-projects">Myth 6: Preview Environments Are Only for Large-Scale Projects<a href="https://www.okteto.com/blog/myths-around-preview-environments/#myth-6-preview-environments-are-only-for-large-scale-projects" class="hash-link" aria-label="Direct link to Myth 6: Preview Environments Are Only for Large-Scale Projects" title="Direct link to Myth 6: Preview Environments Are Only for Large-Scale Projects" translate="no">​</a></h2>
<p>Preview Environments can be very beneficial, regardless of the number of microservices that compose your applications. If your application has a large number of microservices, then it's a no-brainer that Preview Environments will be useful. It becomes very difficult to see the impact of changes in a pull request on the whole application without the endpoints provided by Preview Environments.</p>
<p>But even if you're working on a project with just two or three microservices, the core benefit they provide is still relevant: early feedback from everyone on your team. Even in small projects, non-software engineering teams are almost always left out of the review process. Preview environments help fix that by deploying the changes in pull requests and providing endpoints that anyone can access to review and provide feedback!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/myths-around-preview-environments/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Preview environments are an incredibly valuable tool in the modern application development lifecycle. Not only do they enable all team members across your development team and company to be a part of the feedback process, but they also allow developers to receive early feedback on their work. By providing a quick and easy way to see and test changes, preview environments can help reduce the number of bugs and errors that make it into the final release. In this article, we have discussed some common misconceptions associated with preview environments and have demonstrated just how valuable they can be in helping to ship applications faster. If you are a platform or development experience engineer, <a href="https://www.okteto.com/signup/" target="_blank" rel="noopener noreferrer" class="">Okteto</a> is a great place to get started to learn how to enhance your development experience with Preview Environments. To get set up, follow the quick and easy steps outlined in our <a href="https://www.okteto.com/docs/previews/using-github-actions" target="_blank" rel="noopener noreferrer" class="">guide</a> or you can follow along with our video tutorial:</p>
<div class="embed_uCA2"><iframe src="https://www.youtube-nocookie.com/embed/kgX5qUkJGDA" title="YouTube video player" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>]]></content:encoded>
            <category>preview-environments</category>
        </item>
        <item>
            <title><![CDATA[Guide to the Kubernetes Load Balancer Service]]></title>
            <link>https://www.okteto.com/blog/kubernetes-load-balancer-service/</link>
            <guid>https://www.okteto.com/blog/kubernetes-load-balancer-service/</guid>
            <pubDate>Tue, 28 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[A pod is Kubernetes’ smallest and simplest unit representing a single instance of a running process in a Kubernetes cluster. Pods contain one or more containers. They share the same network namespace to allow containers within the same pod to communicate with each other. However, a pod is updated and deleted based on the desired state defined by higher-level objects such as Deployments, StatefulSets, DaemonSets, and ReplicationControllers.]]></description>
            <content:encoded><![CDATA[<video controls="" preload="metadata" class="video_QmVR"><source src="https://cdn.sanity.io/files/6icyfeiq/production/5ef471e2fdf6e5394c6d39e7298081eceaeb9cb5.mp4" type="video/mp4"></video>
<p>A <a href="https://www.okteto.com/blog/kubernetes-basics/#pods" target="_blank" rel="noopener noreferrer" class="">pod</a> is Kubernetes’ smallest and simplest unit representing a single instance of a running process in a Kubernetes cluster. Pods contain one or more containers. They share the same network namespace to allow containers within the same pod to communicate with each other. However, a pod is updated and deleted based on the desired state defined by higher-level objects such as <a href="https://www.okteto.com/blog/beginners-guide-to-kubernetes-deployments/" target="_blank" rel="noopener noreferrer" class="">Deployments</a>, StatefulSets, DaemonSets, and ReplicationControllers.</p>
<!-- -->
<p>When such actions are performed, the pod IP address changes or is removed based on the pod state. You cannot guarantee that this pod IP will exist in the future. Pod IP addresses in Kubernetes are assigned dynamically and can change under different certain circumstances.</p>
<p>Therefore, you need a reliable identifier. This is where the Kubernetes Load Balancer service comes to rescue. This Kubernetes service provide stable Kubernetes endpoints for accessing applications.</p>
<p>It creates everlasting IP addresses for exposing applications both internally and externally. A service acts as a single entry point to a set of pods. This allows clients to communicate with the application without knowing the individual pod IP addresses or their current state.</p>
<p>The major types of <a href="https://kubernetes.io/docs/concepts/services-networking/" target="_blank" rel="noopener noreferrer" class="">services</a> in Kubernetes are:</p>
<ul>
<li class="">ClusterIP</li>
<li class="">NodePort</li>
<li class="">LoadBalancer</li>
</ul>
<p>In this guide, you will learn how to use Kubernetes Load Balancer service to expose applications running in Kubernetes Pods internally and externally.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-a-load-balancer-works-and-why-it-is-useful">How a Load Balancer Works and Why It Is Useful<a href="https://www.okteto.com/blog/kubernetes-load-balancer-service/#how-a-load-balancer-works-and-why-it-is-useful" class="hash-link" aria-label="Direct link to How a Load Balancer Works and Why It Is Useful" title="Direct link to How a Load Balancer Works and Why It Is Useful" translate="no">​</a></h2>
<p>Imagine your website has thousands of different clients per minute. It is not easy for a single server to keep up with the requests demand. This creates a bad user experience with unpredictable downtimes.</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/220fca0c8e2b-b783dcdbe518ee74d7c10520013ce2e9.webp" width="1284" height="602" class="img_ev3q"></p>
<p>A load balancer helps you distribute the requests to the different servers in the resource pool. This ensures no single server becomes overloaded at any single time.</p>
<p>In Kubernetes, a Load Balancer Service is a crucial component for deploying and managing applications in Kubernetes. It exposes a service externally in the underlying infrastructure (for example, a cloud provider's load balancer).</p>
<p>The Kubernetes Load Balancer Service provides load-balancing abilities for incoming traffic to distribute evenly across multiple pods for better performance and high availability.</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/b0d01c6c9496-d9bed11cfc977e5d47240737add9b1b4.webp" width="1320" height="588" class="img_ev3q"></p>
<p>A Kubernetes LoadBalancer provides external network access to a set of pods to achieve high availability in a cluster. This creates a single and stable IP address for accessing the application without being affected by the pods' state.</p>
<p>Kubernetes uses the Load Balancer service to automatically create a load balancer in the underlying infrastructure. The infrastructure being used must have the capacity to provision a LoadBalancer. This is common when using cloud providers such as <a href="https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html" target="_blank" rel="noopener noreferrer" class="">AWS</a> to provision your applications and route incoming traffic to the pods in a Kubernetes cluster.</p>
<p>Cloud provider uses their own control manager to automatically detect <code>spec.LoadBalancer</code>. The Load Balancer is then provisioned within the cluster to load balance incoming traffic across multiple pods.</p>
<p>This can be used alongside large-scale applications, such as e-commerce apps requiring handling many concurrent requests from external users. A Kubernetes Load Balancer Service creates a unique IP address that is accessible by external networks. It then redirects incoming traffic, and its IP address is the only entry to the Kubernetes cluster.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">apiVersion</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Service</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">metadata</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">loadbalancer</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">spec</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">selector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">app</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">type</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> LoadBalancer</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">ports</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> http</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">port</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">targetPort</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8080</span><br></div></code></pre></div></div>
<p>If you have defined how to expose the service externally, it will display EXTERNAL-IP as pending:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">&gt; kubectl get service nginx-loadbalancer</span><br></div><div class="token-line" style="color:white"><span class="token plain">NAME              TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE</span><br></div><div class="token-line" style="color:white"><span class="token plain">nginx-clusterip   LoadBalancer   10.101.132.164   &lt;pending&gt;     80:30998/TCP     16m</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-kubernetes-load-balancer-service-with-an-example">Understanding Kubernetes Load Balancer Service With an Example<a href="https://www.okteto.com/blog/kubernetes-load-balancer-service/#understanding-kubernetes-load-balancer-service-with-an-example" class="hash-link" aria-label="Direct link to Understanding Kubernetes Load Balancer Service With an Example" title="Direct link to Understanding Kubernetes Load Balancer Service With an Example" translate="no">​</a></h2>
<p>Suppose you want to create a cluster to run the Nginx server with three instances. You need to create ReplicaSet that has three Pods, each of which runs the Nginx server. Below is a simple deployment you can leverage to get a cluster started:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">apiVersion</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">metadata</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">loadbalancer</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">deployment</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">spec</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">replicas</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">selector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">matchLabels</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">app</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">template</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">metadata</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">labels</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">app</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">spec</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">containers</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">image</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">ports</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">containerPort</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">80</span><br></div></code></pre></div></div>
<p>Now, this deployment requires a service object to expose the application. You can use the previously created Load Balancer service object.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">apiVersion</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Service</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">metadata</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">loadbalancer</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">service</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">spec</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">selector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">app</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">type</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> LoadBalancer</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">ports</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> http</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">port</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">targetPort</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8080</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">protocol</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> TCP</span><br></div></code></pre></div></div>
<p>In this case, the Kubernetes service will use a selector to map the service to the corresponding three pods with matching labels. Nginx will have three pods, run the following <a href="https://www.okteto.com/blog/kubectl-cheat-sheet/" target="_blank" rel="noopener noreferrer" class="">Kubernetes command</a> to see them:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">&gt; kubectl get pods --output=wide</span><br></div><div class="token-line" style="color:white"><span class="token plain">NAME                                             READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES</span><br></div><div class="token-line" style="color:white"><span class="token plain">nginx-loadbalancer-deployment-544dc8b7c4-bhh5h   1/1     Running   2          58m   172.17.0.6   minikube   &lt;none&gt;           &lt;none&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">nginx-loadbalancer-deployment-544dc8b7c4-n25fn   1/1     Running   2          58m   172.17.0.8   minikube   &lt;none&gt;           &lt;none&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">nginx-loadbalancer-deployment-544dc8b7c4-wqkn2   1/1     Running   2          58m   172.17.0.7   minikube   &lt;none&gt;           &lt;none&gt;</span><br></div></code></pre></div></div>
<p>It uses Kubernetes Endpoints as an object to update the IP addresses of each pod. Each service creates its own Endpoint object. Thus, the cluster can automatically track the matching pods' IP addresses accordingly.</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/28c8e4297864-949d1906c45ffcc622f703c5a2b51031.webp" width="1286" height="746" class="img_ev3q"></p>
<p>You can describe your service and check how Kubernetes Endpoints lists the matching pods:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">&gt; kubectl describe service nginx-loadbalancer-service</span><br></div><div class="token-line" style="color:white"><span class="token plain">Name:                     nginx-loadbalancer-service</span><br></div><div class="token-line" style="color:white"><span class="token plain">Namespace:                default</span><br></div><div class="token-line" style="color:white"><span class="token plain">Labels:                   &lt;none&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">Labels:                   &lt;none&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">Annotations:              &lt;none&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">Selector:                 app=nginx</span><br></div><div class="token-line" style="color:white"><span class="token plain">Type:                     LoadBalancer</span><br></div><div class="token-line" style="color:white"><span class="token plain">IP Family Policy:         SingleStack</span><br></div><div class="token-line" style="color:white"><span class="token plain">IP Families:              IPv4</span><br></div><div class="token-line" style="color:white"><span class="token plain">IP:                       10.101.132.164</span><br></div><div class="token-line" style="color:white"><span class="token plain">Port:                     http  80/TCP</span><br></div><div class="token-line" style="color:white"><span class="token plain">TargetPort:               80/TCP</span><br></div><div class="token-line" style="color:white"><span class="token plain">NodePort:                 http  30998/TCP</span><br></div><div class="token-line" style="color:white"><span class="token plain">Endpoints:                172.17.0.6:80,172.17.0.7:80,172.17.0.8:80</span><br></div><div class="token-line" style="color:white"><span class="token plain">Session Affinity:         None</span><br></div><div class="token-line" style="color:white"><span class="token plain">External Traffic Policy:  Cluster</span><br></div><div class="token-line" style="color:white"><span class="token plain">Events:                   &lt;none&gt;</span><br></div></code></pre></div></div>
<p>The Kubernetes Endpoints keep the list of IP addresses up to date for the service to forward its traffic. Endpoints are updated automatically if pods are added, updated, or removed from the service selector. This allows the Service to route network traffic to the correct pods, as the Endpoints can save the address the application need to route to.</p>
<p>Every endpoint that represents the pod network IP and port is defined with the same name as that of the service as follows:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">&gt; kubectl describe endpoints nginx-loadbalancer-service</span><br></div><div class="token-line" style="color:white"><span class="token plain">Name:         nginx-loadbalancer-service</span><br></div><div class="token-line" style="color:white"><span class="token plain">Namespace:    default</span><br></div><div class="token-line" style="color:white"><span class="token plain">Labels:       &lt;none&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">Annotations:  endpoints.kubernetes.io/last-change-trigger-time: 2023-02-02T09:29:12Z</span><br></div><div class="token-line" style="color:white"><span class="token plain">Subsets:</span><br></div><div class="token-line" style="color:white"><span class="token plain">  Addresses:          172.17.0.6,172.17.0.7,172.17.0.8</span><br></div><div class="token-line" style="color:white"><span class="token plain">  NotReadyAddresses:  &lt;none&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">  Ports:</span><br></div><div class="token-line" style="color:white"><span class="token plain">    Name  Port  Protocol</span><br></div><div class="token-line" style="color:white"><span class="token plain">    ----  ----  --------</span><br></div><div class="token-line" style="color:white"><span class="token plain">    http  80    TCP</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">Events:  &lt;none&gt;</span><br></div></code></pre></div></div>
<p>Endpoints create a stable network identity for a Replicaset of pods. They change dynamically as the pods' state changes to load balance network traffic to a dynamic set of pods in a consistent pattern.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Stay on Top of Kubernetes Best Practices &amp; Trends</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/ebooks/dzone-kubernetes/" target="_self">Download the Trend Report</a></div></section>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubernetes-load-balancers-and-ingresses">Kubernetes Load Balancers and Ingresses<a href="https://www.okteto.com/blog/kubernetes-load-balancer-service/#kubernetes-load-balancers-and-ingresses" class="hash-link" aria-label="Direct link to Kubernetes Load Balancers and Ingresses" title="Direct link to Kubernetes Load Balancers and Ingresses" translate="no">​</a></h2>
<p>LoadBalancer service type is a good choice when you have a few services to expose. However, with many services, it can be hard to manage. It has limitations such as:</p>
<ul>
<li class="">Limited URL routing</li>
<li class="">Cloud provider dependent</li>
<li class="">Lacks SSL termination</li>
<li class="">It doesn't support URL rewriting and rate limiting.</li>
</ul>
<p>With an extensive pool of services to load balance, you need to explore other alternatives outside the LoadBalancer Kubernetes service. <a href="https://kubernetes.io/docs/concepts/services-networking/ingress/" target="_blank" rel="noopener noreferrer" class="">Ingress</a> defines rules for incoming traffic, such as routing based on the URL path and hostname. This allows you to expose multiple services using a LoadBalancer and manage incoming network traffic to your cluster.</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/3dba6b58e721-8901dcddf21f3e87f0d8ff2e2e756b23.webp" width="1296" height="480" class="img_ev3q"></p>
<p>Unlike LoadBalancer Kubernetes service, it provides:</p>
<ul>
<li class="">Advanced URL routing,</li>
<li class="">URL path-based routing,</li>
<li class="">Hostname-based routing,</li>
<li class=""><a href="https://www.f5.com/glossary/ssl-termination" target="_blank" rel="noopener noreferrer" class="">SSL termination</a>,</li>
<li class="">URL rewriting, and</li>
<li class="">Rate limiting.</li>
</ul>
<p>In the Nginx example, a basic Ingress resource can be defined as follows:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">apiVersion</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> networking.k8s.io/v1</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Ingress</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">metadata</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">ingress</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">annotations</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">nginx.ingress.kubernetes.io/rewrite-target</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> /</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">spec</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">rules</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">host</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx.you_url.com</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">http</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">paths</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> /nginx</span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">pathType</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Prefix</span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">backend</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">service</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">            </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">loadbalancer</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">service</span><br></div><div class="token-line" style="color:white"><span class="token plain">            </span><span class="token key atrule" style="color:rgb(86, 156, 214)">port</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">              </span><span class="token key atrule" style="color:rgb(86, 156, 214)">number</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8080</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">              </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> http</span><br></div></code></pre></div></div>
<p>This will allow your cluster maps incoming traffic for <code>nginx.you_url.com/nginx</code> to the <code>nginx-loadbalancer-service</code> service you created using the service resource.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/kubernetes-load-balancer-service/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>To sum up, LoadBalancer is a powerful tool that can help you optimize your Kubernetes deployments. It provides several benefits, including load balancing, scalability, security, and ease of use. If you are looking to improve the performance and reliability of your Kubernetes deployments, LoadBalancer is definitely worth considering. If you want to learn more about Kubernetes concepts check out our <a href="https://www.okteto.com/blog/kubernetes-basics/" target="_blank" rel="noopener noreferrer" class="">Kubernetes Tutorial for Beginners</a>!</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Four Reasons You Need Preview Environments]]></title>
            <link>https://www.okteto.com/blog/four-reasons-you-need-preview-environments/</link>
            <guid>https://www.okteto.com/blog/four-reasons-you-need-preview-environments/</guid>
            <pubDate>Tue, 21 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[There has been a rapid increase in the adoption of Preview Environments across organizations. From open-source projects to enterprise organizations, everyone seems to agree on their usefulness in helping ship applications faster. If you're not familiar with Preview Environments, they basically deploy the changes present in a Pull Request (PR) or Merge Request and provide a shareable link to access them!]]></description>
            <content:encoded><![CDATA[<p>There has been a rapid increase in the adoption of Preview Environments across organizations. From open-source projects to enterprise organizations, everyone seems to agree on their usefulness in helping ship applications faster. If you're not familiar with Preview Environments, they basically deploy the changes present in a <a href="https://www.okteto.com/docs/previews/using-github-actions" target="_blank" rel="noopener noreferrer" class="">Pull Request</a> (PR) or <a href="https://www.okteto.com/docs/previews/using-gitlab-cicd" target="_blank" rel="noopener noreferrer" class="">Merge Request</a> and provide a shareable link to access them!</p>
<!-- -->
<div class="embed_uCA2 arcade_TJnn"><iframe src="https://demo.arcade.software/K4ZYlSCsQLmkuNklSqNx?embed" title="Arcade demo" loading="lazy" allowfullscreen=""></iframe></div>
<p>Preview Environments provide an excellent way to not only validate that everything is working as expected but also allow everyone in the team to be a part of the feedback process. In this article, I’m going to give you four reasons which make them a must-have if you're looking to boost productivity across your team!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reason-1-bring-everyone-on-board">Reason 1: Bring Everyone on Board<a href="https://www.okteto.com/blog/four-reasons-you-need-preview-environments/#reason-1-bring-everyone-on-board" class="hash-link" aria-label="Direct link to Reason 1: Bring Everyone on Board" title="Direct link to Reason 1: Bring Everyone on Board" translate="no">​</a></h2>
<p>Feedback is one of the most crucial aspects of the software delivery process. Great feedback can come from anyone and not just engineers. But conventionally, the feedback process has always been limited to the software engineers on the team because it involved being able to read code. Even for technical team members, the feedback process hasn’t always been convenient. If you want to see how changes actually look and try things out, you would have to pull the code and build it, which is a time taking process.</p>
<p>Preview Environments solve both these problems by deploying the changes in a pull request and giving you a link that you can visit to view these deployed changes. This link is shareable, which means you can send it to anyone across your organization - product, marketing, sales, and even customers if need be! Not only does this allow a much wider set of people to be a part of the review process, but it also makes reviewing easier for everyone. Nobody needs to build the code or wait for a staging environment to try the new features or verify that that nasty bug blocking your users has indeed been fixed!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reason-2-feedback-at-the-right-time">Reason 2: Feedback at the Right Time<a href="https://www.okteto.com/blog/four-reasons-you-need-preview-environments/#reason-2-feedback-at-the-right-time" class="hash-link" aria-label="Direct link to Reason 2: Feedback at the Right Time" title="Direct link to Reason 2: Feedback at the Right Time" translate="no">​</a></h2>
<p>I think you will agree with me when I say that the early we're able to give feedback, the better. Often feedback from non-technical teams in software companies comes too late in the delivery cycle. It is often just before the release (or sometimes even after 💀) when you're testing things in a staging environment that you would show it to product, marketing, sales, and other teams. But the problem with this is that the feedback you get at this point is much harder to act on than if it were given right when chunks of code were being merged. Preview Environments solve this problem by allowing everyone to review things early on. They provide an excellent way to cut short iteration time by allowing early feedback.</p>
<p>Preview Environments follow the lifecycle of a pull request. They allow you to show the changes in a pull request or merge request before it gets merged. This way, you're able to get feedback for each pushed commit and make the required changes. This is so much easier than getting feedback in staging environments right before the release. Without Preview Environments, feedback <strong>early on</strong> is only possible from people who can read code, and others are left out of this very important process.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reason-3-validation-that-things-work">Reason 3: Validation That Things Work<a href="https://www.okteto.com/blog/four-reasons-you-need-preview-environments/#reason-3-validation-that-things-work" class="hash-link" aria-label="Direct link to Reason 3: Validation That Things Work" title="Direct link to Reason 3: Validation That Things Work" translate="no">​</a></h2>
<p>If multiple people have been pushing commits to the same branch, Preview Environments provide you a way to see the complete change together deployed live and be sure that things are as expected when you make a PR. But it’s not only this; even if you’re working on a branch alone, Preview Environments have become essential because of how complex our applications have grown.</p>
<p>Before a team has Preview Environments, it is very hard to know if the code works as expected or not. Sure, you can look at the code and review it syntactically, but when you start the application, maybe it doesn’t start. Maybe the helm chart you have for your application uses a variable different from the one you used in your code. Preview Environments do an excellent job of highlighting errors like these which are very hard to catch otherwise. When you have multiple services, and there is information flowing through a bunch of different things like databases, secrets, and whatnot, then validating that the changes in a PR still work with the rest of the application becomes a very tough job. Preview Environments help you provide this certainty that things work by deploying your changes and letting you see them!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reason-4-testing-your-code-better">Reason 4: Testing Your Code Better<a href="https://www.okteto.com/blog/four-reasons-you-need-preview-environments/#reason-4-testing-your-code-better" class="hash-link" aria-label="Direct link to Reason 4: Testing Your Code Better" title="Direct link to Reason 4: Testing Your Code Better" translate="no">​</a></h2>
<p>Preview Environments help you expand the kind of tests you run on your Pull Requests or Merge Requests. Before Preview Environments, you would have to rely only on CI/CD to run tests. While having a robust CI/CD is necessary, it still doesn’t solve all your problems. Typically CI/CD is mainly focused on unit and integration tests. What gets left out of the picture are end-to-end (E2E) tests.</p>
<p>End-to-end tests require your entire application to be brought up. This is something that the CI/CD systems are not good at achieving. Preview Environments, on the other hand, shine in this area! They bring up the application with your changes just like it would be deployed in production. This allows you to run all sorts of E2E tests. Preview Environments also allow you to run testing frameworks like <a href="https://www.cypress.io/" target="_blank" rel="noopener noreferrer" class="">Cypress</a> and <a href="https://www.selenium.dev/" target="_blank" rel="noopener noreferrer" class="">Selenium</a>, which require the application to be brought up. If you’re working with APIs, the URL that Preview Environments provide can also be used to test them end-to-end using tools like <a href="https://www.postman.com/" target="_blank" rel="noopener noreferrer" class="">Postman</a>. The cloud-native applications we code today have multiple services and different scenarios that CI/CD doesn’t really have the capability of catching. Preview Environments, therefore, become a must-have for being able to ship bug-free applications!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/four-reasons-you-need-preview-environments/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>To sum up, Preview Environments are a great way to easily get validation and feedback from everyone across your organization in a timely manner! As our applications continue to grow more complex, it becomes essential to rely on them for faster iterations if you’re looking to ship code timely.So what are you waiting for? <a href="https://www.okteto.com/signup/" target="_blank" rel="noopener noreferrer" class="">Sign up</a> for Okteto for free and get started with launching Preview Environments for your repositories. You can find a detailed step-by-step guide to walk you through the process <a href="https://www.okteto.com/docs/previews/using-github-actions" target="_blank" rel="noopener noreferrer" class="">in our docs</a> or check out our video tutorial to get started!</p>
<div class="embed_uCA2"><iframe src="https://www.youtube-nocookie.com/embed/kgX5qUkJGDA" title="YouTube video player" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>]]></content:encoded>
            <category>preview-environments</category>
        </item>
        <item>
            <title><![CDATA[Ready to run…Use the Okteto Catalog]]></title>
            <link>https://www.okteto.com/blog/ready-to-run-use-the-okteto-catalog/</link>
            <guid>https://www.okteto.com/blog/ready-to-run-use-the-okteto-catalog/</guid>
            <pubDate>Wed, 15 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[With Okteto Catalog, teams get a development experience without friction that enables increased productivity and reduces administrative complexity.]]></description>
            <content:encoded><![CDATA[<p>Are you ready to run your application? Go to the Okteto Catalog, select your application from the list, and just click "Launch".  Okteto takes care of all the tasks, the manifest, and runtime environment automation required to immediately deploy the application for anyone inside and outside the development team.  Now that is the best experience for both the experience builder AND their development team. The result is a development experience without friction that enables increased productivity and reduces administrative complexity.</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-experience-for-platform-builders">New Experience for Platform Builders<a href="https://www.okteto.com/blog/ready-to-run-use-the-okteto-catalog/#new-experience-for-platform-builders" class="hash-link" aria-label="Direct link to New Experience for Platform Builders" title="Direct link to New Experience for Platform Builders" translate="no">​</a></h3>
<p>The Catalog is a fast, easy way to pre-configure and publish launch ready Okteto app configurations (based on application and development lifecycle). Whatever makes sense for your project.</p>
<figure class="figure_HOu8"><img src="https://www.okteto.com/blog/assets/images/4dc66fed3786-417a160de28b6985bffcc7324a9d8029.webp" alt="" loading="lazy"><figcaption>Platform Engineer View of listed Apps</figcaption></figure>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features:<a href="https://www.okteto.com/blog/ready-to-run-use-the-okteto-catalog/#features" class="hash-link" aria-label="Direct link to Features:" title="Direct link to Features:" translate="no">​</a></h4>
<ul>
<li class="">The Catalog enables <strong>experience engineers</strong> to pre-configure and publish a list of launch ready application configurations that deploy complete running environments</li>
<li class="">The Catalog enables <strong>platform engineers</strong> to easily manage provisioning environments based on applications and development projects</li>
<li class=""><strong>Automated configuration</strong> support for popular repositories such as Github, Gitlab, Bitbucket, Git.</li>
</ul>
<figure class="figure_HOu8"><img src="https://www.okteto.com/blog/assets/images/98c75c14d29c-a642fbccaf96a513d6f1537902d83c35.webp" alt="" loading="lazy"><figcaption>Editing View adding new App Configuration</figcaption></figure>
<figure class="figure_HOu8"><img src="https://www.okteto.com/blog/assets/images/a1f69098a61f-072672a1ecb23cb8f78ace55ba8e3a68.webp" alt="" loading="lazy"><figcaption>Platform Engineer View of Catalog with new App </figcaption></figure>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="benefits">Benefits:<a href="https://www.okteto.com/blog/ready-to-run-use-the-okteto-catalog/#benefits" class="hash-link" aria-label="Direct link to Benefits:" title="Direct link to Benefits:" translate="no">​</a></h4>
<ul>
<li class="">Get back lost innovation time</li>
<li class="">Creates an easy to use interface for everyone on the team</li>
<li class="">Fast way to govern and support development environments</li>
<li class="">Increases visibility, trust, and control in self-service provisioning / de-provisioning environments</li>
<li class="">Significantly reduces risk of errors and minimizes costs</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-experience-for-developers">New Experience for Developers:<a href="https://www.okteto.com/blog/ready-to-run-use-the-okteto-catalog/#new-experience-for-developers" class="hash-link" aria-label="Direct link to New Experience for Developers:" title="Direct link to New Experience for Developers:" translate="no">​</a></h3>
<p>The Catalog provides the ultimate developer experience for on-demand, self-service launching of application configured environments without manual tracking, configuring, and knowledge of multiple tools. The developer workflow is more independent without having to rely on devops engineers to configure their environments for them.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="features-1">Features:<a href="https://www.okteto.com/blog/ready-to-run-use-the-okteto-catalog/#features-1" class="hash-link" aria-label="Direct link to Features:" title="Direct link to Features:" translate="no">​</a></h4>
<ul>
<li class="">The Catalog is <strong>integrated in the Okteto Experience</strong> user interface for “one click” launching of app environments.</li>
</ul>
<figure class="figure_HOu8"><img src="https://www.okteto.com/blog/assets/images/3c9d162d46d0-c29211001d94958b2e33527a30478306.webp" alt="" loading="lazy"><figcaption>Developer View of Apps listed in Catalog</figcaption></figure>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="benefits-1">Benefits:<a href="https://www.okteto.com/blog/ready-to-run-use-the-okteto-catalog/#benefits-1" class="hash-link" aria-label="Direct link to Benefits:" title="Direct link to Benefits:" translate="no">​</a></h4>
<ul>
<li class="">Get back lost innovation time</li>
<li class="">Hyper-efficiency, on-demand automation increases the velocity of the development lifecycle and efficiency of the development team</li>
<li class="">The optimal developer experience for launching environments without errors and time consuming debugging for complete applications at any stage of the lifecycle.</li>
<li class="">Improved collaboration and less dependency with devops and platform engineering</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="for-experience-builders-and-their-development-team">For Experience Builders and their Development Team<a href="https://www.okteto.com/blog/ready-to-run-use-the-okteto-catalog/#for-experience-builders-and-their-development-team" class="hash-link" aria-label="Direct link to For Experience Builders and their Development Team" title="Direct link to For Experience Builders and their Development Team" translate="no">​</a></h4>
<p>The Catalog feature gives more trust and control to platform, developer experience engineers and administrators and the ability to build a great developer experience. At the same time the Catalog provides a more seamless, frictionless workflow to help developers get started with their work.</p>
<p>The Catalog is available to all Okteto Self-Hosted and BYOC customers. <a href="https://www.okteto.com/docs/development/deploy/deploy-from-catalog" target="_blank" rel="noopener noreferrer" class="">Learn more and get started today →</a></p>]]></content:encoded>
            <category>Development Experience</category>
            <category>platform</category>
        </item>
        <item>
            <title><![CDATA[Cloud Native Development Made Easy With Sprkl and Okteto]]></title>
            <link>https://www.okteto.com/blog/cloud-native-development-made-easy-with-sprkl-and-okteto/</link>
            <guid>https://www.okteto.com/blog/cloud-native-development-made-easy-with-sprkl-and-okteto/</guid>
            <pubDate>Tue, 07 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Our applications are getting increasingly complex with time. This is causing a lot of problems for developers, from having to spend hours configuring their dev environments to not being able to fully understand how the code they write affects the entire application. In this blog, we’re going to see how Sprkl and Okteto can be used together to solve a lot of these problems!]]></description>
            <content:encoded><![CDATA[<p>Our applications are getting increasingly complex with time. This is causing a lot of problems for developers, from having to spend hours configuring their dev environments to not being able to fully understand how the code they write affects the entire application. In this blog, we’re going to see how <a href="https://sprkl.dev/" target="_blank" rel="noopener noreferrer" class="">Sprkl</a> and <a href="https://www.okteto.com/" target="_blank" rel="noopener noreferrer" class="">Okteto</a> can be used together to solve a lot of these problems!</p>
<!-- -->
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Join Us for Our Webinar Showing Using Sprkl and Okteto Together</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/webinars/modern-dev-tools-for-modern-applications/" target="_self">Register here</a></div></section>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problems-plaguing-modern-applications">The Problems Plaguing Modern Applications<a href="https://www.okteto.com/blog/cloud-native-development-made-easy-with-sprkl-and-okteto/#the-problems-plaguing-modern-applications" class="hash-link" aria-label="Direct link to The Problems Plaguing Modern Applications" title="Direct link to The Problems Plaguing Modern Applications" translate="no">​</a></h2>
<p>The applications we code these days consist of a large number of microservices. No doubt that this approach is much better and scalable than the monoliths we were coding earlier, but this microservices-based architecture has also led to some new problems for developers.</p>
<p>Traditionally developers would only have to run a command or two to bring up a monolithic application. But with microservices, a lot of configuration needs to be done to bring up all the services you require for development. Another problem is that even when you bring up these services locally, your dev environment is still nothing like the production Kubernetes clusters you’re running. Having developers spend time configuring a realistic production-like environment for development takes a <strong>huge hit on productivity</strong> and leads to a <strong>poor developer experience</strong>.</p>
<p>Another problem of modern application development is that it has become tough for developers to judge the impact of the code they write on the entire application. Identifying issues with your code earlier in the dev cycle is becoming crucial in order to ship changes faster. Giving developers tools that allow them to be self-sufficient and more productive is the secret ingredient to creating a wonderful developer experience in your organization. Let’s see how Sprkl and Okteto can help you achieve this!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="modern-dev-tools-for-modern-applications">Modern Dev Tools for Modern Applications<a href="https://www.okteto.com/blog/cloud-native-development-made-easy-with-sprkl-and-okteto/#modern-dev-tools-for-modern-applications" class="hash-link" aria-label="Direct link to Modern Dev Tools for Modern Applications" title="Direct link to Modern Dev Tools for Modern Applications" translate="no">​</a></h2>
<p>Okteto allows developers to skip all the headaches of configuring a production-like development environment and get right to the code-writing phase. With Okteto, you can develop your applications directly in a Kubernetes cluster and see the changes you make in your code reflected live as soon as you hit save! This solves one-half of the problems we discussed above.</p>
<p>The second half is where Sprkl shines. Sprkl allows you to immediately judge the impact of the code you write on the entire app. It does so by leveraging <a href="https://opentelemetry.io/" target="_blank" rel="noopener noreferrer" class="">OpenTelemetry</a> to automatically instrument code changes and analyze them upon execution. This helps you write code with the confidence that things would not go wrong in production. You’re able to identify potential issues much earlier and fix them. Feedback provided by Sprkl includes traces on the code level, insights about hidden API calls, DB queries, and memory bottlenecks, among a lot of other things!</p>
<p>The inner dev loop refers to a single developer's workflow when working. It encompasses all the things developers do <strong>before</strong> committing and pushing their code. This makes up the core of developer experience and often is the bottleneck for dev productivity. Shortening the inner dev loop is the secret to unlocking dev productivity. If the inner dev loop your developers have to go through is frustrating and doesn’t provide genuine feedback, then the dev experience across your organization will no doubt be bad. Both Okteto and Sprkl improve this inner dev loop by giving developers access to all the things they need the most:</p>
<ul>
<li class="">instant and genuine feedback in a production-like environment</li>
<li class="">analysis of the effect of their code on the overall application</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-it-in-action">See It in Action<a href="https://www.okteto.com/blog/cloud-native-development-made-easy-with-sprkl-and-okteto/#see-it-in-action" class="hash-link" aria-label="Direct link to See It in Action" title="Direct link to See It in Action" translate="no">​</a></h2>
<p>I’m sure by this point you must be wondering how you can use these two tools together. <a href="https://www.linkedin.com/in/marom-bracha-4a7a341a4/" target="_blank" rel="noopener noreferrer" class="">Marom Bracha</a> recorded a demo showing you exactly that. Go check it out to give a boost to your developers’ workflow and simplify the development process for them!</p>
<div class="embed_uCA2"><iframe src="https://www.youtube-nocookie.com/embed/XY6Z5l68ZqY" title="YouTube video player" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>
<p>Once you’re done watching the video, why don’t you go give it a try yourself to see the magic? The code in the video can be found on GitHub <a href="https://github.com/sprkl-dev/use-sprkl" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>]]></content:encoded>
            <category>collab</category>
            <category>devx</category>
        </item>
        <item>
            <title><![CDATA[The Build vs. Buy Software Guide to Development Platforms]]></title>
            <link>https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/</link>
            <guid>https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/</guid>
            <pubDate>Mon, 06 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Top Ten List of Considerations When Debating to Build or Buy a Dev Platform]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="top-ten-list-of-considerations-when-debating-to-build-or-buy-a-dev-platform">Top Ten List of Considerations When Debating to Build or Buy a Dev Platform<a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/#top-ten-list-of-considerations-when-debating-to-build-or-buy-a-dev-platform" class="hash-link" aria-label="Direct link to Top Ten List of Considerations When Debating to Build or Buy a Dev Platform" title="Direct link to Top Ten List of Considerations When Debating to Build or Buy a Dev Platform" translate="no">​</a></h3>
<p>To build or not to build? Ah, that is the Shakespearean question when it comes to software. When faced with a specific business challenge, many companies debate this dilemma; it's an especially tricky quandary when the software in question is meant to help software developers develop more efficiently.</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-building-might-at-first-seem-smart">Why building might at first seem smart<a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/#why-building-might-at-first-seem-smart" class="hash-link" aria-label="Direct link to Why building might at first seem smart" title="Direct link to Why building might at first seem smart" translate="no">​</a></h3>
<p>Constructing an internal cloud development platform may appear like a smart business move at first glance. Having a custom-made solution enables teams to have control over the specifications and manage releases based on their specific needs. In-house software allows for customization of features to meet immediate requirements instead of opting for a third-party solution that may have unused features.</p>
<p>Another benefit of building an in-house dev platform can lead to a first-hand understanding of the technology and deeper sense of ownership and pride in the solution, which can translate to a more motivated and dedicated development team. This is a fair point because developers like to develop. And some organizations, especially those with sophisticated engineering teams, are tempted to build their own developer platform. It's easy to understand this philosophy: who knows the needs of developers better than a company's own developers?</p>
<p>However, this approach brings with it the responsibility for future development investments, constant research, compliance upkeep, bug fixing, platform updates, and support, all of which can be a costly and time-consuming distraction from the core business operations.</p>
<p>When considering the option to build or purchase software, companies usually start by evaluating their budget, assessing the impact of this investment on their core business, and weighing the near and long-term time constraints and potential future needs.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Should You Buy or Build a Development Platform?</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/build-versus-buy/" target="_self">Watch the Build vs. Buy Webinar Recording</a></div></section>
<p>Although building software may be a viable option in some specialized cases, purchasing a cloud development platform from a vendor often proves to be a more favorable business decision for several reasons, including the following ten:</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>1. Buying a Cloud Dev Platform Offers Superior Features</summary><div><div class="collapsibleContent_i85q"><p>Investing in a cloud development platform developed by cloud experts is likely to bring significant business benefits. Vendors typically offer a wide range of advanced out-of-the-box features that allow developers to create microservices for cloud applications with ease. These cloud development platforms are battle tested and often designed with input from some of the most forward-thinking development organizations and have undergone thorough testing. As a result, these platforms offer features and capabilities that in-house development teams might not have considered on their own.</p><ul>
<li class=""><strong>Pro Tip:</strong> <a href="https://www.okteto.com/docs/reference/development-environments/" target="_blank" rel="noopener noreferrer" class="">The key is to find a cloud development platform built with pre-configured development images for the following languages</a>: dotnetcore, golang, java, node, php, python, ruby and rust. Additionally, the platform should work with existing Helm charts, docker-compose, or Kubernetes manifests. At the end of the day, you have to ask if your homegrown development is robust enough to simplify the adoption of Kubernetes, provide enterprise-ready security, support namespaces, mirror production, and scale as technology evolves. If not, then buying is the correct</li>
</ul></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-buying-a-cloud-dev-platform-offers-superior-features">1. Buying a Cloud Dev Platform Offers Superior Features<a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/#1-buying-a-cloud-dev-platform-offers-superior-features" class="hash-link" aria-label="Direct link to 1. Buying a Cloud Dev Platform Offers Superior Features" title="Direct link to 1. Buying a Cloud Dev Platform Offers Superior Features" translate="no">​</a></h3>
<p>Investing in a cloud development platform developed by cloud experts is likely to bring significant business benefits. Vendors typically offer a wide range of advanced out-of-the-box features that allow developers to create microservices for cloud applications with ease. These cloud development platforms are battle tested and often designed with input from some of the most forward-thinking development organizations and have undergone thorough testing. As a result, these platforms offer features and capabilities that in-house development teams might not have considered on their own.</p>
<ul>
<li class=""><strong>Pro Tip:</strong> <a href="https://www.okteto.com/docs/reference/development-environments/" target="_blank" rel="noopener noreferrer" class="">The key is to find a cloud development platform built with pre-configured development images for the following languages</a>: dotnetcore, golang, java, node, php, python, ruby and rust. Additionally, the platform should work with existing Helm charts, docker-compose, or Kubernetes manifests. At the end of the day, you have to ask if your homegrown development is robust enough to simplify the adoption of Kubernetes, provide enterprise-ready security, support namespaces, mirror production, and scale as technology evolves. If not, then buying is the correct business decision.</li>
</ul>
<aside class="highlight_CGlU"><p><strong>Here are the questions you should ask:</strong></p><ul>
<li class="">Is your feature plan similar to the features included out of the box?</li>
<li class="">Can non-technical teams participate in the feedback and collaboration process?</li>
<li class="">Does your solution accurately reflect production environments with digital twin technology?</li>
<li class="">Are you able to facilitate pair programming for multiple services?</li>
</ul></aside>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-buying-a-cloud-dev-platform-offers-reliability-and-scalability">2. Buying a Cloud Dev Platform Offers Reliability and Scalability<a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/#2-buying-a-cloud-dev-platform-offers-reliability-and-scalability" class="hash-link" aria-label="Direct link to 2. Buying a Cloud Dev Platform Offers Reliability and Scalability" title="Direct link to 2. Buying a Cloud Dev Platform Offers Reliability and Scalability" translate="no">​</a></h3>
<p>If you have built your own in-house cloud development platform, it may seem that the in-house team's familiarity with the solution will make performance maintenance simple. However, if key team members leave the company with that crucial knowledge, it can create challenges. Additionally, as the environment needs to expand to meet the demands of emerging standards and new technology upgrades, such as Kubernetes, the in-house solution may not be equipped to handle these changes.</p>
<p>Inadequate updates to the platform and poor design of its resilience can lead to significant downtime during issues. Even seemingly minor updates can uncover security vulnerabilities and data bugs in business logic, which can hinder the performance of the development teams and put the delivery of value at risk. These issues can have a negative impact on the developer experience and slow down the entire process.</p>
<p>A cloud development platform provided by a third-party vendor can ensure speed, reliability, and scalability through ongoing maintenance and the introduction of new features and functionality.</p>
<ul>
<li class=""><strong>Pro Tip:</strong> When considering a third-party platform, it's important to look for one with a robust architecture that offers multiple layers of redundancy and provides consistent, secure updates. The platform should also be flexible and designed to perform at scale, whether you're developing simple internal apps or complex global apps with numerous microservices.</li>
</ul>
<p>In-house solutions and the teams supporting them may struggle to keep up with the demands of your product development. There's no doubt that <a href="https://www.okteto.com/blog/5-technical-challenges-of-building-software-for-modern-cloud-development/" target="_blank" rel="noopener noreferrer" class="">there are serious technical challenges involved in creating a scalable secure development platform</a>. With a third-party platform, you can relax knowing that it is compatible with current standards and can adapt to evolving standards in the future, such as updates to Kubernetes. This allows your development team to focus on creating innovative cloud applications that will drive your business forward.</p>
<aside class="highlight_CGlU"><p><strong>Questions you should ask:</strong></p><ul>
<li class="">Are you able to provide ongoing bug fixes, maintenance, and platform updates at scale?</li>
<li class="">Is there an option to test code before merging it?</li>
<li class="">Can your platform handle parallel management of multiple microservices?</li>
<li class="">Is it user-friendly for both experienced Kubernetes users and those new to the technology to collaborate effectively?</li>
</ul></aside>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">The Ultimate Build vs Buy Self Evaluation Guide</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/build-versus-buy/" target="_self">Four key points of consideration for every would-be builder</a></div></section>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-dont-waste-engineers-on-non-essential-tasks">3. Don’t Waste Engineers on Non-Essential Tasks<a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/#3-dont-waste-engineers-on-non-essential-tasks" class="hash-link" aria-label="Direct link to 3. Don’t Waste Engineers on Non-Essential Tasks" title="Direct link to 3. Don’t Waste Engineers on Non-Essential Tasks" translate="no">​</a></h3>
<p>The reality is, if your engineers are dedicating a portion of their time each week to maintaining the development environment, they are not able to focus on driving innovation and creating revenue-generating application features. In other words, building an in-house platform can be both resource-intensive and time-consuming. <a href="https://www.okteto.com/blog/total-cost-of-ownership-tco-of-building-versus-buying-software-for-development/" target="_blank" rel="noopener noreferrer" class="">The use of your valuable developer resources is part of the total cost of ownership (TCO) equation often ignored when development teams opt to build an in-house cloud development environment.</a></p>
<ul>
<li class=""><strong>Pro Tip:</strong> Look for a cloud development platform that comes with a support team that has extensive experience in cloud development and Kubernetes. The vendor should leverage their expertise to address complex problems, create comprehensive solutions, proactively tackle security concerns, and anticipate user needs and patterns to enhance your business and fulfill the requirements of all stakeholders. By doing so, your team that was previously responsible for maintaining the development environment can now concentrate on their core strength - developing outstanding applications.</li>
</ul>
<aside class="highlight_CGlU"><p><strong>Questions you should ask:</strong></p><ul>
<li class="">Do you have the resources and budget to effectively address problems at a large scale, now and in the future?</li>
<li class="">Are your developers' time and resources being consumed by maintaining the in-house development environment, instead of developing innovative applications?</li>
</ul></aside>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-remember-building-a-cloud-dev-platform-has-an-opportunity-cost"><a href="https://www.okteto.com/blog/four-opportunity-costs-of-building-vs-buying-software-for-development/" target="_blank" rel="noopener noreferrer" class="">4. Remember Building a Cloud Dev Platform Has an Opportunity Cost</a><a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/#4-remember-building-a-cloud-dev-platform-has-an-opportunity-cost" class="hash-link" aria-label="Direct link to 4-remember-building-a-cloud-dev-platform-has-an-opportunity-cost" title="Direct link to 4-remember-building-a-cloud-dev-platform-has-an-opportunity-cost" translate="no">​</a></h3>
<p>At the end of the day, the argument for building versus buying always comes down to ROI. If you build, you bear the entire cost burden of homegrown software. That includes paying for the initial buildout, ongoing support, bug fixes, upgrades, platform migrations, and keeping up with software industry trends. These costs can add up to hundreds of thousands of dollars, if not millions.</p>
<p>When evaluating the ROI of building versus buying a cloud development platform, it's crucial to consider <a href="https://www.okteto.com/blog/total-cost-of-ownership-tco-of-building-versus-buying-software-for-development/" target="_blank" rel="noopener noreferrer" class="">the total cost of ownership (TCO)</a> of building versus the cost savings and productivity benefits of outsourcing the maintenance and support responsibilities to a vendor. A vendor's expertise in hosting and maintaining cloud development solutions can provide a significantly positive impact on developer experience and overall organization productivity.</p>
<ul>
<li class=""><strong>Pro Tip:</strong> Ask the vendor to showcase their success in helping other companies improve their development processes, reduce the number of bugs and late-stage defects, and cut down on scrap and rework by 50%. A positive developer experience is a crucial factor in achieving a high ROI from a cloud development platform, and you should ask for customer testimonials that speak to this.</li>
</ul>
<p>Remember, by outsourcing the maintenance of the platform to a vendor, your engineering team can concentrate on delivering value to your organization, instead of dealing with the overhead of maintaining a homegrown solution. The vendor bears the cost of building and maintaining the platform and can pass on the efficiency savings to you.</p>
<aside class="highlight_CGlU"><p><strong>Questions you should ask:</strong></p><ul>
<li class="">How many resources and budget can you dedicate to cloud-centric DevOps, Infrastructure Provisioning, and CI/CD QA?</li>
<li class="">How much time and resources are needed to increase collaboration with the DevOps teams even more to ensure the end-to-end platform executes?</li>
</ul></aside>
<video controls="" preload="metadata" class="video_QmVR"><source src="https://cdn.sanity.io/files/6icyfeiq/production/a6acc0600672346da35c95ccddf3cfa66b85cc88.mp4" type="video/mp4"></video>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-improved-developer-experience-accelerates-ttm-for-software-releases"><a href="https://www.okteto.com/blog/total-cost-of-ownership-tco-of-building-versus-buying-software-for-development/" target="_blank" rel="noopener noreferrer" class="">5. Improved Developer Experience Accelerates TTM for Software Releases</a><a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/#5-improved-developer-experience-accelerates-ttm-for-software-releases" class="hash-link" aria-label="Direct link to 5-improved-developer-experience-accelerates-ttm-for-software-releases" title="Direct link to 5-improved-developer-experience-accelerates-ttm-for-software-releases" translate="no">​</a></h3>
<p>Developing a cloud development platform from scratch can take a long time and exhaust your internal engineering resources. On average, building a cloud development platform with a dedicated in-house team can take a year or more. Buying a cloud platform from a vendor can save a significant amount of time as it is already built and ready to use.</p>
<p>This can free up resources for other critical business initiatives. For example, according to monday.com, switching from an in-house to a third-party cloud development platform accelerated developer velocity by 50% and reduced costly scrap and rework by an additional 50%.</p>
<p>And guess what? As a result of superior development processes, development companies using a cloud development platform can in return, reduce the time-to-market for new products and services compared to traditional in-house development platforms and processes. Surprise. Surprise.</p>
<ul>
<li class=""><strong>Pro Tip:</strong> Remember that the bottom line is the bottom line: Building an in-house cloud development platform is time-consuming and can take years with an entire team of engineers. During this time, the organization will have to divert resources away from other critical core-business efforts, which can hurt the bottom line.</li>
</ul>
<aside class="highlight_CGlU"><p><strong>Questions you should ask:</strong></p><ul>
<li class="">How quickly can you see the return on investment: with an in-house dev environment or with the development of core application features?</li>
<li class="">What would be the potential financial impact of a security breach on your company?</li>
<li class="">What is the cost of prolonged onboarding delays in terms of time and money?</li>
</ul></aside>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-vendors-offer-technical-expertise-for-kubernetes-and-microservice-management"><a href="https://www.okteto.com/blog/5-technical-challenges-of-building-software-for-modern-cloud-development/" target="_blank" rel="noopener noreferrer" class="">6. Vendors Offer Technical Expertise for Kubernetes and Microservice Management</a><a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/#6-vendors-offer-technical-expertise-for-kubernetes-and-microservice-management" class="hash-link" aria-label="Direct link to 6-vendors-offer-technical-expertise-for-kubernetes-and-microservice-management" title="Direct link to 6-vendors-offer-technical-expertise-for-kubernetes-and-microservice-management" translate="no">​</a></h3>
<p>Most cloud development platform vendors have a team of experts with extensive experience and knowledge with regards to microservices, Kubernetes and security, for example. These third-parties invest heavily in research and development to create the best possible product. This can ensure a higher level of quality and functionality compared to an in-house development team that may not have the same level of expertise.</p>
<p>According to Slai**,** a company building a developer-first platform for machine learning, the reason they switched to a third party cloud development platform was access to Kubenetes expertise and a pool of skilled resources that were not available internally to the company.</p>
<p>Slai was able to work with a Kubernetes namespace in a shared developer cluster that replicated their production environment. This made it easier for them to work on the project, as they did not have to be experts in Kubernetes: however, the company benefited from the additional expert support they received from the third-party vendor that had a deep understanding of their infrastructure, Kubernetes, and was able to help design their system to closely match the production environment.</p>
<ul>
<li class=""><strong>Pro Tip:</strong> Make sure the cloud development platform vendor has a high level of expertise in cloud computing, security, and infrastructure to support you. Ask if they have customer testimonials confirming the vendor provides excellent professional support. It can be challenging for most organizations to find and retain the necessary in-house expertise. Additionally, remember that maintaining a development platform isn’t your core competency in the first place.</li>
</ul>
<aside class="highlight_CGlU"><p><strong>Questions you should ask:</strong></p><ul>
<li class="">Can you easily find replacement developers for your current homegrown environment if they leave the company?</li>
<li class="">Is it convenient for both experienced and inexperienced Kubernetes users to work together on the solution?</li>
<li class="">Does your platform provide flexibility for developers to use their preferred development tools?</li>
<li class="">Are your developers and teams responsible for managing ETCD, coreDNS, CNI, and Docker within the environment?</li>
</ul></aside>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-buying-a-dev-platform-is-cost-effective">7. <a href="https://www.okteto.com/blog/the-cost-and-complications-of-in-house-development-environments/" target="_blank" rel="noopener noreferrer" class="">Buying a Dev Platform Is Cost Effective</a><a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/#7-buying-a-dev-platform-is-cost-effective" class="hash-link" aria-label="Direct link to 7-buying-a-dev-platform-is-cost-effective" title="Direct link to 7-buying-a-dev-platform-is-cost-effective" translate="no">​</a></h3>
<p>Building an in-house cloud development platform can be very expensive, especially when considering the costs of hiring and training a team, buying hardware and software, and other overhead expenses. According to one build vs buy expert, building a cloud development platform represents around 1MM in payroll expenses to get the platform up and running. For <a href="https://www.okteto.com/customers/replicated/" target="_blank" rel="noopener noreferrer" class="">Replicated</a>, a company that enables the seamless delivery and management of Kubernetes applications in multi-prem, customer-controlled environments using a single architecture, the switch from building to buying resulted in immediate cost benefits. The company saved thousands each month on development costs and accelerated developer productivity by 200%.</p>
<p>"There's a cost-effectiveness to a third-party cloud development platform," says the Senior Software Engineer of a healthcare unicorn platform. "It offers a scalable, reliable, stable production-ready infrastructure that allows our team to shorten the gap from dev to prod and enables us to ship value to our customers faster. I can now deploy a helm chart, namespace, cloud integrations, and can go run through chaos scenarios. I can experiment, delete things and remove pods. I have immediate feedback as to how that might play out in production. And there's no way you can do that with local development or a homegrown solution."</p>
<ul>
<li class=""><strong>Pro Tip:</strong> Remind the business decision makers that buying reduces upfront costs. Building an in-house cloud development platform requires a significant upfront investment in hardware, software, and staffing. This investment can be substantial, especially for organizations unfamiliar with cloud computing. Those upfront costs can be in the form of opportunity costs.</li>
</ul>
<aside class="highlight_CGlU"><p><strong>Questions you should ask:</strong></p><ul>
<li class="">How much investment in terms of resources and budget can you allocate to cloud-focused DevOps, Infrastructure Provisioning, and CI/CD Quality Assurance?</li>
<li class="">What is the effort required to enhance collaboration with the DevOps teams to guarantee seamless execution across the entire platform?</li>
</ul></aside>
<video controls="" preload="metadata" class="video_QmVR"><source src="https://cdn.sanity.io/files/6icyfeiq/production/776fe8af317ad87e45f2213b74995d9f8c219344.mp4" type="video/mp4"></video>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-scaling-with-in-house-solutions-is-challenging">8. Scaling with In-House Solutions Is Challenging<a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/#8-scaling-with-in-house-solutions-is-challenging" class="hash-link" aria-label="Direct link to 8. Scaling with In-House Solutions Is Challenging" title="Direct link to 8. Scaling with In-House Solutions Is Challenging" translate="no">​</a></h3>
<p>Established third-party cloud development platforms tend to have a large user base and strong support networks, making it easier to scale and expand to meet customer demands. On the other hand, an in-house development platform may not be able to handle sudden spikes in demand, quick pivots necessary to adopt disruptive change, leading to prolonged downtime and decreased performance.</p>
<p>In the case of Replicated, the company's local dev environments could not meet the developer demands of the company's sophisticated platform. <a href="https://www.okteto.com/blog/the-cost-and-complications-of-in-house-development-environments/" target="_blank" rel="noopener noreferrer" class="">"Developers would spend a lot of time building their dev environment instead of coding, and that became unsupportable and difficult to maintain," says Marc Campbell, Replicated co-founder and CTO.</a></p>
<ul>
<li class=""><strong>Pro Tip:</strong> Pick a vendor with an architecture, roadmap and vision to support scalability now and into the future. A third-party cloud platform can provide better scalability compared to in-house development, as cloud platforms are designed to handle sudden spikes in demand. Couple that flexibility with a team of vendor experts on emerging technologies and you can be assured that your solution will be prepared for unforeseen technology and market changes.</li>
</ul>
<p>As an organization grows, it may need to scale its cloud development platform to accommodate additional users and workloads. This can be challenging in-house, as the organization will need to acquire additional hardware and software and hire other staff to manage the platform.</p>
<aside class="highlight_CGlU"><p><strong>Questions you should ask:</strong></p><ul>
<li class="">Can you quickly resolve issues globally across different namespaces and shared environments?</li>
<li class="">Is it possible to set up your tech stack with just one simple click using your solution?</li>
<li class="">Can you effectively manage all the components involved, such as IDEs, Docker, code repositories, and various tooling options?</li>
<li class="">Can you access another developer's local frontend branch without launching the instance?</li>
</ul></aside>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-continuous-improvement-not-easy-to-maintain-internally">9. Continuous Improvement Not Easy to Maintain Internally<a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/#9-continuous-improvement-not-easy-to-maintain-internally" class="hash-link" aria-label="Direct link to 9. Continuous Improvement Not Easy to Maintain Internally" title="Direct link to 9. Continuous Improvement Not Easy to Maintain Internally" translate="no">​</a></h3>
<p>Most cloud development platform vendors constantly invest in R&amp;D to improve their products and stay up-to-date with the latest technologies and trends. An in-house development platform may not have the same resources available for continuous improvement and may become outdated quickly. For example, the inability to keep up with updates to Kubernetes can crash an entire application. And not being current with security patches can leave your platform vulnerable to attacks.</p>
<ul>
<li class=""><strong>Pro Tip:</strong> Consider the value of a positive developer experience and weigh it against the potential risks and expenses of a failed migration, security breach, delays, and increased scrap and rework caused by a homegrown solution.</li>
</ul>
<p>Cloud development platforms offered by vendors are continually updated and enhanced with new features and capabilities. Building an in-house platform means the organization will have to manage these updates and improvements, which can be time-consuming and resource-intensive.</p>
<aside class="highlight_CGlU"><p><strong>Questions you should ask:</strong></p><ul>
<li class="">Do you have the ability to facilitate pair programming across multiple services?</li>
<li class="">Is it convenient to access Kubernetes?</li>
<li class="">Do you offer pull requests with easily shareable preview URLs?</li>
<li class="">Can you ensure repeatable and dependable workflows?</li>
</ul></aside>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="10-building-a-cloud-dev-platform-is-a-security-risk">10. Building a Cloud Dev Platform Is a Security Risk<a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/#10-building-a-cloud-dev-platform-is-a-security-risk" class="hash-link" aria-label="Direct link to 10. Building a Cloud Dev Platform Is a Security Risk" title="Direct link to 10. Building a Cloud Dev Platform Is a Security Risk" translate="no">​</a></h3>
<p>Cloud platform vendors typically have a team of security experts focused on ensuring their platform's security. They invest heavily in security infrastructure and continuously monitor and update their systems to prevent security breaches.</p>
<p>Historically, static application security testing (SAST) and dynamic application security testing (DAST) scans cannot accurately determine which environment is being tested against. This impediment can lead to security oversight and bugs skirting past the DevOps goalkeeper. But a cloud development environment with embedded security policies shores up your posture against vulnerabilities.</p>
<ul>
<li class=""><strong>Pro Tip:</strong> Work closely with system architects and CISOs to ensure the cloud dev platform vendor builds with security in mind. An in-house development platform may have a different level of resources or expertise to ensure the same level of security. A cloud development environment allows teams to test security protocols while in development. Forget about the days of developers creating risky ad-hoc staging environments that are impossible for CISOs and system architects to manage and protect. This new cloud security development paradigm has allowed DevOps and developers to work together to stop security risks dead in their tracks.</li>
</ul>
<p>Using cloud platforms can provide better security compared to in-house development, as cloud platform vendors typically have a team of security experts and invest heavily in security infrastructure. Bottomline: Maintaining the security of an in-house cloud development platform is critical. However, doing so can be difficult and expensive, especially for organizations unfamiliar with cloud security best practices.</p>
<aside class="highlight_CGlU"><p><strong>Questions you should ask:</strong></p><ul>
<li class="">Is your solution secure enough to support SOCII or ISO27001 security?</li>
<li class="">Can you effectively protect PII?</li>
<li class="">Can your solution cross borders for GDPR compliance?</li>
</ul></aside>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="to-build-or-buy-a-dev-platform---ah-thats-the-question">To Build or Buy a Dev Platform - Ah, That’s the Question<a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/#to-build-or-buy-a-dev-platform---ah-thats-the-question" class="hash-link" aria-label="Direct link to To Build or Buy a Dev Platform - Ah, That’s the Question" title="Direct link to To Build or Buy a Dev Platform - Ah, That’s the Question" translate="no">​</a></h3>
<p>Buying a cloud development platform from a vendor can provide benefits, such as time and cost savings, access to expertise, scalability, continuous improvement, and security, which are not necessarily guaranteed when building an in-house development platform.</p>
<p>These benefits can result in a better return on investment for a business, making it a better business decision. In addition, with a cloud development environment, you can say goodbye to the headache of worrying about security risks, learning Kubernetes, and escaping the never-ending cycle of updates. Instead, say hello to a simple, effective solution that allows more time for coffee breaks and debating the questions that really truly matter, such as:</p>
<aside class="highlight_CGlU"><ul>
<li class="">Star Wars vs. Star Trek</li>
<li class="">The best Star Wars movie</li>
<li class="">The best Star Trek movie</li>
<li class="">C3P0: man or myth?</li>
<li class="">DC vs. Marvel</li>
<li class="">Batman vs. Superman</li>
<li class="">Apple vs. Android</li>
<li class="">Science vs. Fantasy</li>
<li class="">Get Out vs. Cabin in the Woods</li>
</ul></aside>
<p>Sure, building a cloud development platform can provide customization and control but at what cost - total cost of ownership, total cost of what happens when there is a security breach, and total cost of having unhappy developers leave. Buying removes these issues.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Developing Vue.js and Node.js Apps With Okteto]]></title>
            <link>https://www.okteto.com/blog/developing-vue-js-and-node-js-apps-with-okteto/</link>
            <guid>https://www.okteto.com/blog/developing-vue-js-and-node-js-apps-with-okteto/</guid>
            <pubDate>Wed, 01 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Kubernetes is a feature-rich tool to solve all kinds of problems of the cloud, but it has a steep learning curve, and applications set up in Kubernetes can be quite complex. Because your development and production environments are isolated from each other, they typically have different configurations and thus may not behave the same way.]]></description>
            <content:encoded><![CDATA[<p>Kubernetes is a feature-rich tool to solve all kinds of problems of the cloud, but it has a steep learning curve, and applications set up in Kubernetes can be quite complex. Because your development and production environments are isolated from each other, they typically have different configurations and thus may not behave the same way.</p>
<!-- -->
<p>The best way to develop cloud native applications is in a development environment in the cloud which is where Okteto comes in.</p>
<p>With the Okteto development environment, you can now develop right inside the cloud and see how your application performs in the cloud.</p>
<p>In this tutorial, you will learn how to develop a full-stack application that comprises a VueJS front-end and a NodeJS back-end with Okteto.</p>
<p><strong>Prerequisites</strong></p>
<p>To follow along in this tutorial, it is required that you have:</p>
<ul>
<li class="">A basic understanding of JavaScript and the <a href="https://vuejs.org/" target="_blank" rel="noopener noreferrer" class="">VueJS</a> framework.</li>
<li class="">A basic understanding of <a href="https://nodejs.org/en/" target="_blank" rel="noopener noreferrer" class="">NodeJS</a>.</li>
<li class="">Access to an <a href="https://www.okteto.com/docs/" target="_blank" rel="noopener noreferrer" class="">Okteto instance</a>.</li>
<li class=""><a href="https://www.okteto.com/docs/getting-started/#installing-okteto-cli" target="_blank" rel="noopener noreferrer" class="">Okteto CLI</a> installed on your machine.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-your-dev-environment">Setting Up Your Dev Environment<a href="https://www.okteto.com/blog/developing-vue-js-and-node-js-apps-with-okteto/#setting-up-your-dev-environment" class="hash-link" aria-label="Direct link to Setting Up Your Dev Environment" title="Direct link to Setting Up Your Dev Environment" translate="no">​</a></h2>
<p>To build and develop your applications in Okteto, you’ll need to first, connect your local machine to Okteto.<br>
Run the command below to configure your Okteto context.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">okteto context use https://okteto.example.com</span><br></div></code></pre></div></div>
<p>Once your context is configured successfully, a new tab will open with the below output:</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/f805cd116ed9-bb34fe54fb7ba90af9d02191afdcd082.webp" width="1600" height="1041" class="img_ev3q"></p>
<p>This output shows you are now connected to Okteto from your local machine. So, you can now develop your application with Okteto.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="initializing-the-full-stack-application-with-okteto">Initializing the Full-Stack Application With Okteto<a href="https://www.okteto.com/blog/developing-vue-js-and-node-js-apps-with-okteto/#initializing-the-full-stack-application-with-okteto" class="hash-link" aria-label="Direct link to Initializing the Full-Stack Application With Okteto" title="Direct link to Initializing the Full-Stack Application With Okteto" translate="no">​</a></h2>
<p>To see the power of Okteto, you’ll initialize the full-stack application from the ground up with Okteto.</p>
<p>Create a working directory called node-vue-app:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">mkdir node-vue-app</span><br></div><div class="token-line" style="color:white"><span class="token plain">cd node-vue-app</span><br></div></code></pre></div></div>
<p>Add a <em>docker-compose.yaml</em>&nbsp;file and paste in the following configuration settings:</p>
<p>The Okteto CLI will use this file to deploy the full-stack application.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">version</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"3.8"</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">services</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">api</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">build</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> ./node</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">backend</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">container_name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> node_c</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">ports</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'4000:4000'</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">volumes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> ./node</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">backend</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">/app</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">frontend</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">build</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> ./vue</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">frontend</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">container_name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> vue_c</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">ports</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'8080:8080'</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">volumes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> ./vue</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">frontend</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">/app</span><br></div></code></pre></div></div>
<p>Inside the <em>node-vue-app</em> directory, create two other directories <em>node-backend</em> and <em>vue-frontend</em> to house the NodeJS backend and VueJS frontend application respectively:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">mkdir node-backend</span><br></div><div class="token-line" style="color:white"><span class="token plain">mkdir vue-frontend</span><br></div></code></pre></div></div>
<p>In the <em>node-backend</em> directory, add a <em>Dockerfile</em> with the below code snippets:</p>
<p>You’ll need to do this so that Okteto would know what image to use and what to build.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">FROM node:18-alpine</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">RUN npm install -g nodemon</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">WORKDIR /app</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">COPY package.json ./</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">RUN npm install</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">COPY .  .</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">EXPOSE 4000</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">CMD ["npm", "run", "dev"]</span><br></div></code></pre></div></div>
<p>Go into the <em>vue-frontend</em> folder, create a <em>Dockerfile</em> and add the below code snippets:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">FROM node:17-alpine</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">WORKDIR /app</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">COPY package*.json .</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">RUN npm install</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">COPY . .</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">EXPOSE 8080</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">CMD [ "npm", "run", "dev" ]</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="initializing-the-nodejs-application-with-okteto">Initializing the Node.js Application with Okteto<a href="https://www.okteto.com/blog/developing-vue-js-and-node-js-apps-with-okteto/#initializing-the-nodejs-application-with-okteto" class="hash-link" aria-label="Direct link to Initializing the Node.js Application with Okteto" title="Direct link to Initializing the Node.js Application with Okteto" translate="no">​</a></h2>
<p>Now run the Okteto command below to set up the NodeJS application with a development container. The command below, will deploy the services that were set in the docker-compose file (<em>api</em> and <em>frontend</em>) and spin up a development container for any of the services you specify.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">okteto up</span><br></div></code></pre></div></div>
<p>The command above will display an output asking you to select the development container you’d like to activate, firstly press <em>Enter</em> to start the development container for the <em>api</em> service. The <em>api</em> service in this case houses the NodeJS backend application:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">~/node-vue-app$ okteto up</span><br></div><div class="token-line" style="color:white"><span class="token plain"> i  Using mercybassey @ okteto.example.com as context</span><br></div><div class="token-line" style="color:white"><span class="token plain"> i  Development environment 'node-vue-app' already deployed.</span><br></div><div class="token-line" style="color:white"><span class="token plain"> i  To redeploy your development environment run 'okteto deploy' or 'okteto up [devName] --deploy'</span><br></div><div class="token-line" style="color:white"><span class="token plain">Select the development container you want to activate:</span><br></div><div class="token-line" style="color:white"><span class="token plain">Use the arrow keys to navigate: ↓ ↑ → ← </span><br></div><div class="token-line" style="color:white"><span class="token plain">  ▸ api</span><br></div><div class="token-line" style="color:white"><span class="token plain">    frontend</span><br></div></code></pre></div></div>
<p>You can also bypass these questions by executing the <em>okteto up service_name</em> command.</p>
<p>Next, you will be asked if you’d like to infer defaults for the <em>'.stignore'</em> file? Type in <em>y</em> to continue. The <em>.stignore</em> file tells Okteto CLI which files not to synchronize to your development environment. If you're familiar with <em>.gitignore, or .dockerignore, .stignore</em> has a similar function.<br>
Lastly, select the programming language for the <em>api</em> service, which in this case is&nbsp; - Javascript:</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/d4b2c641e2ba-b74f83a2d3c65a7399d69df201deb7a4.webp" width="1600" height="361" class="img_ev3q"></p>
<p>Wait for a while for your Okteto development container for the <em>api</em> service to be ready. Once it is ready, you should have the below output which indicates that you can now develop the NodeJS application in Okteto:</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/76fd00156aea-5b152f24272e5cdcd3367c086e7c5ccd.webp" width="1600" height="363" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="initializing-the-vuejs-application-with-okteto">Initializing the Vue.js application with Okteto<a href="https://www.okteto.com/blog/developing-vue-js-and-node-js-apps-with-okteto/#initializing-the-vuejs-application-with-okteto" class="hash-link" aria-label="Direct link to Initializing the Vue.js application with Okteto" title="Direct link to Initializing the Vue.js application with Okteto" translate="no">​</a></h2>
<p>Since you have already initialized the NodeJS backend with Okteto, you now need to do the same for the <em>frontend</em> service that houses the VueJS frontend application.</p>
<p>Open a separate terminal and run the below Okteto command to activate the development container for the <em>frontend</em> service:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">okteto up frontend</span><br></div></code></pre></div></div>
<p>Head over to your <a href="https://www.okteto.com/docs/" target="_blank" rel="noopener noreferrer" class="">Okteto</a> dashboard to view the services created by Okteto using the docker-compose file you created:</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/c162cf8a683b-18452761d29aa073e40d814d4ac4e9eb.webp" width="1600" height="400" class="img_ev3q"></p>
<p>You are now ready to develop your application in Okteto.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="developing-the-nodejs-application-in-okteto">Developing the Node.js Application in Okteto<a href="https://www.okteto.com/blog/developing-vue-js-and-node-js-apps-with-okteto/#developing-the-nodejs-application-in-okteto" class="hash-link" aria-label="Direct link to Developing the Node.js Application in Okteto" title="Direct link to Developing the Node.js Application in Okteto" translate="no">​</a></h2>
<p><a href="https://nodejs.org/en/" target="_blank" rel="noopener noreferrer" class="">NodeJS</a> is an asynchronous event-driven JavaScript runtime that is used to run JavaScript code outside the browser.</p>
<p>In this tutorial, you’ll be using NodeJS on the backend to handle asynchronous requests from the frontend.</p>
<p>Inside the <em>api</em>&nbsp;development container, run the following command to create a file called <em>index.js.</em> This file will contain all the backend code for the NodeJS application:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">touch index.js</span><br></div></code></pre></div></div>
<p>Paste in the following code snippets:</p>
<p>The code below will simply output a list of some programming languages, their uses, and when they were created on the home route that listens on port <em>4000</em>.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> express </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">require</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'express'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> cors </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">require</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'cors'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> app </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">express</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">app</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">use</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token function" style="color:rgb(220, 220, 170)">cors</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">app</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">get</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'/'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">req</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> res</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"> res</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">json</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">   </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">     </span><span class="token string-property property">"id"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"1"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">     </span><span class="token string-property property">"language"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"JavaScript"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">     </span><span class="token string-property property">"use"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"Javascript is used by programmers across the world to create dynamic and interactive web content like applications and browsers."</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">     </span><span class="token string-property property">"invented"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"JavaScript was invented by Brendan Eich in 1995"</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">   </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">   </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">     </span><span class="token string-property property">"id"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"2"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">     </span><span class="token string-property property">"language"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"Python"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">     </span><span class="token string-property property">"use"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"Python is a computer programming language often used to build websites and software, automate tasks, and conduct data analysis"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">     </span><span class="token string-property property">"invented"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"Python was created by Guido van Rossum, and first released on February 20, 1991"</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">   </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">   </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">     </span><span class="token string-property property">"id"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"3"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">     </span><span class="token string-property property">"language"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"Go"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">     </span><span class="token string-property property">"use"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"Go (also called Golang or Go language) is an open source programming language used for general purpose. Go was developed by Google engineers to create dependable and efficient software."</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">     </span><span class="token string-property property">"invented"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"Go was developed by Google Engineers on the 10th of November 2009"</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">   </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">   </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">       </span><span class="token string-property property">"id"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"4"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">       </span><span class="token string-property property">"language"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"Ruby"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">       </span><span class="token string-property property">"use"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"Ruby is mainly used to build web applications and is useful for other programming projects. It is widely used for building servers and data processing, web scraping, and crawling. The leading framework used to run Ruby is Ruby on Rails, although that's not the only one."</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">       </span><span class="token string-property property">"invented"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"Ruby was publicly released in 1995, but it didn't quite achieve mass acceptance until much later in 2006"</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">   </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">   </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">       </span><span class="token string-property property">"id"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"5"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">       </span><span class="token string-property property">"language"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"Java"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">       </span><span class="token string-property property">"use"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"Developers use Java to construct applications in laptops, data centres, game consoles, scientific supercomputers, cell phones, and other devices."</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">       </span><span class="token string-property property">"invented"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"Java was first released in 1995, and Java's ability to provide interactivity and multimedia showed that it was particularly well suited for the Web."</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">   </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">app</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">listen</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">4000</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"> </span><span class="token console class-name" style="color:rgb(78, 201, 176)">console</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">log</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'listening for requests on port 4000'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></div></code></pre></div></div>
<p>Create a <em>package.json</em>&nbsp;file to track the dependencies for the NodeJS backend.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">npm init -y</span><br></div></code></pre></div></div>
<p>In the <em>package.json</em> file add a new script <em>dev</em> as shown below:</p>
<p>This script will use a library called <a href="https://www.javatpoint.com/nodemon" target="_blank" rel="noopener noreferrer" class="">Nodemon</a> to watch for changes when the <em>dev</em> script is run.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token property">"scripts"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">   </span><span class="token property">"test"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"echo \"Error: no test specified\" &amp;&amp; exit 1"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">   </span><span class="token property">"dev"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"nodemon -L index.js"</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><br></div></code></pre></div></div>
<p>Now run the following command to spin up the Node.js backend:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">npm run dev</span><br></div></code></pre></div></div>
<p>Go to your Okteto dashboard, and click on the <em>api</em> service endpoint, you should see the NodeJS application with the endpoint provided by Okteto:</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/89ad3f11e738-8cfd55264ab83760c88b68f498c57226.webp" width="1600" height="184" class="img_ev3q"></p>
<p>Since you now have the NodeJS application working as expected on your local machine and in the cloud press <em>ctrl c</em>, to stop the&nbsp; NodeJS application and press <em>exit</em> to exit the development container.</p>
<p>Now, run the command below to deactivate the development container for the NodeJS application:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">okteto down api</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="developing-the-vuejs-application-in-okteto">Developing the Vue.js Application in Okteto<a href="https://www.okteto.com/blog/developing-vue-js-and-node-js-apps-with-okteto/#developing-the-vuejs-application-in-okteto" class="hash-link" aria-label="Direct link to Developing the Vue.js Application in Okteto" title="Direct link to Developing the Vue.js Application in Okteto" translate="no">​</a></h2>
<p><a href="https://vuejs.org/" target="_blank" rel="noopener noreferrer" class="">VueJS</a> is a JavaScript framework that is used to build single-page applications and user interfaces.<br>
To initialize a VueJS project, you will use Vite which is a tool for setting up development environments for JavaScript libraries and frameworks.</p>
<p>Since you already have the <em>frontend</em> development container activated, run the command below to create a VueJS app. Type in <em>y</em> to allow npm to install the vite package, type in (.) so the vite package gets installed into the current directory (<em>vue-frontend</em>), and give it a package name. This tutorial uses <em>vue</em>&nbsp;as the package name.</p>
<p>Also, select <em>No</em> for other configuration settings to continue.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">npm create vue@3</span><br></div></code></pre></div></div>
<p>Now, run the <em>npm install</em>&nbsp;command so Vite can run your VueJS application</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">npm install</span><br></div></code></pre></div></div>
<p>Setting up the VueJS application with Vite empties the folder you try to set it up in. If you head back to the <em>vue-frontend</em> folder, you’ll discover that the <em>Dockerfile</em> has been deleted. This is Vite-specific, so you’ll need to add the <em>Dockefile</em> again.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">touch Dockerfile</span><br></div></code></pre></div></div>
<p>Add the code snippets into the <em>Dockerfile</em>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain"># Choose the Image which has Node installed already</span><br></div><div class="token-line" style="color:white"><span class="token plain">FROM node:17-alpine</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain"># make the 'app' folder the current working directory</span><br></div><div class="token-line" style="color:white"><span class="token plain">WORKDIR /app</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain"># copy both 'package.json' and 'package-lock.json' (if available)</span><br></div><div class="token-line" style="color:white"><span class="token plain">COPY package*.json .</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain"># install project dependencies</span><br></div><div class="token-line" style="color:white"><span class="token plain">RUN npm install</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain"># copy project files and folders to the current working directory (i.e. 'app' folder)</span><br></div><div class="token-line" style="color:white"><span class="token plain">COPY . .</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">EXPOSE 8080</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">CMD [ "npm", "run", "dev" ]</span><br></div></code></pre></div></div>
<p>Go into the <em>package.json</em> file, and edit the <em>dev</em> value inside the <em>script</em>&nbsp;block to look like the below:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token property">"scripts"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">   </span><span class="token property">"dev"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"vite –-port 8080"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">   </span><span class="token property">"build"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"vite build"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">   </span><span class="token property">"preview"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"vite preview"</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><br></div></code></pre></div></div>
<p>The reason you’ll need to do is so that Okteto can serve up your frontend application. As the Okteto development environment listens on port 8080.<br>
Go into the <em>vite.config.js</em> file and edit the configuration settings to look like the following, so that Okteto can serve up the frontend application:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">import { fileURLToPath, URL } from 'node:url'</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">import { defineConfig } from 'vite'</span><br></div><div class="token-line" style="color:white"><span class="token plain">import vue from '@vitejs/plugin-vue'</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">// https://vitejs.dev/config/</span><br></div><div class="token-line" style="color:white"><span class="token plain">export default defineConfig({</span><br></div><div class="token-line" style="color:white"><span class="token plain">  plugins: [vue()],</span><br></div><div class="token-line" style="color:white"><span class="token plain">  server: {</span><br></div><div class="token-line" style="color:white"><span class="token plain">    watch: {</span><br></div><div class="token-line" style="color:white"><span class="token plain">      usePolling: true,</span><br></div><div class="token-line" style="color:white"><span class="token plain">    },</span><br></div><div class="token-line" style="color:white"><span class="token plain">    host: true,</span><br></div><div class="token-line" style="color:white"><span class="token plain">    strictPort: true,</span><br></div><div class="token-line" style="color:white"><span class="token plain">    port: 8080</span><br></div><div class="token-line" style="color:white"><span class="token plain">  },</span><br></div><div class="token-line" style="color:white"><span class="token plain">  resolve: {</span><br></div><div class="token-line" style="color:white"><span class="token plain">    alias: {</span><br></div><div class="token-line" style="color:white"><span class="token plain">      '@': fileURLToPath(new URL('./src', import.meta.url))</span><br></div><div class="token-line" style="color:white"><span class="token plain">    }</span><br></div><div class="token-line" style="color:white"><span class="token plain">  }</span><br></div><div class="token-line" style="color:white"><span class="token plain">})</span><br></div></code></pre></div></div>
<p>Now, confirm the VueJS frontend application is accessible over the browser by running the following command:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">npm run dev</span><br></div></code></pre></div></div>
<p>Now head over to your Okteto dashboard and click on the frontend endpoint to see the VueJS application:</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/6bb5db382a08-051e42acf7167b5a858238904cb4527e.webp" width="1600" height="352" class="img_ev3q"></p>
<p>Once you have clicked on the frontend endpoint, you should have the following output:</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/9c50c8b1f7f4-3f085d4d67383366047ae602faf45b24.webp" width="1600" height="783" class="img_ev3q"></p>
<p>Now you will further develop the VueJS frontend application, by building a UI to serve up the NodeJS backend application.</p>
<p>Paste the code snippet below into the <em>vue-frontend/src/App.vue</em> file.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">&lt;script&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">import {ref,onMounted} from 'vue'</span><br></div><div class="token-line" style="color:white"><span class="token plain">export default {</span><br></div><div class="token-line" style="color:white"><span class="token plain"> setup() {</span><br></div><div class="token-line" style="color:white"><span class="token plain">  const languages = ref([])</span><br></div><div class="token-line" style="color:white"><span class="token plain">  onMounted(() =&gt; {</span><br></div><div class="token-line" style="color:white"><span class="token plain">      getResponse()</span><br></div><div class="token-line" style="color:white"><span class="token plain">    })</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><br></div><div class="token-line" style="color:white"><span class="token plain">   const getResponse = async () =&gt; {</span><br></div><div class="token-line" style="color:white"><span class="token plain">    fetch('http://localhost:4000/') </span><br></div><div class="token-line" style="color:white"><span class="token plain">    .then((res) =&gt; res.json())</span><br></div><div class="token-line" style="color:white"><span class="token plain">    .then(data =&gt; {</span><br></div><div class="token-line" style="color:white"><span class="token plain">      languages.value = data;</span><br></div><div class="token-line" style="color:white"><span class="token plain">      console.log(languages.value)</span><br></div><div class="token-line" style="color:white"><span class="token plain">    })</span><br></div><div class="token-line" style="color:white"><span class="token plain">    .catch(err =&gt; console.log(err.message)) }</span><br></div><div class="token-line" style="color:white"><span class="token plain">   return {getResponse, languages}</span><br></div><div class="token-line" style="color:white"><span class="token plain"> }</span><br></div><div class="token-line" style="color:white"><span class="token plain">}</span><br></div><div class="token-line" style="color:white"><span class="token plain">&lt;/script&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">&lt;template&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">  &lt;div&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">    &lt;table&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">      &lt;tr&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">        &lt;th&gt;LANGUAGE&lt;/th&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">        &lt;th&gt;USES&lt;/th&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">        &lt;th&gt;YEAR OF INVENTION&lt;/th&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">      &lt;/tr&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">      &lt;tr v-for="language in languages" :key="language.id" &gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">        &lt;td&gt;{{language.language}}&lt;/td&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">        &lt;td&gt;{{language.use}}&lt;/td&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">        &lt;td&gt;{{language.invented}}&lt;/td&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">      &lt;/tr&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">    &lt;/table&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">  &lt;/div&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">&lt;/template&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">&lt;style scoped&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">div{</span><br></div><div class="token-line" style="color:white"><span class="token plain">  margin: auto;</span><br></div><div class="token-line" style="color:white"><span class="token plain">  width: 1000px;</span><br></div><div class="token-line" style="color:white"><span class="token plain">}</span><br></div><div class="token-line" style="color:white"><span class="token plain">table {</span><br></div><div class="token-line" style="color:white"><span class="token plain">  margin: 0% auto;</span><br></div><div class="token-line" style="color:white"><span class="token plain">  width: 100%;</span><br></div><div class="token-line" style="color:white"><span class="token plain">}</span><br></div><div class="token-line" style="color:white"><span class="token plain">th{</span><br></div><div class="token-line" style="color:white"><span class="token plain">  font-weight: bolder;</span><br></div><div class="token-line" style="color:white"><span class="token plain">}</span><br></div><div class="token-line" style="color:white"><span class="token plain">td{</span><br></div><div class="token-line" style="color:white"><span class="token plain">  width: 150px;</span><br></div><div class="token-line" style="color:white"><span class="token plain">}</span><br></div><div class="token-line" style="color:white"><span class="token plain">th, td {</span><br></div><div class="token-line" style="color:white"><span class="token plain">  border-bottom: 1px solid #ddd;</span><br></div><div class="token-line" style="color:white"><span class="token plain">  padding: 7px;</span><br></div><div class="token-line" style="color:white"><span class="token plain">}</span><br></div><div class="token-line" style="color:white"><span class="token plain">&lt;/style&gt;</span><br></div></code></pre></div></div>
<p>Head over to your Okteto dashboard and refresh your Frontend service endpoint to see your app.</p>
<p>You could notice that Okteto has picked up the changes in the VueJS application, and it keeps watching out for changes as you develop. This applies to the NodeJS backend too.</p>
<p>For the VueJS application, you should have it look like the below:</p>
<p><img decoding="async" loading="lazy" src="data:image/webp;base64,UklGRmYfAABXRUJQVlA4IFofAAAQHwGdASpABvwBPlEokUajoiGhIPUYUHAKCWlu4XeeAaMnp0ZanMfNnop9Cf+09JzoNf1f0AebT/tf1790f+J/vfVG/8b2FP6T/mv/n7hn8Z/xX//9qT/y+yd/kP/J+0vYAf//gZfSPZ//cPyI88fxj5Z+ufj5+8P+Z6L+Gb3I/kn16+zf2b9kf6p+5fxz/v/DXgC/jX8v/tP9j/Yj82OQH0/zAvUr6B/q/8P+7foDf1XoX9eP6/+UH0Afx3+ff338xv6n///rHv0fEP2R+AL+R/0X/Tf2794f9N9Kf9Z/2v8x+UHuA+nf+h/j/3d/xn2Dfyz+q/6n+9f5v/zf4f/////yP/uz7K/7oAy7wIu/MZVkpo6ntb13shs5RaOmNKMHVHpI3DvF2TYIjB1VF2Q4R+19J2oZtEXJDRltWdr6TUYsObbgqS8IA/JeeXRfGfSQ60SGqpY0jCckMqvfuO17AcLx+Px+Px+Px+Px+Px+Px+Px+Px+Px+Px+PYwCHU24Wlyyf7o++SVZm3iPtmQjJbLBHOT1o7egER5t0WWIe0Aqfj6AMCBbstG9RfOfSN6cWs82JFcgPg6RP/x2nPRfSJvYWgtEeNyYp8i8A/nfgr7Yazk0bcN6qw2spZEcqxEcxFkOkVR0/BXkN8MI2pRyDFtuAP+KE/LLcA4BdnVHsyLYVeamEgB1dlnvhgFnaQi2sHh50rmi37IcH32ExSJ2ey3OiGvRthG0XFUc6DwwdOgiRHhC1p39Ywb4G9akc9fbfkLK/jn3L+plysi20zupqAmKYuMPcdYAmKYuMPcdYAl3EBC3RC6vIHwy9V+IS0d0e1N3l6mA/aX+Mvo2j/cwuXLemvOKLeMLEp0vAAOyzvyAGDBVvVcOivA0TrSamvZ1m6RPnXYxEo3JvgwF9YF9XqnPCt+r22UgyLP1tspBkWfrbZSD1NzXxykGRZ+ttbNW752qt1wYM2gvCm3uJBaLBeFNvcSC0WC8Kbe4kFosF4U29xILRYLwpt7iQWiwXhTb3EgtFgvCm3uJBaLBeFNvcSC0WC8KbaIgs/0WrjV8Chkv/4rVvVzFXMMD4y7vicf7Cm7j843WpjGslGVyz/1l9IiC1esTJHQePU1ATFMXGHuOsAVpN7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFM8cUYMOB02TilReFRK2hfidPYYkGvu2zK0gCuQx2zsFRTyjl9cRbaZU0fKOBCgYcWGfuh3bYFwsU4x1gCYpi4oLHceaSMdRHM1EXUuQxV99osWAluHr+Z1cGVQgWmu4pSjB8CCqUNxCvmM4GLGdF+DHOhN6g//k9jarIttM7qagJimLjD3HWAJimLjD3HTMfLx+O+AozKpxIw4LY2SkviyYZh02RLoHj4A7MmglImIK6qTUZKPo/PiRl40UqB3fvqR5xUjVcylERANMvYHz8Q/7y6ZIivj7CeMEofJpUwBECw3pkk1bhzosukzvqWE4qJVbtuMod5imLjD3HWAJimLjD3HWAJ3it23FAKa5kY/H2zH2spne2Y/H4/H4+1lMpne2Y/H4/H4/G+7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxh7jrAExTFxQAAP7/32ugBYXeKGFGK7zn1okz3qHw4gygC7yWxYAFODaWRJZQa5rgfiNqOyBnSntzbqLjhQhb84/5+TFJ0IyaUrFVqvYaIUnEAaq63LSIQ07jM+PajA7QcWX8foluDbVOri8NOsBnYaVu21N7Qdl+JAFqu0jRYkB37sY4bZlqkREx8hTJpeEKGlDSf4mXIXkZdAIoF9JgTC2tpdZ0S9jFm6t7gyFBZnzHje56OvDhiWTi1wFL3DUNv/+22vs2P/tfhk9IWRKQ6GoDrjS6TXqai9K5qy5aMsIIdMrWz8YEK9rwasnBzg3awmYY7RPsDbJar1rTxUlMNx3o5PIwJQ7L70Jt16sMBwZww6L6Ft6k3PmrgvRD+0gL7FMQ51ej7jzoUWf/ihRJc6iSrPgj4Esx8uHfbVdM/bpNSCA8sje//hVEBGo/esALPqqiYekynL8aXSlwfuju3ZKcsri218X7vQgHmf2b4I8xpBuGjYtAuerRTuGpw2+Tr5B7M63sN4lf2rYf+V/D0P/lVoFpK4cR9uQ/QcE6K4YT0GFHAHGlR3HZcq5F9NSYBSjiTqz3GSnHow+95jDFCMPzkeswAFz5h4EHhGIoO3mspYGze0NiH9pAX6kNmv8T0j1RcxUQWnjcPEEeXGfCbICYcgGd2TCeLYP4zm4xnySs5pyHTHrB4E8XgU/bZxpHGSmxIb41ZS0URWiTajkZmLozsELiwjaszUBmuA9YbBIhUr9ULTMS2rSgKXpmh4WwcM9MsV39BKDI9ZixULg7/NCo3sLgHc5dIlO+/7Ceu+EgG+/3zX/2c/51i8qX80YAwzrn/SKSS7v9+/+smX/9Yzrar1qLF+aFWzJTs4PqUwG5gNzAbmA3MBuYDcwG5gNzAbmA3MBuYDcwG5gNzAbmA3MBuYDcwG5gNzAbmA3MBuYDcwG5gNzAUhJBHzLhOSUeWuZV9p+fm1lNqhGK2iEFfF1doItySzwSkRMEjbI8ga1EGMGzNRA7655+p0JmEGNQMx7WnCNLdZ66QFFUCZ3jviD5NmMDcv8yk62PSn7I1/5CiWMtpzL84Eu80XWLC42WFD4MNEm+/4M+Mds7RnZ2LpzsGBSTer+3RMljgNW9er78Xi1++0SUNoceclzbaCzPlEPOSoGfr999X5my/tnXuVf1ZX9nlxj8Iir7loBfaLV7AT4+TFPu/LR9itiCmHTa/fCWRSFAWJjU8Fa+GgsivzwcKhlAsAH4AuKV2EwBRx6C2Vr4FhnnWSCSbYGR1i+Jh4mTnZbCaXkM2pPzsd/0/RJJToC6aaxolAedp/NT1bsGlY2+XlMOxgD/VmHsadZTDvBNPccoxIeVMOwsDkGOcvIzl7sTZfXB7tnvPZG6WQhjH/PQ7IauLkhPTNuRR9k2DofBbRMOT6ld77hYwg4SvmxYmxnyEm8hY0cf5vy6OLcGbStMoHF16PupszPx8kU/Zu9Zh9phBUgjP/5eGWhzNsjkvYhjEJvUtqQV/BAjg5W2UHb1NTxbPoXxf6Pn0jAt0vskeYxRfRrmtwbvqXUbGXpe4dPaW5ty29RNoYZ/632DzRs3y4Mz48ymHD+APtnU74lT0jgZzpeUgbCEtnH9KBxElnHY2UidgBvkrPoU31uzipghCPBpgq2z01TLPep/96lYOvoXI9onE6jz1jkjR6iNe8hzKYgF6VBUkAUVrTEPoWz59go6x+aoC1T0EUYt4FA6NBCI0F/9hFBgs34hFM+qZzcwlA0eyt8WtXAAS1Dg5sVmj3341NkFv+Sh7nSX9cVdvUhGrxChs+LWgG0kIO0xb0PVD6b4GrGv84lSqCVR/OivIqy2NAv6yMpTNG8Sos8HlHSyyl9saxna9elhqb//aBFeUZgaB32ZI1PJmcdAlDlwKX8Bw2F6Whr08mhdmxtdCBVUzovTWAxQv33jqnEOCoYUVT02L8R6yXI758+UsAK8UJlop3xUN8jXGhgXTJKkyM8oErDHN8xD6jUFAgQGvVh9qO/P3q11kcCZwh5Panjcx5Blr/P41G9c0JFRV3f0VC1Q4X5woe/yDTSQhabhFf57VjR7DmSWWNu/AVeNOdv1Ix6RxT5elLG5lEinbd/ahCGSrdfppf5HHz8x8wtG+vekykSOKjByJj4xwrF135N22/mx6FFnVUp4ZSZAcM+e6Tn4FuWqAs8xhVIgJ18j4+iXWCfr3ZcxZs5gdi/JB5L75dtiOdYq6JS96Pay0dYLV2vb//1E2gOayeBTn9tZ9ZvLMHpaVjwOzpMUaX288vWLwRyuH77Crw0UPPdAAIyE7VK5qBk9vxZEWANFDiLitzo9fynI6ps828PtPrZ6jN946U8+/bh5Qn+69adiR0n0L7uuARj4qSphW/MzD4Rwy2op+Gc+3aOHU6SgcYBZy1jiJjVhrV0LF/Px91+cjCXF2GdcHbM4kIp+k/5EkH4bykXAodV9nWSmMwdpXbGEJFEstFJweIvdd3oL58Ev1hDf73LluLdlUfiufDVhw23ILsBrAiSwaLbtfwlf1AogNgMdVQ7PFZaj50RJ/MH6VHXQZOWRFAfOFYd2XsZnitRxRkXvwYAUJUo9Kb2qg9yAIyKkGr3568XuKsKG9wbocGYn0E4OOg79Yi0hu2fc513GjaWKU3AxS4bF2ulx/YY3M72JJ08fi7ReVs3OSlF2naL6O/3c4FykCxAUoMhZ0THq+SlJunlD9X3w2J9Cw9FYVtSafxqhVz6r2e0s7V5E+vkUw1xSb934f5ZvoJpdo06BVKLlWb+Wb1/UWrPTWDiw3dZ/5+uoUmjZd9x3f60rnfT4ey4IqSeDUifDhQ23rv8CddKthGQAXysbJh+YwnBjS7JVmbbBxO7NsjzrJwPoAk8kpcocBRS4fzCMFFtdjKQdxaQ23NmXSG+iVW6WQ6YuP8n0k23uMAr97/4UZkcvrcYj83OCdq5b1Mqw8zE7z3rlCKdxHap4s3Kwks/9vLvMlv0RJH+p4Jk29tbSbGzlJU1JihVWrks/atao2yz37zpvMJ/loQLBgpErCRm6MGrT5lQ0wKNMSELFy2fsbjqv/T8vjwdbaaabu+KJLFT4bZGlZDvhuuu5AlGU3Kq89hAeMBx+Mw9c7WZFaa3HIUk3SvTVM8rjv47Ry4H+xgJeAS4k8OEYzHZysdazNm0f653NyMImKQ+7m2hvQpfJ6P/PnR7x2kS9Ud2/CL3190sWo/pfFkIDujxqwIDcmcOPIBbl9yNBYT2UF+4EaGT0eOwv8Hu7Qge53HXrbs55QO8hU9uBnYpnLPBj68uk6T4WvhFedofMIloS+3KxwzFOqjUT6gtsyVcUZZDuP4kGElfxt/mbaAlQzNvRMc7NACFGZQQCrdZb6jLPaNH3BKl7ycBSlJwZH/6aHjFvIYHzVek8KXHPOeesvTlxsYSkuaq1s7vs0g/aP0P/2vq3X3dXd8ASzxvXFgRfzDgNhcaZU9+/lAx4kagU2PjuPS6iqwN5Zd86F/3zbXiqBL5xEH8FAI66xnaPZKLdRQ5qfoKuvOT8lrzSaMgynzM1TIiIKhWwMxxmtuXajysNO/z5DUzrBYlN1F1zO9UTxKnz+j/EdmHHo/NReAtD+3aj16w0dX4+A2DuFUyfyHNtRJQFALcysxYjl0wuro3tl+VAp1lSHrgA9bLJwAv1Cwqa2YSZBAZq5JvwVnSLdms6/eDEncluLOgRrZOS/obI8gRxfJWhUJTuSDQ3HM5/3D9Uma5I2jmSRbgT0c8/RozsQEZW+Ad7qD5Y4jmMn64df5AgAAAAAAxzl2xYHoYoa6D3uBD5ZASzFcTSt+GLU6+PRIzpEds+xzIgn9Wty/DTX8Fcvgb5uv2p8I3YqR4Xwvs7isft0tjn+wvUmD5eI91ncgum7BsdsZD+6cPnSV7oIpWCjS3OvMLg/fo06YykD7FE2pou4ktP0y6cn8mlBQ7AoQwPujRCwOLEcwLp7Ygvudv1jbfjfYRjBGQjSE0VmdG8WBGRZ7t10EGy9dnRyRhwGPkzFCxNDAED0pNQxuiw7hys2YIIpEW+ccilrpYeNChF8tPXxdQGFRsIzr1LqmNWpYTS74pdi/QDoDuwptV2x1XV2nGcccgbMhhxl6ej+5Ath+wArZsRAqc95epWzdmhOH/EkF2KRlEigSXrCh10po3jyi5dnETPXJ4FQKBrOdU4sMPnP8D+oIlrqMe+21Z9R/M/pISuyNXsTpzbMqMwW3O/oUDUKhf+x8h/UFqm8NeMMs1AU8mJOw5P+r4hp7Bhceky0eK++XB9gcUt90DYWA9n7VQzxz8PX9QUje+nIMuMf6uaG3WIYz02zvCeTAJwLdRYRu/9zbE6wFnzrAWfOsBZ86wFnzrAWfOsBZ86wFnzrAWfOsBZ86wFnzrAWfOsBZ86wFnzrAWfOsBZ86wFnzrAWfOsBZ86wFnzrAWfOsBZ86wFnzrAWfOsBZ86wFnzrAWfOsBZ86vVrD9wFof6QOA+aGqWva8Pd09LcAWHhP4Dn2qTFH9ZORJEvaDSVKhJ8R0wH24DLP7beQSQtpZKyGgeJE9zq+Xa8cA2ZKdc+bcISyZmVx5QEhAW8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG+exu4WX6gstXzPeprdM79taVxqN6nOb6vIlPDh/Ua5cRyFJvNJTr/E42Md4L0d7P3b8n6VAUbFZho6gtmx6Ox8w+g7CgAE0+ek2Ntgx6ony7+uNvkCEMF6/JaCe74vBLgO+RnczTexYC1yQtTVoVft9zQr8PC7xyzXVkFSVufkQbqXrqT2kE6V1AGJQgT3glRqxqmLVITrSy5RFGGTMCIcnVXQhidIvvuZ2BWinRBbRCAEwik8RiBcFvsmYABNn8Ctuivcb6M4HEwACOf4FfyKT33UjLU04WhRR7wDTOf6CC7L3hvJDqDk1esuHKp+69PAoOcUSAdZ6sU5tTwZDr641Ox9+1iayRRV+jy+hptRrLxpTkaQneZMlIeXHtHV5BTU3XRQxL2yjgUKsPWAKBvtQja5RspWfKbsZoZ4SRTVI+G61G83gytWehqO7/SdFuVOE0JzapGVkNlAFuwlLhy6cSOxzQuSNpYvf7JePIcf86LWI0MwljMgPMuTGbY5duK4PrwUfNKYToSYd1l66RfG8OOSfAki9QjlLdzYRDeflARL9u4ZJPTpVKZpU8CJ/JIPj1LwSdjzopnV5YS/ryLF6o4l5fkVCx0S9/yYVKyK2QYq0VQc87xCzche9PjPDF4mCkzCqJMqg7efzuOp0PPDHQ4g2ro9Nv8D/z4LBX34gYVbgqwEmqWrsNYya91XIariZnEplQmzd3qzK+Sv8CjilmvGYvGnMi23PnvUUEIVLPC5F3qP1aXRqsye7aG4W+sWAcHctoYejC5LFURyhRRAdP8rvvgmaM6wyVnB/KByf6dhPprdAyR0tFM3/Oa9vAYHZPfS/5HA6NvaGNTu7fqyfnKvrFIHUzRJEZiDIBAD4s1+wOXf3OaAAQsa37rqIp2aKjSKbnVr2VwHVHgbFn0q6OUBHmpnfDSgdOE5w9x8VaqNfKPNA6T5/qK92K2AdeO/MJ+nb8XnNeRgXsCVruSq/YR4onOeIUQGMMujYizYaPeaDkwJSHwVq5KcAgqPnevoWZQq0gJURNCYPjynwulxMxrbeGZeAOU7MQ3XbSkx8BbRDSAUnegnjBCIZ5eOOO2gNoe7R7ZlsgKWyG2f/y9MF0/MFTpuQHvcM6qmCoCOmjSs+nMn/7R1j6AnxHW5FZA+j6RKctrCX2CBpHIUoa+0z7vF6+adKBnidVIyTdL0qRBMIvR2XOZpqLv6bZI1pa7MqCTPyXCfZjwpZxoS6EllsgDGbwe44A0JDlrvVcdWISyOXzfYMn0/XCXvmUl9ctjM/wttNmAdlI+daB6Ep0KReXTJrAAEpsyKuDE1cyvTBKF99/ZtsZJ1H6WImHKGSnOpFq7gbq8WkfA4BTOkTjVbo7ieb9VuUnYIuGXnwzC1TOFiD5ZEtGGmqZkwEvPL5zZHzHss6XY9vIEEV/pBdYz9uO2vmClMjKe8f09x2MzASs5TXc1cS3NX5BE4nGv9EnAN/5wjyPKXboYA+3yC0iLmncHGfnkD6BdFsqwyYj8064GDO+hsGGyn45mr5G4osAh3mJhQ2E4NpuF7yYGetuDk0Dn6+bm79MtdBVuBG1HK/RanrZ/n4Mh8Z/SbrlxxRwXSuEa1xUN0A1o3k5GCh1lS6MPPuUmxgdbKPl/w66FiBr7JiE8n0PyUO62C+ED9SdjPJj+quT46d9iIoVemTy1jJ8EMvwJAANoJ7T3b09sv3nQurKd/mHRGYex/E7D5JeE+PKgeWSacOpuWxb/AURo/my4T5Sx4zFpGApBZKDeYgXzzc6sEMOHlOUapPUHogNmZmDhz3XZKEZ2q/WfvQ11r2+Q7wXGVyAYoI++1lGLeQdv/dAF/pB4avJWi++lxmvYsiho8jeqMJuUUB8fmaSUoKh732mDSNeeM7sxWmOUTcthKyL+kAQzm8Tx9UinoAhFxtmQUF6bIjUw/DwceKOpZSjwlbuApyCOC8+9NaXeunA8jBpAZeRTaVAhXKGiGiHvb99okM/UeOciV++PyZ/M2GizsdW7ZzCV4OLSsG7qIxxQ3qiHXqCE/svGkpiHdnjgCyfGZduw2PofILO7NovqgEK4MdInqQ0Erq0Dl5j7dOOzbJkappVsKJZxlfnwOBCKtAy2NvTxV3DdTrnQjXk0jq3DHkA0Q4ln6ZgbVq4VdY2/bUbvXQoCdNT6YXkHf1rzqEIS/1eGZteqCZmx1tEwJoouOuRjhVeE4aaMQD5OFChPDbdNb6XVdnlUVYBzM24xK4/ce7QwJMs7e4TMv++TJjPnCJhYiMoL8FaGt2kzF/peYEGvob5/LtQIHXsIWubQ3GYtyQIFr42Kn1CbFIu5+mcjUQfNBsUiu+cWuO6qpRfnS2wtTOXPUlcpEeeRqw2+fly98tsUcCPJ5C+XIHyfBy5xdYM/Uq9hYP5TxPEQ8MtpAYu4qluoX4j0WZDG1lvSgAF6Hm/7ewatda99p77gBYIMH1LcVfzSIfjkgjtd1ey27wufIBlf57x809H+nrVyBsxrGD3msxk6VMqw6qQbdUigGDPEymZm/jcm9wR8vzfO09R/x3efRPO0o7QIGek8AhFZ39AXjAz5jY+q00P3DqoVf4hWDRuNzpbg4p/CTYjz45fkfHmgTXI2GvQjd6/fEuuDkwxfAXhnPaYQs3cyAhTG3nj2a1WOGwOksqBr7ZYjdgCDt8mEs4uwA0wfJcQ9puulqPWcoHVmSuFo2jKbwCvcOQJyDzcK8cwJ6uaemw5wrCU2kHr6T1NZzDc9cIlaKx4WbbCAdTTBPcpy0/eLUj2HihLu8bTH7N9Ukc/74rYXOLXVCFn3X3y4Q5mudyHV+SL8Igg/yUxzNvXXRadjhm3E6/YCLreERWHvyspzDbgXeChpmYO6EFGkx01GY04HV8gGFaMyiEwdQo3Onp0oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" width="1600" height="508" class="img_ev3q"></p>
<p>The VueJS application couldn’t display the NodeJs application because you deactivated the development container for the <em>api</em> service. As the NodeJS application listens on localhot:4000 which is only available on your local machine and not a public endpoint that is available over the internet.</p>
<p>To have the VueJS frontend serve up the NodeJS backend you’ll need to restart the development container for the <em>api</em> service.</p>
<p>Run the Okteto command below to spin up the development container for the <em>api</em> service.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">okteto up api</span><br></div></code></pre></div></div>
<p>Run the command below to start the NodeJS application:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">npm run dev</span><br></div></code></pre></div></div>
<p>Now, refresh the VueJS application in Okteto. You should see the below output:</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/968d568b571a-b6a2e976816de88ef9891bb461bd0665.webp" width="1600" height="757" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/developing-vue-js-and-node-js-apps-with-okteto/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In this article, you have gotten a good grasp of how you can use the Okteto development environment to develop a full-stack application in the cloud. You have learned how to use docker-compose to deploy applications to Okteto. You now have the opportunity to see how your application behaves in a production-like environment with Okteto at your fingertips.</p>
<p>If you’d like to see the code used in this article, you can find it on <a href="https://github.com/mercybassey/node-vue-app-with-okteto" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>]]></content:encoded>
            <category>development</category>
        </item>
        <item>
            <title><![CDATA[Building a Dev Platform Is Easy - Maintaining it is Hard]]></title>
            <link>https://www.okteto.com/blog/building-a-dev-platform-is-easy-maintaining-it-is-hard/</link>
            <guid>https://www.okteto.com/blog/building-a-dev-platform-is-easy-maintaining-it-is-hard/</guid>
            <pubDate>Mon, 30 Jan 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Building an in-house cloud development environment might seem smart but it is a costly and time consuming distraction from your core business.]]></description>
            <content:encoded><![CDATA[<p><a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/" target="_blank" rel="noopener noreferrer" class="">To build or not to build?</a> Ah, that is the question when it comes to software. Many development teams debate this dilemma. It's a tricky quandary when the software in question is designed to help software company developers actually develop more efficiently.</p>
<!-- -->
<p>That was precisely the debate and dilemma a leading digital healthcare unicorn faced when it came to decide whether to build or buy a cloud development platform. The first choice was to build, but the development team quickly discovered that building a cloud development platform was more trouble than they realized.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Discover why Replicated Halted the Build of Their In-House Dev Platform</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/build-versus-buy/" target="_self">Watch the Webinar Recording Today! </a></div></section>
<p><strong>"We tried to build it in-house, but that failed"</strong></p>
<p>The healthcare company quickly realized its local development tools and deployment strategy could not scale to meet the needs of the company's growing development team However, their decision to solve their local development problems by building a platform was a case of leaping out of the frying pan and into the fire.</p>
<p>The healthcare company attempted to solve its development issues with a homegrown dev environment solution but quickly discovered several problems; namely, using existing members from their 100-plus development team to develop the platform impacted time to market for core development commitments and essential releases and compromised the focus on current projects and morale.</p>
<p>"We tried to build it in-house, but that failed," says the company's Staff Site Reliability Engineer. "Companies don't understand the complexity of what's under the hood when building their cloud dev environments, such as the custom resource definitions and technical design needed to work with Kubernetes. Of course, you can create your development portal from scratch, but companies overlook that you need a dedicated team to manage this tool."</p>
<p>The healthcare company realized they were not equipped to assume the entire burden of building a customizable option, including R&amp;D, writing documentation, QA, ongoing maintenance and support, and data storage. The irony is that even if they <em>did</em> cultivate that internal expertise to build a platform that could support Kubernetes and microservices, there was always the risk that in-house brain trust, which is often a single person, could walk out the door, taking all that knowledge with them.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Four Arguments to Consider When Deciding to Build or Buy a Dev Platform</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/build-versus-buy/" target="_self">Read this Self Evaluation Guide to Weigh the Pros and Cons of Building vs Buying </a></div></section>
<p><strong>Does your in-house solution work well with Kubernetes? Just asking</strong></p>
<p>The company needed a platform out of the box that reduced merge issues, improved developer experience, supported Kubernetes best practices, and helped them manage and control critical data.</p>
<p>"A lot of people know Kubernetes but don't know how to use it well," says the Senior Software Engineer at the healthcare company. "We needed a platform that supported best practices when using Kubernetes as well as something that helped us move our development closer to production by allowing us to use production-like data."</p>
<p><a href="https://www.okteto.com/blog/5-technical-challenges-of-building-software-for-modern-cloud-development/" target="_blank" rel="noopener noreferrer" class="">When it came specifically to Kubernetes, the team soon realized they needed more internal expertise to design, develop, implement, maintain and support a solution that could simplify its complexities.</a> And that's why they scrapped their build project and pivoted to buy a solution that could unlock a better development experience for the entire dev team.</p>
<p>"We deploy all our applications to Kubernetes, but Kubernetes doesn't live in our software development life cycle," says the Site Reliability Engineer. "And that's exactly where Okteto fits in perfectly as a development platform to manage that complexity with Kubernetes and the cloud."</p>
<p><strong>The benefit of a cloud solution versus building an on-premise solution</strong></p>
<p><a href="https://www.okteto.com/blog/four-opportunity-costs-of-building-vs-buying-software-for-development/" target="_blank" rel="noopener noreferrer" class="">Another benefit of Okteto's cloud development solution was it allowed both developers who had an expert understanding of Kubernetes and those that wanted nothing to do with it to thrive.</a> That's a delicate balancing act that takes a lot of work to achieve with a homegrown solution. "With Okteto, developers do not need to know Kubernetes for development," says the engineer. "If developers just want to write python or JavaScript, they don't need to know the complexities of managing their Kubernetes cluster — they can learn it on their terms, and Okteto handles everything in-between."</p>
<p>This healthcare company is a classic example of a developer-first organization that understands how a positive developer experience translates to a productive engineering organization; buying allows developers to do what they love instead of burdening them with the exhausting maintenance of a troublesome homegrown solution. With Okteto, engineering teams got a cloud development environment that spins up in seconds and works with developers' favorite integrated dev environment (IDE), associated tool set, and pre-established workflows. As a result, developers no longer need to install, configure, and run resource-intensive tools.</p>
<p>"There's a cost-effectiveness to Okteto," says the company's Senior Software Engineer. "It offers a scalable, reliable, stable production-ready infrastructure that allows our team to shorten the gap from dev to prod and enables us to ship value to our customers faster. I can now deploy a helm chart, namespace, cloud integrations, and can go run through chaos scenarios. I can experiment, delete things and remove pods. I have immediate feedback as to how that might play out in production. And there's no way you can do that with local development or a homegrown solution."</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Why Your Team’s Developer Experience Matters]]></title>
            <link>https://www.okteto.com/blog/why-your-team-s-developer-experience-matters/</link>
            <guid>https://www.okteto.com/blog/why-your-team-s-developer-experience-matters/</guid>
            <pubDate>Tue, 24 Jan 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Happy developers write better code. Over the last decade, the era of cloud and mobile applications brought about tools like Docker, platforms like Kubernetes, and architectural patterns like microservices to help development and production teams deliver what we know today as modern applications. But somewhere along the way, we seem to have forgotten about the development side of the equation and overlooked the increased gap between development and production. And that has had a huge negative impact on the developer experience!]]></description>
            <content:encoded><![CDATA[<p>Happy developers write better code. Over the last decade, the era of cloud and mobile applications brought about tools like Docker, platforms like <a href="https://www.okteto.com/blog/kubernetes-basics/" target="_blank" rel="noopener noreferrer" class="">Kubernetes</a>, and architectural patterns like microservices to help development and production teams deliver what we know today as modern applications. But somewhere along the way, we seem to have forgotten about the development side of the equation and overlooked the increased gap between development and production. And that has had a huge negative impact on the developer experience!</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-exactly-is-developer-experience">What Exactly Is Developer Experience?<a href="https://www.okteto.com/blog/why-your-team-s-developer-experience-matters/#what-exactly-is-developer-experience" class="hash-link" aria-label="Direct link to What Exactly Is Developer Experience?" title="Direct link to What Exactly Is Developer Experience?" translate="no">​</a></h2>
<p>Just like User Experience (UX) relates to how users feel when interacting with a product, Developer Experience (DX or DevEx) describes how developers feel when using a tool as part of their job. Think of your favorite code editor; the happy feelings you associate with it are part of your DevEx with that tool.</p>
<p>With so many emerging tools and technologies, DevEx has become more relevant than ever. After all, if you want to keep the developers on your team happy and productive, you must invest in solutions that enable them to work without friction. The processes you set up for your team and the tools you choose end up defining the development experience for your team. So what’s wrong with our current approaches?</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-sad-state-of-devex-today">The Sad State of DevEx Today<a href="https://www.okteto.com/blog/why-your-team-s-developer-experience-matters/#the-sad-state-of-devex-today" class="hash-link" aria-label="Direct link to The Sad State of DevEx Today" title="Direct link to The Sad State of DevEx Today" translate="no">​</a></h2>
<p>Today, the state of development is slow, lengthy, and increasingly complex. It’s costing development teams hours of tedious work and lost productivity. Teams remain hindered by the limitations of their local machines that can no longer support the resources it takes to build distributed microservice applications and the lack of intuitive task automation to deal with the gap. To move into deployment, development teams are dealing with a confusing mixture of CI/CD tools, repos, security, and performance test environments. Developers have to work in unrealistic environments which are nothing like production and end up wasting several hours trying to replicate the production setup locally, trying to catch bugs that show up too late in the software delivery cycle.</p>
<p>We, as an industry, have always agreed that the dev environment should be as close to production as possible. But <a href="https://www.okteto.com/blog/kubernetes-basics/" target="_blank" rel="noopener noreferrer" class="">Kubernetes</a> and the cloud shook up the landscape significantly, and we didn’t bother putting in efforts to bridge the now-increased gap between dev and prod. This led to frustrated developers who now found themselves burdened by additional responsibilities.</p>
<p>Simply put, cloud-native applications demand a cloud-based development platform approach.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="closing-the-gap">Closing the Gap<a href="https://www.okteto.com/blog/why-your-team-s-developer-experience-matters/#closing-the-gap" class="hash-link" aria-label="Direct link to Closing the Gap" title="Direct link to Closing the Gap" translate="no">​</a></h2>
<p>We’ve seen cloud dev environments contribute significantly to an improved DX because, with them, developers don’t have to waste time on things they don't like doing. They get to focus on what they love: writing code, innovation, and building cool applications. The cognitive load of configuring networking policies, Kubernetes manifests, etc., in order to get their development environments to resemble what’s happening in the production can be overwhelming and distracting, not to mention nearly impossible to perfect in a local environment. Cloud dev environments take away this worry by getting you right to the code-writing phase in a single command. What’s even better is that these environments are ephemeral and sharable, so collaboration across dev, product, and deployment teams is now easier as well.</p>
<p>Big companies like <a href="http://monday.com/" target="_blank" rel="noopener noreferrer" class="">monday.com</a> have reported a huge increase in productivity thanks to the better DevEx cloud dev environments provide:</p>
<figure class="quote_Y4Tu"><blockquote>The productivity increase is huge— developers almost don't need any extra time handling environment setup and can work on what matters, which is the product itself.</blockquote><figcaption><img src="https://www.okteto.com/blog/assets/images/1df358da1425-5f720f88c48289dfeb250f41a9d71856.webp" alt=""><span><strong>Lior Rabin</strong><span>Infrastructure Tech Lead, monday.com</span></span></figcaption></figure>
<p><a href="https://www.okteto.com/customers/monday-com/" target="_blank" rel="noopener noreferrer" class="">Learn</a> from the case study of <a href="http://monday.com/" target="_blank" rel="noopener noreferrer" class="">monday.com</a> and see how Okteto helped them take their developer experience to the next level!</p>]]></content:encoded>
            <category>developer-experience</category>
        </item>
        <item>
            <title><![CDATA[5 Internal Software Development Platform Challenges]]></title>
            <link>https://www.okteto.com/blog/5-internal-software-development-platform-challenges/</link>
            <guid>https://www.okteto.com/blog/5-internal-software-development-platform-challenges/</guid>
            <pubDate>Mon, 23 Jan 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Building a Cloud Development Platform Is Hard to Maintain]]></description>
            <content:encoded><![CDATA[<p>Some of the smartest engineering and DevOps managers sometimes make the mistake of treating a new software initiative as a single, well-defined one-off project. For example, let’s say that the internal initiative in question is the engineering of a simple, clearly defined cloud development environment.</p>
<!-- -->
<p>Take it from these executives who tried building:</p>
<ul>
<li class="">Marc Campbell, founder of Replicated, says it best: “Easy to develop - impossible to maintain because every day something was broken."</li>
<li class="">John Craft, CTO &amp; Co-Founder, Privacy Dynamics: “We spent 12 months building our preview environment system ourselves, but it was never as good as we wanted. We didn't have the bandwidth to manage or maintain it, and it was distracting us from our primary engineering needs.”</li>
<li class="">Engineering manager at a leading digital healthcare platform: “We tried to build it in-house, but that failed. Companies don't understand the complexity of what's under the hood when building their cloud dev environments, such as the custom resource definitions and technical design needed to work with Kubernetes.”</li>
</ul>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Should You Buy or Build a Development Platform? </p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/build-versus-buy/" target="_self">Watch the Build vs. Buy Webinar Recording</a></div></section>
<p><strong>Internal Software Development Is Messy</strong></p>
<p><a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/" target="_blank" rel="noopener noreferrer" class="">Building software internally, to service your company’s developers, is often an endless, ongoing project to maintain and scale while also accounting for many evolving complex connecting technologies in the world.</a> The blind desire for companies to have their own homegrown development platform is often like the youthful enthusiasm to get a cute puppy.</p>
<p>In both cases, enthusiasm quickly gives way to the realization that there are long-term, serious responsibilities associated with its care. In the case of both, you have to make sure they are safe, secure and bug-free. If there’s a problem, you have to stop what you’re doing and take care of them morning, noon and night. They both require a lot of attention.</p>
<p><strong>5 Challenges to Internal Software Development</strong></p>
<p>But, hey, if you're committed to building here are five simple ways to build your own internal development platform (IDP) and the problems with each approach:</p>
<ol>
<li class="">Build a custom platform from scratch: This approach allows you to build an (IDP)tailored to your needs. But this costs significant time and resources and building a custom platform from scratch can lead to issues with scalability, security, and compatibility with third-party tools.</li>
<li class="">Use open-source software: Using open-source software can be a cost-effective way to build an IDP, as many open-source tools are freely available. However, open-source software can also introduce compatibility issues, security vulnerabilities, and the need for ongoing maintenance and updates.</li>
<li class="">Adopt a cloud-based platform: Cloud-based platforms, such as AWS or Google Cloud, can provide a scalable and cost-effective option for building an IDP. But relying on cloud-based platforms can also introduce issues with data privacy, vendor lock-in, and service reliability.</li>
<li class="">Utilize low-code development platforms: Low-code development platforms enable non-technical users to create software applications with minimal coding experience. However, this limits control over the development process, and can also introduce issues with scalability and compatibility with other tools.</li>
<li class="">Use a DevOps platform: DevOps platforms, such as Jenkins or GitLab, can automate the software development and deployment process, providing increased speed and efficiency. But this can be complex to set up and requires ongoing maintenance and updates to ensure reliability, security and security.</li>
</ol>
<p>See? Turns out that owning a puppy - fleas et all - is a lot of work and costs a lot of money. So is building and managing a homegrown development environment. But it's easy to understand how engineering teams fall in love with the idea of building development environments. After all, who knows what engineers need better than the engineers themselves?</p>
<p>When software projects outside a company's core business are built, it usually starts when a developer or lead identifies a specific pain-point in isolation and engages internal engineering resources to come up with an in-house solution. At first glance, this approach makes sense, as internal engineering teams are good at building projects with a limited, well-defined scope. However, as your development team grows and your projects scale, so do the requirements of the platform; and complex business processes often span multiple departments, including collaboration with - but not limited to - DevOps, security, product, QA testing, and more.</p>
<p><strong>Internal Software Development and Platform Building Is Hard</strong></p>
<p>More projects, people, and product features means more potential problems. Sounds like rap lyrics, but this is the truth when it comes to building, especially a cloud development environment. You build it, you own it.</p>
<p>Daily responsibilities continue and challenges can mount. It's the same problem development teams have with their homegrown solution. This predicament begs the question: <a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/" target="_blank" rel="noopener noreferrer" class=""><strong>why spend countless hours having your most valuable resource capital (your engineers) architect a solution that already exists and is proven in the market</strong></a><strong>?</strong></p>
<p>For instance, generally, a vendor has already solved the same problem hundreds of times, bringing clients the benefits of best practices based on others' experiences. In addition, in most cases, the vendor gains efficiencies because of its large customer base, so it can often charge less for implementing and maintaining an established product than it would cost to support a one-off, homegrown solution.</p>
<p>When you flip the script, the solution provider owns the burden of product development, quality assurance, maintenance, platform migration, security,&nbsp; and patch fixes. In contrast, in-house development requires years of continued development beyond the initial project scope. There’s an opportunity cost and total cost of ownership associated with that that is often overlooked.</p>
<p>Okteto customers who first tried building internally found it required an enormous allocation of resources and budget to create, implement and maintain something as comprehensive and proven. Whether to build or buy a cloud development environment revolves around these four key considerations:</p>
<p>*Ensuring features and functionality were best-in-class</p>
<p>*Supporting performance and maintenance at scale</p>
<p>*Managing the allocation of resources against core business needs</p>
<p>*Realizing the total cost of ownership is more than what it seems</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">What issues drove Replicated to switch from building to buying a dev platform?</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/build-versus-buy/" target="_self">Find out when you attend the Build vs Buy webinar Feb 1st.</a></div></section>
<p><a href="https://www.okteto.com/blog/four-opportunity-costs-of-building-vs-buying-software-for-development/" target="_blank" rel="noopener noreferrer" class=""><strong>Buying is Better Than Building an Internal Development Platform</strong></a></p>
<p>Working with a proven partner to deploy a proven solution allows you to solve the problem more quickly and ensures complex questions, such as Kubernetes updates and security breaches, are answered with comprehensive support and development. Additionally, working with a reputable provider to deploy a proven development platform will allow companies to get up and running more quickly and generally ensures that teams can focus on what developers do best: innovation.</p>
<p><a href="https://www.okteto.com/blog/total-cost-of-ownership-tco-of-building-versus-buying-software-for-development/" target="_blank" rel="noopener noreferrer" class="">Ask yourself how much time and money it will take to either buy software that will fit most of your needs or build a solution from the ground up. And how much will either solution cost you long-term?</a> For instance, creating a cloud development platform with the sophistication to work with Kubernetes could take three to five years.</p>
<p>While developing a solution in-house may initially seem like the best way to address your business challenge, more and more technology leaders are seeing the benefits of buying over building. Commercial solutions provide speed, scale, and efficiency that can’t be matched by in-house solutions.&nbsp; Building a cloud development platform can be tough o manage and secure. As a result, more companies are asking cloud development vendors, "How much is that doggy in the window"?</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Can't Decide Whether to Build or Buy?</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/build-versus-buy/" target="_self">This self-evaluation guide should help you solve the dilemma </a></div></section>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Cost and Complications of In-House Development Environments]]></title>
            <link>https://www.okteto.com/blog/the-cost-and-complications-of-in-house-development-environments/</link>
            <guid>https://www.okteto.com/blog/the-cost-and-complications-of-in-house-development-environments/</guid>
            <pubDate>Thu, 19 Jan 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Building an Internal Dev Environment is a Bad Business Decision]]></description>
            <content:encoded><![CDATA[<p><em>"Everyone has a plan until they get punched in the mouth"</em> - Mike Tyson.</p>
<!-- -->
<p>The importance of tools that boost a positive developer experience can't be overstated. The industry is starting to recognize that an improved developer experience results in an increase of productivity. And that's exactly why more companies view cloud development environments as an essential investment that unburdens developers from tedious administrative tasks so they can focus on innovation.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Questioning Whether to Build or Buy a Cloud Dev Environment? </p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/build-versus-buy/" target="_self">Discover Why Replicated Switched from Building to Buying. Watch the Webinar Recording</a></div></section>
<p>The benefits of a cloud development environment include the ability to mirror production, support holistic testing across the entire stack, manage the complicated integrations between microservices and simplify the adoption of Kubernetes.</p>
<p>And while everyone from enterprise CTOs to startup engineering managers agree that shifting from a local to a cloud environment is the future of development, one question remains: "<a href="https://www.okteto.com/build-versus-buy/" target="_blank" rel="noopener noreferrer" class="">is it better to build or buy the solution</a>?"</p>
<p><a href="https://www.okteto.com/blog/the-build-vs-buy-software-debate-includes-development-platforms/" target="_blank" rel="noopener noreferrer" class=""><strong>To build or not to build - that is the question</strong></a></p>
<p>Historically, development organizations have built and managed their local development environments; however, the evolution of Kubernetes, containers and microservices have made designing and maintaining a modern development environment complicated — if not impossible. In addition, technology trends force organizations to quickly add new functionality while supporting familiar tools and processes. As a result, it's tough to create a secure, "enterprise-ready" cloud development environment that supports a wide range of developer tools, such as Visual Studio Code and Python, and yet is scalable enough to adopt updates to <a href="https://www.okteto.com/blog/beginners-guide-to-kubernetes-deployments/" target="_blank" rel="noopener noreferrer" class="">Kubernetes</a>.</p>
<p>Most of the time, companies see the business benefits of buying software solutions that allow them to focus on their core competencies; however, some organizations, especially those with sophisticated engineering teams, are tempted to build their own solutions — especially when the tools in question help developers develop. It's easy to understand this philosophy: hey, who knows the needs of developers better than a company's own developers?</p>
<p>While developing a purpose-built in-house development environment may appear to be an obvious way to address specific development challenges, it often requires resources -- particularly budget and personnel -- <strong>to not just create but implement and maintain</strong>. It’s a problem that even some of the smartest engineering teams ignore.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">The Ultimate Build vs Buy Self Evaluation Guide</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/build-versus-buy/" target="_self">Four key points of considerations for every would-be builder</a></div></section>
<p><strong>“Easy to build, hard to maintain”</strong></p>
<p>Today, many development organizations are challenged with local environments unable to meet the demands of modern complex cloud-native applications. Replicated, a company that provides delivery and management of Kubernetes applications, first attempted to solve their development problems by creating a homegrown cloud development platform. But unfortunately, they discovered allocating resources to tackle this project distracted from delivering more essential business value. And complicating the developer experience was just the tip of the iceberg - the platform was also buggy, expensive and costly to maintain.</p>
<p><a href="https://www.okteto.com/customers/replicated/" target="_blank" rel="noopener noreferrer" class="">"Our homegrown solution took a massive investment of our engineering to keep Kubernetes, Docker, and all kinds of cutting edge technologies updated and supported,"</a> says Marc Campbell, Replicated co-founder and CTO. "It was difficult, taking our engineering team’s time to support because every day something was broken."</p>
<p>Marc quickly realized it was impossible to devote a development team to maintain and support the solution over time. He also admitted that a buggy development platform was increasing the risk of application bugs making their way to production. It was clear that Replicated needed a dedicated development environment and homegrown solutions were incapable of, namely, continuing to add features regularly and provide support.</p>
<p><strong>The business benefits of partnering with Okteto</strong></p>
<p>While developing a solution in-house may initially seem like the best way to address your business challenges, Replicated discovered building a platform requires an enormous allocation of resources in budget and developer time, implement and maintain.</p>
<p>To overcome the challenges of a homegrown environment, Marc and the Replicated team turned to Okteto. Here are just a few of the benefits Okteto’s out-of-the-box suite of features offered Replicated:</p>
<ul>
<li class="">Simplified Kubernetes adoption</li>
<li class="">Improved Troubleshooting with Shared Services</li>
<li class="">Maximized Inner and Outer Loop Collaboration</li>
<li class="">Mirrored production to reduce scrap and rework</li>
</ul>
<p>"We chose Okteto because it removes the need for every engineer to have a deep understanding of the kubernetes infrastructure that we need to run our system, and it allows us to hire engineers without that level of expertise," says Marc. "Okteto just works; with it we can set the bar higher with what we expect from the dev environment and our team."</p>
<p>Working with Okteto allows you to solve development challenges immediately with comprehensive support and development. So why spend countless hours having expensive engineers — or hiring new ones —&nbsp; to architect a proven solution that already exists? As the pioneer and market leader in cloud development, Okteto has already solved the same development problem for hundreds of developers.</p>
<p>As final words of advice to other companies considering building their own solution, Marc suggests asking yourself these questions: Are you planning for a support team to work on platform bugs and issues long term? And what are your time constraints to develop, QA, implement, and roll out an internal solution? Says Marc, “When it comes to building a development platform, remember this: Easy to develop - hard to maintain."</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Kubernetes vs. Docker: Difference Between the Two]]></title>
            <link>https://www.okteto.com/blog/kubernetes-vs-docker/</link>
            <guid>https://www.okteto.com/blog/kubernetes-vs-docker/</guid>
            <pubDate>Fri, 06 Jan 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[In this blog we learn about the difference between Docker and Kubernetes and when to use what.]]></description>
            <content:encoded><![CDATA[<p>The <a href="https://scand.com/company/blog/the-adoption-of-containerization-and-container-orchestration/" target="_blank" rel="noopener noreferrer" class="">containerization</a> and container orchestration world has seen a lot of development in recent years. One of the most widely used container technology solutions is <a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer" class="">Docker</a>, and another is <a href="https://kubernetes.io/" target="_blank" rel="noopener noreferrer" class="">Kubernetes</a>. While these two technologies are often used together, both have their advantages and are used for different purposes. Many people get confused between Docker vs. Kubernetes, so let’s take a closer look at how they compare.</p>
<!-- -->
<video controls="" preload="metadata" class="video_QmVR"><source src="https://cdn.sanity.io/files/6icyfeiq/production/ab688998932ca92a7d8583cb1621aef31669e904.mp4" type="video/mp4"></video>
<p>Docker's technology helps developers package applications into containers, while Kubernetes helps deploy, scale, and manage them. Both solutions have their strengths and weaknesses, and the choice of which to use depends on the application’s specific requirements. In this article, we’ll dive into the details of Kubernetes vs Docker and explore their differences to help you decide which you should learn first or adopt. We will explore both technologies’ features and examine their pros and cons. Finally, we will look at a comparison between the two orchestration solutions, <a href="https://docs.docker.com/engine/swarm/" target="_blank" rel="noopener noreferrer" class="">Docker Swarm</a> and Kubernetes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-docker">What is Docker?<a href="https://www.okteto.com/blog/kubernetes-vs-docker/#what-is-docker" class="hash-link" aria-label="Direct link to What is Docker?" title="Direct link to What is Docker?" translate="no">​</a></h2>
<p>Docker is an open-source containerization platform that enables developers to package their applications and dependencies into self-contained units known as containers. These containers can be easily deployed and run on any server, making it easier to develop and deploy applications consistently across different environments.</p>
<p>Docker is a container technology that tackles the compatibility and dependency installation challenges that software developers face. This means once you build the Docker configuration, your developers can simply run Docker commands to get started, irrespective of their OS.</p>
<p>Docker relies on two key components for container technology: the container itself and the container image.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="container-images">Container Images<a href="https://www.okteto.com/blog/kubernetes-vs-docker/#container-images" class="hash-link" aria-label="Direct link to Container Images" title="Direct link to Container Images" translate="no">​</a></h3>
<p>These serve as a template for creating a container during runtime. Docker offers a toolkit that helps developers package their applications into container images. To create a container image, developers write a&nbsp;<a href="https://docs.docker.com/engine/reference/builder/" target="_blank" rel="noopener noreferrer" class="">Dockerfile</a>, a set of instructions that tells Docker how to build the image. They then use the Docker server to&nbsp;<a href="https://www.okteto.com/blog/how-to-speed-up-container-image-builds/" target="_blank" rel="noopener noreferrer" class="">build the image</a>&nbsp;by running the appropriate commands.</p>
<p>Container images can be used to deploy and run containers on any platform that supports them, including Kubernetes, Docker Swarm, Mesos, and HashiCorp Nomad.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="containers">Containers<a href="https://www.okteto.com/blog/kubernetes-vs-docker/#containers" class="hash-link" aria-label="Direct link to Containers" title="Direct link to Containers" translate="no">​</a></h3>
<p><a href="https://www.docker.com/resources/what-container/" target="_blank" rel="noopener noreferrer" class="">Containers</a>&nbsp;are lightweight and portable packages that contain all the necessary code, libraries, and dependencies for an application to run. Developers can create containers without Docker; however, the Docker platform simplifies the process.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dockers-features">Docker’s Features<a href="https://www.okteto.com/blog/kubernetes-vs-docker/#dockers-features" class="hash-link" aria-label="Direct link to Docker’s Features" title="Direct link to Docker’s Features" translate="no">​</a></h3>
<p>The purpose of using Docker is to package applications and containerize them so they can conveniently be shipped at any time to any environment. Some of the features it offers include:</p>
<ul>
<li class=""><strong>Isolation</strong>: Docker containers isolate applications from the host system and other containers, providing a clean and predictable environment for each application.</li>
<li class=""><strong>Easy and Faster Configuration</strong>: Docker helps you to configure the system quickly and without difficulty.</li>
<li class=""><strong>Portability</strong>: Docker containers can be easily moved between different environments, including local development, testing, staging, and production.</li>
<li class=""><strong>Consistency</strong>: With Docker, you are confident that the app runs the same across multiple environments.</li>
<li class=""><strong>Scalability</strong>: Docker allows developers to build and deploy applications as small, modular components, making it easier to scale applications horizontally across multiple servers.</li>
<li class=""><strong>Rollbacks and image version control</strong>: Docker enables developers to version and track changes to their container images, making it easier to roll back to previous versions if necessary.</li>
<li class=""><strong>Integration</strong>: Docker integrates seamlessly with many tools and platforms, including popular continuous integration and delivery (CI/CD) systems, making it easier to build, test, and deploy applications.</li>
<li class=""><strong>Resource management</strong>: Docker allows developers to set resource limits for containers, helping to ensure that applications do not consume too many resources and disrupt other applications running on the same host.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-kubernetes-used-for">What is Kubernetes used for?<a href="https://www.okteto.com/blog/kubernetes-vs-docker/#what-is-kubernetes-used-for" class="hash-link" aria-label="Direct link to What is Kubernetes used for?" title="Direct link to What is Kubernetes used for?" translate="no">​</a></h2>
<p><a href="https://www.okteto.com/blog/kubernetes-basics/" target="_blank" rel="noopener noreferrer" class="">Kubernetes</a> (also known as K8s) is an open-source container orchestration tool responsible for managing your containerized applications. It provides a platform-agnostic way to run, scale, and manage numerous containers simultaneously in either physical, virtual, or hybrid environments. It is designed to simplify the management, deployment, and scaling of containerized applications. Kubernetes is one of the most prominent <a href="https://www.okteto.com/blog/kubernetes-containerization/" target="_blank" rel="noopener noreferrer" class="">containerization technologies</a> of our time because of how easy it makes to deploy and run microservices at scale.</p>
<p>K8s is a highly modular and extensible platform that offers a range of features such as self-healing, automatic rollouts and rollbacks, load balancing, and horizontal scaling. It was created by Google and is now managed by the CNCF.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="benefits-of-kubernetes">Benefits of Kubernetes<a href="https://www.okteto.com/blog/kubernetes-vs-docker/#benefits-of-kubernetes" class="hash-link" aria-label="Direct link to Benefits of Kubernetes" title="Direct link to Benefits of Kubernetes" translate="no">​</a></h3>
<p>Kubernetes has become the most popular container orchestration platform due to its extensive characteristics. Some of the key features of Kubernetes include</p>
<ul>
<li class=""><strong>Deployment and scaling</strong>: Kubernetes allows you to deploy and scale your containerized applications quickly. You can specify the number of replicas you want for each application, and Kubernetes will ensure that the desired number of replicas is running at all times.</li>
<li class=""><strong>Self-healing</strong>: Kubernetes includes features for self-healing, which means it can automatically detect and replace failed containers or nodes.</li>
<li class=""><strong>Load balancing</strong>: Kubernetes consists of a built-in load balancer that can distribute incoming traffic across multiple replicas of an application.</li>
<li class=""><strong>Rolling updates</strong>: Kubernetes allows you to perform rolling updates to your applications, which means you can update the application without downtime.</li>
<li class=""><strong>Configuration management</strong>: Kubernetes includes a configuration management system that allows you to easily manage the configuration of your applications and the environment in which they run.</li>
<li class=""><strong>Service discovery and networking</strong>: Kubernetes includes features for service discovery, which allows applications to find and communicate with each other, as well as networking and load balancing features.</li>
<li class=""><strong>Monitoring and logging</strong>: Kubernetes provides several tools for&nbsp;<a href="https://kubernetes.io/docs/tasks/debug/debug-cluster/resource-usage-monitoring/" target="_blank" rel="noopener noreferrer" class="">monitoring the health and performance</a>&nbsp;of your applications, as well as tools for logging and debugging.</li>
<li class=""><strong>Extensibility</strong>: Kubernetes is designed to be extensible, which means you can customize and extend it to meet the specific needs of your applications and infrastructure.</li>
</ul>
<p>If what Kubernetes has to offer excites you and you’re looking to learn more, check out our <a href="https://www.okteto.com/blog/kubernetes-basics/" target="_blank" rel="noopener noreferrer" class="">Kubernetes for Beginners</a> series! We also have a Kubernetes <a href="https://www.okteto.com/blog/kubectl-cheat-sheet/" target="_blank" rel="noopener noreferrer" class="">cheat sheet</a> to get you up to speed with all the relevant commands you need to know.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-the-difference-between-docker-and-kubernetes">What is the Difference Between Docker and Kubernetes?<a href="https://www.okteto.com/blog/kubernetes-vs-docker/#what-is-the-difference-between-docker-and-kubernetes" class="hash-link" aria-label="Direct link to What is the Difference Between Docker and Kubernetes?" title="Direct link to What is the Difference Between Docker and Kubernetes?" translate="no">​</a></h2>
<p>Docker and Kubernetes are both popular tools in the field of containerization, but they serve different purposes and are intended to solve different problems. Docker is a container runtime that helps you build, deploy, and run containers. Kubernetes is a platform that automates the process of running and managing containerized, cloud-native applications created with Docker or other tools.</p>
<p>Kubernetes can be used with Docker and other container runtimes, like&nbsp;<a href="https://containerd.io/" target="_blank" rel="noopener noreferrer" class="">containerd</a>,&nbsp;<a href="https://cri-o.io/" target="_blank" rel="noopener noreferrer" class="">CRI-O</a>, and any implementation of the&nbsp;<a href="https://kubernetes.io/docs/concepts/architecture/cri/" target="_blank" rel="noopener noreferrer" class="">Kubernetes CRI</a>&nbsp;(Container Runtime Interface). However, most developers consider Docker an excellent choice for container runtimes.</p>
<p>Docker offers an orchestration tool called “Docker Swarm,” which allows the orchestration of Docker containers across multiple systems. If a system needs to scale and add more containerized applications, it might face challenges with Docker that Kubernetes can help address.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="docker-swarm-vs-kubernetes">Docker Swarm vs. Kubernetes<a href="https://www.okteto.com/blog/kubernetes-vs-docker/#docker-swarm-vs-kubernetes" class="hash-link" aria-label="Direct link to Docker Swarm vs. Kubernetes" title="Direct link to Docker Swarm vs. Kubernetes" translate="no">​</a></h2>
<table><thead><tr><th>Kubernetes</th><th>Docker Swarm</th></tr></thead><tbody><tr><td>Configuration and setup are complex and take more time</td><td>Configuration and setup are easy and takes less time</td></tr><tr><td>K8s offers built-in tools for logging and monitoring</td><td>Docker swarm requires the use of third-party tools for logging and monitoring</td></tr><tr><td>Comes with a built-in dashboard for easy management</td><td>Does not have any built-in dashboard, so management is complex</td></tr><tr><td>Can perform auto-scaling</td><td>Cannot offer auto-scaling</td></tr><tr><td>Deploys rolling updates and does automatics rollbacks</td><td>Deploys rolling updates but not automatic rollbacks</td></tr><tr><td>Optimized for a single large cluster</td><td>Optimized for multiple small clusters</td></tr></tbody></table>
<p>Implementing Kubernetes can be complex, especially for beginners, but it provides additional flexibility and functionality. On the other hand, Docker Swarm is generally easier to set up and configure, especially when creating and maintaining your infrastructure. Looking at the current industry trends, though, the adoption of Kubernetes is much more than Docker Swarm!</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Stay on Top of Kubernetes Best Practices &amp; Trends</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/ebooks/dzone-kubernetes/" target="_self">Download the Trend Report</a></div></section>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="docker-vs-kubernetes-when-to-adopt-what">Docker vs. Kubernetes: When to Adopt What<a href="https://www.okteto.com/blog/kubernetes-vs-docker/#docker-vs-kubernetes-when-to-adopt-what" class="hash-link" aria-label="Direct link to Docker vs. Kubernetes: When to Adopt What" title="Direct link to Docker vs. Kubernetes: When to Adopt What" translate="no">​</a></h2>
<p>Deciding between Docker vs. Kubernetes can be challenging. When you want to containerize your application and make it easier to deploy and operate in different environments, consider using a container runtime like Docker. Docker provides features and tools for creating and managing containers and a simple and effective way to package and distribute programs.</p>
<p>You can consider using Kubernetes to deploy, scale and manage containerized applications. Kubernetes’ features make it well-suited for applications in production environments and simplify managing large and complex deployments.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/kubernetes-vs-docker/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In this article, we talked about Docker vs Kubernetes, two of the important solutions for containerization and cloud computing. We have seen the features of both solutions and what they are capable of. Kubernetes has become the go-to solution for deploying to production these days. But this has created a gap in the local environment in which development takes place and production. Okteto helps solve this problem by providing developers a cloud environment to develop in. Checkout out <a href="https://www.okteto.com/docs/getting-started/" target="_blank" rel="noopener noreferrer" class="">Getting Started guide</a> to begin simplifying modern application development!</p>]]></content:encoded>
            <category>kubernetes</category>
            <category>docker</category>
        </item>
        <item>
            <title><![CDATA[Practice Secrets Management in Kubernetes With OWASP WrongSecrets and Okteto]]></title>
            <link>https://www.okteto.com/blog/practice-secrets-management-in-kubernetes-with-owasp-wrongsecrets-and-okteto/</link>
            <guid>https://www.okteto.com/blog/practice-secrets-management-in-kubernetes-with-owasp-wrongsecrets-and-okteto/</guid>
            <pubDate>Thu, 22 Dec 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Shipping secure applications is essential for any organization! Security should be a priority, as the consequences of a breach are often dire and tough to recover from. But securing your applications has gotten a lot more complicated over the last few years since the adoption of containers and Kubernetes.]]></description>
            <content:encoded><![CDATA[<p>Shipping secure applications is essential for any organization! Security should be a priority, as the consequences of a breach are often dire and tough to recover from. But securing your applications has gotten a lot more complicated over the last few years since the adoption of <a href="https://www.okteto.com/blog/kubernetes-containerization/" target="_blank" rel="noopener noreferrer" class="">containers and Kubernetes</a>.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-common-culprit-secrets-management">The Common Culprit: Secrets Management<a href="https://www.okteto.com/blog/practice-secrets-management-in-kubernetes-with-owasp-wrongsecrets-and-okteto/#the-common-culprit-secrets-management" class="hash-link" aria-label="Direct link to The Common Culprit: Secrets Management" title="Direct link to The Common Culprit: Secrets Management" translate="no">​</a></h2>
<p>Application Secrets is a broad term that could refer to anything essential for the application's working, but you would want it to stay secret. Often these are API keys, database passwords, and other such things. If someone were to get access to these, they would have the potential to cause a lot of damage and even risk the privacy of your users! That is why keeping your secrets secure and safe is critical, even during your application development.</p>
<p>Secrets can be tricky to handle. Often, you think you have your Secret stored securely where no one can access it, only to learn the hard way that that wasn't the case. Secrets management as it is was a tough job, but ever since we shifted to&nbsp;<a href="https://www.okteto.com/blog/developing-microservices-by-hot-reloading-on-kubernetes-clusters/" target="_blank" rel="noopener noreferrer" class="">microservices</a> and&nbsp;<a href="https://www.okteto.com/blog/kubernetes-containerization/" target="_blank" rel="noopener noreferrer" class="">container orchestrators</a>&nbsp;- things have gotten a lot more tricky!</p>
<p>Even though it has been a good few years since we adopted these technologies, I feel we still keep seeing these breaches because of skill gaps. This world of Kubernetes was new for everyone, so it's no surprise that we did end up making mistakes in securing our Application Secrets. But to avoid making the same mistakes again and instead learn from them, we need to invest in tools and projects which help bridge this knowledge gap for developers.</p>
<blockquote>
<p>If you're new to Kubernetes and looking for a comprehensive guide on the basics, check out our&nbsp;<a href="https://www.okteto.com/blog/kubernetes-basics/" target="_blank" rel="noopener noreferrer" class="">Kubernetes for Beginners</a>&nbsp;article!</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learning-from-our-mistakes-owasps-wrongsecrets">Learning From Our Mistakes: OWASP’s WrongSecrets<a href="https://www.okteto.com/blog/practice-secrets-management-in-kubernetes-with-owasp-wrongsecrets-and-okteto/#learning-from-our-mistakes-owasps-wrongsecrets" class="hash-link" aria-label="Direct link to Learning From Our Mistakes: OWASP’s WrongSecrets" title="Direct link to Learning From Our Mistakes: OWASP’s WrongSecrets" translate="no">​</a></h2>
<p>The best way to prepare for something is to practice in an environment as close to the actual scenarios you'll be facing.&nbsp;<a href="https://owasp.org/www-project-wrongsecrets/" target="_blank" rel="noopener noreferrer" class="">OWASP's WrongSecrets</a>&nbsp;project has a similar ideology. WrongSecrets is an open-source project containing exercises in finding Secrets that have&nbsp;<strong>NOT</strong>&nbsp;been stored securely. It's an excellent way to learn Secret management in cloud-native applications.</p>
<p>The project's intent is that after going through these exercises, you'll have a better idea of where to look for misconfigured Secrets in your application. The challenges will help you understand better how you've been storing Secrets and evaluate if you need to change your approach towards secrets management. The best part about the project for me is that all exercises are based on actual misconfigurations that have taken place.&nbsp;<a href="https://github.com/OWASP/wrongsecrets#special-thanks--contributors" target="_blank" rel="noopener noreferrer" class="">The maintainers</a> (who are amazing people to talk to, by the way!) have poured their years of valuable experience trying to secure Secrets into the project to ensure others don't end up making the same mistakes.</p>
<p>You can check out the project at: <a href="https://github.com/OWASP/wrongsecrets" target="_blank" rel="noopener noreferrer" class="">https://github.com/OWASP/wrongsecrets</a>.</p>
<p>The repository provides you with a Java application for which secrets have not been stored properly. These misconfigured Secrets are present in a bunch of different environments, like would be the case for an actual application - in Docker files, Kubernetes manifests, etc. Each challenge holds a lesson in secrets management and represents a real scenario for you to learn from.</p>
<p>To make it easier to run their Kubernetes-based challenges, The project provides users with an option to&nbsp;<a href="https://github.com/OWASP/wrongsecrets#okteto-based" target="_blank" rel="noopener noreferrer" class="">run them on Okteto</a>. The benefit of using&nbsp;<a href="https://www.okteto.com/development-environments/" target="_blank" rel="noopener noreferrer" class="">Okteto</a>&nbsp;is not having to spend time configuring a cluster and getting right to the fun parts of solving the challenges! Okteto also makes it easier to deploy the application and spin up the environment with a single click of a button without installing tools like&nbsp;<a href="https://www.okteto.com/blog/kubectl-cheat-sheet/" target="_blank" rel="noopener noreferrer" class="">kubectl</a>&nbsp;and downloading the kubeconfig.</p>
<p>Challenge 6 was an excellent learning experience. We often store important data as&nbsp;<a href="https://www.okteto.com/blog/kubernetes-basics/#configmaps-and-secrets" target="_blank" rel="noopener noreferrer" class="">Kubernetes Secrets</a>&nbsp;and think it's all secure. Still, we need to realize that we also need to configure RBAC around these secrets so that only the processes that require the Secret value can access it and not anyone else! Give them a try, and I guarantee you there's a lot you will learn about secrets management.</p>
<p>If you find the project useful, please consider giving&nbsp;<a href="https://github.com/OWASP/wrongsecrets" target="_blank" rel="noopener noreferrer" class="">WrongSecrets</a>&nbsp;and&nbsp;<a href="https://github.com/okteto/okteto" target="_blank" rel="noopener noreferrer" class="">Okteto</a>&nbsp;a star on GitHub! :)</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="shifting-left-application-security-with-okteto">Shifting Left Application Security With Okteto<a href="https://www.okteto.com/blog/practice-secrets-management-in-kubernetes-with-owasp-wrongsecrets-and-okteto/#shifting-left-application-security-with-okteto" class="hash-link" aria-label="Direct link to Shifting Left Application Security With Okteto" title="Direct link to Shifting Left Application Security With Okteto" translate="no">​</a></h2>
<p>Providing developers with tools that allow them to be sure that the code they're writing is secure earlier in the development process can be a game-changer if you're looking to secure applications. Okteto enables this by providing developers with a&nbsp;<a href="https://www.okteto.com/development-environments/" target="_blank" rel="noopener noreferrer" class="">production-like</a>&nbsp;environment to write code in. That means the dev environment now has all the Secrets configured the same way they would be in production. This shifts left the security and allows developers to catch any potentially vulnerable code they write much earlier in the dev cycle. Give&nbsp;<a href="https://www.okteto.com/try-free/" target="_blank" rel="noopener noreferrer" class="">it a try</a>&nbsp;to see how Okteto's Cloud Development Environments change the game!</p>]]></content:encoded>
            <category>kubernetes</category>
        </item>
        <item>
            <title><![CDATA[What is Kubernetes Architecture? A Complete Guide]]></title>
            <link>https://www.okteto.com/blog/kubernetes-architecture/</link>
            <guid>https://www.okteto.com/blog/kubernetes-architecture/</guid>
            <pubDate>Tue, 20 Dec 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[In this blog we learn what the architecture of Kubernetes looks like including worker and control plane node components.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-kubernetes">What is Kubernetes<a href="https://www.okteto.com/blog/kubernetes-architecture/#what-is-kubernetes" class="hash-link" aria-label="Direct link to What is Kubernetes" title="Direct link to What is Kubernetes" translate="no">​</a></h2>
<p>In DevOps, Kubernetes is a <a href="https://www.okteto.com/blog/kubernetes-containerization/" target="_blank" rel="noopener noreferrer" class="">container orchestration tool</a>. It is used to deploy and manage containerized applications in an automated way.</p>
<!-- -->
<p><a href="https://kubernetes.io/blog/2024/06/06/10-years-of-kubernetes/" target="_blank" rel="noopener noreferrer" class="">Kubernetes was first released in 2014</a>. Since then, its <a href="https://edgedelta.com/company/blog/kubernetes-adoption-statistics" target="_blank" rel="noopener noreferrer" class="">adoption</a> has grown phenomenally and continues to grow steadily. Now, it has become the de facto container orchestration platform of choice for organizations across the world.</p>
<video controls="" preload="metadata" class="video_QmVR"><source src="https://cdn.sanity.io/files/6icyfeiq/production/36509a0ac7c52c7208513d2bb68c2330d5b36496.mp4" type="video/mp4"></video>
<p>In this blog post, we will take a closer look at the components that make up a Kubernetes cluster, which is the foundation of Kubernetes. This will help you understand Kubernetes better. If you're not familiar with <a href="https://www.okteto.com/blog/kubernetes-basics/" target="_blank" rel="noopener noreferrer" class="">Kubernetes basics</a> you could check out our beginners guide.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Stay on Top of Kubernetes Best Practices &amp; Trends</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/ebooks/dzone-kubernetes/" target="_self">Download the Trend Report</a></div></section>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubernetes-architecture-explained">Kubernetes Architecture Explained<a href="https://www.okteto.com/blog/kubernetes-architecture/#kubernetes-architecture-explained" class="hash-link" aria-label="Direct link to Kubernetes Architecture Explained" title="Direct link to Kubernetes Architecture Explained" translate="no">​</a></h2>
<p>To understand the <a href="https://www.okteto.com/blog/kubectl-cheat-sheet/" target="_blank" rel="noopener noreferrer" class="">Kubernetes</a> architecture better we can break it down into different components. There are different componenets making up a regular node than there are in a control plane node. But before that let's see what the two types of nodes are.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nodes-in-kubernetes-cluster">Nodes in Kubernetes Cluster<a href="https://www.okteto.com/blog/kubernetes-architecture/#nodes-in-kubernetes-cluster" class="hash-link" aria-label="Direct link to Nodes in Kubernetes Cluster" title="Direct link to Nodes in Kubernetes Cluster" translate="no">​</a></h2>
<p>A Kubernetes cluster provides the platform to <a href="https://www.freecodecamp.org/news/deploy-docker-image-to-kubernetes/" target="_blank" rel="noopener noreferrer" class="">deploy &amp; host containers</a>. It is made up of nodes (physical or virtual machines), which are of two distinct types: the control plane node and the worker nodes.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="control-plane-node">Control Plane Node<a href="https://www.okteto.com/blog/kubernetes-architecture/#control-plane-node" class="hash-link" aria-label="Direct link to Control Plane Node" title="Direct link to Control Plane Node" translate="no">​</a></h3>
<p>The control plane node plays a very important role in the Kubernetes Architecture since it hosts the Kubernetes control plane, which is the brain behind all operations inside the cluster. The control plane is what controls and makes the whole cluster function. It stores the state of the cluster, monitors containers, and coordinates actions across the cluster.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="worker-nodes">Worker Nodes<a href="https://www.okteto.com/blog/kubernetes-architecture/#worker-nodes" class="hash-link" aria-label="Direct link to Worker Nodes" title="Direct link to Worker Nodes" translate="no">​</a></h3>
<p>Worker nodes are the nodes used to actually run the containers. We never directly interact with the worker nodes. Instead, we send instructions to the control plane. The control plane then delegates the task of creating and maintaining containers to the worker nodes.</p>
<p>We understood that a Kubernetes cluster is composed of two distinct types of nodes. That was the first step to understand the Kubernetes Architecture. Now, let’s look more closely at the components running inside these nodes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubernetes-control-plane-architecture">Kubernetes Control Plane Architecture<a href="https://www.okteto.com/blog/kubernetes-architecture/#kubernetes-control-plane-architecture" class="hash-link" aria-label="Direct link to Kubernetes Control Plane Architecture" title="Direct link to Kubernetes Control Plane Architecture" translate="no">​</a></h2>
<p>The control plane is composed of several components, each of which is responsible for a different aspect of cluster management. Kubernetes Architecture can be explained by understanding them in detail. Some of the main components are:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="api-server">API Server<a href="https://www.okteto.com/blog/kubernetes-architecture/#api-server" class="hash-link" aria-label="Direct link to API Server" title="Direct link to API Server" translate="no">​</a></h3>
<p>The API Server is the central component of the Kubernetes control plane. In simple terms, it is a web server that listens for HTTP requests. It exposes the Kubernetes API that external clients use to communicate with the cluster. For example, an external client could use the Kubernetes API to get a list of all the running Pods.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scheduler">Scheduler<a href="https://www.okteto.com/blog/kubernetes-architecture/#scheduler" class="hash-link" aria-label="Direct link to Scheduler" title="Direct link to Scheduler" translate="no">​</a></h3>
<p><strong>The scheduler is responsible for scheduling Pods on nodes in a cluster.</strong> To find an appropriate node for a Pod, the scheduler uses two concepts: predicates &amp; priorities.</p>
<ul>
<li class=""><strong>Predicates:</strong> Predicates are rules or conditions that the scheduler uses to determine whether a particular node is a suitable place to run a particular Pod. For example, a predicate might check whether a node has sufficient CPU &amp; memory resources to run the Pod. If a node does not satisfy all the predicates for a given Pod, the scheduler will not schedule the Pod on that node.</li>
<li class=""><strong>Priorities:</strong> Priorities are used by the scheduler to rank nodes in the cluster and to select the most suitable node for each Pod. The scheduler assigns a priority score to each node, based on various factors such as available resources on the node, the number of Pods already running on the node, and the overall health of the node. When it comes time to schedule a Pod, the scheduler will select the node with the highest priority score that satisfies all of the predicates for the Pod. This ensures that Pods are scheduled to maximize the utilization of cluster resources.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="controller-manager">Controller Manager<a href="https://www.okteto.com/blog/kubernetes-architecture/#controller-manager" class="hash-link" aria-label="Direct link to Controller Manager" title="Direct link to Controller Manager" translate="no">​</a></h3>
<p><strong>The controller manager is a component that runs a set of controllers that are responsible for managing the state of the cluster.</strong> It provides the controllers with access to the API Server, where they can access the current state of the cluster. It also gives them access to the etcd distributed database, where they can store and retrieve the desired state of the cluster.</p>
<p>In Kubernetes, a controller is a piece of software that continuously watches the state of the cluster. And it makes changes to the cluster to move the current state toward the desired state.</p>
<p>For example, a Deployment is a Kubernetes resource that specifies the desired state of a group of Pods, such as the number of replicas and the template used to create the Pods. The Deployment controller is a type of controller that watches the current state of Deployments in the cluster. It ensures that the actual state of the Pods matches the desired state specified in the Deployment. If the current state deviates from the desired state, the Deployment controller will make changes to the cluster, such as creating or deleting Pods, to bring the current state back into alignment with the desired state.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="etcd">Etcd<a href="https://www.okteto.com/blog/kubernetes-architecture/#etcd" class="hash-link" aria-label="Direct link to Etcd" title="Direct link to Etcd" translate="no">​</a></h3>
<p><strong>Etcd is a key-value data store, used by Kubernetes to store its configuration data &amp; cluster state.</strong></p>
<p>Etcd is used by other components of the Kubernetes platform to store and retrieve the data needed for their operation. This can include information about the containers and pods running on the cluster, as well as other data related to the state of the cluster.</p>
<p>The only component that talks to etcd directly is the Kubernetes API server. All other components read and write data to etcd indirectly through the API server. This way updates to the cluster state are always consistent. The API server also makes sure that the data written to the store is always valid and that changes to the data are only performed by authorized clients. You can learn more about <a href="https://www.ibm.com/topics/etcd" target="_blank" rel="noopener noreferrer" class="">etcd</a> here.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubernetes-worker-node-architecture">Kubernetes Worker Node Architecture<a href="https://www.okteto.com/blog/kubernetes-architecture/#kubernetes-worker-node-architecture" class="hash-link" aria-label="Direct link to Kubernetes Worker Node Architecture" title="Direct link to Kubernetes Worker Node Architecture" translate="no">​</a></h2>
<p>I hope you're now able to understand some of the Kubernetes components. Now we'll learn about the components making up the worker nodes in K8s.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="container-runtime">Container Runtime<a href="https://www.okteto.com/blog/kubernetes-architecture/#container-runtime" class="hash-link" aria-label="Direct link to Container Runtime" title="Direct link to Container Runtime" translate="no">​</a></h3>
<p>Kubernetes is a container orchestrator. Yet, Kubernetes itself does not know how to create, start, and stop containers. Instead, it delegates these operations to a pluggable component called the container runtime. The container runtime is a piece of software that creates and manages containers on a cluster node.</p>
<p>Kubernetes supports multiple container runtimes, including containerd &amp; CRI-O. In addition to containerd &amp; CRI-O, Kubernetes also supports any other runtime that implements the Kubernetes CRI (Container Runtime Interface). It specifies the interface that the container runtime must implement to be compatible with Kubernetes. This makes it easier to integrate new or custom runtimes, allowing the users to choose one that best suits their needs.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubelet">Kubelet<a href="https://www.okteto.com/blog/kubernetes-architecture/#kubelet" class="hash-link" aria-label="Direct link to Kubelet" title="Direct link to Kubelet" translate="no">​</a></h3>
<p>Kubelet is an agent that runs on each worker node. Its main responsibility is to <strong>run &amp; manage the containers associated with a Pod.</strong></p>
<p>When the control plane decides to schedule a Pod to a particular node, it sends the Pod definition to the API Server. The Pod definition specifies the containers that should be included in the Pod, as well as their requirements &amp; dependencies. Then, the kubelet on the node receives the Pod definition from the API Server and uses it to run the containers.</p>
<p>To do this, the kubelet communicates with the container runtime &amp; provides it with the necessary information, such as the image to use and the required resources. The container runtime then uses this information to pull images from an image registry and run the containers based on those images.</p>
<p><strong>The Kubelet is also responsible for ensuring that the Pods are running and healthy.</strong> It does this by running health checks on the containers and monitoring their resource usage.</p>
<p>For example, the kubelet can use a liveness probe to periodically check that a container is still running and responding to requests. If the liveness probe fails, the kubelet will restart the container and try to get it back into a healthy state. Similarly, the kubelet monitors the resource usage of the containers to ensure that they are not exceeding their allocated resources. If a container is using more resources than it is allowed, the kubelet will take action to prevent the container from overusing the resources and potentially impacting the performance of other containers on the node.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="kube-proxy">Kube-proxy<a href="https://www.okteto.com/blog/kubernetes-architecture/#kube-proxy" class="hash-link" aria-label="Direct link to Kube-proxy" title="Direct link to Kube-proxy" translate="no">​</a></h3>
<p>Kube-proxy runs on each worker node and is responsible for enabling communication between the containers on the node &amp; the rest of the Kubernetes cluster. The kube-proxy uses a variety of techniques to enable this communication, including:</p>
<ul>
<li class=""><strong>Network Forwarding:</strong> The kube-proxy uses network forwarding to route traffic between the containers on the node and the rest of the cluster. This allows the containers to access services &amp; other resources that are available in the cluster, such as databases &amp; other services.</li>
<li class=""><strong>Load Balancing:</strong> The kube-proxy can also provide load-balancing for the containers on the node. It helps to distribute incoming traffic across the containers on the node, ensuring that no single container becomes overloaded. This improves the performance of the application</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/kubernetes-architecture/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>This was a simplified overview of the Kubernetes architecture. Now, you should have a big-picture understanding of how different components of a Kubernetes cluster communicate with each other &amp; how Kubernetes functions as a whole. If you want to learn more about Kubernetes, you should check out our <a href="https://www.okteto.com/blog/kubernetes-basics/" target="_blank" rel="noopener noreferrer" class="">Kubernetes for Beginners</a> blog for a comprehensive guide!</p>]]></content:encoded>
            <category>kubernetes</category>
        </item>
        <item>
            <title><![CDATA[Containerization and Kubernetes: A Guide]]></title>
            <link>https://www.okteto.com/blog/kubernetes-containerization/</link>
            <guid>https://www.okteto.com/blog/kubernetes-containerization/</guid>
            <pubDate>Wed, 14 Dec 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[In this blog, we learn about what containerization of applications is, the problems we faced with it in production, and how Kubernetes solves them.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-containerization-and-kubernetes">What is containerization and Kubernetes?<a href="https://www.okteto.com/blog/kubernetes-containerization/#what-is-containerization-and-kubernetes" class="hash-link" aria-label="Direct link to What is containerization and Kubernetes?" title="Direct link to What is containerization and Kubernetes?" translate="no">​</a></h2>
<p>Containers quickly became the norm for how we built and packaged our applications. <a href="https://aws.amazon.com/what-is/containerization/" target="_blank" rel="noopener noreferrer" class="">Containerization</a> of applications made the software delivery and development cycle easy by providing a convenient way to run applications anywhere - without having to worry about setting the environment up from scratch every time. But, to run our containerized applications in production, we still needed to solve a few pieces of the puzzle. And that's where Kubernetes came in to the picture.</p>
<!-- -->
<video controls="" preload="metadata" class="video_QmVR"><source src="https://cdn.sanity.io/files/6icyfeiq/production/9516a3c80e94a816beb980424569ed2f24b89a1b.mp4" type="video/mp4"></video>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="problems-with-containerization-and-production-setups">Problems With Containerization and Production Setups<a href="https://www.okteto.com/blog/kubernetes-containerization/#problems-with-containerization-and-production-setups" class="hash-link" aria-label="Direct link to Problems With Containerization and Production Setups" title="Direct link to Problems With Containerization and Production Setups" translate="no">​</a></h2>
<p>Since <a href="https://www.crowdstrike.com/cybersecurity-101/cloud-security/containerization/" target="_blank" rel="noopener noreferrer" class="">containerization became the norm</a>, we started having a separate container for each of our application microservice. But containers are meant to be ephemeral, and things can and do go wrong in production. This can lead to <a href="https://www.okteto.com/blog/how-to-speed-up-container-image-builds/" target="_blank" rel="noopener noreferrer" class="">containers going down unexpectedly</a>. And this is just one of the many problems associated with containerization. Long story short, we couldn’t just run containers directly to serve our applications. We needed something to manage these running containers - a container orchestrator (like Kubernetes).</p>
<p>Managing a few containers to serve your application might still be possible with manual effort, but to run containers at scale, we needed some way to automate all the operational tasks associated with containerization. Container orchestrators like Kubernetes take care of all this. They are responsible for managing the complete container lifecycle and ensuring your applications are always up and running for users to access. They remove the manual effort of monitoring and managing containers by automating the whole process. Some of the tasks they generally take care of are:</p>
<ul>
<li class="">Deploying containers with the correct application images</li>
<li class="">Monitoring provisioned containers and checking if they are healthy</li>
<li class="">Scaling up or down the number of containers based on the application traffic</li>
<li class="">Balancing load between different running containers using <a href="https://www.okteto.com/blog/kubernetes-load-balancer-service/" target="_blank" rel="noopener noreferrer" class="">services</a></li>
</ul>
<p>When it came to containerization, two prominent names appeared: <a href="https://docs.docker.com/engine/swarm/" target="_blank" rel="noopener noreferrer" class="">Docker Swarm</a> and <a href="https://kubernetes.io/" target="_blank" rel="noopener noreferrer" class="">Kubernetes</a> (K8s). Let’s see how they differ and which one might be ideal for your use case.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="docker-swarm-vs-kubernetes">Docker Swarm vs Kubernetes<a href="https://www.okteto.com/blog/kubernetes-containerization/#docker-swarm-vs-kubernetes" class="hash-link" aria-label="Direct link to Docker Swarm vs Kubernetes" title="Direct link to Docker Swarm vs Kubernetes" translate="no">​</a></h2>
<p>Containerization started a war between Docker Swarm and Kubernetes. Deciding between the two primarily depends on your use case. Docker Swarm is an easy to set up and maintain solution when you want to manage simple workloads. It has a lower learning curve and is lightweight. If you have a relatively simple application and don’t have the time to invest in a complex solution, Docker Swarm might be the better choice for you. Kubernetes, on the other hand, offers a lot more features and should be the choice if you want to run complex workloads at scale effectively. It has a lot larger open source community than Docker Swarm and is offered by all the major cloud providers. It also has a <a href="https://spacelift.io/blog/kubernetes-tools" target="_blank" rel="noopener noreferrer" class="">vast ecosystem of tools</a> built around it which extend its capabilities and make it the ideal choice for enterprises managing their microservices based applications. But the problem with Kubernetes is that it can be tough to learn and set up when getting started initially.</p>
<blockquote>
<p>If you’re looking to get started with containerization and Kubernetes, check out our <a href="https://www.okteto.com/blog/kubernetes-basics/" target="_blank" rel="noopener noreferrer" class="">Kubernetes for Beginners</a> blog to get learning!</p>
</blockquote>
<p>Migrating your existing applications and development workflows to containers running on Kubernetes can be a tough task. If you’re struggling with that, Okteto can help make the migration easy and simplify how you develop cloud native applications! <a href="https://www.okteto.com/get-demo/" target="_blank" rel="noopener noreferrer" class="">Reach out to us</a> to talk more :)</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-kubernetes-helps-with-containerized-applications">How Kubernetes Helps With Containerized Applications<a href="https://www.okteto.com/blog/kubernetes-containerization/#how-kubernetes-helps-with-containerized-applications" class="hash-link" aria-label="Direct link to How Kubernetes Helps With Containerized Applications" title="Direct link to How Kubernetes Helps With Containerized Applications" translate="no">​</a></h2>
<p>Now that you have an idea of why containerization with Kubernetes is helpful, you might be wondering how exactly does this work. K8s works on a declarative system to manage your containerized applications. You tell it how you want things configured by writing a YAML file, and then it will work towards bringing up all the required containers and other needed things.</p>
<p>Then it also continuously monitors the resources it has created and checks that they still match the state we had described in the configuration file. If that’s not the case, it takes the necessary actions required to get to that state. This is how <a href="https://www.okteto.com/blog/beginners-guide-to-kubernetes-deployments/" target="_blank" rel="noopener noreferrer" class="">Kubernetes functions as a container orchestrator</a> and avoids application downtime.</p>
<blockquote>
<p>Now that you recognize the usefullness of Kubernetes and will be using it to deliver, deploy, and run containers, <a href="https://www.okteto.com/try-free/" target="_blank" rel="noopener noreferrer" class="">give Okteto a try</a> and immediately get the development environment to the K8s level and save development time and resources!</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="developing-containerized-applications-on-kubernetes-with-okteto">Developing Containerized Applications on Kubernetes With Okteto<a href="https://www.okteto.com/blog/kubernetes-containerization/#developing-containerized-applications-on-kubernetes-with-okteto" class="hash-link" aria-label="Direct link to Developing Containerized Applications on Kubernetes With Okteto" title="Direct link to Developing Containerized Applications on Kubernetes With Okteto" translate="no">​</a></h2>
<p>Containerization of applications has made Kubernetes the go-to tool for running things at scale. It has changed how we deploy our applications. But the <strong>development</strong> of these microservices based applications has still been an area that is lacking behind. Mainly because we’ve been using the same old tools for development that we used before containers came into the picture. Okteto simplifies the development of containerized applications by allowing you to write code in an environment that is exactly like production. This is done by leveraging Kubernetes during development as well! Check out our <a href="https://www.okteto.com/docs/getting-started/" target="_blank" rel="noopener noreferrer" class="">Getting Started Guide</a> and learn how to simplify the development of your containerized applications.</p>]]></content:encoded>
            <category>kubernetes</category>
        </item>
        <item>
            <title><![CDATA[Kubectl Cheat Sheet Commands & Examples]]></title>
            <link>https://www.okteto.com/blog/kubectl-cheat-sheet/</link>
            <guid>https://www.okteto.com/blog/kubectl-cheat-sheet/</guid>
            <pubDate>Mon, 05 Dec 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn the most useful kubectl commands to help you in your Kubernetes learning journey]]></description>
            <content:encoded><![CDATA[<p>Things can be overwhelming when you are <a href="https://www.reddit.com/r/kubernetes/comments/13f57ta/is_it_just_me_or_is_kubernetes_supposed_to_be/" target="_blank" rel="noopener noreferrer" class="">new to Kubernetes</a>. You’d think that understanding all the <a href="https://www.okteto.com/blog/kubernetes-basics/#getting-started-with-kubernetes" target="_blank" rel="noopener noreferrer" class="">different objects</a> Kubernetes has to offer would be the end of it. But no, when it comes to actually interacting with K8s clusters, things get even more confusing for beginners. This is where our kubectl cheat sheet will come in handy!</p>
<!-- -->
<div class="embed_uCA2"><iframe src="https://www.youtube-nocookie.com/embed/zn0ieFdYsl4" title="YouTube video player" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction-to-kubectl">Introduction to kubectl<a href="https://www.okteto.com/blog/kubectl-cheat-sheet/#introduction-to-kubectl" class="hash-link" aria-label="Direct link to Introduction to kubectl" title="Direct link to Introduction to kubectl" translate="no">​</a></h2>
<p>The most common tool to interact with a Kubernetes cluster is <a href="https://kubernetes.io/docs/tasks/tools/#kubectl" target="_blank" rel="noopener noreferrer" class="">kubectl</a>. This allows you to interact with the objects you create, view logs, etc. But as anyone who’s just starting to learn K8s will agree, THERE ARE JUST <a href="https://kubernetes.io/docs/reference/kubectl/quick-reference/" target="_blank" rel="noopener noreferrer" class="">TOO MANY KUBECTL COMMANDS</a> TO KEEP TRACK OF!</p>
<figure class="quote_Y4Tu"><blockquote>When I was learning K8s personally, I had to maintain a diary of all the commands I came across and used to revise them every day before taking my Certified Kubernetes Administrator exam. I hope this Kubernetes command cheat sheet makes things easier for you so that you don't have to struggle like I did.</blockquote><figcaption><span><strong>Arsh Sharma</strong><span>Developer Experience Engineer</span></span></figcaption></figure>
<p>But don’t worry; this kubectl cheat sheet is going to be my attempt to simplify things. We’ll go over the most common commands you’d find yourself using throughout your K8s journey. Here’s a meme to ease you in before getting started.</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/9d39c8830b64-0dfad16de16f1a8f187db3f2ac9fde2e.webp" width="720" height="720" class="img_ev3q"></p>
<p>Also, if you’re completely new to Kubernetes, you might want to check out our <a href="https://www.okteto.com/blog/kubernetes-basics/" target="_blank" rel="noopener noreferrer" class="">Kubernetes for Beginners</a> blog before proceeding. Now let's begin with our Kubernetes command cheat sheet!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cluster-info-and-configuration">Cluster Info and Configuration<a href="https://www.okteto.com/blog/kubectl-cheat-sheet/#cluster-info-and-configuration" class="hash-link" aria-label="Direct link to Cluster Info and Configuration" title="Direct link to Cluster Info and Configuration" translate="no">​</a></h2>
<p>Often you need to get information, not about the application but the <a href="https://www.vmware.com/topics/kubernetes-cluster" target="_blank" rel="noopener noreferrer" class="">cluster itself</a>. Here are a few Kubernetes commands in our cheat sheet which help with that:</p>
<ul>
<li class=""><code>kubectl version</code>: Gives information about what version of Kubernetes the client and server are on.</li>
<li class=""><code>kubectl cluster-info</code>: Displays the endpoint of the Kubernetes control plane.</li>
<li class=""><code>kubectl config get-contexts</code>: Lists all the contexts present in the current kubeconfig.</li>
<li class=""><code>kubectl config use-context &lt;context name&gt;</code>: Allows you to set the default context for all the kubectl commands you’ll run.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="namespaces">Namespaces<a href="https://www.okteto.com/blog/kubectl-cheat-sheet/#namespaces" class="hash-link" aria-label="Direct link to Namespaces" title="Direct link to Namespaces" translate="no">​</a></h2>
<p><a href="https://www.okteto.com/blog/kubernetes-basics/#namespaces" target="_blank" rel="noopener noreferrer" class="">Namespaces</a> play a very important role in clusters. No kubectl cheat sheet can be complete without including commands which help you work with them. They act as a way to organize and isolate the different resources your application might need. By default, you’re in the <code>default</code> namespace (surprise, surprise!), and the resources Kubernetes needs for its functioning are in the <code>kube-system</code> namespace. Here are some other commands related to namespaces you’ll find yourself using frequently:</p>
<ul>
<li class=""><code>kubectl get namespaces</code>: Often, you’ll find that you’ve lost track of all the namespaces you’ve created. This command will help you out by listing them all.</li>
<li class=""><code>kubectl create namespace &lt;namespace name&gt;</code>: This command would create a new namespace for you. Note that it will not set that namespace as the default one, though. So all resources you create will still be created in the <code>default</code> namespace unless you specify the <code>--namespace</code> flag explicitly.</li>
<li class=""><code>kubectl config set-context --current --namespace=&lt;namespace name&gt;</code>: This allows you to change the default namespace for all the commands you’ll run while still keeping the same context. Just remember that the default namespace is called <code>default</code> in case you ever want to switch back.</li>
<li class=""><code>kubectl delete namespace &lt;namespace name&gt;</code>: This deletes the specified namespace and <strong>all resources under the namespace!</strong> The deletion of resources is an asynchronous process, so don’t be surprised if you see your namespace in the “Terminating” state for a while before it’s completely gone.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pods-deployments-secrets-etc">Pods, Deployments, Secrets, etc<a href="https://www.okteto.com/blog/kubectl-cheat-sheet/#pods-deployments-secrets-etc" class="hash-link" aria-label="Direct link to Pods, Deployments, Secrets, etc" title="Direct link to Pods, Deployments, Secrets, etc" translate="no">​</a></h2>
<p>Now there is a certain set of commands which you’ll find yourself using a lot when interacting with most of the <a href="https://www.okteto.com/blog/kubernetes-basics/#getting-started-with-kubernetes" target="_blank" rel="noopener noreferrer" class="">Kubernetes resources</a>. Just put in the resource name instead of <code>X</code>, and you should be good to go with these:</p>
<ul>
<li class=""><code>kubectl get X</code>: Lists all resources of that particular type <strong>in the current namespace</strong>.</li>
<li class=""><code>kubectl create X &lt;name&gt; &lt;other properties&gt;</code>: Creates the “X” resource in the current namespace with the specified name. In most cases, you would have to specify some additional flags to actually create that particular resource.</li>
<li class=""><code>kubectl delete X &lt;name&gt;</code>: Deletes the “X” resource with the given name in the current namespace.</li>
<li class=""><code>kubectl describe X &lt;name&gt;</code>: You’ll find yourself using this one a lot when debugging things. This provides details and events related to the resource you specify.</li>
<li class=""><code>kubectl edit X &lt;name&gt;</code>: This command will allow you to edit the specified resource directly without having to deal with any YAML. Remember to make the changes to your YAMLs once you’re satisfied with your edits because the edits don’t persist once the resource gets deleted!</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nodes">Nodes<a href="https://www.okteto.com/blog/kubectl-cheat-sheet/#nodes" class="hash-link" aria-label="Direct link to Nodes" title="Direct link to Nodes" translate="no">​</a></h2>
<p>Next up in our kubectl cheat sheet are commands related to nodes. Nodes are what build your cluster, so it’s no surprise that you’ll often find yourself interacting with them. The following commands are worth keeping a note of:</p>
<ul>
<li class=""><code>kubectl get nodes</code>: Shows a list of all the nodes along with their role (<code>control-plane</code>, <code>worker</code>, etc.) and the version of K8s they are running.</li>
<li class=""><code>kubectl top node &lt;node name&gt;</code>: Shows the CPU and memory usage of the specified node.</li>
<li class=""><code>kubectl cordon/uncordon node &lt;node name&gt;</code>: Cordoning nodes means marking them as unschedulable; that is, no pods will be placed on that particular node. This is useful when you want to isolate a node for something like updating its version or debugging.</li>
<li class=""><code>kubectl drain node &lt;node name&gt;</code>: You’ll find yourself using this command when doing maintenance tasks for your cluster. Draining a node, cordons it as well, and deletes all pods running on it. If those pods are being managed by a Deployment, DaemonSet, etc., they will be recreated on the remaining nodes.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-common-kubectl-cheat-sheet-commands">Other Common Kubectl Cheat Sheet Commands<a href="https://www.okteto.com/blog/kubectl-cheat-sheet/#other-common-kubectl-cheat-sheet-commands" class="hash-link" aria-label="Direct link to Other Common Kubectl Cheat Sheet Commands" title="Direct link to Other Common Kubectl Cheat Sheet Commands" translate="no">​</a></h2>
<p>Finally to finish our kubectl cheat sheet let's discuss some commands which don’t exactly fit into any single category, but you’ll find yourself using them a lot.</p>
<ul>
<li class=""><code>kubectl apply -f &lt;filename.yaml&gt;</code>: If you’re creating K8s resources using YAML files, then this is the command you should be using to apply those YAMLs. If the resource specified in the YAML already exists, then this command would update that resource with the latest configuration specified in the YAML file.</li>
<li class=""><code>kubectl delete -f &lt;filename.yaml&gt;</code>: This command deletes all the resources specified in the particular YAML file.</li>
<li class=""><code>kubectl port-forward &lt;pod name&gt; &lt;local port&gt;:&lt;remote port&gt;</code>: Relying on <a href="https://www.okteto.com/blog/kubernetes-network-policies/" target="_blank" rel="noopener noreferrer" class="">services</a> to expose your application to external traffic isn’t always convenient, especially when you’re debugging. The <code>port-forward</code> subcommand provides you with a simple way to do this by letting you forward a local port to a specified port in the mentioned pod.</li>
<li class=""><code>kubectl logs &lt;pod name&gt;</code>: This is a very useful command for debugging your deployed application. This command prints the logs for the container running in the specified pod. If your pod is running more than one container, you can additionally specify the <code>--container</code> flag to mention which container’s logs you want to see.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="who-are-these-kubectl-cheat-sheet-commands-for">Who Are These Kubectl Cheat Sheet Commands For?<a href="https://www.okteto.com/blog/kubectl-cheat-sheet/#who-are-these-kubectl-cheat-sheet-commands-for" class="hash-link" aria-label="Direct link to Who Are These Kubectl Cheat Sheet Commands For?" title="Direct link to Who Are These Kubectl Cheat Sheet Commands For?" translate="no">​</a></h2>
<p>While we discussed some common Kubernetes commands in the form of a cheat sheet that you’d find yourself using when working with K8s, I believe that it is not developers who should be taking care of these K8s related tasks. Having developers deal with the infrastructure and deployment side of things during the development process takes a massive hit on productivity and also leads to a poor developer experience. With Okteto, you can define all the things you need to spin up your dev environment in a YAML and have developers skip right to the code-writing phase by running just one single command. Try our <a href="https://www.okteto.com/docs/getting-started/" target="_blank" rel="noopener noreferrer" class="">Getting Started Guide</a> to see the magic for yourself!</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Kubernetes Network Policy: A Beginner’s Guide]]></title>
            <link>https://www.okteto.com/blog/kubernetes-network-policies/</link>
            <guid>https://www.okteto.com/blog/kubernetes-network-policies/</guid>
            <pubDate>Mon, 28 Nov 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn about Network Policies in Kubernetes and how to implement them with best practices.]]></description>
            <content:encoded><![CDATA[<p>Everyone agrees that <a href="https://www.darkreading.com/cloud-security/why-kubernetes-clusters-are-intrinsically-insecure-what-to-do-about-them-" target="_blank" rel="noopener noreferrer" class="">Kubernetes clusters are not secure by default</a>. But the good thing is that Kubernetes gives you the tools to make it so.</p>
<!-- -->
<figure class="quote_Y4Tu"><blockquote>Teams new to Kubernetes often deploy clusters in an insecure way by default because they don't know what they don't know. Unless you've got a team of battle-hardened Kubernetes experts, you're bound to run into trouble.</blockquote><figcaption><span><strong>Robert Brennan</strong><span>Director of Open Source Software, Fairwinds</span></span></figcaption></figure>
<p>In this article, we’re going to learn about one of such resources K8s provides right out of the box to make your deployed applications a bit more secure: Kubernetes Network Policies.</p>
<div class="embed_uCA2"><iframe src="https://www.youtube-nocookie.com/embed/ehj0Qdq1qdA" title="YouTube video player" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-network-policies-in-kubernetes-are-important">Why Network Policies in Kubernetes Are Important<a href="https://www.okteto.com/blog/kubernetes-network-policies/#why-network-policies-in-kubernetes-are-important" class="hash-link" aria-label="Direct link to Why Network Policies in Kubernetes Are Important" title="Direct link to Why Network Policies in Kubernetes Are Important" translate="no">​</a></h2>
<p>When learning about something new, I often find it easier to understand if I start with learning the “why” it was needed, even before knowing “what” it actually is. Let’s do the same with Network Policies, and I’m sure you’ll have a much easier time understanding them! :)</p>
<p>By default, <a href="https://kubernetes.io/docs/concepts/services-networking/#the-kubernetes-network-model" target="_blank" rel="noopener noreferrer" class="">Kubernetes allows traffic</a> from all pods to reach all other pods. But this isn’t something you’d want in production. Why? Because this way, if a pod gets compromised, it will be able to affect other pods and potentially compromise the security of your entire application. Network Policies provide a way to restrict traffic in your cluster so that only legitimate traffic can flow - where the term “legitimate traffic” is for you to decide based on your application.</p>
<p>For example, if you’ve deployed a full-stack application by default, the frontend pods will be able to communicate with the backend as well as the database pods. But we know that the frontend pods don’t actually need to talk to the database pods directly.</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/ec9f5da0e9d3-69029d2422c851fee2fdc4410837db4f.webp" width="671" height="362" class="img_ev3q"></p>
<p>In this scenario, it would be ideal for us to leverage Kubernetes Network Policies to allow traffic from the frontend pods only to the backend pods. This way, even if the frontend pods get compromised, we can be sure that our database won’t be affected!</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/65446747337b-90927d1bdabb02b6e27946cccdc7c44b.webp" width="671" height="362" class="img_ev3q"></p>
<p>Now that you have an understanding of what utility Network Policies serve let’s start learning about them in more detail.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-exactly-are-kubernetes-network-policies">What Exactly Are Kubernetes Network Policies<a href="https://www.okteto.com/blog/kubernetes-network-policies/#what-exactly-are-kubernetes-network-policies" class="hash-link" aria-label="Direct link to What Exactly Are Kubernetes Network Policies" title="Direct link to What Exactly Are Kubernetes Network Policies" translate="no">​</a></h2>
<p>Network Policies are a resource in Kubernetes responsible for controlling traffic <em>to and from</em> <a href="https://www.okteto.com/blog/kubernetes-basics/#pods" target="_blank" rel="noopener noreferrer" class="">pods</a> running in a cluster. With Network Policies, you select pods using labels and then specify rules for these selected pods. You can utilize a combination of the following three to precisely control traffic:</p>
<ul>
<li class="">Other pods: You can select other pods using labels that should be allowed to talk to the selected pods.</li>
<li class=""><a href="https://www.okteto.com/blog/kubernetes-basics/#namespaces" target="_blank" rel="noopener noreferrer" class="">Namespaces</a>: You can select complete namespaces as well. In this case, all pods in the namespace would be able to communicate with the selected pods.</li>
<li class="">IP blocks: You can specify <a href="https://aws.amazon.com/what-is/cidr/" target="_blank" rel="noopener noreferrer" class="">CIDR ranges</a> from or to which traffic is allowed for the selected pods.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubernetes-network-policy-example">Kubernetes Network Policy Example<a href="https://www.okteto.com/blog/kubernetes-network-policies/#kubernetes-network-policy-example" class="hash-link" aria-label="Direct link to Kubernetes Network Policy Example" title="Direct link to Kubernetes Network Policy Example" translate="no">​</a></h3>
<p>Let’s look at a Network Policy example resource and then see how we can define network policies in K8s. Warning: things aren’t as scary as they might look at first glance! <!-- -->:P</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">apiVersion</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> networking.k8s.io/v1</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> NetworkPolicy</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">metadata</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> sample</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">network</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">policy</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">spec</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">podSelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">matchLabels</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">role</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> db</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">policyTypes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> Ingress</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> Egress</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">ingress</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">from</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">namespaceSelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">            </span><span class="token key atrule" style="color:rgb(86, 156, 214)">matchLabels</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">              </span><span class="token key atrule" style="color:rgb(86, 156, 214)">project</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> firstproject</span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">podSelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">            </span><span class="token key atrule" style="color:rgb(86, 156, 214)">matchLabels</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">              </span><span class="token key atrule" style="color:rgb(86, 156, 214)">role</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> client</span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">ports</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">protocol</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> TCP</span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">port</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4614</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">egress</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">to</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">namespaceSelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">            </span><span class="token key atrule" style="color:rgb(86, 156, 214)">matchLabels</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">              </span><span class="token key atrule" style="color:rgb(86, 156, 214)">project</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> secondproject</span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">ports</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">protocol</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> TCP</span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">port</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1010</span><br></div></code></pre></div></div>
<p>Like most other K8s resources, the <code>NetworkPolicy</code> resource also has the usual <code>apiVersion</code>, <code>kind</code>, <code>metadata</code>, and <code>spec</code> fields. The <code>spec</code> field is where things get interesting! You’ll mostly see the following things under this field:</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="podselector">podSelector<a href="https://www.okteto.com/blog/kubernetes-network-policies/#podselector" class="hash-link" aria-label="Direct link to podSelector" title="Direct link to podSelector" translate="no">​</a></h4>
<p>This is where we select the pods we want the policy to get applied to.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="policytype">policyType<a href="https://www.okteto.com/blog/kubernetes-network-policies/#policytype" class="hash-link" aria-label="Direct link to policyType" title="Direct link to policyType" translate="no">​</a></h4>
<p>NetworkPolicies have two types: Ingress and Egress. A NetworkPolicy resource can be of any of the two types (or even both!). Ingress refers to the traffic entering the pods we select under the <code>podSelector</code>, whereas Egress refers to the traffic leaving the pods. The <code>policyType</code> field indicates whether we will specify ingress rules or egress rules, or both for the pods we’ve selected in our NetworkPolicy resource.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="ingress">ingress<a href="https://www.okteto.com/blog/kubernetes-network-policies/#ingress" class="hash-link" aria-label="Direct link to ingress" title="Direct link to ingress" translate="no">​</a></h4>
<p>Ingress is where we list rules for what traffic is allowed to enter the selected pods. All the listed rules get <code>OR</code>ed.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">ingress</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">from</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">namespaceSelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">matchLabels</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">project</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> firstproject</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">podSelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">matchLabels</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">role</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> client</span><br></div></code></pre></div></div>
<p>The above section in a network policy would allow traffic to the selected pods:</p>
<ul>
<li class="">from all pods in the namespace with the label "project: firstproject" and,</li>
<li class="">from all pods with the label "role: client" regardless of which namespace they are present in.</li>
</ul>
<p>In case you wanted a combination of both of these rules, your ingress section would look something like this:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">ingress</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">from</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">namespaceSelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">matchLabels</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">project</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> firstproject</span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">podSelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">matchLabels</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">role</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> client</span><br></div></code></pre></div></div>
<p>Now, this would allow traffic only from pods with the “role: client” label present in the namespace with the “project: firstproject” label.</p>
<p>The selection capabilities are quite powerful, no?</p>
<p>The <code>ports</code> section simply specifies the ports on which the selected traffic is allowed.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="egress">egress<a href="https://www.okteto.com/blog/kubernetes-network-policies/#egress" class="hash-link" aria-label="Direct link to egress" title="Direct link to egress" translate="no">​</a></h4>
<p>Similar to ingress in terms of selecting things, the only difference being that egress is where we select where traffic is allowed to go from our selected pods.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">egress</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">to</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">namespaceSelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">            </span><span class="token key atrule" style="color:rgb(86, 156, 214)">matchLabels</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">              </span><span class="token key atrule" style="color:rgb(86, 156, 214)">project</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> secondproject</span><br></div></code></pre></div></div>
<p>So in the above example, the selected pods are allowed to send traffic to all pods in the namespace with the label “project: secondproject”. The selection rules for egress get <code>AND</code>ed and <code>OR</code>ed, similar to ingress rules. The <code>ports</code> section, too, like in the case of ingress, specifies what ports the rules are valid on.</p>
<p>Now that you have a general idea of what a NetworkPolicy does and looks like let’s see things in action!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="working-with-network-policies">Working With Network Policies<a href="https://www.okteto.com/blog/kubernetes-network-policies/#working-with-network-policies" class="hash-link" aria-label="Direct link to Working With Network Policies" title="Direct link to Working With Network Policies" translate="no">​</a></h2>
<p>We’ll keep things simple in this section but, at the same time, ensure that you’re able to understand Network Policies in detail. We’ll work with two pods: frontend and backend, and test the connectivity between them before and after creating some Network Policies.</p>
<p>Let’s first create both our pods:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ kubectl run frontend --image=nginx</span><br></div><div class="token-line" style="color:white"><span class="token plain">$ kubectl run backend --image=nginx</span><br></div></code></pre></div></div>
<p>If you want to learn more about common <a href="https://www.okteto.com/blog/kubectl-cheat-sheet/" target="_blank" rel="noopener noreferrer" class="">kubectl commands check this blog out</a>!</p>
<p>Next, let’s just expose both these pods by creating cluster internal services so that its easier for us to check the connectivity between them:</p>
<p>n commnandsn</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ kubectl expose pod frontend --port 80</span><br></div><div class="token-line" style="color:white"><span class="token plain">$ kubectl expose pod backend --port 80</span><br></div></code></pre></div></div>
<p>Confirm that everything is working as expected by running <code>kubectl get all</code>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">NAME           READY   STATUS    RESTARTS   AGE</span><br></div><div class="token-line" style="color:white"><span class="token plain">pod/backend    1/1     Running   0          3m10s</span><br></div><div class="token-line" style="color:white"><span class="token plain">pod/frontend   1/1     Running   0          3m18s</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE</span><br></div><div class="token-line" style="color:white"><span class="token plain">service/backend      ClusterIP   10.120.37.122   &lt;none&gt;        80/TCP    67s</span><br></div><div class="token-line" style="color:white"><span class="token plain">service/frontend     ClusterIP   10.120.39.94    &lt;none&gt;        80/TCP    72s</span><br></div><div class="token-line" style="color:white"><span class="token plain">service/kubernetes   ClusterIP   10.120.32.1     &lt;none&gt;        443/TCP   257d</span><br></div></code></pre></div></div>
<p>Now, if you remember, at the start, I mentioned that by default, all pods in K8s are allowed to interact with each other. Let’s confirm this by trying to ping the backend pod, using the cluster IP of its service, from the frontend pod by running the <code>exec</code> <a href="https://kubernetes.io/docs/tasks/debug/debug-application/get-shell-running-container/" target="_blank" rel="noopener noreferrer" class="">command</a>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ kubectl exec frontend -- curl 10.120.37.122</span><br></div></code></pre></div></div>
<p>You should get the following output:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token doctype punctuation" style="color:rgb(212, 212, 212)">&lt;!</span><span class="token doctype doctype-tag">DOCTYPE</span><span class="token doctype"> </span><span class="token doctype name">html</span><span class="token doctype punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">html</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">head</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">title</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Welcome to nginx!</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">title</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">style</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:white"><span class="token style language-css"></span><span class="token style language-css selector" style="color:rgb(215, 186, 125)">html</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token style language-css"> </span><span class="token style language-css property">color-scheme</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> light dark</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:white"><span class="token style language-css"></span><span class="token style language-css selector" style="color:rgb(215, 186, 125)">body</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token style language-css"> </span><span class="token style language-css property">width</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">35</span><span class="token style language-css unit">em</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css property">margin</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:rgb(181, 206, 168)">0</span><span class="token style language-css"> auto</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:white"><span class="token style language-css"></span><span class="token style language-css property">font-family</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token style language-css"> Tahoma</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token style language-css"> Verdana</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token style language-css"> Arial</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token style language-css"> sans-serif</span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:white"><span class="token style language-css"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">style</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">head</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">body</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">h1</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Welcome to nginx!</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">h1</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">p</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">If you see this page, the nginx web server is successfully installed and</span><br></div><div class="token-line" style="color:white"><span class="token plain">working. Further configuration is required.</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">p</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">p</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">For online documentation and support please refer to</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">a</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">href</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">&lt;http://nginx.org/&gt;</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">nginx.org</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">a</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">.</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">br</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">Commercial support is available at</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">a</span><span class="token tag" style="color:rgb(78, 201, 176)"> </span><span class="token tag attr-name" style="color:rgb(156, 220, 254)">href</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(212, 212, 212)">=</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag attr-value" style="color:rgb(206, 145, 120)">&lt;http://nginx.com/&gt;</span><span class="token tag attr-value punctuation" style="color:rgb(212, 212, 212)">"</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">nginx.com</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">a</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">.</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">p</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">p</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;</span><span class="token tag" style="color:rgb(78, 201, 176)">em</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain">Thank you for using nginx.</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">em</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">p</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">body</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&lt;/</span><span class="token tag" style="color:rgb(78, 201, 176)">html</span><span class="token tag punctuation" style="color:rgb(212, 212, 212)">&gt;</span><br></div></code></pre></div></div>
<p>We see the HTML output for the NGINX starter page, which confirms that we were successfully able to ping the backend pod.</p>
<p>You can also try this the other way around as well by running:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ kubectl exec backend -- curl 10.120.39.94</span><br></div></code></pre></div></div>
<p>Let’s now create a very common policy called “Default deny”. Once this is created, it will restrict <strong>ALL</strong> traffic for <strong>ALL</strong> pods in your cluster. This is a very convenient and common way to begin thinking about networking rules in your cluster. You begin by stopping all traffic and then create more network policies only for the traffic you want to allow.</p>
<p>Here's an example of a default deny network policy:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">apiVersion</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> networking.k8s.io/v1</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> NetworkPolicy</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">metadata</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> default</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">deny</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">spec</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">podSelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">policyTypes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> Ingress</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> Egress</span><br></div></code></pre></div></div>
<p>Specifying <code>{}</code> for <code>podSelector</code> simply selects all pods and not writing an ingress or egress section <strong>while mentioning them both</strong> under <code>policyTypes</code> blocks all traffic.</p>
<p>Try running the <code>kubectl exec</code> commands we ran before now. You’ll notice that it doesn’t show the HTML and just keeps loading. This is because of the Network Policy that we just created!</p>
<p>Now let’s make sure our frontend pod is able to communicate with the backend pod. For this, we would need to create two rules:</p>
<ul>
<li class="">One egress rule which allows outgoing traffic from the frontend to the backend</li>
<li class="">One ingress rule which allows incoming to the backend from the frontend</li>
</ul>
<p>The following policy will select the frontend pods and allow outgoing traffic from them to reach the backend pods:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">apiVersion</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> networking.k8s.io/v1</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> NetworkPolicy</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">metadata</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> frontend</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">policy</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">spec</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">podSelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">matchLabels</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">run</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> frontend</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">policyTypes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> Egress</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">egress</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">to</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">podSelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">            </span><span class="token key atrule" style="color:rgb(86, 156, 214)">matchLabels</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">              </span><span class="token key atrule" style="color:rgb(86, 156, 214)">run</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> backend</span><br></div></code></pre></div></div>
<p>Try rerunning the following command to test if things are working or not:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ kubectl exec frontend -- curl 10.120.37.122</span><br></div></code></pre></div></div>
<p>You’ll notice that it still doesn’t work. And that’s expected! Right now, we’ve only created a policy that allows traffic to leave from the frontend pods to the backend pods. The backend pods still need an ingress rule to allow incoming traffic from the frontend pods. Let’s create another policy to achieve this:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">apiVersion</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> networking.k8s.io/v1</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> NetworkPolicy</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">metadata</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> backend</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">policy</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">spec</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">podSelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">matchLabels</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">run</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> backend</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">policyTypes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> Ingress</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">ingress</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">from</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">podSelector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">            </span><span class="token key atrule" style="color:rgb(86, 156, 214)">matchLabels</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">              </span><span class="token key atrule" style="color:rgb(86, 156, 214)">run</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> frontend</span><br></div></code></pre></div></div>
<p>Once you’ve created both of these policies, try pinging the backend pods again, and it should work! You can also try pinging the frontend pods from the backend ones and confirm that it still does not work because of our default deny policy.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="wrap-up">Wrap Up<a href="https://www.okteto.com/blog/kubernetes-network-policies/#wrap-up" class="hash-link" aria-label="Direct link to Wrap Up" title="Direct link to Wrap Up" translate="no">​</a></h2>
<p>I think you can now start to appreciate how Network Policies can play a crucial role in helping you ship secure applications. We learned why Network Policies are needed and how they work and then saw them in action. If there is one piece of advice I want to leave you with before concluding, it's that when managing traffic in your clusters, it is best to <strong>only</strong> allow the required traffic and <strong>block everything else</strong>!</p>
<p>Okteto allows developers to work on their applications in a production-like environment. This means you can use Kubernetes resources like Network Policies right <strong>during the development phase</strong>. This allows developers to be sure that the code they write is secure and won’t break in production. Check out our <a href="https://www.okteto.com/docs/getting-started/" target="_blank" rel="noopener noreferrer" class="">Getting Started</a> guide to learn more!</p>]]></content:encoded>
            <category>kubernetes</category>
            <category>tutorial</category>
        </item>
        <item>
            <title><![CDATA[Applying GitOps Principles to Your Development Environments]]></title>
            <link>https://www.okteto.com/blog/applying-gitops-principles-to-your-development-environments/</link>
            <guid>https://www.okteto.com/blog/applying-gitops-principles-to-your-development-environments/</guid>
            <pubDate>Tue, 18 Oct 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[GitOps refers to the practice of using Git repositories as the single source of truth for provisioning and managing your infrastructure. Everyone in the industry agrees upon how much more convenient GitOps principles have made continuous delivery. Wouldn’t it be great if we could apply those very same principles to our development environments too?]]></description>
            <content:encoded><![CDATA[<p>GitOps refers to the practice of using Git repositories as the single source of truth for provisioning and managing your infrastructure. Everyone in the industry agrees upon how much more convenient GitOps principles have made <a href="https://en.wikipedia.org/wiki/Continuous_delivery" target="_blank" rel="noopener noreferrer" class="">continuous delivery</a>. Wouldn’t it be great if we could apply those very same principles to our development environments too?</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-challenge-kubernetes-created">The Challenge Kubernetes Created<a href="https://www.okteto.com/blog/applying-gitops-principles-to-your-development-environments/#the-challenge-kubernetes-created" class="hash-link" aria-label="Direct link to The Challenge Kubernetes Created" title="Direct link to The Challenge Kubernetes Created" translate="no">​</a></h2>
<p>GitOps emphasizes a declarative state for your infrastructure stored in a version control system. But why would we need to apply this to development environments? Why can’t we simply just continue writing code the way we did before?</p>
<p>One reason is that the modern applications we work on these days have multiple components. Because of this, developers now have a really hard time setting up their development environment. They have to go through numerous READMEs, full of instructions about setting up dev infrastructure, which they might not even fully understand or run hacky bash scripts, which might fail and are tough to maintain. All of this leads to developers spending hours of pre-work to get to the “code writing” phase. This makes for a terrible developer experience in teams. It is not fair to expect developers to configure and debug things in “Kubernetes land” instead of writing code.</p>
<p>Today’s reality is that developers have two options:</p>
<ul>
<li class="">To continue developing locally. Which meant they would not get genuine feedback when developing since locally bringing up applications is impossible to reflect production of microservice applications.</li>
<li class="">Or to spend hours configuring a production-like development environment for themselves. This is not only wasted dev time but also requires developers to keep up with the ever-growing cloud native ecosystem of tools.</li>
</ul>
<div class="embed_uCA2" data-tweet="true"><iframe src="https://platform.twitter.com/embed/Tweet.html?id=1303858170155081728&amp;dnt=true" title="Post on X" loading="lazy"></iframe></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="gitops-to-the-rescue">GitOps to the Rescue<a href="https://www.okteto.com/blog/applying-gitops-principles-to-your-development-environments/#gitops-to-the-rescue" class="hash-link" aria-label="Direct link to GitOps to the Rescue" title="Direct link to GitOps to the Rescue" translate="no">​</a></h2>
<p>Okteto solves the problems we discussed above by leveraging GitOps principles. Using Okteto, you can have all the configuration required to set up a <strong>production-like</strong> development environment defined, as code, <strong>in a version control system</strong>. Once that is done, any developer on your team can simply run a single command to get right to the “code writing” phase without worrying about the nuts and bolts of configuring Kubernetes.</p>
<p>Okteto deploys your application to an actual Kubernetes cluster using the same manifests you use in production and then allows you to <a href="https://www.okteto.com/blog/developing-microservices-by-hot-reloading-on-kubernetes-clusters/" target="_blank" rel="noopener noreferrer" class="">develop it there directly</a>. The best part is that just like GitOps advocates, the entire configuration for your dev environment is stored in Git. Okteto leverages the idea of “development environments as code” by allowing you to specify all the configuration needed to spin up a dev environment in a single file: <a href="https://www.okteto.com/docs/reference/manifest/" target="_blank" rel="noopener noreferrer" class="">the Okteto manifest</a>. This file is committed along with the application source code to a version control system. Once that is done, any developer on your team can simply clone the repository, run <code>okteto up</code>, and have a production-like environment ready for them to develop in.</p>
<p>Utilizing GitOps principles for your dev environments significantly improves developer experience by making things simple for everyone:</p>
<ul>
<li class="">The infrastructure team now only has to manage a single file per application where all the configuration for development environments lives</li>
<li class="">Updating the dev environment is now as simple as making a change in your Okteto manifest and sending a PR</li>
<li class="">Developers have to spend ZERO time configuring things and can have the dev environment launched in one command</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="benefits">Benefits<a href="https://www.okteto.com/blog/applying-gitops-principles-to-your-development-environments/#benefits" class="hash-link" aria-label="Direct link to Benefits" title="Direct link to Benefits" translate="no">​</a></h2>
<p>With Okteto, just like in GitOps, a single source of truth can power development environments for all developers on your team. This approach has numerous benefits which make working on cloud native applications a lot easier than before:</p>
<ol>
<li class=""><strong>Developer Experience</strong>
When the entire configuration needed to spin up a development environment has been defined as code, developers on your team don’t have to spend hours with configuration or spent cognitive load. A single command gets you right to the code writing phase. This also enables new developers on your team to get up to speed much more quickly than possible before!</li>
<li class=""><strong>Consistency</strong>
Having a single file power every developer’s dev environment ensures that there is consistency in workflows across your entire team. This leads to easier debugging and more effective collaboration because the focus can now be shifted to the actual application problems instead of worrying about infrastructure and configuration related issues.</li>
<li class=""><strong>Reliability</strong>
Since your development environment is defined as code and stored in Git, you can leverage all the benefits of working with a version control system. From having a log of all the changes made to being able to easily revert back in case of things going wrong, this approach ensures you always have a safety net to fall back on.</li>
<li class=""><strong>Security</strong>
Having developers write code in secure environments is very important. Using vulnerable container images during development can be a huge risk compromising the security of your organization. With Okteto, you can periodically check the committed manifest for vulnerabilities and ensure that your mean time to recovery is minutes and not hours in case of an incident. Fixing things for everyone on your team is as simple as raising a pull request which updates your Okteto manifest!</li>
</ol>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/0ef4c010f276-f92d08320d3c3615af23fa616602e6ab.webp" width="1904" height="873" class="img_ev3q"></p>
<p>A couple of years ago, the benefits you would get from “GitOpsifying” your development environments wouldn’t have been that significant. But now, I would say that if you’re looking to unblock dev productivity, it’s absolutely essential for you to have your development environments as code in a version control system. Go try our <a href="https://www.okteto.com/docs/getting-started/" target="_blank" rel="noopener noreferrer" class="">Getting Started Guide</a> to see how Okteto helps with this!</p>]]></content:encoded>
            <category>gitops</category>
            <category>dev-environments</category>
        </item>
        <item>
            <title><![CDATA[Why Development Experience Matters]]></title>
            <link>https://www.okteto.com/blog/why-development-experience-matters/</link>
            <guid>https://www.okteto.com/blog/why-development-experience-matters/</guid>
            <pubDate>Tue, 27 Sep 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[We sat down with Monday.com and Yotpo, two Tel Aviv companies seeing massive growth over the last two years, to talk about why DevEx matters for their teams]]></description>
            <content:encoded><![CDATA[<p>In September, <a href="https://twitter.com/rberrelleza" target="_blank" rel="noopener noreferrer" class="">Ramiro</a> and <a href="https://www.linkedin.com/in/mayjohn/" target="_blank" rel="noopener noreferrer" class="">John</a> traveled to Tel Aviv for a hosted event with Okteto customers and local engineering leaders. The evening included presentations from <a href="https://monday.com/" target="_blank" rel="noopener noreferrer" class="">monday.com</a>, <a href="https://www.yotpo.com/" target="_blank" rel="noopener noreferrer" class="">Yotpo</a> and a panel discussion about Why Developer Experience Matters.</p>
<!-- -->
<p>We captured that conversation here…</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://www.okteto.com/blog/why-development-experience-matters/#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h3>
<p><strong>Ramiro Berrelleza, CEO &amp; Co-Founder, Okteto:</strong> When Pablo, Ramon and I started Okteto, the idea came out of common frustrations we each had. We had  worked in similar companies, building SaaS products in the early days of Kubernetes and Docker. We saw these same problems across companies; complex environments, slow onboarding, it was hard to validate if changes worked or not until you got production, we had shared test environments that were broken half the time and the other half they just didn't work. These pain points led us to starting Okteto.</p>
<p>I'm excited to talk to Lior and Ron about what they're building, the why behind their decisions and the benefits and challenges of building DevEx initiatives.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-did-you-start-recognizing-that-development-experience-mattered-for-your-company">How did you start recognizing that Development Experience mattered for your company?<a href="https://www.okteto.com/blog/why-development-experience-matters/#how-did-you-start-recognizing-that-development-experience-mattered-for-your-company" class="hash-link" aria-label="Direct link to How did you start recognizing that Development Experience mattered for your company?" title="Direct link to How did you start recognizing that Development Experience mattered for your company?" translate="no">​</a></h3>
<p><strong>Ron Barabash, Chief Architect, Yotpo:</strong> For us it’s a story of growth in headcount and especially in R&amp;D. COVID also changed a lot of the way we work in our day to day.</p>
<p>In the past, you have your developer paired with likely a more senior developer or somebody that is your buddy when you're onboarding, so you can speak with them and they help you out with setup of things like a development environment. And as we kept growing in headcount and with COVID everything moved to be more distributed globally - you no longer had that person sitting at the desk next to you. We saw that it became very difficult to onboard new teammates.</p>
<p>I started my current position 2 years ago. At first, I mapped out all phases of the SDLC (Software Development Lifecycle). I analyzed stages from creating new services, to development, testing, and build to CI/CD deployment of services. I started mapping out where the challenges were for the entire R&amp;D team and we saw that the first major pain point for us was setting up a remote environment for our monolith application. And that journey of high-growth in headcount, moving to a distributed company policy and also the decomposition of our monolith to microservices is what led us to evaluate our internal development experience.</p>
<p><strong>Lior Rabin, DevEx Team Lead, monday.com:</strong> Yeah, I totally relate with what Ron said. I started at Monday.com in the height of COVID. I was assigned an onboarding task and my goal (and every new developer joining) was to deploy something to production in the first week. I started off by setting up my dev environment. Here I was, a developer with 10 years of experience, trying to setup the environment and it doesn't work. I'm sitting at home and I tell my buddy on Slack that this setup doesn’t work. I’m sending him snapshots and trying to figure it out but it’s really hard to do async. It’s like the last thing you want to do on your first week as the new person is to have a zoom call for setting up your environment - that looks a little strange. So in summary, I didn’t hit my goal and I deployed to production on the second week.</p>
<p>That experience really annoyed me. We had also just moved to Docker and Docker Compose, and this was the shiny new environment. And I said, oh my god, what was this like a month ago? I think this was one of the first moments that I thought I came to a big company and everything should go smoothly and this can’t be how it should work.</p>
<p>And as Ron mentioned, we were experiencing hyper-growth at monday. We almost tripled ourselves in the R&amp;D department. At monday, the developers have full ownership end-to-end, so they're a bit of a product people, a bit of QA, (we don't have dedicated QA) they also own metrics of their features and the data. They don't need to "waste" their time on setting up stuff for their local environments. They just need to sit on their laptops and start developing and doing impactful work.</p>
<p>This was one of the big motivations that drove us to creating a DevEx team.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-the-team-structure">What is the team structure?<a href="https://www.okteto.com/blog/why-development-experience-matters/#what-is-the-team-structure" class="hash-link" aria-label="Direct link to What is the team structure?" title="Direct link to What is the team structure?" translate="no">​</a></h3>
<p><strong>Lior, monday.com:</strong> As we grew, we understood that we needed to split the Infrastructure group into Production Engineering and DevEx. The production team are the engineers serving monday’s customers. And the DevEx team is "serving" a different type of customer, which are the monday engineers. This is also how we present it in job interviews - you have a responsibility to your customers which happen to also be monday employees.</p>
<figure class="quote_Y4Tu"><blockquote>As we grew, we understood that we needed to split the team into Production and DevEx. The production team are the developers serving Monday’s customers. And the DevEx team is serving a different type of customer, which are the Monday developers.</blockquote><figcaption><img src="https://www.okteto.com/blog/assets/images/1df358da1425-5f720f88c48289dfeb250f41a9d71856.webp" alt=""><span><strong>Lior Rabin</strong><span>Infrastructure Tech Lead, monday.com</span></span></figcaption></figure>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-do-you-see-your-teams-responsibilities-evolving-as-you-continue-to-grow">How do you see your team's responsibilities evolving as you continue to grow?<a href="https://www.okteto.com/blog/why-development-experience-matters/#how-do-you-see-your-teams-responsibilities-evolving-as-you-continue-to-grow" class="hash-link" aria-label="Direct link to How do you see your team's responsibilities evolving as you continue to grow?" title="Direct link to How do you see your team's responsibilities evolving as you continue to grow?" translate="no">​</a></h3>
<p><strong>Ron, Yotpo:</strong> We are currently building what I call our entire platform engineering department at Yotpo. Since it’s so new, we thought about having a developer platform. You see that in a lot of companies right now, where R&amp;D is growing and you want to have a centralized, internal and kind of like an opinionated platform. This is your product as an internal team. And it’s the team's responsibility to figure out how to expose your services to your [internal] customer.</p>
<p>The way I treat it is that we have our developer platform and part of it consists of our cloud environments. Developer Experience something that is being molded into and thought about with everything that you do. Like if you create a new service, what is the developer experience there? If you do monitoring, observability, etc, how is the development experience? So basically in every part of the software pipeline we ask ourselves is the developer experiencing something that we are proud of and something we are satisfied with.</p>
<p>Another aspect, especially with Kubernetes and cloud services becoming a lot more distributed is that everything is becoming a little bit more complex. And similar to Monday, at Yotpo developers have an end-to-end responsibility and ownership of their services. So we really want to reduce the cognitive load for them.</p>
<p>And because of that, we're using our platform engineering groups and improving developer experience on all fronts. I think it's a blowing up trend and I'm not seeing it go away anytime soon.</p>
<figure class="quote_Y4Tu"><blockquote>With Kubernetes and cloud services, things become more distributed and complex. At Yotpo, developers all have an end to end responsibility and ownership of their services. So we really want to reduce the cognitive load for developers.
</blockquote><figcaption><img src="https://www.okteto.com/blog/assets/images/55b3f433a5e4-d57642a4f7910fb41bdc05fac965b460.webp" alt=""><span><strong>Ron Barabash</strong><span>Chief Architect, Yotpo</span></span></figcaption></figure>
<p><strong>Lior, monday.com:</strong> Yeah, I totally agree. It’s funny, it’s like we are working at the same place - our story is so similar. We did not prepare for this talk, we’ve never met before, I promise!</p>
<p>At monday, we're also building an internal platform and my team, the Developer Experience team, is the team responsible for it. It’s a collaborative effort and not only us building it, but we lead it. In this platform we create a lot of services and we want this flow seamless, fast and as fail-proof as possible.</p>
<p>For example, when a developer creates a microservice, it's a click of a button and two check boxes. After two minutes, you can start developing because it's on Okteto from a template and it's all working with no friction. A few more button clicks and it goes to staging. It's amazing. It's a process that used to take us a couple of weeks, plus a few internal tickets for the team to create those resources and the helm charts or whatever. Today it’s just automated and it's a super, super good experience for the developers.</p>
<p>With this workflow the infra team is no longer the bottleneck. We're around one infra team member for every nine developers. The developers work a lot and we [the infra team] were a huge bottleneck to their work. Now that we have this platform and these automated processes, it reduces our tickets influx and things are moving fast while we can reinvest our time back to important infrastructure work like monitoring, building more regions, more clusters, etc.</p>
<p>Another benefit of this has been improved developer experience for the infra team. Our goal and vision is to automate as much as possible. The first part was setting up dev environments but then by using those environments we can reduce the load from staging environments. With faster inner loops, we don’t need multiple staging environments now, we could have one staging which is production-like. At one point I think we had 5 to 6 staging environments and it just doesn’t make sense when you can develop remotely. We aren’t completely there yet, but this is the vision.</p>
<figure class="quote_Y4Tu"><blockquote>It's amazing. It's a process that used to take us a couple of weeks, plus a few internal tickets for a team to create those resources and the helm charts or whatever. Today it’s just automated and it's a super, super good experience for the developers.</blockquote><figcaption><img src="https://www.okteto.com/blog/assets/images/1df358da1425-5f720f88c48289dfeb250f41a9d71856.webp" alt=""><span><strong>Lior Rabin</strong><span>Infrastructure Tech Lead, monday.com</span></span></figcaption></figure>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="do-you-think-development-experience-is-something-only-for-larger-teams-at-big-companies-or-should-startups-be-thinking-about-it-from-the-beginning">Do you think Development Experience is something only for larger teams at big companies, or should startups be thinking about it from the beginning?<a href="https://www.okteto.com/blog/why-development-experience-matters/#do-you-think-development-experience-is-something-only-for-larger-teams-at-big-companies-or-should-startups-be-thinking-about-it-from-the-beginning" class="hash-link" aria-label="Direct link to Do you think Development Experience is something only for larger teams at big companies, or should startups be thinking about it from the beginning?" title="Direct link to Do you think Development Experience is something only for larger teams at big companies, or should startups be thinking about it from the beginning?" translate="no">​</a></h3>
<p><strong>Ron, Yotpo:</strong> Yes, I think you should take a proactive approach when it comes to building a decent developer experience. Because it’s something that can actually grow, in a bad way, and blow up in your face.</p>
<p>As we saw with both of us at Monday and Yotpo, our first use case for Okteto started with our legacy applications, our monolith. Mostly because it's very hard to work with and having a one click deployment made it really easy.</p>
<p>So in that regard, smaller startups might not have these legacy apps and monoliths to see the immediate use case, but eventually you’re going to want to think about how your teams are organized and what they consume, and teams that need services from other teams. It’s going to happen where you’ll need a way to deploy something that is not your direct responsibility or project. And if you can deploy that in one-click and work against it in a cloud development environment with no friction, that’s super powerful.</p>
<p><strong>Lior, monday.com:</strong> I think the main advantage is that you can deploy it and just forget about it. So I think for a small team it’s still very powerful to think about this workflow. Maybe you didn’t develop a service yourself, you didn’t work on that project and maybe the other developer is unavailable and you don’t have context or know how it works exactly, but you just need it to work. It can be simplified from the beginning.</p>
<p>Maybe at a three-person startup you don’t need a dev platform in your first days, but there are things like what we are talking about that will help you along the way. In some ways, at a startup you might have more to work on as an individual than at a big company. So if you can save time and some headaches by using cloud environments, why not? The technology is there - just use it!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-do-you-get-developer-buy-in-for-something-thats-a-big-shift-in-culture-or-workflow">How do you get Developer buy-in for something that’s a big shift in culture or workflow?<a href="https://www.okteto.com/blog/why-development-experience-matters/#how-do-you-get-developer-buy-in-for-something-thats-a-big-shift-in-culture-or-workflow" class="hash-link" aria-label="Direct link to How do you get Developer buy-in for something that’s a big shift in culture or workflow?" title="Direct link to How do you get Developer buy-in for something that’s a big shift in culture or workflow?" translate="no">​</a></h3>
<p><strong>Ramiro, Okteto:</strong> I’ve worked in developer tooling for a long time and I’ve learned over the years that it’s really hard to convince developers to change their tools or the way they work. You can’t force developers to adopt something new. At Okteto, we of course dogfood and use cloud environments because they believe in the technology and see the value. But if I we’re to say hey let’s use Jira (disclaimer: I worked for Atlassian for many years), they would say “yeah, yeah, you use Jira, we’re going to use something else”. My point is, it’s a hard drive and I think you have to really pull out the use case for them. What have you found to be helpful as you shape new development experience paths for your teams?</p>
<p><strong>Ron, Yotpo:</strong> We started off by launching an internal survey for our R&amp;D organization. The whole purpose of the survey was to identify what the most painful points of their jobs were. We learned that their highest pain point was development environments. So we took that information and found a solution. We said hey, if that's your biggest problem, try this tool, Okteto, that we just implemented and see if it helps. And today I think Okteto is the most adopted tool across the entire R&amp;D organization at Yotpo.</p>
<p>That’s because we actually solved a really big pain for our customer (internal developers) The way we went about it was to do a POC and a POC team which created the entire infrastructure for it. They led the POC and worked alongside our developers to create a really good experience for them. Because of that, the adoption just blew up.</p>
<p>In summary, if you want developers to adopt something, solve something that is really painful for them and they will come.</p>
<figure class="quote_Y4Tu"><blockquote>We learned that their highest pain point was development environments. So we took that information and found a solution. We said hey, if that's your biggest problem, try this tool, Okteto, that we just implemented and see if it helps. And today I think Okteto is the most adopted tool across the entire R&amp;D organization at Yotpo.</blockquote><figcaption><img src="https://www.okteto.com/blog/assets/images/55b3f433a5e4-d57642a4f7910fb41bdc05fac965b460.webp" alt=""><span><strong>Ron Barabash</strong><span>Chief Architect, Yotpo</span></span></figcaption></figure>
<p><strong>Lior, monday.com:</strong> I think that is an important point. If you help them, you don't need to force them.</p>
<p>We did find a similar thing. We already knew that people had a lot of problems with their environments. We started the POC with Okteto and defined every touch point with one microservice to work on. I posted a question in Slack asking if some developers wanted to join the experiment to solve the environment issue. I needed help on this because I’m not a developer on my day-to-day. I wouldn’t be the one using this every day and I needed their input.</p>
<p>I was a bit surprised when 10 developers said they wanted to join the POC. And it quickly spread across the organization and in a matter of days the POC experiment team grew to 30 developers. It was really crazy the adoption rate with Okteto. All 120 developers we had at that time moved to Okteto quickly after the POC was done and we finalized an agreement.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-do-you-measure-success-in-your-devex-initiatives">How do you measure success in your DevEx initiatives?<a href="https://www.okteto.com/blog/why-development-experience-matters/#how-do-you-measure-success-in-your-devex-initiatives" class="hash-link" aria-label="Direct link to How do you measure success in your DevEx initiatives?" title="Direct link to How do you measure success in your DevEx initiatives?" translate="no">​</a></h3>
<p><strong>Ron, Yotpo:</strong> It's a really good question. Right now one of the biggest things that we actively seek to measure is your R&amp;D velocity. You can start off by looking at <a href="https://cloud.google.com/blog/products/devops-sre/using-the-four-keys-to-measure-your-devops-performance" target="_blank" rel="noopener noreferrer" class="">DORA metrics</a> and lead time is probably the most meaningful one when you talk cloud development environments.</p>
<p>This can also be one of the hardest things to measure when not everything is streamlined and you have unified pipelines for example. It's very hard to measure so the first thing that we do in order to prove the value of that kind of project, or any developer experience initiative, is to show adoption usage and also what I call customer testimonials.</p>
<p>I did this recently when I was presenting to management. I wanted to communicate how successful the initiative was. So I presented customer testimonials, stuff that the developers said to me when they started using Okteto. I also showed adoption and how many people are using it.</p>
<p>Those are helpful when showing success and I also believe DORA metrics is a very good way to kind of understand if the things you are doing are actually meaningful in terms of velocity. So we are not there yet, but we’re working on it.</p>
<figure class="quote_Y4Tu"><blockquote>The first thing that we do in order to prove the value of that kind of project, or any developer experience initiative, is to show adoption usage and also what I call customer testimonials.</blockquote><figcaption><img src="https://www.okteto.com/blog/assets/images/55b3f433a5e4-d57642a4f7910fb41bdc05fac965b460.webp" alt=""><span><strong>Ron Barabash</strong><span>Chief Architect, Yotpo</span></span></figcaption></figure>
<p><strong>Ramiro, Okteto:</strong> How do you track DORA metrics? What are using?</p>
<p><strong>Ron, Yotpo:</strong> We did a POC with a bunch of companies like <a href="https://linearb.io/" target="_blank" rel="noopener noreferrer" class="">LinearB</a> and <a href="https://www.okayhq.com/" target="_blank" rel="noopener noreferrer" class="">OKAY Engineering</a>. Basically those tools are sitting on top of your GitHub and JIRA and are digesting all the activity that is happening and showing you lead time, which is how long it takes to take something from development into production.</p>
<p>Again, we had some trouble initially understanding if those metrics are right for us and how they are being measured. We need to do a lot of work to streamline the interim process along GitHub and Jira before we get value out of using a tool like that.</p>
<p><strong>Lior, monday.com:</strong> For us it’s almost entirely usage that we’re tracking. We have some manual surveys around developer experience that gives us good feedback, but we don’t have too many success metrics outside of usage.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-were-some-challenges-you-had-integrating-okteto-into-your-environment">What were some challenges you had integrating Okteto into your environment?<a href="https://www.okteto.com/blog/why-development-experience-matters/#what-were-some-challenges-you-had-integrating-okteto-into-your-environment" class="hash-link" aria-label="Direct link to What were some challenges you had integrating Okteto into your environment?" title="Direct link to What were some challenges you had integrating Okteto into your environment?" translate="no">​</a></h3>
<p><strong>Ron, Yotpo:</strong> One initial challenge was that we had to pick the use case that we wanted to do the first POC implementation around. It was important to us that the project solved a real, painful problem for developers, and that was the key success criteria for the POC. So for us we started off with something small and we didn’t build anything new and in the end it didn’t solve a big problem, so it didn’t seem successful to us.</p>
<p>But eventually we found the right use case. It was the biggest pain point and most hard thing to do for a dev at Yotpo. So we figured if we can solve that, it’s very valuable.</p>
<p>My advice when selecting or introducing any new technology is to frame it in regards to solving a real problem and work with your customer or employee peers to scope and solve it. Usage is super important so I’m going to make sure I do everything I can to troubleshoot and help the customers, because onboarding any new tool is a big lift. Developers have many other things to do so you need to be very proactive if you are going to ask them to experiment and onboard a new tool. Take a very hands on, engaging and supportive approach.</p>
<figure class="quote_Y4Tu"><blockquote>My advice when selecting or introducing any new technology is to frame it in regards to solving a real problem and work with your customer or employee peers to scope and solve it.</blockquote><figcaption><img src="https://www.okteto.com/blog/assets/images/55b3f433a5e4-d57642a4f7910fb41bdc05fac965b460.webp" alt=""><span><strong>Ron Barabash</strong><span>Chief Architect, Yotpo</span></span></figcaption></figure>
<p><strong>Lior, monday.com:</strong> The most challenging thing was to make our monolith work because it had a lot of moving parts at the time (and has even more today). It was a very deprecated old version of rails and it had a lot of dependencies of some very hard coded stuff that was mostly technical. We chose this as the POC project because it was the most difficult thing for us. We said, if we solve this, all those other node.js microservices are peanuts.</p>
<p>During the first month of the POC, Okteto’s CTO Pablo, really dug into the repos - he probably knows our code better than me now - and he fixed and optimized a lot of the code to make it work. But we have some technical limitations on our side that are preventing us from using all of Okteto’s features like Preview Environments. We still need to solve that part.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next-in-terms-of-dev-experience-that-has-you-excited">What’s next in terms of Dev Experience that has you excited?<a href="https://www.okteto.com/blog/why-development-experience-matters/#whats-next-in-terms-of-dev-experience-that-has-you-excited" class="hash-link" aria-label="Direct link to What’s next in terms of Dev Experience that has you excited?" title="Direct link to What’s next in terms of Dev Experience that has you excited?" translate="no">​</a></h3>
<p><strong>Ron, Yotpo:</strong> In terms of vision, I'm sticking with the developer platform. This is the biggest initiative that I'm trying to promote in my company. It’s all about having a centralized piece of infrastructure where you can go and create new services, understand knowledge bases and know where to see ownership of things. I want to keep investing in that.</p>
<p>And the other thing that has my interest is remote IDEs like Code Spaces and GitPod. We are interested in using one of those tools with Okteto then we have a full cloud experience when developing so you’ll never need to come back and install an IDE. You could work from an iPad if you wanted and that’s very cool to me.</p>
<p><strong>Lior, monday.com:</strong> It’s also about the developer platform for us. It’s about providing developers a way of self-service for the infrastructure, where it makes sense of course. The vision is that you come to work, you open Slack, you open monday internal platform (Sphera), you run "okteto up" and that’s all you need. You can go from your CI and your monitoring tools, there are some notifications and diff detections. You can create secrets, create services, whatever else you could want in that same platform. That’s great DevEx.</p>
<figure class="quote_Y4Tu"><blockquote>The vision is someone comes to work, you open slack, you open Monday's internal platform and you run okteto up and that’s all you need.</blockquote><figcaption><img src="https://www.okteto.com/blog/assets/images/1df358da1425-5f720f88c48289dfeb250f41a9d71856.webp" alt=""><span><strong>Lior Rabin</strong><span>Infrastructure Tech Lead, monday.com</span></span></figcaption></figure>]]></content:encoded>
            <category>Development Experience</category>
        </item>
        <item>
            <title><![CDATA[Beginner’s Guide to Kubernetes Deployments]]></title>
            <link>https://www.okteto.com/blog/beginners-guide-to-kubernetes-deployments/</link>
            <guid>https://www.okteto.com/blog/beginners-guide-to-kubernetes-deployments/</guid>
            <pubDate>Tue, 06 Sep 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Over the last five years, Kubernetes has seen rapid adoption as a container orchestrator. And for a good reason too. Containers solved the problem of being unable to run applications easily on different environments and systems. But there were a lot of problems when running containers at scale:]]></description>
            <content:encoded><![CDATA[<p>Over the last five years, <a href="https://kubernetes.io/" target="_blank" rel="noopener noreferrer" class="">Kubernetes</a> has seen rapid adoption as a container orchestrator. And for a good reason too. <a href="https://www.docker.com/resources/what-container/" target="_blank" rel="noopener noreferrer" class="">Containers</a> solved the problem of being unable to run applications easily on different environments and systems. But there were a lot of problems when running containers at scale:</p>
<!-- -->
<ul>
<li class="">How do you ensure a minimum number of containers are always running?</li>
<li class="">What happens when a container goes down?</li>
<li class="">How do you update your application without any downtime?</li>
</ul>
<p>Kubernetes solved all these and many more problems for us. But <a href="https://www.okteto.com/blog/kubernetes-basics/#:~:text=Kubernetes%20Architecture%20Basics" target="_blank" rel="noopener noreferrer" class="">its architecture</a> has always been an object of mystery when looked at from far. How is it managing all these containers for us? What inputs does it need from us to do this? All of this can be scary if you haven’t gotten the <a href="https://www.okteto.com/blog/kubernetes-basics/" target="_blank" rel="noopener noreferrer" class="">basics of Kubernetes</a> right. In this article, we will focus on one of the basic objects it has to offer: Deployments.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-bit-about-pods-first">A Bit About Pods First<a href="https://www.okteto.com/blog/beginners-guide-to-kubernetes-deployments/#a-bit-about-pods-first" class="hash-link" aria-label="Direct link to A Bit About Pods First" title="Direct link to A Bit About Pods First" translate="no">​</a></h2>
<p>Learning about Deployments directly before knowing about Pods is like learning to read without knowing the alphabet. We won’t go into much detail about pods here, but I’ll cover enough so the rest of the article makes sense.</p>
<p><a href="https://www.okteto.com/blog/kubernetes-basics/#:~:text=with%20Okteto!-,Pods,-Kubernetes%20Pods%20are" target="_blank" rel="noopener noreferrer" class="">Pods</a> are the most fundamental unit in the K8s world. The simplest way to understand pods without getting confused is to think of them as a wrapper for containers. Kubernetes doesn’t run containers directly. Instead, it runs Pods, where we specify which containers we want to run. Another thing to remember about pods, which we’ll get back to later, is that in the K8s world, pods are meant to be ephemeral: a single pod runs a single instance of your application, and that’s all there is to it. A running pod is only responsible for ensuring an instance of your application is running.</p>
<p>You can learn more about Pods via our <a href="https://www.okteto.com/blog/kubernetes-basics/" target="_blank" rel="noopener noreferrer" class="">Kubernetes Tutorial for Beginners</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubernetes-vs-docker-deployments">Kubernetes vs Docker Deployments<a href="https://www.okteto.com/blog/beginners-guide-to-kubernetes-deployments/#kubernetes-vs-docker-deployments" class="hash-link" aria-label="Direct link to Kubernetes vs Docker Deployments" title="Direct link to Kubernetes vs Docker Deployments" translate="no">​</a></h2>
<p>When we talk of Deployments in Kubernetes, it is very different from what we mean when we refer to deploying your application using just Docker. This is why I wanted to have a separate section to clarify the difference, so you don’t get confused.</p>
<p>When we talk about deploying using Docker, we usually mean the process of building container images from our Dockerfiles, pushing them to a registry, and then running our application containers.</p>
<p>In the world of Kubernetes, however, Deployments are an <strong>object</strong>. As per the <a href="https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/#kubernetes-objects" target="_blank" rel="noopener noreferrer" class="">official documentation</a>:</p>
<blockquote>
<p>A Kubernetes object is a "record of intent"--once you create the object, the Kubernetes system will constantly work to ensure that object exists.</p>
</blockquote>
<p>These objects are accompanied by <a href="https://www.okteto.com/blog/kubernetes-basics/#:~:text=A%20controller%20in%20K8s%20is%20responsible%20for%20observing%20an%20object%20and%20making%20sure%20that%20the%20current%20state%20of%20that%20object%20matches%20the%20desired%20state%20we%20specified." target="_blank" rel="noopener noreferrer" class="">controllers</a>. So for the Deployment object, there is a Deployment controller. The controllers ensure that the object's current state matches the desired state we specified.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="deployments-in-kubernetes">Deployments in Kubernetes<a href="https://www.okteto.com/blog/beginners-guide-to-kubernetes-deployments/#deployments-in-kubernetes" class="hash-link" aria-label="Direct link to Deployments in Kubernetes" title="Direct link to Deployments in Kubernetes" translate="no">​</a></h2>
<p>So now we know two things: Pods are the fundamental unit in the world of K8s, and Deployments are a type of Kubernetes object. With this, we’re ready to understand the Deployment object in more detail. Let’s consider the following scenario:</p>
<p>You run a bunch of pods to serve your application to the users. Now let’s say there’s a sudden increase in traffic, and your pods start running out of resources. What should Kubernetes do in this case? If you recall, I mentioned that Pods only have the single function of running your application. They alone can’t bring up more pods if existing pods run out of resources.</p>
<p>To help manage pods, we need another Kubernetes object. And that’s where Deployments kick in. Instead of creating individual pods to serve our application, we create a Deployment object. The Deployment controller is then responsible for the management of these pods. All we have to do is create our Deployment object, and then the controller will handle the task of making sure that our specified number of pods is always running. What’s more, is that it also allows us to do other useful things like scale the number of pods, update the version of our application (without any downtime!), and even roll back to a previous app version if we discover a bug. We’ll soon see all of these in action. But let’s now learn how we can create them.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-deployment">Creating a Deployment<a href="https://www.okteto.com/blog/beginners-guide-to-kubernetes-deployments/#creating-a-deployment" class="hash-link" aria-label="Direct link to Creating a Deployment" title="Direct link to Creating a Deployment" translate="no">​</a></h3>
<p>I'll assume you have a K8s cluster ready to work with. If you don’t, you can use the free one provided by the <a href="https://www.okteto.com/docs/core/credentials/kubernetes-credentials" target="_blank" rel="noopener noreferrer" class="">Okteto Platform</a>. If this is your first time interacting with Kubernetes, I will recommend you read our <a href="https://www.okteto.com/blog/kubernetes-basics/" target="_blank" rel="noopener noreferrer" class="">Beginners’ Guide to Kubernetes</a> before continuing with this.</p>
<p>Let us look at what the YAML for a typical Deployment object would look like:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token comment" style="color:rgb(106, 153, 85)"># nginx-deployment.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">apiVersion</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">metadata</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">deployment</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">labels</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">app</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">spec</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">replicas</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">selector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">matchLabels</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">app</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">template</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">metadata</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">labels</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">app</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">spec</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">containers</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">image</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">1.14.2</span><br></div></code></pre></div></div>
<p>Looking at the <code>spec</code> section, you’ll notice we have a property called <code>replicas</code>. This refers to the number of pods we want our Deployment to run. The Deployment controller will continuously check if these many pods are up and running at any given time. If that’s not the case, it will work towards reaching this number by creating more pods or deleting existing ones.</p>
<p>Then under the <code>selector</code>, we specify the labels of the pods for the Deployment controller. This is so that it knows which pods it is supposed to manage. Let’s say in our Deployment object, we specify that we want three replicas, but two pods with the label <code>app: nginx</code> already exist before we create the object. In this case, the controller will only create one additional pod for us. Had we not specified any labels, then the controller wouldn’t have been able to identify that two of the needed pods were already running.</p>
<p>The <code>template</code> section is nothing but a Pod template's metadata and specification section. The <code>metadata</code> section lets the Deployment controller know what labels to attach to any new pods it creates, and the <code>spec</code> section has information about the containers which would run in the pod.</p>
<p>You can create this Deployment just like you would any other object by using the <code>kubectl apply</code> command:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">kubectl apply -f nginx-deployment.yaml</span><br></div></code></pre></div></div>
<p>After creating the Deployment, if you now look at all the objects in our K8s cluster by running:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">kubectl get all</span><br></div></code></pre></div></div>
<p>you’ll notice that we not only have the Deployment, but we also see the three pods which the Deployment created for us!</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">NAME                                   READY   STATUS    RESTARTS   AGE</span><br></div><div class="token-line" style="color:white"><span class="token plain">pod/nginx-deployment-877f48f6d-2zp4p   1/1     Running   0          15s</span><br></div><div class="token-line" style="color:white"><span class="token plain">pod/nginx-deployment-877f48f6d-8tf9g   1/1     Running   0          15s</span><br></div><div class="token-line" style="color:white"><span class="token plain">pod/nginx-deployment-877f48f6d-ptgz8   1/1     Running   0          15s</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)     AGE</span><br></div><div class="token-line" style="color:white"><span class="token plain">service/kubernetes   ClusterIP   10.120.32.1     &lt;none&gt;        443/TCP     223d</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">NAME                               READY   UP-TO-DATE   AVAILABLE   AGE</span><br></div><div class="token-line" style="color:white"><span class="token plain">deployment.apps/nginx-deployment   3/3     3            3           16s</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">NAME                                         DESIRED   CURRENT   READY   AGE</span><br></div><div class="token-line" style="color:white"><span class="token plain">replicaset.apps/nginx-deployment-877f48f6d   3         3         3       16s</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="performing-rolling-updates">Performing Rolling Updates<a href="https://www.okteto.com/blog/beginners-guide-to-kubernetes-deployments/#performing-rolling-updates" class="hash-link" aria-label="Direct link to Performing Rolling Updates" title="Direct link to Performing Rolling Updates" translate="no">​</a></h3>
<p>Let’s say you updated your container image and now want all your pods serving your application using the new image. If you were to manually delete and recreate them, you would face downtime. To avoid this, Kubernetes supports something called Rolling Updates. Rolling updates are the default strategy K8s uses whenever you make any updates to your Deployment. When doing a Rolling update, K8s doesn’t bring down all the pods at once and then bring up all the new ones. Instead, it brings down some pods, then brings up some, and then repeats this process until all old pods have been replaced. This ensures that there are always pods available serving the application to the users.</p>
<p>Let’s see this in action by changing the image used in our nginx deployment:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">kubectl set image deployment nginx-deployment nginx=nginx:1.19.10</span><br></div></code></pre></div></div>
<p>To see the rollout process in action as it proceeds, run:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">kubectl rollout status deployment nginx-deployment</span><br></div></code></pre></div></div>
<p>When you do this, you’ll notice exactly what I described taking place in the logs:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...</span><br></div><div class="token-line" style="color:white"><span class="token plain">Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...</span><br></div><div class="token-line" style="color:white"><span class="token plain">Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...</span><br></div><div class="token-line" style="color:white"><span class="token plain">Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...</span><br></div><div class="token-line" style="color:white"><span class="token plain">Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...</span><br></div><div class="token-line" style="color:white"><span class="token plain">Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...</span><br></div><div class="token-line" style="color:white"><span class="token plain">Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...</span><br></div><div class="token-line" style="color:white"><span class="token plain">Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...</span><br></div><div class="token-line" style="color:white"><span class="token plain">deployment "nginx-deployment" successfully rolled out</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rolling-back-deployments">Rolling Back Deployments<a href="https://www.okteto.com/blog/beginners-guide-to-kubernetes-deployments/#rolling-back-deployments" class="hash-link" aria-label="Direct link to Rolling Back Deployments" title="Direct link to Rolling Back Deployments" translate="no">​</a></h3>
<p>Now let’s say we realize there’s a bug in the latest container image we just updated <code>nginx</code> to. In this case, we would ideally like to return to the last version of our deployment, which we knew was working. K8s allows us to do exactly that using the <code>undo</code> subcommand.</p>
<p>If you run:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">kubectl rollout history deployment nginx-deployment</span><br></div></code></pre></div></div>
<p>you should be able to see all the updates we made to our Deployment. We can go back to any previous version (in the case the first one) by running:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">kubectl rollout undo deployment nginx-deployment --to-revision=1</span><br></div></code></pre></div></div>
<p>Like with Rolling Updates, when rolling back, Kubernetes will ensure that all the pods aren’t brought down all at once to avoid downtime.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scaling-deployments">Scaling Deployments<a href="https://www.okteto.com/blog/beginners-guide-to-kubernetes-deployments/#scaling-deployments" class="hash-link" aria-label="Direct link to Scaling Deployments" title="Direct link to Scaling Deployments" translate="no">​</a></h3>
<p>The number of pods we mention in the <code>replicas</code> section of our Deployment can be updated. This is very useful when we want the number of pods to be changed based on the load. If at some point, there are a lot of users trying to access our application, we would obviously want more pods so there is no overload.</p>
<p>Let’s say we want Kubernetes to increase the number of pods for our deployment if the CPU load of the <a href="https://www.okteto.com/blog/kubernetes-basics/#:~:text=In%20the%20Kubernetes%20world%2C%20a%20machine%20is%20called%20a%20node." target="_blank" rel="noopener noreferrer" class="">node</a> exceeds 80%. But we still want the max number of pods it scales up to to be 7. The <code>autoscale</code> subcommand helps us achieve exactly that:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">kubectl autoscale deployment nginx-deployment --min=3 --max=7 --cpu-percent=80</span><br></div></code></pre></div></div>
<p>Based on this, when the load decreases to less than 80%, it will also automatically start scaling down the number of pods until there are just three running pods.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="making-kubernetes-deployments-easy-for-developers-to-manage">Making Kubernetes Deployments Easy for Developers To Manage<a href="https://www.okteto.com/blog/beginners-guide-to-kubernetes-deployments/#making-kubernetes-deployments-easy-for-developers-to-manage" class="hash-link" aria-label="Direct link to Making Kubernetes Deployments Easy for Developers To Manage" title="Direct link to Making Kubernetes Deployments Easy for Developers To Manage" translate="no">​</a></h2>
<p>I hope you found this introduction to Kubernetes Deployments useful. There is <a href="https://www.okteto.com/blog/kubernetes-basics/" target="_blank" rel="noopener noreferrer" class="">much more</a> to Deployments, but this should be enough to get you started. In today’s world, even developers have to deal with Kubernetes. While that is not ideal, it is becoming almost unavoidable at this point. But the good thing is that if you’re developing cloud native applications, <a href="https://www.okteto.com/" target="_blank" rel="noopener noreferrer" class="">Okteto</a> allows you to continue doing so without having to <a href="https://www.okteto.com/docs/" target="_blank" rel="noopener noreferrer" class="">worry about Kubernetes</a>. Okteto takes care of managing all your Deployments and having a <a href="https://www.okteto.com/docs/welcome/overview/#development-environments" target="_blank" rel="noopener noreferrer" class="">Kubernetes based Development Environment</a> ready for you to develop in - without you having to spend hours configuring things.</p>
<p>Check out our <a href="https://www.okteto.com/docs/getting-started/" target="_blank" rel="noopener noreferrer" class="">Getting Started Guide</a> to see it in action yourself!</p>]]></content:encoded>
            <category>kubernetes</category>
            <category>containers</category>
        </item>
        <item>
            <title><![CDATA[What Is the Kubernetes Release Team and Why You Should Consider Applying]]></title>
            <link>https://www.okteto.com/blog/what-is-the-kubernetes-release-team-and-why-you-should-consider-applying/</link>
            <guid>https://www.okteto.com/blog/what-is-the-kubernetes-release-team-and-why-you-should-consider-applying/</guid>
            <pubDate>Thu, 25 Aug 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Kubernetes 1.25 just got released. I consider myself very lucky to be able to help with the release as the CI Signal Lead and get to work with the amazing folks in the K8s community! If this is something that sounds interesting to you, but you’ve no clue how to get started, then keep reading, and I’ll try to answer most questions people have when getting started with the Kubernetes release team.]]></description>
            <content:encoded><![CDATA[<p>Kubernetes 1.25 just got released. I consider myself very lucky to be able to help with the release as the CI Signal Lead and get to work with the amazing folks in the K8s community! If this is something that sounds interesting to you, but you’ve no clue how to get started, then keep reading, and I’ll try to answer most questions people have when getting started with the Kubernetes release team.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="first-things-first-what-is-the-kubernetes-release-team">First Things First: What Is the Kubernetes Release Team?<a href="https://www.okteto.com/blog/what-is-the-kubernetes-release-team-and-why-you-should-consider-applying/#first-things-first-what-is-the-kubernetes-release-team" class="hash-link" aria-label="Direct link to First Things First: What Is the Kubernetes Release Team?" title="Direct link to First Things First: What Is the Kubernetes Release Team?" translate="no">​</a></h2>
<p>Kubernetes has grown exponentially in the last few years and has seen adoption by countless companies. But at the end of the day, it is still an open source project being maintained by the community! For each new Kubernetes release, there is a team of community members assembled that is responsible for the day-to-day work which goes into successfully releasing the next version of Kubernetes. This is the Kubernetes Release Team.</p>
<figure class="figure_HOu8 float-center_VJCd"><img src="https://www.okteto.com/blog/assets/images/5d43707e86d4-85f0eb6454bc1354025c8cd909d15b73.webp" alt="Photo of avengers captioned: &quot;Release Team Assemble!!&quot;" loading="lazy"></figure>
<p>The release team is further divided into various sub-teams to ensure the smooth functioning of all horizontals. Each release has a Release Lead, and they are helped by 3-4 Release Lead Shadows. The same is true for each subteam: there is the subteam lead, accompanied by 4-5 shadows. You start in the release team as one of the subteam’s shadows and can eventually grow your way up to the Release Lead!</p>
<p>If you’d like to know more about the various roles on the release team, you can check out the <a href="https://github.com/kubernetes/sig-release/tree/master/release-team/role-handbooks" target="_blank" rel="noopener noreferrer" class="">official role handbooks</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="my-personal-experience-with-the-release-team">My Personal Experience With the Release Team<a href="https://www.okteto.com/blog/what-is-the-kubernetes-release-team-and-why-you-should-consider-applying/#my-personal-experience-with-the-release-team" class="hash-link" aria-label="Direct link to My Personal Experience With the Release Team" title="Direct link to My Personal Experience With the Release Team" translate="no">​</a></h3>
<p>I started with the Kubernetes 1.23 Release Team as a CI Signal Shadow. The CI Signal Team is responsible for monitoring the CI throughout the release and ensuring any test failures get fixed before the release. Then in the 1.24 cycle, I shadowed under the Release Notes team. This team is tasked with making sure the release notes for the upcoming release are proper. In the recent 1.25 release, I returned to the CI Signal Team but as the role lead this time.</p>
<p>My every time on the release team, I learned a lot. Being a shadow in the first two cycles gave me the time to understand how the release process for a project as big as Kubernetes works. One of my biggest learnings, and one of my biggest surprises as well, was watching and learning how to collaborate effectively when you’re working on such a big open source project, with so many contributors, distributed across multiple timezones! I’m, to date, awestruck looking at what all the team manages to accomplish. My time leading the CI Signal team in 1.25 also taught me how to mentor and set others up for success. I feel this is something very important for the health of open source projects because if present project maintainers fail to enable others: the project will eventually die. Open source is always a team effort, and ensuring you’re mentoring new contributors to lead in the future is as critical as fixing issues!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-should-i-consider-applying">Why Should I Consider Applying?<a href="https://www.okteto.com/blog/what-is-the-kubernetes-release-team-and-why-you-should-consider-applying/#why-should-i-consider-applying" class="hash-link" aria-label="Direct link to Why Should I Consider Applying?" title="Direct link to Why Should I Consider Applying?" translate="no">​</a></h2>
<p>One of the reasons you should consider joining the release team is if you were already looking to get started with contributing to the Kubernetes project. Kubernetes is HUGE. While full of helpful people, jumping in and figuring out how the open source project works can be scary and overwhelming. Joining the release team, in my opinion, is one of the best ways to get started with contributing to the project. Joining as a shadow allows you to directly get mentored by the role lead and the broader release team. Not only do you end up learning about the release process, but you also get to learn a lot about how the open source K8s project is structured. Thanks to your time on the release team, you’ll have a much better idea of all the verticals that exist in the project.</p>
<p>Other than that, being on the release team itself brings with it a lot of learnings. Depending on what area you want to grow in, there’s a lot to learn in every role. For example, if Documentation interests you, you could apply to be a Docs shadow. As part of this, you’ll be chasing pull requests to the Kubernetes documentation and will, in turn, get exposed to various things one needs to consider when maintaining and writing documentation for a project as big as K8s. Similarly, if you want to learn more about how the CI and testing are done for K8s releases, you could apply to be on the CI Signal team. Regardless of the role you apply to, I can assure you there will be a lot of opportunities for you to learn and gain experience!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="okay-im-sold-how-do-i-apply">Okay, I’m Sold: How Do I Apply?<a href="https://www.okteto.com/blog/what-is-the-kubernetes-release-team-and-why-you-should-consider-applying/#okay-im-sold-how-do-i-apply" class="hash-link" aria-label="Direct link to Okay, I’m Sold: How Do I Apply?" title="Direct link to Okay, I’m Sold: How Do I Apply?" translate="no">​</a></h2>
<p>Now that you know how cool and exciting being part of the Release Team is, I know you probably want to apply right away. But how do you do that?</p>
<p>A few weeks before each release cycle begins, an application form is floated to apply to be on the release team. You can receive notifications for this if you join the Kubernetes dev mailing list:&nbsp;<a href="https://groups.google.com/a/kubernetes.io/g/dev" target="_blank" rel="noopener noreferrer" class="">https://groups.google.com/a/kubernetes.io/g/dev</a></p>
<blockquote>
<p>You can find the application form for the current 1.26 Release team <a href="https://bit.ly/k8s126-shadow-form" target="_blank" rel="noopener noreferrer" class="">here</a> :) Open till September 2nd, 2022</p>
</blockquote>
<p>The application form does a pretty good job of explaining what is expected in your responses, so I won’t get into that in this blog. But I do want to point out something which I’ve seen discourage a lot of people. It is okay to not be selected the first time, and you should totally keep applying again if you’re interested! You have no idea the number of applications the release team receives each cycle for its limited number of roles.</p>
<p>I personally know folks who got accepted on their fourth application. I, too, didn’t get accepted the first time I applied. I won’t sugarcoat and say that it doesn’t feel demotivating to get your application rejected, because I know how it feels! But what I want to emphasize is that not getting selected isn’t a reflection of your skills at all! Having experienced selecting shadows for the CI Signal team in 1.25, I can tell how sad it feels passing on so many deserving candidates simply because of having limited bandwidth to mentor folks.</p>
<p>So please don’t lose faith if you don’t get accepted the first few times you apply. I would say that having had prior contributions to the project or just researching about your role properly definitely helps your application significantly!</p>
<p>All the best for your application, and I hope to see you grow in the Release Team. Also, if you’re looking to learn more about Kubernetes, checkout our <a href="https://www.okteto.com/blog/kubernetes-basics/" target="_blank" rel="noopener noreferrer" class="">Kubernetes Tutorial for Beginners</a>!</p>]]></content:encoded>
            <category>kubernetes</category>
            <category>open-source</category>
        </item>
        <item>
            <title><![CDATA[Developing Microservices by Hot Reloading on Kubernetes Clusters]]></title>
            <link>https://www.okteto.com/blog/developing-microservices-by-hot-reloading-on-kubernetes-clusters/</link>
            <guid>https://www.okteto.com/blog/developing-microservices-by-hot-reloading-on-kubernetes-clusters/</guid>
            <pubDate>Thu, 11 Aug 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Let me jog your memory with how we used to develop applications not so long ago. We would bring up the application, write some code, hit save, see our changes, and iterate accordingly. It was fun, no?]]></description>
            <content:encoded><![CDATA[<p>Let me jog your memory with how we used to develop applications not so long ago. We would bring up the application, write some code, hit save, see our changes, and iterate accordingly. It was fun, no?</p>
<!-- -->
<p>Huge jumps in deployment practices changed the game, however. Two problems emerged:</p>
<ul>
<li class="">We started breaking down our monoliths into multiple microservices. This meant it was no longer one single command to bring up the application during development. These microservices required configuration with each other, and we, as developers, had to start spending more and more time on this phase of setting up our development environment.</li>
<li class="">Even after doing all the hard work we talked about when we coded our changes, we lost that sense of certainty we had earlier - that our changes would work in production as expected. This is because bringing the microservices up locally no longer mimics the production environment. With <a href="https://www.okteto.com/blog/kubernetes-basics/" target="_blank" rel="noopener noreferrer" class="">Kubernetes</a> in the picture, replication of the production environment during development became tougher and tougher.</li>
</ul>
<p>But what if I tell you there is a free and open source solution for both these woes? The solution I’m talking about is <a href="https://github.com/okteto/okteto" target="_blank" rel="noopener noreferrer" class="">Okteto CLI</a>.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Stay on Top of Kubernetes Best Practices &amp; Trends</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/ebooks/dzone-kubernetes/" target="_self">Download the Trend Report</a></div></section>
<p>Okteto CLI deploys your microservices to a <a href="https://www.okteto.com/blog/kubernetes-basics/" target="_blank" rel="noopener noreferrer" class="">Kubernetes</a> cluster and allows you to develop them directly there - so basically, hot reloading on Kubernetes clusters! It combats both the problems we discussed:</p>
<ul>
<li class="">With Okteto CLI, you can bring up all the microservices you require during development with just one single command. No configuration is required by developers since it uses already existing manifests - the ones that are used to deploy to the production Kubernetes clusters.</li>
<li class="">Once you have your microservices deployed, Okteto CLI allows you to develop them directly on a Kubernetes cluster. So you’ll make a code change, hit save, and immediately see the results in the deployed version of your application. Since the results you see are on an actual Kubernetes cluster, you can be sure that what you’re seeing is what you’ll get when you push to production.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-our-arsenal">Setting Up Our Arsenal<a href="https://www.okteto.com/blog/developing-microservices-by-hot-reloading-on-kubernetes-clusters/#setting-up-our-arsenal" class="hash-link" aria-label="Direct link to Setting Up Our Arsenal" title="Direct link to Setting Up Our Arsenal" translate="no">​</a></h2>
<p>Now that you know what Okteto CLI is and how it helps, let’s see all of this in action. In this article, we’ll use a <a href="https://cloud.google.com/kubernetes-engine" target="_blank" rel="noopener noreferrer" class="">GKE cluster</a> and develop a simple application consisting of a couple of microservices using Okteto CLI. But this works for any Kubernetes cluster (even <a href="https://minikube.sigs.k8s.io/docs/start/" target="_blank" rel="noopener noreferrer" class="">minikube</a>!) and regardless of the number of microservices your application has!</p>
<blockquote>
<p>Looking to refresh your K8s knowledge? Check out our <a href="https://www.okteto.com/blog/kubernetes-basics/" target="_blank" rel="noopener noreferrer" class="">Kubernetes Basics tutorial</a>!</p>
</blockquote>
<p>The first step is installing Okteto CLI. You can install Okteto CLI for macOS and Linux by simply running:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">curl https://get.okteto.com -sSfL | sh</span><br></div></code></pre></div></div>
<p>For detailed install instructions, you can check out the <a href="https://www.okteto.com/docs/getting-started/#installing-okteto-cli" target="_blank" rel="noopener noreferrer" class="">documentation</a>.</p>
<p>Once you have Okteto CLI installed, you’ll need to configure it to work with your GKE cluster (or any other Kubernetes cluster you might be using). Okteto CLI uses <a href="https://www.okteto.com/docs/reference/cli/#context" target="_blank" rel="noopener noreferrer" class="">contexts</a> to manage which clusters you want to launch your <a href="https://www.okteto.com/docs/reference/development-environments/" target="_blank" rel="noopener noreferrer" class="">dev environments</a> with. Any clusters part of your <a href="https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/" target="_blank" rel="noopener noreferrer" class="">kubeconfig</a> are automatically picked up by Okteto CLI. So let’s first add the entry for our GKE cluster to our kubeconfig.</p>
<p>If you head over to your cluster in your GKE console, you should see a button called “Connect” at the top, which will prompt you to the command you need to run in order to add the cluster to your kubeconfig.</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/37785f8aaaac-f9970ef241a173aa6a18d119c7a3654a.webp" width="1904" height="434" class="img_ev3q"></p>
<p>Once you do that, you should be able to see it in the lists of contexts when you run:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ kubectl config get-contexts</span><br></div><div class="token-line" style="color:white"><span class="token plain">CURRENT   NAME                                        CLUSTER                                     AUTHINFO                                    NAMESPACE</span><br></div><div class="token-line" style="color:white"><span class="token plain">*         gke_development-xyz                         gke_development-xyz                         gke_development-xyz</span><br></div></code></pre></div></div>
<p>You should now also be able to see it under your Okteto contexts now by running:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ okteto ctx ls</span><br></div><div class="token-line" style="color:white"><span class="token plain">Name                                       Namespace     Builder                                 Registry</span><br></div><div class="token-line" style="color:white"><span class="token plain">https://okteto.example.com *               rinkiyakedad  tcp://buildkit.okteto.example.com:1234  registry.okteto.example.com</span><br></div><div class="token-line" style="color:white"><span class="token plain">gke_development-xyz                        default       docker                                  -</span><br></div></code></pre></div></div>
<p>You might or might not see other contexts based on your configuration. You can switch to the one you want (the GKE one in this case) by running:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ okteto ctx use gke_development-xyz</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="launching-our-development-environment">Launching Our Development Environment<a href="https://www.okteto.com/blog/developing-microservices-by-hot-reloading-on-kubernetes-clusters/#launching-our-development-environment" class="hash-link" aria-label="Direct link to Launching Our Development Environment" title="Direct link to Launching Our Development Environment" translate="no">​</a></h2>
<p>Okay, now that we have all our setup done, we’re ready to do the fun bits of developing our application. For this article, we’ll be using a simple Movies application, the code for which is present at:&nbsp;<a href="https://github.com/okteto/movies-with-vanilla-k8s" target="_blank" rel="noopener noreferrer" class="">https://github.com/okteto/movies-with-vanilla-k8s</a></p>
<p>Along with the code making up all the microservices in this application, the repository also contains a <a href="https://helm.sh/" target="_blank" rel="noopener noreferrer" class="">Helm</a> <a href="https://helm.sh/docs/topics/charts/" target="_blank" rel="noopener noreferrer" class="">chart</a> for each microservice. These are the same helm charts used to deploy the application to production. Okteto CLI will also rely on them to deploy the microservices to the Kubernetes cluster we just connected it to. Using the same manifests as prod is what makes sure that our development environment is exactly like production.</p>
<p>Let’s first clone our application code locally:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ git clone https://github.com/okteto/movies-with-vanilla-k8s.git</span><br></div><div class="token-line" style="color:white"><span class="token plain">$ cd movies-with-vanilla-k8s</span><br></div></code></pre></div></div>
<p>Now let’s launch our Kubernetes based development environment by running:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ okteto up</span><br></div></code></pre></div></div>
<p>This is the one single command I mentioned earlier that replaces all the exhausting setup developers usually need to do these days to get started developing. On running this command, Okteto CLI first checks if all required microservices have been deployed to the cluster or not. If not, like in this case, it first deploys them. If you look at the logs carefully, you’ll see exactly this:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">i  Deploying development environment 'movies-with-vanilla-k8s'...</span><br></div><div class="token-line" style="color:white"><span class="token plain">i  To redeploy your development environment manually run 'okteto deploy' or 'okteto up --deploy'</span><br></div><div class="token-line" style="color:white"><span class="token plain">i  Images were already built. To rebuild your images run 'okteto build' or 'okteto deploy --build'</span><br></div><div class="token-line" style="color:white"><span class="token plain">i  Running helm upgrade --install movies chart --set api.image=${OKTETO_BUILD_API_IMAGE} --set frontend.image=${OKTETO_BUILD_FRONTEND_IMAGE}</span><br></div><div class="token-line" style="color:white"><span class="token plain">Release "movies" does not exist. Installing it now.</span><br></div><div class="token-line" style="color:white"><span class="token plain">NAME: movies</span><br></div><div class="token-line" style="color:white"><span class="token plain">LAST DEPLOYED: Thu Aug  4 12:52:18 2022</span><br></div><div class="token-line" style="color:white"><span class="token plain">NAMESPACE: default</span><br></div><div class="token-line" style="color:white"><span class="token plain">STATUS: deployed</span><br></div></code></pre></div></div>
<p>Once Okteto CLI is done deploying, it will prompt you to choose which one of your microservices you want to develop:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">Select the development container you want to activate:</span><br></div><div class="token-line" style="color:white"><span class="token plain">Use the arrow keys to navigate: ↓ ↑ → ←</span><br></div><div class="token-line" style="color:white"><span class="token plain">  ▸ api</span><br></div><div class="token-line" style="color:white"><span class="token plain">    frontend</span><br></div></code></pre></div></div>
<p>Let's select the <code>api</code> one for now. Once you do that, you'll see that Okteto CLI will replace the container running for that microservice in the Kubernetes cluster with a development container. What's special about this development container is that it syncs all the code changes we make on our local machine with the code running in the cluster. This means as soon as we hit save, we would be able to see the result of our changes in a deployed version of our application.</p>
<p>Another thing you'll notice is that Okteto CLI has also given you access to a shell in the container running our microservice. The shell is currently already running <a href="https://nodemon.io/" target="_blank" rel="noopener noreferrer" class="">nodemon</a> for us. Having a shell in the container is useful because it ensures that you still have the ability to launch all the commands you would run on your local terminal when developing.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="developing-our-application">Developing Our Application<a href="https://www.okteto.com/blog/developing-microservices-by-hot-reloading-on-kubernetes-clusters/#developing-our-application" class="hash-link" aria-label="Direct link to Developing Our Application" title="Direct link to Developing Our Application" translate="no">​</a></h2>
<p>Before we develop our application, let's see how it looks. Based on our deployment manifests, we would have an <a href="https://kubernetes.io/docs/concepts/services-networking/ingress/" target="_blank" rel="noopener noreferrer" class="">ingress resource</a> called <code>movies</code> where we should be able to go and visit our application. You might need to wait a couple of minutes before your ingress is ready. Run the following command to get the ingress address we need to visit:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ kubectl get ingress</span><br></div><div class="token-line" style="color:white"><span class="token plain">NAME     CLASS    HOSTS   ADDRESS         PORTS   AGE</span><br></div><div class="token-line" style="color:white"><span class="token plain">movies   &lt;none&gt;   *       34.110.194.92   80      5m31s</span><br></div></code></pre></div></div>
<p>If you visit the <code>ADDRESS</code> shown, you should be able to see your application.</p>
<p><img decoding="async" loading="lazy" alt="Frontend for the movies application" src="https://www.okteto.com/blog/assets/images/0d1e145074ff-117fe5f5df11fccb134179803570d9e2.webp" width="1904" height="1012" class="img_ev3q"></p>
<p>But something doesn’t look quite right here, does it? The list of movies shown is the same in both cases. Let’s now use our newly launched development environment to fix this. If you look at line 43 in <code>api/server.js</code>, you might spot what’s going wrong. The list of movies displayed under “watching” is also being pulled from the “movies” database collection. Let’s change that to the “watching” collection and see what happens. Edit line 43 to:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">db</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">collection</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'watching'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">find</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token method function property-access" style="color:rgb(220, 220, 170)">toArray</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token parameter">err</span><span class="token parameter punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token parameter"> results</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(212, 212, 212)">=&gt;</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><br></div></code></pre></div></div>
<p>and hit save. Now go back to your browser and refresh the page!</p>
<p><img decoding="async" loading="lazy" alt="Fixed version of the Movies application" src="https://www.okteto.com/blog/assets/images/e1993208e76b-438a0900bcc2f791f5943b7aa9b12b38.webp" width="1903" height="1011" class="img_ev3q"></p>
<p>Notice how the list got updated automatically. The cool thing is that this is in the deployed version of the application running on the GKE cluster. This is what I’ve been referring to since the start of the article: hot reloading on Kubernetes clusters!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/developing-microservices-by-hot-reloading-on-kubernetes-clusters/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>What I just showed you was a very simple application with just two microservices. But imagine when your application consists of 15 or more microservices. Getting feedback for your changes then becomes almost impossible without spending a lot of time configuring things. And all this time spent on configuration takes a massive hit on developer productivity.</p>
<p>The beauty of this approach is that developing applications this way ensures that the feedback process is not only instantaneous but also genuine. Because we see the results for the changes we make on an actual Kubernetes cluster, we can be sure that nothing will break when we push to the production Kubernetes cluster. Okteto CLI uses the same manifests you use to deploy to production, so you can be sure that what you see is what you’ll get when you push to production.</p>
<p>We have always agreed that it is best to develop in an environment as close to production as possible. Since Kubernetes came into the picture, we started failing in our attempts to improve the development environment. Instead, we resorted to CI pipelines and staging environments to ensure that the code we ship works. But the problem with those approaches is that they are far from the developer - they give you feedback after you’re done writing and committing your code. Okteto CLI improves on that by allowing you to develop in an environment that is exactly like production and gives you instantaneous feedback as soon as you hit save!</p>]]></content:encoded>
            <category>kubernetes</category>
            <category>open-source</category>
            <category>okteto-cli</category>
        </item>
        <item>
            <title><![CDATA[Kubernetes Basics: Kubernetes Tutorial for Beginners]]></title>
            <link>https://www.okteto.com/blog/kubernetes-basics/</link>
            <guid>https://www.okteto.com/blog/kubernetes-basics/</guid>
            <pubDate>Wed, 27 Jul 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[What you need to know to get started with Kubernetes to deliver and manage containerized applications.]]></description>
            <content:encoded><![CDATA[<p>Are you tired of listening to everyone in <a href="https://www.atlassian.com/devops" target="_blank" rel="noopener noreferrer" class="">DevOps</a> talk about "Kubernetes" while you're still struggling with how to pronounce it? Unless you started programming today, I'm pretty sure you have heard the word <a href="https://www.redhat.com/en/resources/kubernetes-adoption-security-market-trends-overview" target="_blank" rel="noopener noreferrer" class="">Kubernetes</a>. Still, you most likely haven't gotten the chance to learn about it - maybe because it seems intimidating or because you aren't sure how it's useful.</p>
<!-- -->
<video controls="" preload="metadata" class="video_QmVR"><source src="https://cdn.sanity.io/files/6icyfeiq/production/28c43c75a0b3e9e3d1a4d7648107c5495c9f62b0.mp4" type="video/mp4"></video>
<p>This Kubernetes Tutorial will take you on a journey from being clueless about Kubernetes to one who has an excellent grasp of all the Kubernetes Basics. In the process, you'll also start appreciating its beauty and usefulness in increasing developer productivity. We have a lot to cover throughout this guide, so let's jump in and learn all about Kubernetes!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-death-of-it-works-on-my-machine">The Death Of "It Works On My Machine!"<a href="https://www.okteto.com/blog/kubernetes-basics/#the-death-of-it-works-on-my-machine" class="hash-link" aria-label="Direct link to The Death Of &quot;It Works On My Machine!&quot;" title="Direct link to The Death Of &quot;It Works On My Machine!&quot;" translate="no">​</a></h2>
<p>It's essential to have an understanding of containers before getting started with Kubernetes. Containers are executable software packages containing all the code and dependencies necessary to run any application. And by anywhere, I mean anywhere - my laptop, your laptop, or even on "the cloud."</p>
<p>Are containers starting to sound similar to virtual machines? Well, they're not, and they're even better! Why? Because, unlike VMs, containers do not contain operating system images. This means they're much more lightweight! To create and run containers locally, you would use a container engine like Docker.</p>
<p>Containers grew in popularity because they genuinely embraced the ideology of write once, run anywhere. Because of how fast and easy it is to deploy containers, they increased developer productivity significantly. A fun fact is that <a href="https://www.okteto.com/docs/getting-started/#step-4-activate-your-development-container" target="_blank" rel="noopener noreferrer" class="">Okteto also utilizes these containers</a> to give you a live preview of the changes you make while developing locally.</p>
<p>But a new problem arose as more companies started using containers. How do you manage thousands of containers running on distributed systems? And that's where Kubernetes saved the day!</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Stay on Top of Kubernetes Best Practices &amp; Trends</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/ebooks/dzone-kubernetes/" target="_self">Download the Trend Report</a></div></section>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-kubernetes-used-for">What is Kubernetes Used For?<a href="https://www.okteto.com/blog/kubernetes-basics/#what-is-kubernetes-used-for" class="hash-link" aria-label="Direct link to What is Kubernetes Used For?" title="Direct link to What is Kubernetes Used For?" translate="no">​</a></h2>
<p>Kubernetes, often abbreviated as K8s, is a <a href="https://www.okteto.com/blog/kubernetes-containerization/" target="_blank" rel="noopener noreferrer" class="">container orchestration platform</a>. Let me explain this in straightforward terms.</p>
<p>Let's say you have your app, which you have containerized. So you run a bunch of containers to serve your app to users. But how do you manage these different containers? The situation is complicated even more by the fact that these containers needn't necessarily be running on the same machine!</p>
<p>This is where K8s comes to the rescue. Kubernetes makes deploying, managing, and scaling containerized workloads a breeze! I want to explicitly call out here that K8s is NOT a <strong>container engine</strong> like Docker. Rather it is a <strong>container orchestrator</strong>.</p>
<p>As a developer, you won't need to worry about "how" Kubernetes does all this orchestration. You will probably not have to set up a Kubernetes cluster for your application. But what you would mostly be doing is interacting with a cluster set up for you by the infrastructure team. So it becomes crucial to learn about the Kubernetes objects you'll be interacting with. We'll focus on that in the later sections of this guide.</p>
<p>Before we do that, let's have a high-level idea about Kubernetes' architecture so that you're not clueless about what is happening under the hood.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learn-kubernetes-architecture-basics">Learn Kubernetes Architecture Basics<a href="https://www.okteto.com/blog/kubernetes-basics/#learn-kubernetes-architecture-basics" class="hash-link" aria-label="Direct link to Learn Kubernetes Architecture Basics" title="Direct link to Learn Kubernetes Architecture Basics" translate="no">​</a></h2>
<p>In the Kubernetes world, a machine is called a node. A K8s "cluster" is simply a group of nodes that run your containerized application. These nodes may be bare metal servers in your home or instances you're running on a cloud provider. These nodes are also of two types: worker and master.</p>
<p><img decoding="async" loading="lazy" alt="An image showing the different types of kubernetes nodes: Master Node, Worker Node, Worker Node" src="https://www.okteto.com/blog/assets/images/dd7c8406fa94-a56312f56de46a338b771688b857da39.webp" width="1356" height="722" class="img_ev3q"></p>
<p>The worker nodes are where your application's containers would be running. Kubernetes uses an object called Pod to run these containers but more on that in a section below. Three essential things running on a worker node in a Kubernetes cluster are:</p>
<ol>
<li class="">Container runtime: This should be no surprise since a container runtime is what is responsible for running containers. Kubernetes supports multiple container runtimes, including Docker and containerd.</li>
<li class="">kubelet: This is the agent which is responsible for communicating with the Kubernetes control plane running on the master node. It is responsible for executing any instructions it receives from the control plane. It also makes sure that containers are running in the pods properly.</li>
<li class="">kube-proxy: This is a network proxy running on each node. Not going into much detail, you can think of it as being responsible for network communications within and outside the cluster. We'll be exploring how all these communications happen between pods later in this guide.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="Kubernetes cluster showing the control plane and compute machines" src="https://www.okteto.com/blog/assets/images/76da69af005d-cc12f33ea02e91c92ac0df5a3ad437fd.webp" width="1518" height="1186" class="img_ev3q"></p>
<p>The master node is the one that has all the components of the Kubernetes control plane running on it. You can also set up multiple master nodes for high availability. Following are some important control plane components you should be familiar with:</p>
<ol>
<li class="">kube-apiserver: This exposes the Kubernetes API, which we can use to talk to our K8s cluster. You can think of the kube-apiserver as the frontend for the Kubernetes control plane.</li>
<li class="">etcd: This is the distributed key-value store where all cluster-related data is stored. For security reasons, it is only accessible through the API server. This restriction also helps ensure that the data stored in etcd is consistent.</li>
<li class="">kube-scheduler: This is responsible for scheduling pods on available worker nodes. While scheduling, it takes into consideration the resource requirements of the pod and any other constraints that we specify.</li>
<li class="">kube-controller-manager: A controller in K8s is responsible for observing an object and making sure that the current state of that object matches the desired state we specified. There are various controllers in K8s for different objects. All these are combined into a single binary which is the kube-controller-manager.</li>
<li class="">cloud-controller-manager: This component lets you link your cluster to a cloud provider. This binary contains all the cloud provider-specific controllers. So when something like a node termination happens in the cloud provider, this component will be responsible for handling that.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-started-with-kubernetes">Getting Started With Kubernetes<a href="https://www.okteto.com/blog/kubernetes-basics/#getting-started-with-kubernetes" class="hash-link" aria-label="Direct link to Getting Started With Kubernetes" title="Direct link to Getting Started With Kubernetes" translate="no">​</a></h2>
<p>In the Kubernetes world, everything is an object. An object is something you create in Kubernetes to give it a configuration of sorts so that it knows how to run and serve your application. Once you create K8s objects describing your application, the controllers work to ensure that the object's current state matches the desired state.</p>
<p>There are many Kubernetes objects, some of which you already would have come across if you tried the Okteto <a href="https://www.okteto.com/docs/getting-started/" target="_blank" rel="noopener noreferrer" class="">Quick Start Guide</a>. This section will discuss three very important objects: Pods, Deployments, and Namespaces. Trying out the things mentioned here by yourself is highly recommended if you want to be comfortable using K8s.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pods">Pods<a href="https://www.okteto.com/blog/kubernetes-basics/#pods" class="hash-link" aria-label="Direct link to Pods" title="Direct link to Pods" translate="no">​</a></h3>
<p>Kubernetes Pods are the smallest and most fundamental of objects in Kubernetes. Instead of running containers directly on nodes, Kubernetes runs them inside pods. So think of a pod basically as a wrapper for your Kubernetes containers. A pod usually runs a single container but can also have multiple containers. What's important to remember is that all the containers of a pod will run on the same node, sharing the same network and resources. Another important thing to remember about Pods is that they are immutable. While you can change the image being used to run the container in the Pod, you can not update fields like the name of the Pod or the name of the namespace.</p>
<p>You would usually containerize your application's frontend and backend parts and have these containers run in separate pods. We saw this in the <a href="https://okteto.com/docs/getting-started/" target="_blank" rel="noopener noreferrer" class="">Quick Start Guide</a>. If you open a terminal and run the command below, you will see these pods. Additionally, you'll see another pod running a MongoDB container used as our application's database.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">kubectl get pods</span><br></div></code></pre></div></div>
<p>Each pod has a unique IP address assigned to it. While you can't ping this IP address from outside the cluster, you can ping from within your Kubernetes cluster.</p>
<p>Let's do something exciting, shall we? Let's launch a pod and use that to ping our existing frontend pod. To create an object in Kubernetes, a Pod, in this case, there are two ways: declarative and imperative. The declarative method involves writing a YAML file describing the object, whereas the imperative method uses kubectl. <a href="https://kubernetes.io/docs/tasks/tools/" target="_blank" rel="noopener noreferrer" class="">kubectl</a> is a command-line tool that allows you to <a href="https://www.okteto.com/blog/kubectl-cheat-sheet/" target="_blank" rel="noopener noreferrer" class="">talk to your Kubernetes cluster</a>. Let's use the imperative way here and run:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">kubectl run temp-pod --image=busybox -it -- /bin/sh</span><br></div></code></pre></div></div>
<p>This command does a couple of things for us. <code>kubectl run</code> creates a Pod named "temp-pod" and runs a container inside it using the "busybox" <a href="https://www.okteto.com/blog/how-to-speed-up-container-image-builds/" target="_blank" rel="noopener noreferrer" class="">image</a>. The <code>-it</code> is used to give us access to a shell inside this pod, and we also specify that we want to run <code>/bin/sh</code> as the first command in this shell. You should also be able to see this pod on your Okteto Dashboard. Now let us get the IP address of the frontend pod so we can ping it. To do that, in another terminal, run:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">kubectl get pods -o wide</span><br></div></code></pre></div></div>
<p>The <code>kubectl get</code> command can get all kubernetes objects of a particular type. Here we use it to get all pods. The <code>-o wide</code> flag tells us to provide even more details like the IP addresses of the Pods. Once you copy the IP address of the pod, go back to the shell inside the "temp-pod" and run the command below.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">wget -O- &lt;IP Address&gt;</span><br></div></code></pre></div></div>
<p>You should see an output like:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">Connecting to 10.8.6.136 (10.8.6.136:80)</span><br></div><div class="token-line" style="color:white"><span class="token plain">writing to stdout</span><br></div><div class="token-line" style="color:white"><span class="token plain">&lt;!DOCTYPE html&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">&lt;html&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">&lt;head&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">&lt;title&gt;Movies&lt;/title&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">&lt;meta charset="utf-8"&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">&lt;meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">&lt;link rel="icon" href="favicon.png"&gt;&lt;script defer src="app.770412f1098441c2c698.js"&gt;&lt;/script&gt;&lt;/head&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">&lt;body&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">&lt;div id="root"&gt;&lt;/div&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">&lt;/body&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">&lt;/html&gt;</span><br></div><div class="token-line" style="color:white"><span class="token plain">-</span><br></div><div class="token-line" style="color:white"><span class="token plain">100% |************************************************************************************************************| 353 0:00:00 ETA</span><br></div><div class="token-line" style="color:white"><span class="token plain">written to stdout</span><br></div></code></pre></div></div>
<p>How cool, right? To destroy this pod, you can select it in your Dashboard and click "Destroy". If you want to go the <code>kubectl</code> route, you can run <code>kubectl delete pod temp-pod</code> in your terminal. The <code>kubectl delete</code> command works for all Kubernetes objects and takes the object type and name as arguments.</p>
<p><img decoding="async" loading="lazy" alt="An image of the Okteto Dashboard and an arrow pointing to destroy a pod using the button in the okteto Dashboard" src="https://www.okteto.com/blog/assets/images/c0395ab6a68b-0ba8031087cf74b727a6d1cf8f9d84e5.webp" width="745" height="323" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="deployments">Deployments<a href="https://www.okteto.com/blog/kubernetes-basics/#deployments" class="hash-link" aria-label="Direct link to Deployments" title="Direct link to Deployments" translate="no">​</a></h3>
<p>So you might be wondering why Kubernetes doesn't run containers directly instead of running Pods. This is because Pods are ephemeral and having containers in Pods enables easy replication - which is one of the most important features of K8s.</p>
<p>A single Kubernetes pod runs a single instance of your application. You would never create individual pods to serve your application. Why? Because that would mean if the traffic suddenly increases, your Pod will run out of resources, and you will face downtime. Instead, you create a bunch of identical pods. If one of these pods goes down or the traffic increases and you need more pods, Kubernetes will bring up more pods. The deployment controller does this management of multiple similar pods when you create a Deployment object.</p>
<p>I think you can now see why it's recommended to create a <a href="https://www.okteto.com/blog/beginners-guide-to-kubernetes-deployments/" target="_blank" rel="noopener noreferrer" class="">Deployment</a> instead of Pods. The Deployment object will further create and manage the Pods for you. If you look closely at your Dashboard, you'll see that <code>api</code> and <code>frontend</code> are Deployments. This is why when you did <code>kubectl get pods</code>, the pods were not called <code>api</code> and <code>frontend</code> and instead had some random string added to the end. This helps tell that the pods were created by the deployment and not us directly.</p>
<p>Let's not take my word for it and verify that Pods are indeed actually managed by their Deployments :)</p>
<p>Go to your terminal and see the name of the pod created by the API deployment. After that, delete the pod by running</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">kubectl delete pod &lt;api pod name&gt;</span><br></div></code></pre></div></div>
<p>Now run <code>kubectl get pods</code> again, and you'll see another pod coming up in its place with a different name. This is because Okteto told Kubernetes to create a deployment that ensures that at least one API pod runs at all times. You can also see this in the YAML used to create the deployment from your Dashboard:</p>
<p><img decoding="async" loading="lazy" alt="See the number of replicas in the okteto Dashboard" src="https://www.okteto.com/blog/assets/images/e932c448c686-9a8078755a381b9939fedf2aa8aada6c.webp" width="834" height="389" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="namespaces">Namespaces<a href="https://www.okteto.com/blog/kubernetes-basics/#namespaces" class="hash-link" aria-label="Direct link to Namespaces" title="Direct link to Namespaces" translate="no">​</a></h3>
<p>If you took a closer look at your Okteto Dashboard, you'd see something called "Namespace" in the top right corner. If you click that, you'll also see the option to create a new namespace.</p>
<p><img decoding="async" loading="lazy" alt="Screenshot of how to create a new namespace directly with the Okteto dashboard" src="https://www.okteto.com/blog/assets/images/15284ef1ff17-507d4d685635a62f89a219a6d6f3263c.webp" width="594" height="345" class="img_ev3q"></p>
<p>Namespaces in Kubernetes are a way to partition your cluster into multiple virtual clusters. You always deploy K8s objects (like Pods, Deployments, etc) in a particular namespace. Deploying different objects in different namespaces allows you to isolate different projects on the same cluster.</p>
<p>Let's see this in action. Click on "New Namespace" in the dropdown shown above and enter a name - I'm going to go with "golang-rinkiyakedad". Now switch to this namespace from the same menu and deploy using the same steps you followed in the <a href="https://www.okteto.com/docs/getting-started/" target="_blank" rel="noopener noreferrer" class="">Quick Start Guide</a>, except that use <a href="https://github.com/okteto/go-getting-started" target="_blank" rel="noopener noreferrer" class="">https://github.com/okteto/go-getting-started</a> as the repository URL this time.</p>
<p>Once the deployment process is complete, head over to the URL under "Endpoints" in the Dashboard, and you should see a webpage showing "Hello world!".</p>
<p><img decoding="async" loading="lazy" alt="Screenshot of the application&amp;#39;s endpoints directly okteto Dashboard" src="https://www.okteto.com/blog/assets/images/ea4800feaefd-3ed9d319327e6e0214c05fb1fa1b3533.webp" width="742" height="286" class="img_ev3q"></p>
<p>This means you can work on two completely different projects running on the same cluster. Pretty cool, right? When using Kubernetes directly, we specify the namespace under an object's YAML's <code>metadata</code> section. You can see this by selecting the "hello-world" deployment and seeing its YAML:</p>
<p><img decoding="async" loading="lazy" alt="Screenshot of the application&amp;#39;s yaml directly okteto Dashboard" src="https://www.okteto.com/blog/assets/images/1dc32ce290b0-e3a876fe9c938ec016974c094c8ef0bd.webp" width="851" height="526" class="img_ev3q"></p>
<p>You can read more about managing your namespaces in Okteto by heading to the <a href="https://www.okteto.com/docs/core/namespaces" target="_blank" rel="noopener noreferrer" class="">Documentation</a>.</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Okteto development environments give your team a Developer-friendly approach to Kubernetes.</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/ebooks/how-cloud-dev-environments-accelerate-developer-velocity-and-drive-innovation/" target="_self">Download our eBook</a></div></section>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration-and-storage-in-kubernetes">Configuration and Storage in Kubernetes<a href="https://www.okteto.com/blog/kubernetes-basics/#configuration-and-storage-in-kubernetes" class="hash-link" aria-label="Direct link to Configuration and Storage in Kubernetes" title="Direct link to Configuration and Storage in Kubernetes" translate="no">​</a></h2>
<p>In this section, we'll first look at two somewhat similar Kubernetes objects which help with configuring our application running in the cluster - ConfigMaps and Secrets. Then we'll move on to look at how storage is handled in Kubernetes using Volumes and Persistent Volumes. So strap in, and let's get started!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configmaps-and-secrets">ConfigMaps and Secrets<a href="https://www.okteto.com/blog/kubernetes-basics/#configmaps-and-secrets" class="hash-link" aria-label="Direct link to ConfigMaps and Secrets" title="Direct link to ConfigMaps and Secrets" translate="no">​</a></h3>
<p>To inject configuration data into a container, Kubernetes provides us with two objects: ConfigMaps and Secrets. It is highly recommended to separate configuration data from your application code, so you'll see these two objects being used in almost all Kubernetes clusters.</p>
<p>If you see the YAML for a <a href="https://kubernetes.io/docs/concepts/configuration/configmap/#configmaps-and-pods" target="_blank" rel="noopener noreferrer" class="">ConfigMap</a> or a <a href="https://kubernetes.io/docs/concepts/configuration/secret/#service-account-token-secrets" target="_blank" rel="noopener noreferrer" class="">Secret</a>, you'll notice that both of them are almost similar. They both have a <code>data</code> key under which the configuration data provides using key-value pairs. For example,</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">key1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> value1</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">key2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> value2</span><br></div></code></pre></div></div>
<p>The difference is in the fact that you should use secrets to hold sensitive data. When writing the YAML for a secret, we wouldn't specify <code>value1</code> and <code>value2</code> as we would for ConfigMaps. Instead, we would specify the <a href="https://en.wikipedia.org/wiki/Base64" target="_blank" rel="noopener noreferrer" class="">base64</a> encoded versions of these values.</p>
<p>Pods can refer to a particular ConfigMap and/or Secret and specify a key, and then they would have an environment variable in their container with the corresponding value. This would enable you to refer to these environment variables in your application code.</p>
<p>For the movies app, which we deployed, our API pod needed the credentials for the MongoDB database to connect to it. We provided these using a secret. If you see the YAML for the API deployment you'll see that we're getting an environment variable called <code>MONGODB_PASSWORD</code> for our container from a secret called <code>mongodb</code>.</p>
<p><img decoding="async" loading="lazy" alt="Screenshot of Secret being used in pod" src="https://www.okteto.com/blog/assets/images/6cd31255df16-c9d2949fa330d6199ee023cb50542385.webp" width="1000" height="567" class="img_ev3q"></p>
<p>If you want to see how the YAML for this secret looks, head over to the terminal and run:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">kubectl get secret mongodb -o yaml</span><br></div></code></pre></div></div>
<p>The <code>-o yaml</code> flag gets the YAML for a particular Kubernetes object. You'll see that under the <code>data</code> key for the returned object, we have the <code>mongodb-password</code> key, which we were referring to in our API deployment. To see the actual value for this key, you'll have to decode the base64 encoded value shown.</p>
<p>Now that you know how configuration data is handled in Kubernetes clusters let's move on and look at how data is shared between K8s objects using Volumes and Persistent Volumes.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="storage-in-kubernetes">Storage in Kubernetes<a href="https://www.okteto.com/blog/kubernetes-basics/#storage-in-kubernetes" class="hash-link" aria-label="Direct link to Storage in Kubernetes" title="Direct link to Storage in Kubernetes" translate="no">​</a></h3>
<p>If you recall, we mentioned that Kubernetes Pods are ephemeral. This means that data generated by the containers running in a Pod will be destroyed when the pod is destroyed. In Kubernetes, Volumes and Persistent Volumes help solve this data loss problem. Apart from this, they also solve another problem - data sharing between containers.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="volumes">Volumes<a href="https://www.okteto.com/blog/kubernetes-basics/#volumes" class="hash-link" aria-label="Direct link to Volumes" title="Direct link to Volumes" translate="no">​</a></h4>
<p>There are a lot of <a href="https://kubernetes.io/docs/concepts/storage/volumes/#volume-types" target="_blank" rel="noopener noreferrer" class="">volume types</a> offered by Kubernetes. But thankfully, as developers, we mostly never have to worry about all this stuff. In this section, we'll cover a common volume type that you might run into - <code>emptyDir</code>.</p>
<p>The <code>emptyDir</code> type has two important use cases. First, it allows us to share data between two containers running in the same pod. The second is that if our container ever crashes, it enables us to retain still all the data created previously. Note that this volume only exists as long as the Pod runs. So if your pod is destroyed for any reason, you <strong>WILL</strong> lose all the data. Let's look at how to configure volumes for Pods:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">apiVersion</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Pod</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">metadata</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> my</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">pod</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">spec</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">volumes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> cache</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">volume</span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">emptyDir</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">containers</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">image</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> my</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">container</span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">volumeMounts</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">mountPath</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> /cache</span><br></div><div class="token-line" style="color:white"><span class="token plain">              </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> cache</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">volume</span><br></div></code></pre></div></div>
<p>Under the Pod <code>spec</code> we first define our volumes in a list - in the above example, we have one volume called <code>cache-volume</code>, which is of type <code>emptyDir</code>. Then, while specifying our containers, we refer to this volume under <code>volumeMounts</code>. <code>mountPath</code> is where Kubernetes will load the data from the volume into the filesystem of the container.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="persistent-volumes">Persistent Volumes<a href="https://www.okteto.com/blog/kubernetes-basics/#persistent-volumes" class="hash-link" aria-label="Direct link to Persistent Volumes" title="Direct link to Persistent Volumes" translate="no">​</a></h4>
<p>We just learned that <code>emptyDir</code> volumes won't save our data if our Pod goes down. So you must be wondering how to store data that persists regardless of any changes to the Pod. This is where Persistent Volumes come to save the day.</p>
<p>A Persistent Volume (PV) is a cluster-level storage object. This means that just like Nodes, it is a resource present in the cluster. It is an administrator's job to provision this, so don't worry too much about how it's created. However, we as developers should know how to use this provisioned storage.</p>
<p>To use a Persistent Volume, we create a Persistent Volume Claim (PVC) object and then refer to this claim under the <code>volumes</code> key of the Pod YAML, as we saw above. A PVC is nothing but a storage request. This is what a simple PVC object would look like:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">apiVersion</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> PersistentVolumeClaim</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">metadata</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> pv</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">claim</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">spec</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">accessModes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> ReadWriteOnce</span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">resources</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">requests</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">            </span><span class="token key atrule" style="color:rgb(86, 156, 214)">storage</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> 3Gi</span><br></div></code></pre></div></div>
<p>Once you create this PVC, the Kubernetes control plane will *bind* this claim to a suitable persistent volume for you. The above YAML should be pretty simple to understand. We're requesting 3 Gigabytes of storage with the <a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes" target="_blank" rel="noopener noreferrer" class="">access mode</a> of <code>ReadWriteOnce</code>. ReadWriteOnce means that the volume can be mounted as read-write storage but only by a single node.</p>
<p>After you create the PVC, all that you need to do is refer to it in your Pod's YAML as we did for <code>emptyDir</code> above.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">spec</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">volumes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> pv</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">storage</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">persistentVolumeClaim</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">claimName</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> pv</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">claim</span><br></div></code></pre></div></div>
<p>This concludes our discussion on configuration and storage in Kubernetes. We started by taking a look at ConfigMaps and Secrets and saw how they help provide us with configuration data for our application. Then we looked at how we can leverage Volumes to safeguard our application data in case our container restarts. Finally, we looked at Persistent Volumes, which provide us a way to persist data in a separate resource present in the cluster - thus ensuring that even Pod deletion doesn't lead to a loss of data.</p>
<p>All of this does look intimidating at first but remember that you don't have to fight these battles alone. If you're using a managed Kubernetes environment like Okteto, most of this is already taken care of for you. If not, even then, you should be receiving support from the infra team. But like I said earlier, even as a developer, it is good to have an idea of things, so you're not lost! This article's final section will look at how networking works in Kubernetes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="services-and-ingresses-in-kubernetes">Services and Ingresses in Kubernetes<a href="https://www.okteto.com/blog/kubernetes-basics/#services-and-ingresses-in-kubernetes" class="hash-link" aria-label="Direct link to Services and Ingresses in Kubernetes" title="Direct link to Services and Ingresses in Kubernetes" translate="no">​</a></h2>
<p>Before starting with this section, I want to congratulate you all for making it here! Learning Kubernetes can be intimidating, especially if you come from a developer background. The fact that you could understand the concepts we talked about in the previous section of this guide is a huge feat. Wrapping your head around so many Kubernetes objects is no easy deal!</p>
<p>In this section, we will see how we can expose Pods running our application using the Service object. This would help us ensure that different parts of our application (backend, frontend, etc.) can communicate within the cluster. Then we will see how we can ease external access to our application by setting up routing using the Ingress object. Lots to cover in this one, so let's begin!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="services">Services<a href="https://www.okteto.com/blog/kubernetes-basics/#services" class="hash-link" aria-label="Direct link to Services" title="Direct link to Services" translate="no">​</a></h3>
<p>To understand Services, let's look at what problems they solve. If you recall our discussion of Deployments in the previous section, you'll remember that deployments create and manage multiple pods for us.</p>
<p>So we would have a deployment for the frontend of our application which would manage multiple pods running our containerized frontend code. Now, this code would need to interact with the backend pods. But how does it do that? What IP address should it ping? It clearly can't be the IP address of a particular backend pod because we know pods are ephemeral, so we can't rely on their IP addresses.</p>
<p>This is where Services come into the picture. Services allow us to send traffic to Pods that match the labels we specify when creating the Service. Let us look at the YAML for a simple service to understand things better:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">apiVersion</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Service</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">metadata</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> database</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">service</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">spec</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">selector</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">app</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> database</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">ports</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">protocol</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> TCP</span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">port</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">targetPort</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">9376</span><br></div></code></pre></div></div>
<p>The above YAML should be pretty easy to understand - it creates a Service that will route all traffic to Pods with the label <code>app: database</code> on them. Coming to the <code>ports</code> section, which might not be so obvious, we specify a <code>port</code> and a <code>targetPort</code>. <code>targetPort</code> is the port on which the selected pods will be listening. The Service will send requests to the Pods on this particular port. <code>port</code>, on the other hand, is simply the port within the cluster on which we want the Service to be exposed. This is needed because we might have different services in our cluster, which we would then expose on different ports. Another thing worth mentioning is that while TCP is the default network protocol for services in Kubernetes, you can use any of the <a href="https://kubernetes.io/docs/concepts/services-networking/service/#protocol-support" target="_blank" rel="noopener noreferrer" class="">following</a> protocols as well.</p>
<p>So far, so good, right? Looking at the movies app <a href="https://www.okteto.com/docs/get-started/deploy-your-app/" target="_blank" rel="noopener noreferrer" class="">we deployed</a> on Okteto , we have created a service that exposes the database for our backend pods to talk to. You can confirm that this Service exists by running:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">kubectl get services</span><br></div></code></pre></div></div>
<p>To see what the YAML for this Service looks like, you can run:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">kubectl get service mongodb -o yaml</span><br></div></code></pre></div></div>
<p>You'll see that we arbitrarily chose to specify <code>3940</code> as the value of the <code>port</code>. For the <code>targetPort</code>, we set <code>27017</code> because that is the default port a MongoDB database listens on.</p>
<p>Now, if you look at the <a href="https://github.com/okteto/movies/blob/ce27d64bd17762559eea6cbdebc28592065790d6/api/server.js#L6" target="_blank" rel="noopener noreferrer" class="">backend code</a> you'll see that we use the name of this Service, which is <code>mongodb</code>, to connect to the database. The <code>url</code> used to connect to the database is:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> url </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token template-string string" style="color:rgb(206, 145, 120)">mongodb://</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">process</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation property-access">env</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation constant" style="color:rgb(100, 102, 149)">MONGODB_USERNAME</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)">:</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation function" style="color:rgb(220, 220, 170)">encodeURIComponent</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token template-string interpolation">process</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation property-access">env</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation constant" style="color:rgb(100, 102, 149)">MONGODB_PASSWORD</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)">@</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">process</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation property-access">env</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation constant" style="color:rgb(100, 102, 149)">MONGODB_HOST</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string string" style="color:rgb(206, 145, 120)">:3940/</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">${</span><span class="token template-string interpolation">process</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation property-access">env</span><span class="token template-string interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token template-string interpolation constant" style="color:rgb(100, 102, 149)">MONGODB_DATABASE</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token template-string template-punctuation string" style="color:rgb(206, 145, 120)">`</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></div></code></pre></div></div>
<p>It is using the <code>MONGODB_HOST</code> environment variable, which is <a href="https://github.com/okteto/movies/blob/a60756c8122643ac65fec2cee837d95a60b02210/chart/templates/api-deployment.yaml#L52-L53" target="_blank" rel="noopener noreferrer" class="">set to</a> the name of the Service, that is, <code>mongodb</code>. After that, we also specify the port which we arbitrarily chose when creating our Service (<code>3940</code>).</p>
<p>This is all the K8s magic we need to make different microservices in our application talk to each other. Let's now discuss further and see how we can route incoming traffic to various services.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ingresses">Ingresses<a href="https://www.okteto.com/blog/kubernetes-basics/#ingresses" class="hash-link" aria-label="Direct link to Ingresses" title="Direct link to Ingresses" translate="no">​</a></h3>
<p>So you've containerized your application, you've set up your Deployments and configured Services to enable communication between parts of your application, but what's next? If your application is deployed on a cloud provider, you would set up a load balancer pointing to your services. The load balancer would provide a static IP address accessible from outside the cluster.</p>
<p>But is it cost-effective and manageable to set up different load balancers for each service? This is where Ingresses come to the rescue. Think of an Ingress object as a signboard for vehicles at a cross-section of roads.</p>
<p><img decoding="async" loading="lazy" alt="An image of Sign boards: pointing to the left it says &amp;#39;/api&amp;#39; pointing to the right it says &amp;#39;home&amp;#39;" src="https://www.okteto.com/blog/assets/images/497e65c8e6c4-25aabe80211dcfbd89bc26d1c1bfcd55.webp" width="1602" height="1318" class="img_ev3q"></p>
<p>The roads in this metaphor are different services in our cluster, and the vehicles are the requests coming to our cluster. An Ingress object we create will tell the incoming requests to the cluster which Service they should go to. Ingresses don't enable external access to our app on their own, but they make it easier. You would now just need one load balancer from your cloud provider, which would point to the Ingress, and then the Ingress will handle the routing of all incoming traffic.</p>
<p><img decoding="async" loading="lazy" alt="an image of ingress flow showing users - load balancer and the cluster" src="https://www.okteto.com/blog/assets/images/488c6ce56fd7-8b6586b9186bc1c024d348a0fcdcde0c.webp" width="1904" height="2018" class="img_ev3q"></p>
<p>Let's see what the Ingress object for our movies app looks like by running:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">kubectl get ingress movies -o yaml</span><br></div></code></pre></div></div>
<p>The output you get should look something like this:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">spec</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">rules</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">host</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> okteto.example.com</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">http</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">paths</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">backend</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">service</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> frontend</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">port</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">number</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> /</span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">pathType</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Prefix</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">backend</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token key atrule" style="color:rgb(86, 156, 214)">service</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> api</span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">port</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">number</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">8080</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> /api</span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">pathType</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Prefix</span><br></div></code></pre></div></div>
<p>You'll see that under the <code>spec</code> section, we set up two paths for different services in our application that we wanted to expose: the frontend service and the backend service. So requests sent to our cluster at <code>/api</code> will be redirected to the backend service, which further directs them to the backend pods serving our application. Any request that doesn't match that prefix will be redirected to the frontend pods via the frontend service. This simplifies the management of different routes significantly when compared to the traditional way of doing this - setting up an NGINX proxy per application. Very convenient, right? :)</p>
<p>To sum our discussion up, Ingress isn't something complicated - it's just a Kubernetes object which allows us to specify routing rules!</p>
<p>However, there is another part to Ingresses that we didn't touch in this article. So far, the K8s objects we've seen (Pods, Deployments, etc) come with their controllers preinstalled in the cluster. This is not true for Ingresses. To create an Ingress object, your cluster admin will need to install an <a href="https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/" target="_blank" rel="noopener noreferrer" class="">ingress controller</a> in your cluster. I won't be covering how to do that since we rarely have to do it ourselves as developers. If you're using <a href="https://www.okteto.com/" target="_blank" rel="noopener noreferrer" class="">Okteto</a>, the cluster provided to you would already have an Ingress controller installed :)</p>
<p>In this section we learned that different microservices in our application can talk to each other with the help of the Service K8s object. Then we looked at Ingresses, allowing us to route incoming traffic to our cluster to the different Services we've created.</p>
<p>I hope this discussion not only enables you to learn more about this topic but also sparks your curiosity enough to give things a try yourself. A straightforward way to tinker with all this could be to <a href="https://github.com/okteto/movies" target="_blank" rel="noopener noreferrer" class="">fork the movies app</a>, edit the <a href="https://github.com/okteto/movies-with-helm/tree/main/chart/templates" target="_blank" rel="noopener noreferrer" class="">YAMLs</a> and deploy on Okteto using a <a href="https://www.okteto.com/docs/get-started/deploy-your-app/" target="_blank" rel="noopener noreferrer" class="">single click</a>!</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Making Sense of Cloud Development in a Complicated Kubernetes World  |  Burr Sutter, Dir. Developer Experience at RedHat</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/docs/" target="_self">Read now</a></div></section>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/kubernetes-basics/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The adoption of Kubernetes as a container orchestrator has been increasing tremendously. While SREs and DevOps engineers are already familiar with it, we saw that there was a gap when it comes to developers' knowledge of Kubernetes. This was the problem we wanted to solve through this Kubernetes tutorial - we wanted to familiarize developers with some essential Kubernetes concepts and show them how they, too, can leverage its benefits!</p>
<p>In the first section, we explored what Kubernetes did and took a little peek under the hood to see the components generally present in a Kubernetes cluster. Then we went on to look at Pods which are the most fundamental object Kubernetes offers. We learned that they are ephemeral and often managed using another Kubernetes object - Deployments. In the third section, we learned how configuration data is passed to a Kubernetes cluster with the help of ConfigMaps and Secrets. We also looked at how Volumes and Persistent Volumes are used in Kubernetes to handle storage. Then in the section article, we looked at two slightly more complicated Kubernetes objects, Services and Ingresses. We saw how to use Services to enable interaction between different microservices parts of our application. We then looked at the Ingress object, which allows us to set up rules to route traffic to other services. And that concluded our tutorial on Kubernetes Basics.</p>
<p>If you want to learn more about Kubernetes, the best way is to start getting your hands dirty. Start containerizing projects you might have made earlier and try deploying them on a Kubernetes cluster. If you run into trouble or need to know more about a particular Kubernetes object - head over to the <a href="https://kubernetes.io/docs/home/" target="_blank" rel="noopener noreferrer" class="">Kubernetes documentation</a>. After going through this guide, you should be able to look up and understand most things in detail from the documentation.</p>
<p>For deploying applications on Kubernetes, there are many ways to go, even if you're looking for a free solution to try things out. One of them is running a K8s cluster locally using Minikube or Kind. Another is using something like <a href="https://www.okteto.com/" target="_blank" rel="noopener noreferrer" class="">Okteto</a>. I'm biased towards the second one 😛 but for a good reason!</p>
<p>If you go the second route, you will get everything you get with a traditional cluster and see how we're leveraging Kubernetes to make lives easy for developers. <a href="https://www.okteto.com/" target="_blank" rel="noopener noreferrer" class="">Okteto</a> gives you access to a Kubernetes cluster without worrying about the infrastructure and operations. But what makes us unique is that if you install the <a href="https://okteto.com/docs/getting-started/installation/" target="_blank" rel="noopener noreferrer" class="">okteto cli</a> you can start a <a href="https://www.okteto.com/docs/development/containers/" target="_blank" rel="noopener noreferrer" class="">development container</a> in Okteto. This allows you to code locally and sees the result live in a version of your application deployed on Kubernetes. In short, we make developing on Kubernetes very, very easy. Do you want to see it in action? We've got a super concise 5-minute <a href="https://www.okteto.com/docs/getting-started/" target="_blank" rel="noopener noreferrer" class="">getting started guide</a> ready for you!</p>
<p>So that concludes this Kubernetes for Beginners guide. If you have any doubts related to Kubernetes or Okteto, feel free to hop on <a href="https://community.okteto.com/" target="_blank" rel="noopener noreferrer" class="">our community site</a> to talk to us. We'd also love to hear how you found this guide or if you have any suggestions for what we should be covering next. Until next time! 😁</p>
<section class="cta_r8D7"><p class="ctaTitle_rn0H">Kubernetes helps you Accelerate Developer Velocity and Drive Innovation.</p><div class="ctaButtons_Zeqx"><a class="Button teal layout" href="https://www.okteto.com/ebooks/how-cloud-dev-environments-accelerate-developer-velocity-and-drive-innovation/" target="_self">Download our eBook</a></div></section>]]></content:encoded>
            <category>cloud-native</category>
            <category>kubernetes</category>
            <category>developers</category>
        </item>
        <item>
            <title><![CDATA[Launching the Docker Desktop Extension for Okteto!]]></title>
            <link>https://www.okteto.com/blog/launching-the-okteto-docker-desktop-extension/</link>
            <guid>https://www.okteto.com/blog/launching-the-okteto-docker-desktop-extension/</guid>
            <pubDate>Mon, 09 May 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Get the Docker Desktop experience you love without the restrictions of having to run everything on your local machine using the Okteto Extension.]]></description>
            <content:encoded><![CDATA[<p>Docker launched in 2013 and since then has revolutionized the way we build and ship code. Docker made containers a part of the modern application development cycle - and a crucial one too! Part of Docker's success is thanks to how simple it made configuring multiple microservices during development.</p>
<!-- -->
<p>The concept is very simple yet extremely powerful. You write a Docker Compose file, and then using a single command, <code>docker compose up</code>, you have all the microservices you require during development up and running. This has made Docker Desktop and Docker Compose files part of developers' daily toolkit.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="running-containers-only-locally-isnt-an-option-anymore">Running Containers ONLY Locally Isn’t an Option Anymore<a href="https://www.okteto.com/blog/launching-the-okteto-docker-desktop-extension/#running-containers-only-locally-isnt-an-option-anymore" class="hash-link" aria-label="Direct link to Running Containers ONLY Locally Isn’t an Option Anymore" title="Direct link to Running Containers ONLY Locally Isn’t an Option Anymore" translate="no">​</a></h2>
<p>Over the last few years, modern applications have gotten more and more complex. We have gone from applications consisting of a&nbsp;<em>couple</em>&nbsp;of microservices to seeing 30+ of them in a single app! The Docker Compose file still continues to set the standard when it comes to defining these multi-container applications. But relying just on the local machine to bring up all these complex and large numbers of microservices isn't practical anymore. This is where the Okteto extension for Docker Desktop comes to the rescue!</p>
<p>The Okteto extension allows you to run all (or just the ones you want) of your containers on a remote cluster instead of your local machine. A single click to bring up all the microservices you require on the cloud using your already existing Docker Compose files. Leveraging cloud resources makes developing modern cloud-native applications a much easier task than before. You are now&nbsp;<strong>no longer limited</strong>&nbsp;by the computing resources of your local dev machine. Everything, right from the building of the container images to running the actual containers, happens remotely on the cloud and so is extremely quick!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-magic-behind-the-scenes">The Magic Behind the Scenes<a href="https://www.okteto.com/blog/launching-the-okteto-docker-desktop-extension/#the-magic-behind-the-scenes" class="hash-link" aria-label="Direct link to The Magic Behind the Scenes" title="Direct link to The Magic Behind the Scenes" translate="no">​</a></h2>
<p>All of this, while ensuring you get the same familiar experience you got when running containers locally. This is achieved by Okteto configuring port forwarding rules for you behind the scenes. These rules expose your application on localhost - allowing you to interact with it exactly as you did before. You might also be wondering how you can develop using these containers if they are running remotely? The Okteto extension configures volumes that help synchronize the code you write locally with that running inside the containers on the cluster. So everything continues to be&nbsp;<strong>exactly</strong>&nbsp;like it was before, except that your local machine now has much more resources left to support all the chrome tabs and slack workspaces you have running 😛</p>
<p>You can also combine the two approaches - run some containers locally and some on the cloud using the Okteto extension. This gives you the flexibility in choosing different approaches for different components of your application. A microservice consumes a lot of resources? Run it on the cloud while keeping everything as it is. The beauty lies in the fact that this requires no additional configuration at any step whatsoever!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it-out-yourself">Try It Out Yourself!<a href="https://www.okteto.com/blog/launching-the-okteto-docker-desktop-extension/#try-it-out-yourself" class="hash-link" aria-label="Direct link to Try It Out Yourself!" title="Direct link to Try It Out Yourself!" translate="no">​</a></h2>
<p>Using the Okteto extension with Docker Desktop is very simple. Once you have the extension installed, simply point it to the location of the Docker compose file describing your services and click the "Launch Remote Environment" button! In a matter of minutes, all the services you require should be up and running in the cloud.</p>
<p><img decoding="async" loading="lazy" alt="UI of the Okteto Extension" src="https://www.okteto.com/blog/assets/images/cace60875f79-28867644ed03383eb609937c3bf78874.webp" width="1271" height="997" class="img_ev3q"></p>
<p>You can sign up for the extension's Private Beta Program <a href="https://www.okteto.com/docker-beta/" target="_blank" rel="noopener noreferrer" class="">here</a>. Okteto community members who sign up get early access and a chance to win exclusive swag 😉</p>
<p>Everyone who signs up also gets access to all the fun discussions happening under the Docker Desktop Extension category on our&nbsp;<strong>newly launched</strong>&nbsp;<a href="https://community.okteto.com/" target="_blank" rel="noopener noreferrer" class="">community website</a>. Sign up now, and let's continue the discussion there!</p>]]></content:encoded>
            <category>docker</category>
            <category>docker-compose</category>
        </item>
        <item>
            <title><![CDATA[Announcing the Launch of Okteto CLI 2.0!]]></title>
            <link>https://www.okteto.com/blog/announcing-the-launch-of-okteto-cli-2-0/</link>
            <guid>https://www.okteto.com/blog/announcing-the-launch-of-okteto-cli-2-0/</guid>
            <pubDate>Wed, 13 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Announcing the release of Okteto CLI 2.0! Learn more about what's new, why we started the project, and our commitment to open source!]]></description>
            <content:encoded><![CDATA[<p>I think you'll agree that, as developers, we enjoy innovating and working on exciting new features more than anything else. We'd get some coffee and play some music, and a few hours later, there is a new cool feature to be released! Then we collect user feedback and iterate. It's just a lot of fun, isn't it? I have worked in a few startups before (Elasticbox, Tutum, Docker), and this is how it goes when you're starting a new project - you feel productive! But as the company grows and the application gets more complex, the development workflow becomes full of friction, and fast iteration becomes impossible. What was all fun earlier starts turning into a developer's nightmare of spending long hours configuring things instead of being able to write code.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="our-motivation-behind-okteto-cli">Our Motivation Behind Okteto CLI<a href="https://www.okteto.com/blog/announcing-the-launch-of-okteto-cli-2-0/#our-motivation-behind-okteto-cli" class="hash-link" aria-label="Direct link to Our Motivation Behind Okteto CLI" title="Direct link to Our Motivation Behind Okteto CLI" translate="no">​</a></h2>
<p>The main thing which motivated us to start the open-source <a href="https://github.com/okteto/okteto" target="_blank" rel="noopener noreferrer" class="">Okteto CLI</a> project in 2019 was how tedious developing microservices had become in the present-day era of cloud-native applications.</p>
<p>Let's say your application consisted of 10 different microservices. You basically had two options:</p>
<ol>
<li class="">Either run all these services locally with tools like Docker Compose.</li>
<li class="">Mock some of these dependencies locally, push your changes and wait for your PR to merge in order to do manual end-to-end testing relying on some sort of integration environment like staging.</li>
</ol>
<p>The former requires a lot of configuration every day trying to bring up these services and takes away time that could've been spent working on features. It also adds unwanted overhead to your machine to the point where everything gets so slow that you feel frustrated all the time.</p>
<p>The latter makes the feedback loop way longer than it needs to be. You need to push your code and wait for the CI to build your container images and redeploy your containers - all of which take minutes, if not hours. And only after all this can you test your changes realistically.</p>
<p>Long story short, all the existing ways of development led to a huge loss in developer productivity and were frustrating to deal with on a day-to-day basis.</p>
<p>As developers ourselves, we were very well aware of these problems, and we wanted to provide a solution for everyone to develop applications - using the modern way! This is why we started Okteto CLI as an open-source project back in 2019. The project has grown significantly since then and has a lot of active community members. We also just <a href="https://twitter.com/oktetohq/status/1491820163855167488?s=20&amp;t=aqwC1Vv8CtwjpHdIdj6sUA" target="_blank" rel="noopener noreferrer" class="">recently</a> hit 2000 stars on GitHub 😎</p>
<p>In case you're not familiar with what Okteto CLI does, let me give you a brief introduction.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="remote-development-environments">Remote Development Environments<a href="https://www.okteto.com/blog/announcing-the-launch-of-okteto-cli-2-0/#remote-development-environments" class="hash-link" aria-label="Direct link to Remote Development Environments" title="Direct link to Remote Development Environments" translate="no">​</a></h2>
<p>As you just read above, while innovation boomed in DevOps and deployment solutions, software development remained more or less stagnant. Our solution to that was Okteto CLI which provides&nbsp;<strong>remote development environments that feel like local</strong>.</p>
<p>Let me explain this in more detail:</p>
<ul>
<li class="">A&nbsp;<strong>remote development environment</strong>&nbsp;means your containers run in a remote cluster instead of in your local machine - implying everything is faster and takes up almost no resources on your laptop.</li>
<li class="">By "<strong>feel like local,"</strong>&nbsp;I mean that you can still continue coding on your favorite IDE locally. Your local code changes are synchronized into the remote containers allowing you to see them live on the deployed application&nbsp;<strong>as soon as you hit save</strong>&nbsp;locally!</li>
</ul>
<p>File synchronization is a core component of this solution. With Okteto CLI, there is no need to rebuild your container images and redeploy your application every time you change in a single line of code - goodbye to spending time configuring microservices and waiting hours to see what your changes would look like in production.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="okteto-️-open-source">Okteto ❤️ Open Source<a href="https://www.okteto.com/blog/announcing-the-launch-of-okteto-cli-2-0/#okteto-%EF%B8%8F-open-source" class="hash-link" aria-label="Direct link to Okteto ❤️ Open Source" title="Direct link to Okteto ❤️ Open Source" translate="no">​</a></h2>
<p>Ever since we started Okteto CLI, we knew open source was going to play a huge part in what we do. We spent a lot of time collecting feedback from our community members who belonged to companies of all different sizes because we knew this was a problem almost all companies were struggling with. The feedback we got during the initial phases helped us shape Okteto CLI the way it is today. Some common things we heard post the v1 release of Okteto CLI included:</p>
<ul>
<li class="">Okteto CLI should be taking care of not just file sync but also building containers and deploying the application. Developers didn't want to write a new set of manifests to deploy their applications; they wanted Okteto CLI to work smoothly with whatever manifests they might be using currently for deployment - be it Docker Compose files or Helm charts, or Kubernetes manifests.</li>
<li class="">Developers shouldn't require any Docker or Kubernetes knowledge to use the Okteto CLI - we already have enough JavaScript frameworks to keep up with; don't add more stuff! 😛 The process should be as simple as having all application manifests preconfigured for developers in Git repositories, and they should be able to build, deploy and develop their applications with a single command.</li>
<li class="">Okteto CLI should be able to power Development Environments regardless of where the Kubernetes cluster has been deployed - be it EKS, GCP, AKS, Docker Desktop, K3s.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new-in-the-okteto-cli-20">What's new in the Okteto CLI 2.0<a href="https://www.okteto.com/blog/announcing-the-launch-of-okteto-cli-2-0/#whats-new-in-the-okteto-cli-20" class="hash-link" aria-label="Direct link to What's new in the Okteto CLI 2.0" title="Direct link to What's new in the Okteto CLI 2.0" translate="no">​</a></h2>
<p>Today we present to you Okteto CLI 2.0 - where've we addressed much of the feedback we received to date. I don't want to go over the <a href="https://github.com/okteto/okteto/releases" target="_blank" rel="noopener noreferrer" class="">changelog</a> in this blog, but I do want to take the time to point out some really important quality of life changes we've added.</p>
<p>First, if you already have a Docker Compose file, you just need to run the <code>okteto up</code> command, and you will have spun up your Development Environment with your containers running in a remote Kubernetes cluster. It is that simple! We literally reduced the process to one command :)</p>
<p>For Helm applications, or if you need to complement your Docker Compose file with Kubernetes dependent resources, you can configure an Okteto manifest. But this isn't the same old manifest you used to write with Okteto CLI 1.0. The new Okteto manifest has sections to define how to build your container images, deploy your application, and develop on a given microservice.</p>
<p>With the new Okteto CLI, developers don't need to know how to build and deploy their applications. Run <code>okteto up</code>, and it will automatically build and deploy your application when needed before synchronizing your code into your containers.</p>
<p>Finally, the Okteto CLI 2.0 is now a fully isolated client-side tool that works with <strong>any</strong> Kubernetes cluster, be it EKS, GKE, or even Minikube!</p>
<p>Wanna give the new release a try? Check out our&nbsp;updated <a href="https://www.okteto.com/docs/getting-started/" target="_blank" rel="noopener noreferrer" class="">Getting Started Guide</a> to bring you up to speed.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="so-whats-next">So What's Next?<a href="https://www.okteto.com/blog/announcing-the-launch-of-okteto-cli-2-0/#so-whats-next" class="hash-link" aria-label="Direct link to So What's Next?" title="Direct link to So What's Next?" translate="no">​</a></h2>
<p>We not only plan to continue our commitment to investing in open source but, in fact, aim to double down on that promise with the launch of Okteto CLI 2.0. We firmly believe that the future of cloud-native application development is remote development environments.</p>
<p>Okteto CLI is our solution to solving this problem at scale, and open source is at the heart of it. Solving this problem and stepping into this new way of application development requires continuous community support and feedback, which we've been very grateful to receive. With the new release, we also aim to make the <a href="https://github.com/okteto/okteto/blob/master/contributing.md" target="_blank" rel="noopener noreferrer" class="">contribution process</a> around Okteto CLI more friendly for new contributors to the project! If you too believe that remote development environments are the way to go,&nbsp;<a href="https://github.com/okteto/okteto#support-and-community" target="_blank" rel="noopener noreferrer" class="">join our community</a>&nbsp;and help us shape the future of development!</p>]]></content:encoded>
            <category>okteto-cli</category>
            <category>open-source</category>
            <category>remote-development-environments</category>
        </item>
        <item>
            <title><![CDATA[Maybe It's Time To Rethink How You've Been Developing?]]></title>
            <link>https://www.okteto.com/blog/maybe-it-s-time-to-rethink-how-you-ve-been-developing/</link>
            <guid>https://www.okteto.com/blog/maybe-it-s-time-to-rethink-how-you-ve-been-developing/</guid>
            <pubDate>Wed, 09 Mar 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Cloud-Native Applications Need Cloud-Native Development Environments]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-native-applications-need-cloud-native-development-environments">Cloud-Native Applications Need Cloud-Native Development Environments<a href="https://www.okteto.com/blog/maybe-it-s-time-to-rethink-how-you-ve-been-developing/#cloud-native-applications-need-cloud-native-development-environments" class="hash-link" aria-label="Direct link to Cloud-Native Applications Need Cloud-Native Development Environments" title="Direct link to Cloud-Native Applications Need Cloud-Native Development Environments" translate="no">​</a></h3>
<p>We've seen a tremendous change in the way applications get deployed over the last five years. From huge monoliths deployed on self-hosted infrastructure, almost everyone seems to be moving towards a microservices-based architecture deployed on Kubernetes clusters. And for a good reason too!</p>
<!-- -->
<p>Cloud and Kubernetes significantly simplified the deployment process and reduced the headache of managing deployment-related tasks. But while we've been busy rushing towards modern deployment practices, I think we forgot to stop and take a look at how we've been developing all this time.</p>
<p>Our <strong>traditional</strong> ways of development were okay for the <strong>traditional</strong> deployment methods. But, a change in deployment practices does <strong>demand</strong> a rethinking of development practices - and it's for the better too! We've all always agreed that it makes sense for the development environment to be as close to production as possible. With Kubernetes in the picture, we're seeing teams struggle to fulfill this. The problem is significantly heightened by the fact that while the pace of deployment has increased, the ability of development environments to keep up has remained unchanged.</p>
<p>Some teams are just not able to provide their developers access to production-like environments during the development phase. These teams then struggle with bugs that often come in notice only after shipping changes and are hard to debug. What makes these bugs particularly hard to fix is the fact that they don't get spotted during development in the first place!</p>
<p>The other kinds of teams we see struggle are those who do recognize that they need to provide developers with production-like environments to test changes, but they've been using ineffective ways of doing so. Their solution often involves building some in-house tooling to provide these environments. More often than not, this ends up being just another "hacky fix" that is not sustainable, maintainable and does not capture the best practices. Some common complaints we hear about such solutions are:</p>
<ul>
<li class="">Slower inner feedback loop because of waiting for long CI builds</li>
<li class="">Loss in developer productivity and high cost of operation because of reliance on staging clusters</li>
</ul>
<p>Often, full development environments cannot be provided to developers and fit them on their laptops. The old way of having a set development environment that all developers access does not work in a cloud environment.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="remote-dev-environments-change-the-paradigm-for-developers">Remote Dev Environments Change the Paradigm for Developers<a href="https://www.okteto.com/blog/maybe-it-s-time-to-rethink-how-you-ve-been-developing/#remote-dev-environments-change-the-paradigm-for-developers" class="hash-link" aria-label="Direct link to Remote Dev Environments Change the Paradigm for Developers" title="Direct link to Remote Dev Environments Change the Paradigm for Developers" translate="no">​</a></h3>
<p>So you probably have a hint of what the ideal solution should look like by this point. We need special development environments that replicate production, including all the microservices. Remote development environments are definitely one of the best solutions to these problems.</p>
<p>You might think that a remote dev environment means there's a powerful machine somewhere; you SSH into it and then develop your application using that machine's resources. Well, you wouldn't technically be wrong in assuming that, but modern-day remote dev environments are so much more than this. They still do leverage remote resources, but they give developers easy access to a deployed instance of the application during development. They're extremely convenient, accessible, and offer a wide variety of additional useful features!</p>
<p>Let me explain that more by going over what Okteto's Dev Environments offer.</p>
<ul>
<li class="">We use Kubernetes to power all our dev environments so developers can be ensured that what they see during development is exactly what they'll get in production.</li>
<li class="">Each developer gets access to a personal namespace on a Kubernetes Cluster, and then they can choose to deploy their entire application or any of the particular microservices they might need during development.</li>
<li class="">Once this deployment happens, Okteto CLI enables developers to connect to the cluster and replace the running container with a "development container". This container sets up a two-way file synchronization service - the code changes made on a developer's local machine get transferred to the container running inside the Kubernetes cluster.</li>
<li class="">Apart from this, developers also get a terminal that is connected to the cluster, so they can still do things like run tests using this terminal - except that all these actions would be executed on the Kubernetes cluster, so they'll be much faster. This also saves resources on local machines!</li>
<li class="">Another benefit of using Development Environments is that developers can continue working using their favorite IDEs and tools as if they were developing locally.</li>
<li class="">Dev Environments enable developers to be productive without being experts in using Docker or Kubernetes. These environments are deployed using the same manifests being used to deploy to production clusters, so they require next to no configuration from developers.</li>
</ul>
<p>To put it simply, developers can continue writing code on their local machine as if they were developing locally but&nbsp;<strong>as soon as they hit save</strong>, they see their changes get reflected&nbsp;<strong>in real-time</strong>&nbsp;on a&nbsp;<strong>deployed version</strong>&nbsp;of their application. So not only can they be sure that what they see is exactly what they'll get when they push to production - but it's also instantaneous as if they were developing locally!</p>
<p>This also allows teams to have complete control over the pace of development. Development Environments mirror production and can also be set to work with staging environments - they give you complete control over how you want your development cycle to look like while removing all friction from the process!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="developers-love-it-and-adopt-it-across-the-organization">Developers Love It and Adopt It Across the Organization<a href="https://www.okteto.com/blog/maybe-it-s-time-to-rethink-how-you-ve-been-developing/#developers-love-it-and-adopt-it-across-the-organization" class="hash-link" aria-label="Direct link to Developers Love It and Adopt It Across the Organization" title="Direct link to Developers Love It and Adopt It Across the Organization" translate="no">​</a></h3>
<p>So I think you can now start to appreciate why there is a rapid rise in the adoption of remote development environments across multiple organizations. To sum up the utility of Kubernetes based development environments, I would like to quote my friend <a href="https://www.linkedin.com/in/danielkidon/" target="_blank" rel="noopener noreferrer" class="">Daniel</a> from <a href="https://www.honeybook.com/" target="_blank" rel="noopener noreferrer" class="">HoneyBook</a>, who recently <a href="https://medium.com/we-are-honeybook/remote-cloud-development-honeybook-5c8d63db2b5e" target="_blank" rel="noopener noreferrer" class="">transitioned their entire dev team</a> to move to using cloud-based development environments:</p>
<blockquote>
<p>“Developing <strong>for</strong> the cloud <strong>in</strong> the cloud creates a mindset shift that betters how we code”</p>
</blockquote>
<p>And it's totally true! We've heard nothing but positive things from our customers who have migrated to these Kubernetes powered dev environments. No need to take my word for it, go <a href="https://www.okteto.com/case-study/monday-com/" target="_blank" rel="noopener noreferrer" class="">check out</a> yourself what <a href="https://monday.com/" target="_blank" rel="noopener noreferrer" class="">monday.com</a> has to say about operating a team of 100+ developers developing using dev environments. And if you want to try out these dev environments, you can take a look at our <a href="https://www.okteto.com/docs/getting-started/" target="_blank" rel="noopener noreferrer" class="">getting started guide</a>. Or, if you want to know more about how switching to development environments can benefit your team, don't hesitate to <a href="https://www.okteto.com/get-demo/" target="_blank" rel="noopener noreferrer" class="">book a demo</a> with us!</p>]]></content:encoded>
            <category>developers</category>
            <category>developer-environment</category>
            <category>development</category>
        </item>
        <item>
            <title><![CDATA[Okteto Raises a $15M Series A To Disrupt How Software Teams Develop Modern Applications]]></title>
            <link>https://www.okteto.com/blog/a-15m-series-a-to-disrupt-modern-development/</link>
            <guid>https://www.okteto.com/blog/a-15m-series-a-to-disrupt-modern-development/</guid>
            <pubDate>Wed, 23 Feb 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Okteto raises a $15M Series A to disrupt how software teams develop modern applications]]></description>
            <content:encoded><![CDATA[<p>We are excited to announce that Okteto has raised $15M in Series A financing. The round was led by Villi Iltchev from Two Sigma Ventures, with participation from existing investors Haystack, Root Ventures, and Uncorrelated Ventures.</p>
<p>The round also included investments from some of the world's leading founders and operators of Developer Tools, including John Kodumal, Founder and CTO of LaunchDarkly; Grant Miller &amp; Marc Campbell, founders of Replicated, Dan Pinto, Founder and CEO of FingerprintJS; Erica Brescia, Founder of Bitnami and former GitHub COO; Florian Leibert, Founder of Mesosphere; Taimur Rashid, Chief BD at Redis; Jono Bacon, Community Strategist; and others.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="todays-state-of-development">Today’s State of Development<a href="https://www.okteto.com/blog/a-15m-series-a-to-disrupt-modern-development/#todays-state-of-development" class="hash-link" aria-label="Direct link to Today’s State of Development" title="Direct link to Today’s State of Development" translate="no">​</a></h2>
<p>For the past 15 years, application architecture has changed dramatically. We went from monoliths on physical servers hosted in basements to microservices running on distributed containers worldwide.</p>
<p>While innovation has boomed in DevOps and deployment solutions, software development has remained stagnant: developers are still trying to make their machines look like clusters by manually spinning up a "dev" version of their application and writing code against that. But the "dev" version is nothing like production, so developers are then forced to wait for endless CI cycles, or worse yet, for their turn on a shared staging environment before they know if their changes truly work. That was almost tolerable when the entire application was a single binary, but not in a world of highly distributed applications.</p>
<p>Not only is the state of development slow, lengthy, and increasingly complex, it’s costing development teams hours of tedious work and lost productivity. Developers want to innovate and build cool products, and businesses want to ship value to their customers quickly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-we-started-okteto">Why We Started Okteto<a href="https://www.okteto.com/blog/a-15m-series-a-to-disrupt-modern-development/#why-we-started-okteto" class="hash-link" aria-label="Direct link to Why We Started Okteto" title="Direct link to Why We Started Okteto" translate="no">​</a></h2>
<p>Today, business and engineering teams are building next-generation cloud-native applications. Yet the development process has not adopted next-generation cloud-native tools. This formula isn't right. This lack of development-focused innovation drove Pablo, Ramon, and I to quit our jobs and join the Y Combinator Winter 2019 batch. We quickly started working towards the vision of revolutionizing how software teams develop modern applications.</p>
<p>In short, we really need to say goodbye to the days where developers spend hours of their day waiting for containers, builds, and deployments.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="remote-development-environments-for-everyone">Remote Development Environments for Everyone<a href="https://www.okteto.com/blog/a-15m-series-a-to-disrupt-modern-development/#remote-development-environments-for-everyone" class="hash-link" aria-label="Direct link to Remote Development Environments for Everyone" title="Direct link to Remote Development Environments for Everyone" translate="no">​</a></h2>
<p>Today, leading tech companies like Monday.com, LaunchDarkly, Replicated, Privacy Dynamics, Sirona Medical, Dafiti, and many more are already using Okteto remote development and preview environments every day to develop amazing experiences for their customers.</p>
<p>With the Okteto platform, teams of all sizes can deploy pre-configured environments in the cloud in seconds. This enables developers to instantly work with their existing application stack and see their code changes live on the cloud, as they would look in production, as soon as they hit save.</p>
<p>With this workflow, developers can now:</p>
<ul>
<li class="">break away from limited resources available on their machines</li>
<li class="">avoid manual or shared dev environments</li>
<li class="">unlock insanely fast feedback loops</li>
<li class="">ship value faster with increased replicability and confidence</li>
</ul>
<blockquote>
<p>“After adopting Okteto and remote development environments, the engineering productivity increase has been huge for the Engineering R&amp;D team at Monday.com. Developers no longer spend extra time on handling environment setup and can work on what really matters which is building the product itself.”</p>
<ul>
<li class="">Lior Rabin, Engineering Manager, Monday.com</li>
</ul>
</blockquote>
<p>The future of development is not on a local machine.  It’s in the cloud with remote development environments at the core. If you recognize the lack of productivity stemming from the traditional, tedious workflow of application development, you and your engineering team are ready to join us. We would love to help you and your team transform your software development process. <a href="https://www.okteto.com/contact/" target="_blank" rel="noopener noreferrer" class="">Reach out</a>!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="we-are-hiring">We Are Hiring<a href="https://www.okteto.com/blog/a-15m-series-a-to-disrupt-modern-development/#we-are-hiring" class="hash-link" aria-label="Direct link to We Are Hiring" title="Direct link to We Are Hiring" translate="no">​</a></h2>
<p>What started as an open-source project in 2019, is now a world-class team of 17 experts in dev tools working alongside a global community of thousands of developers to improve application development. And we're only beginning to scratch the surface of what's possible with remote development environments.</p>
<p>Now is the time to spread the word and bring remote development environments to the forefront. Over the next several months, we'll be hiring talent across Marketing, Sales, Customer Success, and Engineering to bring the vision to life.</p>
<p>We are a fully remote and global company (we don't even have an office). Join us! You can find <a href="https://www.okteto.com/about-us/#careers" target="_blank" rel="noopener noreferrer" class="">our open positions here</a>.</p>
<p>In addition to expanding the team, we're beyond excited to partner with Villi and Two Sigma Ventures as partners for this next phase of the Okteto journey. We're convinced that Villi's experience with category-defining companies like Gitlab and Remote.com will support us in building an even more amazing community and product.</p>
<p>This funding milestone would not be possible without the support of our community, customers, and partners. Thank you all for believing and supporting us!</p>]]></content:encoded>
            <category>okteto</category>
            <category>startup</category>
        </item>
        <item>
            <title><![CDATA[Building Docker Images Faster for Webpack]]></title>
            <link>https://www.okteto.com/blog/building-docker-images-faster-for-webpack/</link>
            <guid>https://www.okteto.com/blog/building-docker-images-faster-for-webpack/</guid>
            <pubDate>Thu, 16 Dec 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[How to Optimize your Webpack Dockerfile]]></description>
            <content:encoded><![CDATA[<p>At Okteto we are very passionate about increasing developer productivity. We were looking for ways to improve our container build times when we came across an amazing project, <a href="https://github.com/moby/buildkit" target="_blank" rel="noopener noreferrer" class="">BuildKit</a>. BuildKit helps us build Docker images faster than ever.</p>
<!-- -->
<p>But when getting started we found that there were very few practical examples on how someone could optimize their Dockerfiles with Buildkit - so we thought why not change that? This article is going to be about how you too can optimize your Docker builds using <a href="https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/syntax.md#run---mounttypecache" target="_blank" rel="noopener noreferrer" class="">Buildkit caches</a>!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-why">The Why<a href="https://www.okteto.com/blog/building-docker-images-faster-for-webpack/#the-why" class="hash-link" aria-label="Direct link to The Why" title="Direct link to The Why" translate="no">​</a></h2>
<p>The first question which arises is, why even bother with optimizing your Dockerfiles? Well, the thing is that containers have revolutionized how we build, ship, and run our applications these days. So much so that containers are now heavily integrated into the development cycle and are built over and over - manually or in CI pipelines for testing and live previews.</p>
<p>The biggest quality of life improvement that comes with better image build times is faster testing and review cycles. The quicker everyone can see and test the changes they make, the more the productivity of the team would increase! We have first-hand witnessed this for our website, but more on that <a href="https://www.okteto.com/blog/building-docker-images-faster-for-webpack/#performance-evaluation" target="_blank" rel="noopener noreferrer" class="">later</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-standard-dockerfile-for-webpack">The Standard Dockerfile for Webpack<a href="https://www.okteto.com/blog/building-docker-images-faster-for-webpack/#the-standard-dockerfile-for-webpack" class="hash-link" aria-label="Direct link to The Standard Dockerfile for Webpack" title="Direct link to The Standard Dockerfile for Webpack" translate="no">​</a></h2>
<p>Before we look at how we can speed up build times using BuildKit, let's first see how a standard Dockerfile for Webpack should look like.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token comment" style="color:rgb(106, 153, 85)"># Dockerfile</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">FROM node</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">16 as build</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">WORKDIR /usr/src/app</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">COPY package.json yarn.lock ./</span><br></div><div class="token-line" style="color:white"><span class="token plain">RUN yarn install</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">COPY . .</span><br></div><div class="token-line" style="color:white"><span class="token plain">RUN yarn build</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">FROM nginx</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">alpine</span><br></div><div class="token-line" style="color:white"><span class="token plain">COPY </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">from=build /usr/src/app/dist /usr/share/nginx/html</span><br></div><div class="token-line" style="color:white"><span class="token plain">EXPOSE 80</span><br></div></code></pre></div></div>
<p>This Dockerfile uses a <code>build</code>step to build the final artifacts, and then, it copies the artifacts to an <code>nginx</code>image.</p>
<p>In order to optimize the Dockerfile instructions cache, we are purposefully <strong>first</strong> copying <code>package.json</code>and <code>yarn.lock</code>to install the runtime dependencies. We don't copy over everything else in this same step since most of the commits don't change the yarn dependencies, allowing this step to be cached in those cases leading to better build times! But this is already a commonly known best practice and BuildKit would help us optimize the process even more.</p>
<p>The next thing we do is to <code>COPY</code>all our remaining files from our local folder to our <code>WORKDIR</code>. Our changes would be made to one of these files so this means that <code>yarn build</code>is always executed unlike the <code>yarn install</code>instruction above.</p>
<blockquote>
<p>Remember to configure your <code>.dockerignore</code>file. In this case, adding <code>.git</code>or <code>node_modules</code>to your <code>.dockerignore</code>file will dramatically reduce the time to send your build context to the docker daemon. This is even more relevant if your build is running on a remote server.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="optimizing-the-standard-dockerfile">Optimizing the Standard Dockerfile<a href="https://www.okteto.com/blog/building-docker-images-faster-for-webpack/#optimizing-the-standard-dockerfile" class="hash-link" aria-label="Direct link to Optimizing the Standard Dockerfile" title="Direct link to Optimizing the Standard Dockerfile" translate="no">​</a></h2>
<p>Now that we've looked at how a standard Dockerfile for Webpack looks like, let's see how we can leverage BuildKit caches to further reduce our build times. BuildKit enables us to configure cache folders for the <code>RUN</code> instructions in our Dockerfile.</p>
<p>Contents of the BuildKit cache directories persist between builder invocations without invalidating the instruction cache. BuildKit also takes care of compatibility - our builds would work with any contents of the cache directory. This is necessary since another build may overwrite the cache files or GC may clean it if more storage space is needed.</p>
<p>In our case, we will use BuildKit caches to persist the <a href="https://classic.yarnpkg.com/en/docs/cli/cache" target="_blank" rel="noopener noreferrer" class="">yarn cache</a> and the <a href="https://webpack.js.org/configuration/cache/#cachecachedirectory" target="_blank" rel="noopener noreferrer" class="">webpack cache</a>.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token comment" style="color:rgb(106, 153, 85)"># Dockerfile.buildkit</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">FROM node</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">16 as build</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">WORKDIR /usr/src/app</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">COPY package.json yarn.lock ./</span><br></div><div class="token-line" style="color:white"><span class="token plain">RUN </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">mount=type=cache</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn install</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">COPY . .</span><br></div><div class="token-line" style="color:white"><span class="token plain">RUN </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">mount=type=cache</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">target=./node_modules/.cache/webpack yarn build</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">FROM nginx</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">alpine</span><br></div><div class="token-line" style="color:white"><span class="token plain">COPY </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">from=build /usr/src/app/dist /usr/share/nginx/html</span><br></div><div class="token-line" style="color:white"><span class="token plain">EXPOSE 80</span><br></div></code></pre></div></div>
<p>What this means is that <code>yarn install</code>and <code>yarn build</code>will be much faster. This is because their contents will be cached now onwards instead of them being run from scratch every time like earlier.</p>
<blockquote>
<p>Please note that we've not covered the installation process for BuildKit in this article since it's fairly simple and is documented well <a href="https://github.com/moby/buildkit#quick-start" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-evaluation">Performance Evaluation<a href="https://www.okteto.com/blog/building-docker-images-faster-for-webpack/#performance-evaluation" class="hash-link" aria-label="Direct link to Performance Evaluation" title="Direct link to Performance Evaluation" translate="no">​</a></h2>
<p>The improvement in build times we saw for our website after using BuildKit was phenomenal! Have a look yourself.</p>
<p><img decoding="async" loading="lazy" src="https://www.okteto.com/blog/assets/images/096b3801c44a-de69264353abc02d87128681c6f95c27.webp" width="1904" height="1510" class="img_ev3q"></p>
<p>The first graph shows the performance improvement we saw whenever we changed a dependency of our website and the second one shows the boost we got from using BuildKit when making code changes.</p>
<p>This means if you're building your images 100 times a day, you save more than 1 hr 23 mins of build time every day!</p>
<p>We hope you too can now appreciate how powerful BuildKit is. A change of only two lines of code in your Dockerfile can dramatically decrease your image build times! We hope this article was useful and you too are now able to optimize your Docker builds.</p>
<p>Happy coding!</p>]]></content:encoded>
            <category>buildkit</category>
            <category>dockerfile</category>
            <category>webpack</category>
            <category>development</category>
            <category>docker</category>
        </item>
        <item>
            <title><![CDATA[Building a FastAPI Application with Okteto - Part 4 - Preview Environments]]></title>
            <link>https://www.okteto.com/blog/fastapi-and-okteto-video-series-preview-environment/</link>
            <guid>https://www.okteto.com/blog/fastapi-and-okteto-video-series-preview-environment/</guid>
            <pubDate>Fri, 05 Nov 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to create a FastAPI app with Okteto remote development environments in this video series by Abdul.]]></description>
            <content:encoded><![CDATA[<p>Welcome back to our video series - Building a FastAPI Application with Okteto. This is Part 4: Preview Environments.</p>
<p>In this video, you’ll learn how to automatically create <a href="https://www.okteto.com/preview-environments" target="_blank" rel="noopener noreferrer" class="">preview environments</a> for every pull request of your application using GitHub actions and Okteto.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/wZMZ9HtphFU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<p>New to the series? Don't worry, the previous episodes are available on our YouTube channel:</p>
<ul>
<li class=""><a href="https://www.youtube.com/watch?v=NJpcKkQ3Bn0" target="_blank" rel="noopener noreferrer" class="">Part I: Intro</a></li>
<li class=""><a href="https://www.youtube.com/watch?v=ScWyTBy9N94&amp;t=123s" target="_blank" rel="noopener noreferrer" class="">Part II: Routes</a></li>
<li class=""><a href="https://www.youtube.com/watch?v=VuvPDApyGek&amp;t=8s" target="_blank" rel="noopener noreferrer" class="">Part III: Databases</a></li>
</ul>
<p>Be sure to subscribe to our <a href="https://www.youtube.com/channel/UCXYaFkiXHdBA7fjKgEgSJfA" target="_blank" rel="noopener noreferrer" class="">YouTube channel</a> to be the first to know when new videos go live!</p>]]></content:encoded>
            <category>fastapi</category>
            <category>remote-development-environments</category>
            <category>preview-environments</category>
        </item>
        <item>
            <title><![CDATA[Building a FastAPI Application with Okteto - Part 3 - Database]]></title>
            <link>https://www.okteto.com/blog/fastapi-and-okteto-video-series-database/</link>
            <guid>https://www.okteto.com/blog/fastapi-and-okteto-video-series-database/</guid>
            <pubDate>Wed, 27 Oct 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to create a FastAPI app with Okteto remote development environments in this video series by Abdul.]]></description>
            <content:encoded><![CDATA[<p>Welcome back to our video series - Building a FastAPI Application with Okteto. This is Part 3: Database.</p>
<p>In this video, you’ll learn how to add HTTP routes to your service and how to connect it to a database.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/VuvPDApyGek" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<p>Be sure to subscribe to our <a href="https://www.youtube.com/channel/UCXYaFkiXHdBA7fjKgEgSJfA" target="_blank" rel="noopener noreferrer" class="">YouTube channel</a> to be the first to know when new videos go live!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources:<a href="https://www.okteto.com/blog/fastapi-and-okteto-video-series-database/#resources" class="hash-link" aria-label="Direct link to Resources:" title="Direct link to Resources:" translate="no">​</a></h3>
<ul>
<li class=""><a href="https://www.youtube.com/watch?v=NJpcKkQ3Bn0" target="_blank" rel="noopener noreferrer" class="">Part I: Intro</a></li>
<li class=""><a href="https://www.youtube.com/watch?v=ScWyTBy9N94&amp;t=123s" target="_blank" rel="noopener noreferrer" class="">Part II: Routes</a></li>
<li class="">Try Okteto for <a href="https://www.okteto.com/signup/" target="_blank" rel="noopener noreferrer" class="">free</a></li>
<li class="">Follow us on <a href="https://twitter.com/oktetohq/" target="_blank" rel="noopener noreferrer" class="">Twitter</a></li>
<li class=""><a href="https://github.com/okteto/guestbook-api/tree/setting-up" target="_blank" rel="noopener noreferrer" class="">Guestbook API code</a></li>
</ul>]]></content:encoded>
            <category>fastapi</category>
            <category>remote-development-environments</category>
        </item>
        <item>
            <title><![CDATA[What's New in Okteto CLI and Enterprise October 2021]]></title>
            <link>https://www.okteto.com/blog/oct-2021-cli-enterprise-release/</link>
            <guid>https://www.okteto.com/blog/oct-2021-cli-enterprise-release/</guid>
            <pubDate>Wed, 20 Oct 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Check out what's new in Okteto CLI and Enterprise! You can now set your context for all Okteto commands, manually sleep a namespace and more!]]></description>
            <content:encoded><![CDATA[<p>Fall is here, and with it, we have some cool new features that we hope will help you have a better developer experience while using Okteto.</p>
<p>Here’s what’s new in both our CLI and Okteto Self-Hosted.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new-in-cli">What’s new in CLI<a href="https://www.okteto.com/blog/oct-2021-cli-enterprise-release/#whats-new-in-cli" class="hash-link" aria-label="Direct link to What’s new in CLI" title="Direct link to What’s new in CLI" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="okteto-context">Okteto context<a href="https://www.okteto.com/blog/oct-2021-cli-enterprise-release/#okteto-context" class="hash-link" aria-label="Direct link to Okteto context" title="Direct link to Okteto context" translate="no">​</a></h3>
<p>We’re really excited about our new command <code>okteto context</code> which allows you to set your context once, and then all okteto commands you run will use that particular context. Specifically, this will help to avoid those instances when you might accidentally run <code>okteto up</code> against production and cause an outage.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="okteto-up-translation-uses-a-mirror"><code>okteto up</code> translation uses a mirror<a href="https://www.okteto.com/blog/oct-2021-cli-enterprise-release/#okteto-up-translation-uses-a-mirror" class="hash-link" aria-label="Direct link to okteto-up-translation-uses-a-mirror" title="Direct link to okteto-up-translation-uses-a-mirror" translate="no">​</a></h3>
<p>This change allows a user to do <code>kubectl apply</code> changes to their deployments while there is an active okteto up session.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-for-building-docker-images-locally">Support for building docker images locally<a href="https://www.okteto.com/blog/oct-2021-cli-enterprise-release/#support-for-building-docker-images-locally" class="hash-link" aria-label="Direct link to Support for building docker images locally" title="Direct link to Support for building docker images locally" translate="no">​</a></h3>
<p>Thanks to our new support for building images using your local docker daemon, you can now tell Okteto to use your local docker to build images instead of using Okteto’s build service. This is another features that makes using our open source CLI easier for customers and helps to improve the overall developer experience.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-for-okteto-manifest-override">Support for Okteto Manifest override<a href="https://www.okteto.com/blog/oct-2021-cli-enterprise-release/#support-for-okteto-manifest-override" class="hash-link" aria-label="Direct link to Support for Okteto Manifest override" title="Direct link to Support for Okteto Manifest override" translate="no">​</a></h3>
<p>We now support multiple manifests in Okteto CLI, which means you can override values in the manifest that will affect only your stack, and not affect the rest of the team. This allows you to test things out on your end and not affect anyone else’s stack in the process.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new-in-okteto-self-hosted">What’s new in Okteto Self-Hosted<a href="https://www.okteto.com/blog/oct-2021-cli-enterprise-release/#whats-new-in-okteto-self-hosted" class="hash-link" aria-label="Direct link to What’s new in Okteto Self-Hosted" title="Direct link to What’s new in Okteto Self-Hosted" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="disable-cli-metrics">Disable CLI metrics<a href="https://www.okteto.com/blog/oct-2021-cli-enterprise-release/#disable-cli-metrics" class="hash-link" aria-label="Direct link to Disable CLI metrics" title="Direct link to Disable CLI metrics" translate="no">​</a></h3>
<p>We’ve always had a way for our Self-Hosted admins to disable analytics coming from their Self-Hosted accounts. Now, we also have a way for them to disable analytics from both their Self-Hosted and CLI accounts if the admin doesn’t want those metrics being saved.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="manually-sleep-a-namespace">Manually sleep a namespace<a href="https://www.okteto.com/blog/oct-2021-cli-enterprise-release/#manually-sleep-a-namespace" class="hash-link" aria-label="Direct link to Manually sleep a namespace" title="Direct link to Manually sleep a namespace" translate="no">​</a></h3>
<p>Coming this month: Admins can sleep a namespace manually, rather than just waiting for it to naturally sleep. This is helpful in conserving resources when an employee is going to be out of the office, or when you know they won’t be using a namespace during a specified time.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-destroy-all-command">New destroy all command<a href="https://www.okteto.com/blog/oct-2021-cli-enterprise-release/#new-destroy-all-command" class="hash-link" aria-label="Direct link to New destroy all command" title="Direct link to New destroy all command" translate="no">​</a></h3>
<p>We have now created the ability for a developer to destroy all resources in a namespace at once without actually having to destroy the namespace in the process.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="namespaces-that-are-terminating">Namespaces that are terminating<a href="https://www.okteto.com/blog/oct-2021-cli-enterprise-release/#namespaces-that-are-terminating" class="hash-link" aria-label="Direct link to Namespaces that are terminating" title="Direct link to Namespaces that are terminating" translate="no">​</a></h3>
<p>You can now see a list of namespaces that are currently in the process of terminating, rather than just those that are still active.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrading-dependencies">Upgrading dependencies<a href="https://www.okteto.com/blog/oct-2021-cli-enterprise-release/#upgrading-dependencies" class="hash-link" aria-label="Direct link to Upgrading dependencies" title="Direct link to Upgrading dependencies" translate="no">​</a></h2>
<p>Of course, we’re always upgrading dependencies to make sure we have an efficient and secure product for our customers. This month, we’re upgrading to buildkit 0.9.</p>
<p>Have you tried Okteto? We’d love for you to try it out for yourself and see how developers are coding faster with Okteto, and avoiding the dreaded sluggish laptop. <a href="https://www.okteto.com/signup/" target="_blank" rel="noopener noreferrer" class="">Click here to get your free account</a> Log in with GitHub and give it a try!</p>
<p>Happy coding!</p>]]></content:encoded>
            <category>kubernetes</category>
            <category>cloud-native</category>
            <category>development</category>
            <category>okteto-cli</category>
            <category>okteto-enterprise</category>
        </item>
        <item>
            <title><![CDATA[How a Hackathon Helps You Become a Better Developer]]></title>
            <link>https://www.okteto.com/blog/hackathon-helps-you-become-a-better-developer/</link>
            <guid>https://www.okteto.com/blog/hackathon-helps-you-become-a-better-developer/</guid>
            <pubDate>Fri, 15 Oct 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Hackathons can help you learn new skills, network, and improve your resume.]]></description>
            <content:encoded><![CDATA[<p>It’s Hacktober and that means you might have the opportunity to participate in some hackathons either virtually or in person this month.</p>
<p>Here at Okteto, we love Hackathons because they're a great way to build community. If you’re a newer developer, you may be wondering if participating is a good idea. We think so, and want to share with you some of the top reasons why you should participate in one or more hackathons this year.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learn-new-skills">Learn new skills<a href="https://www.okteto.com/blog/hackathon-helps-you-become-a-better-developer/#learn-new-skills" class="hash-link" aria-label="Direct link to Learn new skills" title="Direct link to Learn new skills" translate="no">​</a></h2>
<p>A hackathon is a great way to learn new skills and grow your current knowledge. Maybe you’ll get some experience in a coding language you’re not familiar with. Or, maybe you’ll get to try building a type of feature you’ve never worked on before. With hackathons, there’s a time constraint, which can actually help you learn how to figure things out quickly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="networking">Networking<a href="https://www.okteto.com/blog/hackathon-helps-you-become-a-better-developer/#networking" class="hash-link" aria-label="Direct link to Networking" title="Direct link to Networking" translate="no">​</a></h2>
<p>Whether you’re doing a hackathon through your employer, or through an outside company, there’s no doubt that networking is one of the great benefits. For internal hackathons, you can meet some people who are on a different team from you and learn more about the company. If you’re working on a hackathon through an external source, you can meet potential employers, friends, and future team members. Growing your network and community through participation will help you as you grow in your career.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="improve-your-resume">Improve your resume<a href="https://www.okteto.com/blog/hackathon-helps-you-become-a-better-developer/#improve-your-resume" class="hash-link" aria-label="Direct link to Improve your resume" title="Direct link to Improve your resume" translate="no">​</a></h2>
<p>When you’re first starting out, growing your resume can feel difficult. Perhaps you went to school for software engineering, or attended a bootcamp and now you’re not sure what to do to get that first role. Participating in a hackathon can be a great choice because now you’re showing potential employers a real world example of your work. It’s a great project to talk through at job interviews, and can be helpful for getting your foot in the door.</p>
<p>What do you think? Will you be participating in any hackathons this month? If so, let us know which ones on <a href="https://twitter.com/oktetohq/" target="_blank" rel="noopener noreferrer" class="">Twitter</a> so we can cheer you on!</p>]]></content:encoded>
            <category>kubernetes</category>
            <category>cloud-native</category>
            <category>development</category>
            <category>hackathon</category>
        </item>
        <item>
            <title><![CDATA[Building a FastAPI Application with Okteto - Part 1 - Getting Started]]></title>
            <link>https://www.okteto.com/blog/fastapi-and-okteto-video-series-getting-started/</link>
            <guid>https://www.okteto.com/blog/fastapi-and-okteto-video-series-getting-started/</guid>
            <pubDate>Wed, 13 Oct 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to create a FastAPI app with Okteto remote development environments in this video series by Abdul.]]></description>
            <content:encoded><![CDATA[<p>Welcome back to our video series - Building a FastAPI Application with Okteto. This is Part 1: Getting Started.</p>
<p>In this video, we'll be setting up our FastAPI application structure as well as creating the initial deployment to Okteto and setting up our dev environments.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/ScWyTBy9N94" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<p>Be sure to subscribe to our <a href="https://www.youtube.com/channel/UCXYaFkiXHdBA7fjKgEgSJfA" target="_blank" rel="noopener noreferrer" class="">YouTube channel</a> to be the first to know when new videos go live!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources:<a href="https://www.okteto.com/blog/fastapi-and-okteto-video-series-getting-started/#resources" class="hash-link" aria-label="Direct link to Resources:" title="Direct link to Resources:" translate="no">​</a></h3>
<ul>
<li class="">Try Okteto for <a href="https://www.okteto.com/signup/" target="_blank" rel="noopener noreferrer" class="">free</a></li>
<li class="">Follow us on <a href="https://twitter.com/oktetohq/" target="_blank" rel="noopener noreferrer" class="">Twitter</a></li>
<li class=""><a href="https://github.com/okteto/guestbook-api/tree/setting-up" target="_blank" rel="noopener noreferrer" class="">Guestbook API code</a></li>
</ul>]]></content:encoded>
            <category>fastapi</category>
            <category>remote-development-environments</category>
        </item>
        <item>
            <title><![CDATA[Okteto’s Monthly Community Call is on October 21st]]></title>
            <link>https://www.okteto.com/blog/oct-2021-community-call/</link>
            <guid>https://www.okteto.com/blog/oct-2021-community-call/</guid>
            <pubDate>Tue, 12 Oct 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Register for the October 2021 Community Call and let's talk about all things KubeCon and DevX Day!]]></description>
            <content:encoded><![CDATA[<p>We’re excited to announce that our next Community Call will be on Thursday, October 21st at 10am Pacific/1pm Eastern.</p>
<p>This month, we'll be talking all about KubeCon. Whether you attended in person, online, or were unable to attend, you won't want to miss this call! We'll be sharing details about our presentations at DevX Day, plus some cool new things we learned about during the conference.</p>
<p>We'd love to hear from members of our community who were also there and feel like sharing their experiences. Is that you? Reach out to us on <a href="https://twitter.com/oktetohq" target="_blank" rel="noopener noreferrer" class="">Twitter</a> and let us know! We'd be happy to have you join us.</p>
<p>When you <a href="https://lu.ma/dqbc7s3v" target="_blank" rel="noopener noreferrer" class="">register for this month’s Community Call</a>, you can select to register for the entire series so that you’ll always be on the list for future events.</p>
<p>We look forward to seeing you there!</p>]]></content:encoded>
            <category>events</category>
            <category>startup</category>
            <category>youtube</category>
            <category>kubecon</category>
            <category>developer-experience</category>
        </item>
        <item>
            <title><![CDATA[Introducing the FastAPI and Okteto Video Series]]></title>
            <link>https://www.okteto.com/blog/intro-to-fastapi-and-okteto-video-series/</link>
            <guid>https://www.okteto.com/blog/intro-to-fastapi-and-okteto-video-series/</guid>
            <pubDate>Fri, 08 Oct 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to create a FastAPI app with Okteto remote development environments in this video series by Abdul.]]></description>
            <content:encoded><![CDATA[<p>We have a new series beginning on our YouTube channel where you'll learn how to create a FastAPI app using Okteto remote development environments. Check out the intro video and make sure you've <a href="https://www.youtube.com/channel/UCXYaFkiXHdBA7fjKgEgSJfA/" target="_blank" rel="noopener noreferrer" class="">subscribed to our channel</a> to be the first to know when new videos go live!</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/NJpcKkQ3Bn0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources:<a href="https://www.okteto.com/blog/intro-to-fastapi-and-okteto-video-series/#resources" class="hash-link" aria-label="Direct link to Resources:" title="Direct link to Resources:" translate="no">​</a></h3>
<ul>
<li class="">Try Okteto for <a href="https://www.okteto.com/signup/" target="_blank" rel="noopener noreferrer" class="">free</a></li>
<li class=""><a href="https://www.okteto.com/docs/get-started/install-okteto-cli" target="_blank" rel="noopener noreferrer" class="">Building a FastAPI app with Okteto</a></li>
<li class="">Follow us on <a href="https://twitter.com/oktetohq/" target="_blank" rel="noopener noreferrer" class="">Twitter</a></li>
</ul>]]></content:encoded>
            <category>fastapi</category>
            <category>remote-development-environments</category>
        </item>
        <item>
            <title><![CDATA[Okteto Self-Hosted vs. Bring Your Own Cloud: Which Is Right for Your Team?]]></title>
            <link>https://www.okteto.com/blog/okteto-for-teams/</link>
            <guid>https://www.okteto.com/blog/okteto-for-teams/</guid>
            <pubDate>Wed, 06 Oct 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[There are two ways to run Okteto, and both keep your code and data in your own infrastructure: Self-Hosted in your own Kubernetes cluster, or Bring Your Own Cloud, where Okteto manages the platform in your cloud account. Here is how to choose.]]></description>
            <content:encoded><![CDATA[<p>If you've been following Okteto, you know our mission hasn't changed: give every developer a production-like environment on demand, so teams can build, preview, and test against something real instead of a laptop-sized approximation. What has evolved is <em>how</em> you bring that capability into your organization.</p>
<p>The question we hear most often from platform teams isn't "should we adopt Okteto?" It's "how should we run it?" The answer depends on how much of the underlying infrastructure your team wants to own. Today there are two ways to run Okteto, and both keep your code and data inside your own cloud: <strong>Okteto Self-Hosted</strong> and <strong>Okteto Bring Your Own Cloud (BYOC)</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="okteto-self-hosted">Okteto Self-Hosted<a href="https://www.okteto.com/blog/okteto-for-teams/#okteto-self-hosted" class="hash-link" aria-label="Direct link to Okteto Self-Hosted" title="Direct link to Okteto Self-Hosted" translate="no">​</a></h2>
<p>With Okteto Self-Hosted, you install and run Okteto in your own Kubernetes cluster. Your team owns the deployment end to end: the cluster, the upgrades, the configuration, and the day-to-day operations.</p>
<p>This is the right fit for organizations that already have deep Kubernetes expertise, that have strict requirements about what runs where, or that simply want full control over every layer of the stack. Nothing leaves your environment, and nothing is out of your hands.</p>
<p>The tradeoff is ownership. Running a platform is real work, and Self-Hosted assumes your team is ready to take that on.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="okteto-bring-your-own-cloud">Okteto Bring Your Own Cloud<a href="https://www.okteto.com/blog/okteto-for-teams/#okteto-bring-your-own-cloud" class="hash-link" aria-label="Direct link to Okteto Bring Your Own Cloud" title="Direct link to Okteto Bring Your Own Cloud" translate="no">​</a></h2>
<p>Not every team wants to operate the platform, even when they want the control that comes with running it in their own environment. That's the gap <a href="https://www.okteto.com/docs/byoc/" target="_blank" rel="noopener noreferrer" class="">Okteto Bring Your Own Cloud</a> fills.</p>
<p>With BYOC, Okteto runs on your own cloud account, but we handle the operational side: installation, upgrades, patching, monitoring, and the daily reconciliation that keeps the platform healthy. You keep full ownership of your cloud environment and your data. Okteto only interacts with the workloads required to run the platform itself.</p>
<p>In other words, your data never leaves your cloud, and your team never has to become a full-time platform operator. For teams with strong security or compliance requirements, or those running at scale, that combination of control and low operational overhead is often the deciding factor.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="which-one-is-right-for-your-team">Which one is right for your team?<a href="https://www.okteto.com/blog/okteto-for-teams/#which-one-is-right-for-your-team" class="hash-link" aria-label="Direct link to Which one is right for your team?" title="Direct link to Which one is right for your team?" translate="no">​</a></h2>
<p>It comes down to a single question: how much of the platform do you want to run yourself?</p>
<ul>
<li class="">Choose <strong>Self-Hosted</strong> if you have the Kubernetes expertise in-house and want to own every part of the deployment.</li>
<li class="">Choose <strong>Bring Your Own Cloud</strong> if you want the security and data-residency benefits of running in your own cloud, but would rather Okteto handle the undifferentiated heavy lifting of operating the platform.</li>
</ul>
<p>The important part, and what sets both apart from the multi-tenant SaaS model many tools default to, is that in either case your environments, your source code, and your data stay inside infrastructure you own.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learning-from-teams-already-doing-this">Learning from teams already doing this<a href="https://www.okteto.com/blog/okteto-for-teams/#learning-from-teams-already-doing-this" class="hash-link" aria-label="Direct link to Learning from teams already doing this" title="Direct link to Learning from teams already doing this" translate="no">​</a></h2>
<p>One of the clearest examples comes from Monday.com. They needed to give a large engineering organization realistic development environments for an application with more than 30 microservices, without asking every developer to run all of it on their laptop.</p>
<p>You can read about <a href="https://engineering.monday.com/development-environments-in-the-cloud/" target="_blank" rel="noopener noreferrer" class="">Monday.com's experience</a> in their own words. It's a good look at what changes for a team when production-like environments become something developers can spin up on demand.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-you-get-either-way">What you get, either way<a href="https://www.okteto.com/blog/okteto-for-teams/#what-you-get-either-way" class="hash-link" aria-label="Direct link to What you get, either way" title="Direct link to What you get, either way" translate="no">​</a></h2>
<p>Whichever model you choose, the developer experience is the same. Both Self-Hosted and BYOC give your team:</p>
<ul>
<li class="">Preview environments with every pull request</li>
<li class="">Development environments that are realistic replicas of production</li>
<li class="">Single sign-on so you can plug into your existing identity provider</li>
<li class="">Namespace sharing for real-time collaboration</li>
<li class="">Custom roles and security policies</li>
<li class="">Support from the Okteto team</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="not-sure-which-fits">Not sure which fits?<a href="https://www.okteto.com/blog/okteto-for-teams/#not-sure-which-fits" class="hash-link" aria-label="Direct link to Not sure which fits?" title="Direct link to Not sure which fits?" translate="no">​</a></h2>
<p>If you're weighing Self-Hosted against Bring Your Own Cloud, or you just want to see what Okteto looks like for a team your size, <a href="https://www.okteto.com/get-demo/" target="_blank" rel="noopener noreferrer" class="">book a demo</a> and we'll walk you through both and help you figure out which one fits your organization.</p>]]></content:encoded>
            <category>kubernetes</category>
            <category>cloud-native</category>
        </item>
        <item>
            <title><![CDATA[Best Practices in Kubernetes Security]]></title>
            <link>https://www.okteto.com/blog/best-practices-in-kubernetes-security/</link>
            <guid>https://www.okteto.com/blog/best-practices-in-kubernetes-security/</guid>
            <pubDate>Mon, 04 Oct 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how you can include preview environments and automate your CI/CD process using GitHub Actions and Okteto.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>Joydip is a Microsoft Most Valuable Professional in ASP.NET, speaker, and author of several books and articles. He has more than 25 years of experience in IT, and more than 18 years in Microsoft .NET and its related technologies. He has authored more than 500 articles in some of the most reputed sites worldwide, including MSDN, InfoWorld, CodeMag, Tech Beacon, Auth0, MSSQLTips, Tech Target, etc.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h2>
<p>There has been a surge in the adoption of containers such as Docker over the past few years. These containers offer lightweight virtualization and encapsulation for packing, deploying, and scaling microservices.</p>
<p>Containers are small, portable, executable application components that comprise source code and the operating system libraries and dependencies required for the code to run in any environment. You can quickly and effortlessly start new services, run several instances on the same host to save resources, and scale up and down as needed.</p>
<p>Containers are becoming more popular, driving the need for tools to manage and orchestrate them on a larger scale. With the introduction of containers came the expansion of the size of clusters and the diversification of microservices. As a result, container orchestration has become more crucial.</p>
<p>This is exactly where Kubernetes comes to the rescue. Over the past few years, Kubernetes' acceptance has grown leaps and bounds. This exponential growth is predominantly because of its ability to improve efficiency and agility in an organization.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-kubernetes">What is Kubernetes?<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#what-is-kubernetes" class="hash-link" aria-label="Direct link to What is Kubernetes?" title="Direct link to What is Kubernetes?" translate="no">​</a></h2>
<p>Kubernetes, also known as K8s, is a portable, open-source, extensible, vendor and cloud-agnostic container orchestration platform designed to automate container scaling, deployment, and management. Although Kubernetes is excellent at orchestration, it's not adept at handling security. As a result, you must use the appropriate deployment architecture and security best practices to eliminate security flaws and thwart any security attacks.</p>
<p>Here are a few reasons why you should use Kubernetes:</p>
<p><strong>Open-Source:</strong> Kubernetes is an open-source container orchestration system and a community-led initiative governed by Certified Kubernetes Conformance Program (CNCF).</p>
<p><strong>Portability and Flexibility:</strong> You can use Kubernetes with any container runtime and any underlying infrastructure provided that the host operating system is either Windows or Linux.</p>
<p><strong>Multi-cloud support:</strong> Kubernetes can host workloads that are executed both on a single cloud as well as distributed across several clouds.</p>
<p><strong>Load balancing:</strong> To guarantee that the deployment is reliable, Kubernetes supports load balancing and network traffic distribution.</p>
<p><strong>Scalability:</strong> Kubernetes enables your application to be scaled both vertically and horizontally. Since containers are lightweight by design, you can build them at the drop of a hat and then scale your application quickly.</p>
<p><strong>Vendor and Cloud agnostic:</strong> Kubernetes is Cloud and Vendor neutral. It can run on Amazon Web Services (AWS), Microsoft Azure, Google Cloud Platform (GCP), or even on premise.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-kubernetes-control-plane-and-its-components">The Kubernetes Control Plane and its Components<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#the-kubernetes-control-plane-and-its-components" class="hash-link" aria-label="Direct link to The Kubernetes Control Plane and its Components" title="Direct link to The Kubernetes Control Plane and its Components" translate="no">​</a></h2>
<p>The Kubernetes Control Plane, a.k.a. the Master Node, serves as the brain of the cluster that manages the worker nodes. It's responsible for ensuring that the system is up and running and is in perfect working order. For administrators and users, it acts as the main point of access for managing the various nodes in the cluster. The control plane comprises the Kubernetes API server, etcd, and several controllers.</p>
<p>The following are the purposes of each of the components of the control plane:</p>
<ul>
<li class="">etcd - This is the fundamental component of a Kubernetes cluster used to store configuration data such that it's accessible to each node in a Kubernetes cluster.</li>
<li class="">kube-apiserver - This is a REST-based interface through which all communications pass and controls all management and operational functions in Kubernetes.</li>
<li class="">kube-controller-manager - This is a service that is responsible for keeping a close eye on the state of a cluster.</li>
<li class="">kube-scheduler - This component is accountable for scheduling cluster workloads.</li>
</ul>
<p>Malicious attackers might try to gain access to the Kubernetes API Server and Control Plane. Once they have been hacked, the attackers may compromise the entire cluster by altering the pods. They can deploy new ones or modify or even delete the existing pods from the cluster.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubernetes-security-understanding-the-challenges">Kubernetes Security: Understanding the Challenges<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#kubernetes-security-understanding-the-challenges" class="hash-link" aria-label="Direct link to Kubernetes Security: Understanding the Challenges" title="Direct link to Kubernetes Security: Understanding the Challenges" translate="no">​</a></h2>
<p>While Kubernetes is a popular technology for delivering containerized apps, scaling Kubernetes environments is challenging. Each new container increases the attack surface. To effectively deal with Kubernetes security, you must have complete visibility into every managed container and application request.
Kubernetes is great at orchestration but not as adept at security. For all deployments, it's imperative to employ the appropriate deployment architecture and security best practices. We'll take a deep dive into some of the Kubernetes security best practices in the following sections.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="securing-the-control-plane">Securing the Control Plane<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#securing-the-control-plane" class="hash-link" aria-label="Direct link to Securing the Control Plane" title="Direct link to Securing the Control Plane" translate="no">​</a></h3>
<p>Integrity monitoring on the most critical Kubernetes files is a vital first step to securing the control plane. This way, you'll get an instant notification if the settings of your Kubernetes environment are altered in any way. Note that critical files are those that, if hacked or compromised, might cause the whole cluster to fail.</p>
<p>This can be achieved by implementing detection policies to monitor any suspicious filesystem changes on critical Kubernetes files such as the following:</p>
<ul>
<li class="">Creation or removal of files or directories</li>
<li class="">Renaming of files or directories</li>
<li class="">Changes to the security settings of a file or directory, such as permissions, ownership, and so on</li>
<li class="">Changes made to the files pertaining a container</li>
</ul>
<p>You can read more on this <a href="https://www.trendmicro.com/vinfo/us/security/news/virtualization-and-cloud/the-basics-of-keeping-your-kubernetes-cluster-secure-part-1" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="securing-the-kubernetes-api-server">Securing the Kubernetes API Server<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#securing-the-kubernetes-api-server" class="hash-link" aria-label="Direct link to Securing the Kubernetes API Server" title="Direct link to Securing the Kubernetes API Server" translate="no">​</a></h3>
<p>To safeguard your Kubernetes API server, ensure it's on an authorized network and in a private cluster. To restrict unauthorized access to the Kubernetes API server, you should utilize Kubernetes Role-Based Access Control (RBAC).</p>
<p>Considered the Kubernetes control plane gateway, you should allocate a private IP address to the Kubernetes API server to protect it. Access to the Kubernetes API server from any public IP address should be disabled.</p>
<p>What then is the need to disable access from a public IP? The objective should always be to work with private nodes by disabling public access to prevent attackers from gaining control of the control plane. You should use a load balancer or an API gateway to expose a service on the web and enable the ports you require. The essence is that we should always strive to apply the least-privileged concept and ensure that everything is closed as a preventative measure.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-kubernetes-monitoring">What is Kubernetes Monitoring?<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#what-is-kubernetes-monitoring" class="hash-link" aria-label="Direct link to What is Kubernetes Monitoring?" title="Direct link to What is Kubernetes Monitoring?" translate="no">​</a></h2>
<p>Traditional monitoring no longer works for Kubernetes environments. However, you can adhere to the Kubernetes monitoring best practices to gain a deep insight into your system availability, performance, and the proper context to troubleshoot any problem if need be.</p>
<p>When you use Kubernetes monitoring, you may get insight into the current health of your cluster by looking at performance indicators such as resource counts, performance metrics, and a high-level overview of what is going on within your containerized application. It will help if you're notified when errors occur so that you may take appropriate action and resolve the issues.</p>
<p>Some of the popular Kubernetes monitoring tools include Prometheus, Grafana, Dashboard, Jaeger, etc.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubernetes-security-the-best-practices">Kubernetes Security: The Best Practices<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#kubernetes-security-the-best-practices" class="hash-link" aria-label="Direct link to Kubernetes Security: The Best Practices" title="Direct link to Kubernetes Security: The Best Practices" translate="no">​</a></h2>
<p>Since Kubernetes is completely API-driven, your first strategy should be managing and restricting who has access to the cluster and what activities they can do. To help you in this pursuit, take a look at these Kubernetes security best practices and guidelines you should adhere to protect your infrastructure.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enable-role-based-access-control-rbac">Enable Role-Based Access Control (RBAC)<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#enable-role-based-access-control-rbac" class="hash-link" aria-label="Direct link to Enable Role-Based Access Control (RBAC)" title="Direct link to Enable Role-Based Access Control (RBAC)" translate="no">​</a></h3>
<p>Role-Based Access Control (RBAC) allows you to control who has access to the Kubernetes API and their actions, such as creating, editing, and deleting resources. Since the authorization controllers in Kubernetes are combined, you must activate RBAC and disable traditional Attribute-Based Access Control. Once RBAC has been implemented, you must ensure that it's used properly. For example, it's usually recommended to avoid using cluster-wide permissions in favor of namespace-specific permissions. If possible, avoid granting anybody cluster-admin rights, even for debugging purposes. It's far more secure to give access only when it's needed.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enforce-resource-management-using-policy-as-code">Enforce Resource Management using Policy-as-Code<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#enforce-resource-management-using-policy-as-code" class="hash-link" aria-label="Direct link to Enforce Resource Management using Policy-as-Code" title="Direct link to Enforce Resource Management using Policy-as-Code" translate="no">​</a></h3>
<p>You need proactive resource management to establish predefined limitations on the resources used by both pods and containerized workloads. For DevOps teams, it's the most effective method to manage the production environment and to improve both operations and security at the same time. You can take advantage of policy-as-code tools to scan configuration data and check if it conforms to the codified policies.</p>
<p>In the absence of limitations on the resources that your containers and pods may use, you might find yourself in a position where they need more resources than are available. It would help if you created a policy that would make it imperative for Kubernetes configurations to specify resource limits to prevent such issues in the future. You might want to use policy-as-code tools like Terrascan to scan configurations and flag as soon as there is any non-conformance to the predefined codified policies.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="always-keep-kubernetes-updated">Always Keep Kubernetes Updated<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#always-keep-kubernetes-updated" class="hash-link" aria-label="Direct link to Always Keep Kubernetes Updated" title="Direct link to Always Keep Kubernetes Updated" translate="no">​</a></h3>
<p>Keeping your Kubernetes cluster up to date with the most current version is one of the most important security best practices you can follow. The old version of Kubernetes might be susceptible to attackers since they might get access to your Kubernetes cluster if you don't update Kubernetes with its most recent version. This activity must be performed regularly so that you have a most recent copy of Kubernetes.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="restrict-api-access">Restrict API Access<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#restrict-api-access" class="hash-link" aria-label="Direct link to Restrict API Access" title="Direct link to Restrict API Access" translate="no">​</a></h3>
<p>Most cloud-based Kubernetes implementations already limit access to the Kubernetes API of your cluster via the use of Identity and Access Management (IAM), Role-Based Access Control (RBAC), or Active Directory (AD). If your cluster doesn't already use one of these methods, you can typically configure one by using open-source projects to deal with different authentication methods. Additionally, access to the API should also be limited by the IP address, and access should only be provided to the trustworthy IPs.</p>
<p>The following open-source projects can help in this regard:</p>
<ul>
<li class=""><a href="https://github.com/liggitt/audit2rbac" target="_blank" rel="noopener noreferrer" class="">Audti2rbac</a></li>
<li class=""><a href="https://github.com/alcideio/rbac-tool" target="_blank" rel="noopener noreferrer" class="">Kubernetes RBAC</a></li>
<li class=""><a href="https://www.strongdm.com/" target="_blank" rel="noopener noreferrer" class="">StrongDM</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="restrict-ssh-access">Restrict SSH Access<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#restrict-ssh-access" class="hash-link" aria-label="Direct link to Restrict SSH Access" title="Direct link to Restrict SSH Access" translate="no">​</a></h3>
<p>It's an excellent practice to disallow SSH access to the Kubernetes nodes. This will lower the risk of unauthorized access to host resources on the cluster. Instead, it would help to ask the users to use the "kubectl exec" command to access the container environment without directly connecting to the host. You can also take advantage of Kubernetes Authorization Plugins to restrict user access to resources. You can even define access control rules for containers, namespaces, and operations.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="isolate-kubernetes-nodes">Isolate Kubernetes Nodes<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#isolate-kubernetes-nodes" class="hash-link" aria-label="Direct link to Isolate Kubernetes Nodes" title="Direct link to Isolate Kubernetes Nodes" translate="no">​</a></h3>
<p>You should ensure that a distinct network is dedicated to Kubernetes nodes. Additionally, it would help ensure that Kubernetes nodes are not accessible to the corporate network. Hence, Kubernetes control and data traffic should be kept separate. You should configure nodes in such a way that they allow connections from the master node only.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-process-whitelisting">Use Process Whitelisting<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#use-process-whitelisting" class="hash-link" aria-label="Direct link to Use Process Whitelisting" title="Direct link to Use Process Whitelisting" translate="no">​</a></h3>
<p>Process whitelisting is an efficient Kubernetes security technique that provides zero-trust guarantee as far as process security is concerned. You should create a list of processes that are allowed to run on each pod. Next, you should use this list as your application's whitelist.</p>
<p>Suppose an attacker succeeds in getting access to your cluster and begins running a malicious process. In that case, you'll easily identify the user since it's a new non-whitelisted process. If it isn't on the whitelist and isn't part of the pod's normal behavior either, it should be reported immediately.</p>
<p>The user can do process Whitelisting with admin privileges. <a href="https://www.alcide.io/whitelisting-processes-on-kubernetes-using-apparmor/" target="_blank" rel="noopener noreferrer" class="">AppArmor</a> is a popular security module for Linux that can be used for implementing process whitelisting in Kubernetes. <a href="https://www.alcide.io/securing-kubernetes-clusters-using-process-whitelisting/" target="_blank" rel="noopener noreferrer" class="">Here</a> is a good read on process whitelisting.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="deploy-additional-controls">Deploy Additional Controls<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#deploy-additional-controls" class="hash-link" aria-label="Direct link to Deploy Additional Controls" title="Direct link to Deploy Additional Controls" translate="no">​</a></h3>
<p>If you're using Kubernetes in a production environment, it's imperative that you deploy additional security controls. The reason is that you need complete visibility into the Kubernetes environment and the activities going on there.</p>
<p>This would help you to avoid potential downtimes when deploying mission-critical applications. These controls exist as policies to enable you to restrict access to resources in the cluster.</p>
<p>Here are the security best practices for Kubernetes in production:</p>
<ul>
<li class="">Enable Kubelet authentication and authorization</li>
<li class="">Establish security boundaries and isolate Kubernetes Nodes</li>
<li class="">Monitoring network traffic to be able to limit communications</li>
<li class="">Implement network security policies</li>
<li class="">Create security policy for pods</li>
<li class="">Use Process Whitelisting</li>
<li class="">Images should be scanned for any security vulnerabilities</li>
<li class="">Apply security updates on a regular basis</li>
<li class="">Log extensively</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="monitor-network-traffic">Monitor Network Traffic<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#monitor-network-traffic" class="hash-link" aria-label="Direct link to Monitor Network Traffic" title="Direct link to Monitor Network Traffic" translate="no">​</a></h3>
<p>Ideally, you should keep an eye on network activity and compare it to authorized traffic and traffic permitted by the Kubernetes network policy. The goal is to eliminate connections that are no longer required in order to minimize the attack surface. Additionally, you may strengthen the permitted network policy by removing any connections that aren't required.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="adopt-a-multi-layered-security-approach">Adopt a Multi-Layered Security Approach<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#adopt-a-multi-layered-security-approach" class="hash-link" aria-label="Direct link to Adopt a Multi-Layered Security Approach" title="Direct link to Adopt a Multi-Layered Security Approach" translate="no">​</a></h3>
<p>Cloud-native applications have diverse components and elements, making it imperative to look beyond containerized workloads to safeguard your Kubernetes deployments. Hence to secure your Kubernetes environment, you should adopt a multi-layered security strategy. The Kubernetes documentation recommends a multi-layered approach called 4C (Cloud, Container, Cluster, and Cloud) for securing your Kubernetes environments.</p>
<ul>
<li class="">Cloud and data center infrastructure and other resources required to create Kubernetes environments</li>
<li class="">Container clusters that comprise the workloads that run on a particular cluster</li>
<li class="">Individual Containers, i.e., the software images used to instantiate workloads.</li>
<li class="">Source Code and container images</li>
</ul>
<p>It would help if you took advantage of recommended tools to secure and protect each of these layers. However, you should know that you don't have one tool that can help protect all these layers.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enable-kubernetes-role-based-access-control">Enable Kubernetes Role-Based Access Control<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#enable-kubernetes-role-based-access-control" class="hash-link" aria-label="Direct link to Enable Kubernetes Role-Based Access Control" title="Direct link to Enable Kubernetes Role-Based Access Control" translate="no">​</a></h3>
<p>Role-Based Access Control or RBAC is a critical security component of Kubernetes and one of the Kubernetes Deployment best practices. It enables you to implement access control rules to your Kube API; you may specify the permissions granted to users through RBAC.</p>
<p>Although RBAC is enabled by default, starting with Kubernetes 1.6, it should be used appropriately. It would be best if you took appropriate measures to minimize permission duplication and deactivate inactive and unused roles so that you can concentrate only on active components and avoid providing unnecessary permissions to a user.</p>
<p>If you want to specify who has access to the Kubernetes API and what rights they have, RBAC may assist you in doing so. When you activate RBAC, you must also disable the old Attribute-Based Access Control (ABAC) mechanism.</p>
<p>When implementing RBAC, you should prefer namespace-specific rights over cluster-wide permissions. Even while debugging, don't give cluster administrator access. It's safer to provide access only when required.</p>
<p><a href="https://www.strongdm.com/blog/kubernetes-rbac-role-based-access-control" target="_blank" rel="noopener noreferrer" class="">Here</a> is a good read on working with RBAC in Kubernetes. Here are some additional references that might help:</p>
<ul>
<li class=""><a href="https://docs.giantswarm.io/getting-started/rbac-and-psp/" target="_blank" rel="noopener noreferrer" class="">https://docs.giantswarm.io/getting-started/rbac-and-psp/</a></li>
<li class=""><a href="https://www.cncf.io/blog/2018/08/01/demystifying-rbac-in-kubernetes/" target="_blank" rel="noopener noreferrer" class="">https://www.cncf.io/blog/2018/08/01/demystifying-rbac-in-kubernetes/</a></li>
<li class=""><a href="https://docs.redhat.com/en/documentation/openshift_container_platform/latest/html/authentication_and_authorization/using-rbac" target="_blank" rel="noopener noreferrer" class="">https://docs.redhat.com/en/documentation/openshift_container_platform/latest/html/authentication_and_authorization/using-rbac</a></li>
<li class=""><a href="https://thenewstack.io/three-realistic-approaches-to-kubernetes-rbac/" target="_blank" rel="noopener noreferrer" class="">https://thenewstack.io/three-realistic-approaches-to-kubernetes-rbac/</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="protect-etcd-with-tls-firewall-and-encryption">Protect etcd with TLS, Firewall and Encryption<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#protect-etcd-with-tls-firewall-and-encryption" class="hash-link" aria-label="Direct link to Protect etcd with TLS, Firewall and Encryption" title="Direct link to Protect etcd with TLS, Firewall and Encryption" translate="no">​</a></h3>
<p>The etcd database is the primary source of data within a Kubernetes cluster and contains all cluster objects. It's where all your cluster objects are kept safe and secure. If the etcd database is exposed, sensitive data can be compromised. This will enable an attacker to gain access and control on your cluster in its entirety. You should take advantage of both encryptions for the data in transit and at rest to secure your data.</p>
<p>Note that even read access is not safe since it would enable an attacker to elevate privileges. You can protect etcd using TLS encryption and Firewall. Once you've secured the data in transit, you can encrypt the entire etcd data at rest so that the data residing inside your clusters are secure.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="turn-on-audit-logging">Turn on Audit Logging<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#turn-on-audit-logging" class="hash-link" aria-label="Direct link to Turn on Audit Logging" title="Direct link to Turn on Audit Logging" translate="no">​</a></h3>
<p>Audit logging keeps track of the sequence of events in a Kubernetes cluster. It helps the administrators investigate a potential issue by keeping a close eye on the activities performed by the users and the Kubernetes API and examine the sequence of events that caused the problem.</p>
<p>You can take advantage of Kubernetes audit logs to keep track of everything that happens in your Kubernetes control plane, including who, what, when, and how it happened. It may be very beneficial to keep an eye on your audit logs since it can assist you in detecting and mitigating misconfigurations or misuse of Kubernetes resources before sensitive data is compromised.</p>
<p>Ensure that audit logging is enabled and that you monitor API requests that are unusual or unwanted, particularly authentication failures. These log entries are marked with the status message "Forbidden." An attacker may be attempting to use stolen credentials if an authorization request is denied.</p>
<p>You can take advantage of the audit policy file to enable audit logging while specifying which events should be captured in the logs. You may choose from four different logging levels: None, Metadata only, Request, and RequestResponse.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="leverage-the-principle-of-least-privilege-and-defense-in-depth">Leverage the Principle of Least Privilege and Defense-in-Depth<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#leverage-the-principle-of-least-privilege-and-defense-in-depth" class="hash-link" aria-label="Direct link to Leverage the Principle of Least Privilege and Defense-in-Depth" title="Direct link to Leverage the Principle of Least Privilege and Defense-in-Depth" translate="no">​</a></h3>
<p>Take advantage of the principles of least privilege and defense-in-depth to protect your Kubernetes environments. As a result, even if the attacker has breached one component, i.e., one of the components has been compromised, the attacker will still not have complete access to the system. In essence, the attacker will have to penetrate several additional layers to cause any substantial damage or gain access to the sensitive data.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What’s Next?<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#whats-next" class="hash-link" aria-label="Direct link to What’s Next?" title="Direct link to What’s Next?" translate="no">​</a></h2>
<p>Keeping up with security concerns may be difficult. Just keep in mind that adopting several levels of protection will significantly decrease your organization's risk. Kubernetes has a vibrant community that shares many of your organization's issues; consider using this community and contribute back when you can to help make Kubernetes more secure for everyone.</p>
<p>Use these recommendations to protect your Kubernetes cluster. Even if you follow these guidelines to protect your Kubernetes cluster, you must still secure your container configurations and runtime operations. Look for solutions that provide centralized governance, continuous monitoring, and security for containers and cloud-native applications.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/best-practices-in-kubernetes-security/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Because of its complexity, cloud-native systems such as Kubernetes offer rapidly growing challenges in adopting security best practices and fulfilling corporate security policy and compliance objectives. Securing your Kubernetes deployments can be excruciatingly difficult but not impossible.</p>
<p>Start by implementing the recommendations provided here as a starting point for securing your Kubernetes environment and decreasing the number of attack surfaces. The use of robust security guidelines will empower you to have complete transparency into and control over every layer of your Kubernetes deployment.</p>]]></content:encoded>
            <category>kubernetes</category>
            <category>security</category>
            <category>cloud-native</category>
        </item>
        <item>
            <title><![CDATA[Getting the Most Out of an Online Conference]]></title>
            <link>https://www.okteto.com/blog/getting-the-most-out-of-an-online-conference/</link>
            <guid>https://www.okteto.com/blog/getting-the-most-out-of-an-online-conference/</guid>
            <pubDate>Fri, 01 Oct 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Online conferences are now the norm, but how do you get the most out of them? Here are our top tips to make the most of any online conference.]]></description>
            <content:encoded><![CDATA[<p>Online conferences have quickly become the norm. Even as restrictions in some regions start to lift, many conferences are offering both online and in-person options. In some ways, online conferences may feel less connected than their in-person counterparts, but an online conference can actually be a great experience with opportunities to network and learn.</p>
<p>This year, <a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/" target="_blank" rel="noopener noreferrer" class="">KubeCon North America 2021</a> is offering both an in-person and virtual conference for attendees.</p>
<p>In order to help you make the most out of KubeCon and any future virtual/online conference, we put together a list of our favorite tips to keep in mind!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="mark-your-calendar">Mark your calendar<a href="https://www.okteto.com/blog/getting-the-most-out-of-an-online-conference/#mark-your-calendar" class="hash-link" aria-label="Direct link to Mark your calendar" title="Direct link to Mark your calendar" translate="no">​</a></h2>
<p>If you’re attending a conference from the comfort of your home or office, you may feel the temptation to carry on as business as usual. However, if you were attending in person, you’d be out of the office and probably away from your email and Slack for the most part. Even if you can’t focus 100% on your online conference, you should mark your calendar as busy so that your colleagues know you’ve got something going on. As much as possible, focus on the conference.</p>
<p>Of course, that doesn’t mean you need to book your calendar back to back. Take some time to breathe and relax in between sessions and don’t feel the need to be in a talk every moment that the conference is running because that can lead to burnout.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="participate">Participate<a href="https://www.okteto.com/blog/getting-the-most-out-of-an-online-conference/#participate" class="hash-link" aria-label="Direct link to Participate" title="Direct link to Participate" translate="no">​</a></h2>
<p>Sure, online conferences may have less opportunities for participation than in-person conferences, but that doesn’t mean you can’t participate at all! Many conferences have online networking opportunities, happy hours, and we’ve even seen online karaoke, show and tell, or talent shows taking place. Try to find something you can participate in, whether that’s something fun after the conference, or perhaps a round table discussion during the conference. Many online conferences have chat opportunities during talks so you can communicate with other attendees and ask the speakers questions.</p>
<p>One of the great things about virtual conferences is they allow for many different types of participation. No matter whether you’re more extroverted or introverted there’s an option for you. If you’re not comfortable jumping into a round table discussion on Zoom, can you try leaving comments on a presentation? Or ask a written question to the speakers during Q&amp;A?</p>
<p>This year at KubeCon North America 2021, attendees will have networking opportunities on Slack as well as the ability to participate in Office Hours. Check out everything that’s included with either the virtual or in-person pass <a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/register/" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="share-what-you-learn">Share what you learn<a href="https://www.okteto.com/blog/getting-the-most-out-of-an-online-conference/#share-what-you-learn" class="hash-link" aria-label="Direct link to Share what you learn" title="Direct link to Share what you learn" translate="no">​</a></h2>
<p>Take notes during the sessions just like you would for an in-person event and create a blog article sharing about what you learned. Or, you may want to find out the event hashtag and live tweet throughout the conference. Not only will you be getting the word out about the conference, but you might end up meeting fellow attendees and do some networking.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="connect-offline">Connect offline<a href="https://www.okteto.com/blog/getting-the-most-out-of-an-online-conference/#connect-offline" class="hash-link" aria-label="Direct link to Connect offline" title="Direct link to Connect offline" translate="no">​</a></h2>
<p>If you do end up connecting with attendees or speakers online, stay in touch. Whether through email, social media, Slack, or getting together in person, building your network is one of the top benefits of attending a conference in the first place, whether in person or virtually. Make a point to reach out to anyone you connected with and keep that conversation going!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="watch-the-replays">Watch the replays<a href="https://www.okteto.com/blog/getting-the-most-out-of-an-online-conference/#watch-the-replays" class="hash-link" aria-label="Direct link to Watch the replays" title="Direct link to Watch the replays" translate="no">​</a></h2>
<p>One of the benefits of virtual conferences is the opportunity that many provide to watch replays after the conference ends. If the conference you’re attending offers this, it can be a great bonus. When listening to a speaker, it’s hard to catch everything the first time around, even if you’re good at taking notes. Having the option to watch or listen later can help you retain what you learned, as well as learn some things that you might have missed.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="okteto-at-kubecon-north-america-2021">Okteto at KubeCon North America 2021<a href="https://www.okteto.com/blog/getting-the-most-out-of-an-online-conference/#okteto-at-kubecon-north-america-2021" class="hash-link" aria-label="Direct link to Okteto at KubeCon North America 2021" title="Direct link to Okteto at KubeCon North America 2021" translate="no">​</a></h2>
<p>This year team members from Okteto are presenting at KubeCon North America 2021 and we’re excited that this conference is currently scheduled to take place both in person in Los Angeles and online, so you can pick the option that works best for you. We’ll be presenting during DevX Day and you can learn more about our talks here.</p>
<p>Whether you attend in person or online, we look forward to seeing you there! <a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/" target="_blank" rel="noopener noreferrer" class="">Register for KubeCon</a></p>]]></content:encoded>
            <category>kubecon</category>
            <category>online-conference</category>
            <category>developer-experience</category>
        </item>
        <item>
            <title><![CDATA[We Need a Cloud-Native Development Experience]]></title>
            <link>https://www.okteto.com/blog/we-need-a-cloud-native-development-experience/</link>
            <guid>https://www.okteto.com/blog/we-need-a-cloud-native-development-experience/</guid>
            <pubDate>Wed, 29 Sep 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[If Your Application is Going to Run in a Multi-Node Cluster, Why Are You Developing it in a Single Machine?]]></description>
            <content:encoded><![CDATA[<p>In the beginning, development was straightforward: You wrote code, built a binary, and then ran it in your machine to validate that things worked. You went through this a few times, and once you were happy, you would then SSH into a server, copy your binary, and restart a process. Applications have evolved a lot since those times. Architectural patterns evolved from those single binaries into microservice-based orchestrations that span multiple machines. And our deployment toolkits grew with them: We no longer SSH into servers and copy binaries. We now use sophisticated container orchestrators like Kubernetes and mature deployment practices like GitOps.</p>
<p>And yet, the development workflow has stayed pretty much the same throughout the years. We clone the code of our project, we start a local copy of the application, we write code, we build a new version of our application, we see the result of it, and we do it all over again (these days, we call this the inner loop). The problem is that instead of compiling a binary and starting a process, we now have to build a bunch of containers and start an entire orchestration of services.</p>
<p>We go through a lot of trouble to make our machines look like a one-node version of our production clusters. And we are not clueless. We know that this will eat all our memory, CPU, and battery. We know this introduces configuration drift. We know this creates manifest duplication (raise your hand if you run Docker Compose for local dev and Kubernetes in production). We know this makes a dev version, a CI version, and a production version of our services. And still, we keep doing it. Why?</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="development-is-not-production">Development is not production<a href="https://www.okteto.com/blog/we-need-a-cloud-native-development-experience/#development-is-not-production" class="hash-link" aria-label="Direct link to Development is not production" title="Direct link to Development is not production" translate="no">​</a></h2>
<p>We have to create these mini-clusters because production and development environments have evolved in opposite directions for the last ten years. Think about this for a second. What do you want from a modern production environment:</p>
<ul>
<li class="">You want it to be immutable</li>
<li class="">Easy to redeploy</li>
<li class="">Scalable</li>
<li class="">Resilient</li>
<li class="">Automated</li>
</ul>
<p>And what does a typical development environment look like:</p>
<ul>
<li class="">It changes with every code change</li>
<li class="">Everything runs on a single machine</li>
<li class="">It's installed and operated by hand</li>
</ul>
<p>The current generation of developer tools helps us a lot. Products like Minikube, Docker Desktop, or VSCode's Dev Containers enable us to transform our development machines into one-node clusters. But the experience is still slow and full of friction. And they do little to solve what I believe is the root cause behind this: <strong>Today, production and development environments are opposites</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="production-is-not-development">Production is not development<a href="https://www.okteto.com/blog/we-need-a-cloud-native-development-experience/#production-is-not-development" class="hash-link" aria-label="Direct link to Production is not development" title="Direct link to Production is not development" translate="no">​</a></h2>
<p>When talking about this problem, the industry's first reaction was: Oh, this is simple; let's give every developer their cluster so they can develop in a realistic development environment. Cloud providers like Civo, AWS, Azure, or Google Cloud certainly make it feasible. Except that now, we've made the developer experience even harder.</p>
<p>Developers now need to be experts in the cloud provider, the infrastructure, the orchestrator, and even the software distribution model. The developer can't simply change a line of code and see the result anymore, like in the <code>rails s</code> days. No, our developer now has to perform all these tasks before seeing the results of their work:</p>
<ul>
<li class="">Change a line of code</li>
<li class="">Run a make command to build all the artifacts</li>
<li class="">Push the artifacts to a registry</li>
<li class="">Run the correct argo/helm/kubectl/docker incantation to deploy the application</li>
<li class="">Wait for the application to be redeployed</li>
<li class="">Finally see the result of their changes</li>
</ul>
<p>Don't you miss running <code>rails s</code>?</p>
<p>While this is a step forward in the development vs. production divide, this is a slow inner loop. And a slow inner loop only has two outcomes: very frustrated developers (who will eventually quit your team), or very motivated developers who end up hacking their applications to run them on a one-node cluster. I've been both types of developers. And neither is fun.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="we-need-a-cloud-native-development-experience">We need a Cloud-Native development experience<a href="https://www.okteto.com/blog/we-need-a-cloud-native-development-experience/#we-need-a-cloud-native-development-experience" class="hash-link" aria-label="Direct link to We need a Cloud-Native development experience" title="Direct link to We need a Cloud-Native development experience" translate="no">​</a></h2>
<p>I didn't make up the points above. They result from hundreds of conversations about developer experience with developers, designers, product managers, founders, and even execs at hundreds of companies. Yes, I do have a thing for developer experience. I even quit my job to do this full time 😜.</p>
<p>And my conclusion is that a modern Cloud-Native development experience needs to follow these three principles:</p>
<ol>
<li class="">It has to be fast: developers should see their changes in seconds.</li>
<li class="">It has to be replicable: deploying a new environment should be "free".</li>
<li class="">It has to be realistic: it should use the same configuration and infrastructure as production.</li>
</ol>
<p>These are the core principles that guide the Cloud-Native development experience we are building. We needed a new generation of developer tools that match the new generation of applications. We need <code>rails s</code>, but for a cloud-native world. And that's Okteto.</p>
<p><strong>If your application is going to run in a multi-node cluster, why are you developing it in a single machine?</strong> <a href="https://okteto.com/" target="_blank" rel="noopener noreferrer" class="">That is precisely the problem we are tackling with Okteto</a>, and it would make my day if you were to try our approach, and <a href="https://twitter.com/oktetohq" target="_blank" rel="noopener noreferrer" class="">let me know what you think about it</a>.</p>]]></content:encoded>
            <category>ephemeral-environments</category>
            <category>okteto</category>
            <category>development</category>
            <category>best-practices</category>
        </item>
        <item>
            <title><![CDATA[Level Up Your Review Process With Preview Environments]]></title>
            <link>https://www.okteto.com/blog/preview-environments-importance/</link>
            <guid>https://www.okteto.com/blog/preview-environments-importance/</guid>
            <pubDate>Mon, 27 Sep 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Needs a descriptions]]></description>
            <content:encoded><![CDATA[<p>Reviewing code diffs has been the primary and often sole way of reviewing feature changes in software products.
Now that more and more teams are using ephemeral environments, it allows for different review patterns.
One of the more significant improvements in the review process has been the automated preview environment, one of Okteto's core features!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-a-preview-environment-exactly">What is a preview environment exactly?<a href="https://www.okteto.com/blog/preview-environments-importance/#what-is-a-preview-environment-exactly" class="hash-link" aria-label="Direct link to What is a preview environment exactly?" title="Direct link to What is a preview environment exactly?" translate="no">​</a></h2>
<p>A preview environment is a full deployment of your application that is automatically created alongside a pull request.
The preview environment deployment is made from the branch being reviewed.
Often the deployment of the preview environment uses the same or similar techniques as production environments.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="traditional-code-review">Traditional code review<a href="https://www.okteto.com/blog/preview-environments-importance/#traditional-code-review" class="hash-link" aria-label="Direct link to Traditional code review" title="Direct link to Traditional code review" translate="no">​</a></h2>
<p>During the code review process, you are likely evaluating the change in regards to:</p>
<ul>
<li class="">Code that is appropriately designed for the system</li>
<li class="">Code that matches required style guidelines</li>
<li class="">Overly complex code that requires simplification</li>
<li class="">Behavior that functions as intended</li>
<li class="">Tests that validate the expected behavior</li>
</ul>
<p>If your team can consistently evaluate the code in all these regards, it helps maintain the codebase for a healthy product.
However, it may not leave room for receiving the variety of feedback that a team with diverse roles can provide.
Executing reviews on code diffs consistently can also be a struggle simply due to human nature and priorities.
It is in these scenarios where the addition of a preview environment is valuable.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reviewing-with-a-preview-environment">Reviewing with a preview environment<a href="https://www.okteto.com/blog/preview-environments-importance/#reviewing-with-a-preview-environment" class="hash-link" aria-label="Direct link to Reviewing with a preview environment" title="Direct link to Reviewing with a preview environment" translate="no">​</a></h2>
<p>The preview environment allows for a more holistic review when paired with traditional code review.</p>
<p>The additional review steps may include:</p>
<ul>
<li class="">Live review of visual changes</li>
<li class="">Exercises deployment process before merging</li>
<li class="">Manual and automated testing of interactions and dependency chains in a deployed environment</li>
<li class="">Performance evaluation from the perspective of a user of your application</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="software-interaction">Software interaction<a href="https://www.okteto.com/blog/preview-environments-importance/#software-interaction" class="hash-link" aria-label="Direct link to Software interaction" title="Direct link to Software interaction" translate="no">​</a></h3>
<p>Reviewing user interaction and visual elements is often mentioned as the sole reason for using preview environments.
While the review of visual elements is a large benefit of having preview environments, it is not the only way they are helpful.
Almost all code has some form of interaction with other code or technology not present in the code diff.
Code changes can have a significant effect whenever it is a shared library or central backend service with several consumers.
In such cases, deploying an environment, allowing hands-on experience and testing, helps teams engage all users affected by a change.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="timing-of-feedback">Timing of feedback<a href="https://www.okteto.com/blog/preview-environments-importance/#timing-of-feedback" class="hash-link" aria-label="Direct link to Timing of feedback" title="Direct link to Timing of feedback" translate="no">​</a></h3>
<p>Reviewing a deployed environment alongside the pull request is a big win!
Reviewing a change requiring integration or visual feedback takes longer without a preview environment.
The extra time needed is due to the possibility of multiple merges and deployment that it may take to iterate on feedback.</p>
<img decoding="async" loading="lazy" src="https://www.okteto.com/blog/preview-environments-importance/review_flow_without_preview.png" alt="review flow without preview environment" width="500" class="img_ev3q">
<p>Shortening the feedback cycle helps for faster delivery and preservation of developer focus.
A preview environment is created simultaneously with a pull request, so there's no waiting for a merge or staging deployment.
You can address and make changes all within the PR utilizing the preview environment, and the flow is much more efficient.</p>
<img decoding="async" loading="lazy" src="https://www.okteto.com/blog/preview-environments-importance/review_flow_with_preview.png" alt="review flow with preview environment" width="500" class="img_ev3q">
<p>Adding more review opportunities to the pull request ensures that changes get addressed before any merge takes place.
When developing, it's inconvenient to re-visit a change after a merge has taken place because there's a sense of completeness when the request is closed.
Handling more feedback earlier ensures a greater chance of not going back and making changes after moving on.</p>
<p>Reviewing all of the components at the same point in time allows for addressing most concerns in a single iteration.
You aren't necessarily receiving less feedback, but you are receiving it at that critical point in time when you are most focused on reviewing the change.</p>
<p>Preview environment feedback also makes it more likely to get changes in before a merge to a critical branch.
There is always some amount of risk involved when merging into a critical branch.
The amount of risk depends on various levels of test coverage, the type of change and the overall health of the branch.
Getting as much change and feedback done before the critical merge means that there will be less merging and each merge will be safer.</p>
<p>The successful deployment of a branch occurs before merging is an enhancement.
How many times have you written your tests, received a critical review, only to find the automation can deploy the changes reviewed.
The bare minimum value received from preview environments is eliminating post-merge hiccups due to automation!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="include-more-of-your-team">Include more of your team<a href="https://www.okteto.com/blog/preview-environments-importance/#include-more-of-your-team" class="hash-link" aria-label="Direct link to Include more of your team" title="Direct link to Include more of your team" translate="no">​</a></h3>
<p>If you are fortunate enough to work on a broad team with writers, designers, or product managers, the preview environment provides an opportunity for quick, mixed feedback.
The entire team is now reviewing changes that include wording, graphics, or user interaction alongside the code diff.
This diversification of immediate feedback will make for a more robust product and possibly a more cohesive team.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="providing-opportunities-for-collaborative-ownership">Providing opportunities for collaborative ownership<a href="https://www.okteto.com/blog/preview-environments-importance/#providing-opportunities-for-collaborative-ownership" class="hash-link" aria-label="Direct link to Providing opportunities for collaborative ownership" title="Direct link to Providing opportunities for collaborative ownership" translate="no">​</a></h3>
<p>A preview environment allows for a more fluid engagement from <em>all</em> team members.
When the opportunity to engage is simplified, then a typical result is an increase in ownership.</p>
<p>Being part of the review process is engaging and promotes a sense of responsibility.
The ability to engage often facilitates more consistent involvement with a project which leads to better understanding of changes for all involved.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="preview-environments-in-okteto">Preview environments in Okteto<a href="https://www.okteto.com/blog/preview-environments-importance/#preview-environments-in-okteto" class="hash-link" aria-label="Direct link to Preview environments in Okteto" title="Direct link to Preview environments in Okteto" translate="no">​</a></h2>
<p>I hope at this point that you have been convinced that preview environments can be a tremendous tool to add to your development and review processes.
Now, how can you start using them?</p>
<p>If you are already an Okteto user then preview environments are already <a href="https://www.okteto.com/docs/previews" target="_blank" rel="noopener noreferrer" class="">available</a> for you!
Go ahead and set up a repo and see how it works.
We have a <a href="https://www.okteto.com/videos/how-to-set-up-preview-environments-with-okteto/" target="_blank" rel="noopener noreferrer" class="">video walkthrough</a> as well as <a class="" href="https://www.okteto.com/blog/preview-environments-for-kubernetes/">further reading</a> on why Kubernetes, in particular, is a good fit for preview environments.</p>
<p>If you aren't yet using Okteto now is a good time to check us out!
Preview environments are just one of many ways in which Okteto assists with the development cycle, and it's <a href="https://www.okteto.com/signup/" target="_blank" rel="noopener noreferrer" class="">free to get started</a>.</p>
<p>If you have any questions about getting started with Okteto or preview environments, feel free to <a href="https://www.okteto.com/contact" target="_blank" rel="noopener noreferrer" class="">book a call</a> or reach out in our <a href="https://community.okteto.com/" target="_blank" rel="noopener noreferrer" class="">community forum</a>.</p>]]></content:encoded>
            <category>ephemeral-environments</category>
            <category>preview-environments</category>
            <category>okteto</category>
            <category>development</category>
            <category>best-practices</category>
        </item>
        <item>
            <title><![CDATA[September 2021 Community Call Recap]]></title>
            <link>https://www.okteto.com/blog/sept-2021-community-call-recap/</link>
            <guid>https://www.okteto.com/blog/sept-2021-community-call-recap/</guid>
            <pubDate>Fri, 24 Sep 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Our September 2021 Community Call incudes info on how to use StatefulSets in Okteto, and how MBA students at Rutgers use Okteto for data analysis.]]></description>
            <content:encoded><![CDATA[<p>Thanks to everyone who attended our September 2021 Community Call!</p>
<p>We heard from Wajahat Gilani, Founder of strikevaluation.com and Assistant Professor of Professional Practice at Rutgers Business School. He talked about his experience using Okteto in one of the courses he teaches for Rutgers’ MBA.</p>
<p>We also heard from our Developer Advocate Abdul, who showed us a demo on how to use Okteto with StatefulSets.</p>
<p>If you’d like to watch the replay we have it available for you here:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/4oaWe6kZqmY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="okteto-is-for-more-than-developers">Okteto is for more than developers<a href="https://www.okteto.com/blog/sept-2021-community-call-recap/#okteto-is-for-more-than-developers" class="hash-link" aria-label="Direct link to Okteto is for more than developers" title="Direct link to Okteto is for more than developers" translate="no">​</a></h2>
<p>One of the really cool things we heard about during this month’s call is that Okteto, while a tool for developers, isn’t only for developers. Wajahat shared his experience using Okteto to build a dashboard with his students who are learning data analysis. He wanted to use dashboards with students because nowadays people want interactive and more personal data. While PDFs were the first generation of data sharing, he wanted his students to be prepared for what's expected when sharing data today.</p>
<p>Of course, teaching his students how to build these dashboards led to some decisions that he needed to make. First of all, they would need to learn more than Python. They’d also need to understand HTML/CSS, and they’d need some way to use a tool like FastAPI. He also had to figure out where students would store their data, and that’s when he found Okteto.</p>
<p>Coming from a background that did not include Kubernetes, Wajahat found Okteto easy to learn, use, and teach. His students found Okteto very smooth and easier to use than other tools they tried. We’d love for you to watch the presentation to learn more about his story and how Okteto has helped his students!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="statefulsets-with-okteto">StatefulSets with Okteto<a href="https://www.okteto.com/blog/sept-2021-community-call-recap/#statefulsets-with-okteto" class="hash-link" aria-label="Direct link to StatefulSets with Okteto" title="Direct link to StatefulSets with Okteto" translate="no">​</a></h2>
<p>Abdul gave us a demonstration on one of our newest features that we’re very excited about—how to use StatefulSets with Okteto. Using FastAPI, he walks you through how to get up and running quickly with StatefulSets. Follow along, and let us know on <a href="https://twitter.com/oktetohq" target="_blank" rel="noopener noreferrer" class="">Twitter</a> if you tried it out for yourself!</p>
<p>As always, we appreciate you taking the time to be part of our Community Calls, whether you attended live or watched the replay.</p>
<p>We’ll see you next month!</p>]]></content:encoded>
            <category>events</category>
            <category>youtube</category>
            <category>cloud-native</category>
            <category>statefulsets</category>
            <category>data-analytics</category>
        </item>
        <item>
            <title><![CDATA[What's New in Okteto CLI September 2021]]></title>
            <link>https://www.okteto.com/blog/sept-2021-cli-release/</link>
            <guid>https://www.okteto.com/blog/sept-2021-cli-release/</guid>
            <pubDate>Wed, 22 Sep 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Check out what's new in Okteto CLI! Updates to preview environments, auto scanning with Trivy and more!]]></description>
            <content:encoded><![CDATA[<p>There are many new features and upgrades in Okteto CLI this month!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="deploy-individual-services-with-okteto-stack">Deploy individual services with Okteto Stack<a href="https://www.okteto.com/blog/sept-2021-cli-release/#deploy-individual-services-with-okteto-stack" class="hash-link" aria-label="Direct link to Deploy individual services with Okteto Stack" title="Direct link to Deploy individual services with Okteto Stack" translate="no">​</a></h2>
<p>You can now redeploy a single service of an Okteto Stack. Okteto will create the services defined in your <a href="https://www.okteto.com/docs/reference/stacks/" target="_blank" rel="noopener noreferrer" class="">Stack manifest</a>.</p>
<p>We also now support docker compose's extension fields in Okteto Stacks.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="preview-environment-updates">Preview environment updates<a href="https://www.okteto.com/blog/sept-2021-cli-release/#preview-environment-updates" class="hash-link" aria-label="Direct link to Preview environment updates" title="Direct link to Preview environment updates" translate="no">​</a></h2>
<p>Now when you deploy Okteto Pipeline from the command line, GitHub action, or CircleCI, the CLI will display the URL of the preview environment. Run the command <code>okteto preview deploy</code> and your URL will appear. Click on it directly from the command line and view your preview environment!</p>
<p>Another change in preview environments is you now have the ability to run a preview while another deployment is running. Instead of the first one failing (as would happen before) the second one will be queued. This is helpful when working on a branch and pushing commits before your previous preview environment deploys.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-info-in-the-logs">More info in the logs<a href="https://www.okteto.com/blog/sept-2021-cli-release/#more-info-in-the-logs" class="hash-link" aria-label="Direct link to More info in the logs" title="Direct link to More info in the logs" translate="no">​</a></h2>
<p>Now, when you run <code>okteto up</code>, we’ve added more events to the logs to give you more information as you wait for commands to run. Now you’ll have a clearer picture of what’s happening behind the scenes as you use Okteto.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="destroy-any-deployment">Destroy any deployment<a href="https://www.okteto.com/blog/sept-2021-cli-release/#destroy-any-deployment" class="hash-link" aria-label="Direct link to Destroy any deployment" title="Direct link to Destroy any deployment" translate="no">​</a></h2>
<p>We’ve updated our destroy feature so that you can now destroy any pipeline, whether preview or development while it’s running. In the past, you’d have to wait until your deployment was fully deployed, but now you can force destroy as needed. No more waiting for a deployment to finish that you know you need to make changes to before utilizing!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="auto-scanning-with-trivy">Auto scanning with Trivy<a href="https://www.okteto.com/blog/sept-2021-cli-release/#auto-scanning-with-trivy" class="hash-link" aria-label="Direct link to Auto scanning with Trivy" title="Direct link to Auto scanning with Trivy" translate="no">​</a></h2>
<p>Trivy is a popular open source scanner for vulnerabilities in container images, Git repositories, file systems, and also scans for configuration issues. In an effort to maintain a secure software supply chain, we’re now automatically scanning the CLI open source repository with Trivy.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-features-to-improve-your-developer-experience">New features to improve your developer experience<a href="https://www.okteto.com/blog/sept-2021-cli-release/#new-features-to-improve-your-developer-experience" class="hash-link" aria-label="Direct link to New features to improve your developer experience" title="Direct link to New features to improve your developer experience" translate="no">​</a></h2>
<p>Many of the features in Okteto CLI come directly from users of Okteto. We are committed to improving your developer experience, and love hearing from users about what they’d like to see next. If you use Okteto CLI, we’d love to have your feedback. Feel free to open an issue in our <a href="https://github.com/okteto/okteto" target="_blank" rel="noopener noreferrer" class="">open source repo</a>, or star it if you use and love Okteto!</p>
<p>Happy Coding!</p>]]></content:encoded>
            <category>kubernetes</category>
            <category>cloud-native</category>
            <category>development</category>
            <category>okteto-cli</category>
            <category>preview-environments</category>
        </item>
        <item>
            <title><![CDATA[September 2021 Okteto Enterprise Release]]></title>
            <link>https://www.okteto.com/blog/sept-2021-okteto-enterprise/</link>
            <guid>https://www.okteto.com/blog/sept-2021-okteto-enterprise/</guid>
            <pubDate>Mon, 20 Sep 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[New features in Okteto Enterprise include updates to preview environments, more info available in the administrator dashboard, and more!]]></description>
            <content:encoded><![CDATA[<p>September included many upgrades and updates to features and dependencies for Okteto Self-Hosted customers. Read on to find out what’s new in Okteto Self-Hosted.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="preview-environments">Preview environments<a href="https://www.okteto.com/blog/sept-2021-okteto-enterprise/#preview-environments" class="hash-link" aria-label="Direct link to Preview environments" title="Direct link to Preview environments" translate="no">​</a></h2>
<p>One big change to preview environments this month is you can now run a preview environment while another deployment is running. When your additional preview environment is from the same repo, it will go into the queue, instead of the first preview environment failing. This feature can be helpful when you’re pushing several commits to a repo and want changes to show as they are added.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrades-and-updates">Upgrades and updates<a href="https://www.okteto.com/blog/sept-2021-okteto-enterprise/#upgrades-and-updates" class="hash-link" aria-label="Direct link to Upgrades and updates" title="Direct link to Upgrades and updates" translate="no">​</a></h2>
<p>We can now support Kubernetes 1.20 and 1.21.</p>
<p>We’ve updated to <code>cert-manager</code> 1.5.2, and <code>reloader</code> 0.0.99.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="autoscaler-and-garbage-collector-updates">Autoscaler and garbage collector updates<a href="https://www.okteto.com/blog/sept-2021-okteto-enterprise/#autoscaler-and-garbage-collector-updates" class="hash-link" aria-label="Direct link to Autoscaler and garbage collector updates" title="Direct link to Autoscaler and garbage collector updates" translate="no">​</a></h2>
<p>Information about your autoscaler and garbage collector are now available right on the administrator dashboard.</p>
<p>It's now possible to configure your autoscaler based on the number of pods, cpu, and memory. Previously, the autoscaler could only be configured by number of pods, which made for an easy configuration, but was less flexible. We’re happy to report that we can now support all these other configuration options as well!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="updates-to-logs">Updates to logs<a href="https://www.okteto.com/blog/sept-2021-okteto-enterprise/#updates-to-logs" class="hash-link" aria-label="Direct link to Updates to logs" title="Direct link to Updates to logs" translate="no">​</a></h2>
<p>The display of logs is now based on events, which means that logs will not only arrive more smoothly, but okteto will also make significantly less calls to Kubernetes, improving the performance of both Okteto and the cluster.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="manually-sleep-a-namespace">Manually sleep a namespace<a href="https://www.okteto.com/blog/sept-2021-okteto-enterprise/#manually-sleep-a-namespace" class="hash-link" aria-label="Direct link to Manually sleep a namespace" title="Direct link to Manually sleep a namespace" translate="no">​</a></h2>
<p>Administrators can now manually sleep a namespace in addition to the auto sleep function that already exists. This is helpful if you have a team member who will be on vacation or won’t be using their namespace for a prolonged period of time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="updated-pipeline">Updated pipeline<a href="https://www.okteto.com/blog/sept-2021-okteto-enterprise/#updated-pipeline" class="hash-link" aria-label="Direct link to Updated pipeline" title="Direct link to Updated pipeline" translate="no">​</a></h2>
<p>We’ve been updating our pipeline to have more pre-installed tools. This month, we’ve added two popular open source file management tools <code>jq</code> and <code>yq</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="improving-build-stickiness">Improving build stickiness<a href="https://www.okteto.com/blog/sept-2021-okteto-enterprise/#improving-build-stickiness" class="hash-link" aria-label="Direct link to Improving build stickiness" title="Direct link to Improving build stickiness" translate="no">​</a></h2>
<p>When you deploy a build on a pipeline, typically you’ll run more than one build server. In the past, this meant your build would get randomly assigned to one of the available services and could be slow. Now, we've made your okteto builds sticky, which will make your builds run much faster. For example, if you run <code>okteto build</code> 3 times it will now go to the same build server each time so you reuse connections, caches, and previous artifacts.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-is-a-top-priority">Security is a top priority<a href="https://www.okteto.com/blog/sept-2021-okteto-enterprise/#security-is-a-top-priority" class="hash-link" aria-label="Direct link to Security is a top priority" title="Direct link to Security is a top priority" translate="no">​</a></h2>
<p>We’re investing in a lot in scanning capabilities and fixing vulnerabilities. We care about security so we continue to fix critical and high vulnerabilities as they arise.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="questions">Questions?<a href="https://www.okteto.com/blog/sept-2021-okteto-enterprise/#questions" class="hash-link" aria-label="Direct link to Questions?" title="Direct link to Questions?" translate="no">​</a></h2>
<p>Have questions about using self-hosted Okteto with your team? <a href="https://okteto.com/schedule/" target="_blank" rel="noopener noreferrer" class="">Schedule a time on our calendar</a> to chat with us and see a demo of our Self-Hosted offering (suitable for teams of any size).</p>
<p>Happy Coding!</p>]]></content:encoded>
            <category>kubernetes</category>
            <category>cloud-native</category>
            <category>development</category>
            <category>okteto-enterprise</category>
            <category>preview-environments</category>
        </item>
        <item>
            <title><![CDATA[How to Create and Use Secrets in Okteto - Video Walkthrough]]></title>
            <link>https://www.okteto.com/blog/create-and-use-secrets-in-okteto/</link>
            <guid>https://www.okteto.com/blog/create-and-use-secrets-in-okteto/</guid>
            <pubDate>Fri, 17 Sep 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn all about creating and using secrets in Okteto in this video tutorial by Abdul.]]></description>
            <content:encoded><![CDATA[<p>In this latest video walkthrough, you’ll learn all about how to create and use secrets in Okteto.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/dWMezBQ309U" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-secrets">What are secrets?<a href="https://www.okteto.com/blog/create-and-use-secrets-in-okteto/#what-are-secrets" class="hash-link" aria-label="Direct link to What are secrets?" title="Direct link to What are secrets?" translate="no">​</a></h2>
<p>When you’re developing an application you’ll often have confidential information or tokens that you don’t want to leave exposed. Normally, you’ll save this information locally, but what happens when you want to use Okteto and you’re concerned about how you will store these secrets?</p>
<p>That’s where Okteto’s secrets management can help.</p>
<p>For more information on secrets, <a href="https://okteto.com/docs/cloud/secrets/#manage-okteto-secrets-from-the-okteto-cloud-ui" target="_blank" rel="noopener noreferrer" class="">check out our docs</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="video-summary">Video summary<a href="https://www.okteto.com/blog/create-and-use-secrets-in-okteto/#video-summary" class="hash-link" aria-label="Direct link to Video summary" title="Direct link to Video summary" translate="no">​</a></h2>
<p>In this video, we'll deploy a sample application and learn how to configure secrets in settings, then redeploy the app and take a look at the endpoint.</p>
<p>If you enjoyed this video, please be sure to give us a like and <a href="https://www.youtube.com/channel/UCXYaFkiXHdBA7fjKgEgSJfA" target="_blank" rel="noopener noreferrer" class="">subscribe to our YouTube channel here</a>!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources:<a href="https://www.okteto.com/blog/create-and-use-secrets-in-okteto/#resources" class="hash-link" aria-label="Direct link to Resources:" title="Direct link to Resources:" translate="no">​</a></h2>
<ul>
<li class="">Follow Abdul on <a href="https://twitter.com/kvng_zeez/" target="_blank" rel="noopener noreferrer" class="">Twitter</a></li>
<li class="">Video on <a href="https://www.youtube.com/watch?v=U0SobYDKVsM/" target="_blank" rel="noopener noreferrer" class="">how to develop with Okteto</a></li>
<li class="">Visit <a href="https://okteto.com/" target="_blank" rel="noopener noreferrer" class="">https://okteto.com</a> and give it a try in seconds.</li>
</ul>]]></content:encoded>
            <category>tutorials</category>
            <category>youtube</category>
            <category>cloud-native</category>
            <category>secrets</category>
        </item>
        <item>
            <title><![CDATA[Okteto’s September Community Call is on September 23rd]]></title>
            <link>https://www.okteto.com/blog/sept-2021-community-call/</link>
            <guid>https://www.okteto.com/blog/sept-2021-community-call/</guid>
            <pubDate>Wed, 15 Sep 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Register for the September 2021 Community Call and learn about how to use okteto up with StatefulSets.]]></description>
            <content:encoded><![CDATA[<p>We’re excited to announce that our next Community Call will be on Thursday, September 23rd at 10am Pacific/1pm Eastern.</p>
<a href="https://lu.ma/dqbc7s3v" target="_blank" rel="noopener noreferrer" class="">
<p><img decoding="async" loading="lazy" alt="Register" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTgzcHgiIGhlaWdodD0iNDNweCIgdmlld0JveD0iMCAwIDE4MyA0MyIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDx0aXRsZT5Db2RlIE5vdzwvdGl0bGU+CiAgICA8ZGVmcz4KICAgICAgICA8cmVjdCBpZD0icGF0aC0xIiB4PSIwIiB5PSIwIiB3aWR0aD0iMTc4IiBoZWlnaHQ9IjM4IiByeD0iNCI+PC9yZWN0PgogICAgICAgIDxmaWx0ZXIgeD0iLTEuMSUiIHk9Ii01LjMlIiB3aWR0aD0iMTAzLjklIiBoZWlnaHQ9IjExOC40JSIgZmlsdGVyVW5pdHM9Im9iamVjdEJvdW5kaW5nQm94IiBpZD0iZmlsdGVyLTIiPgogICAgICAgICAgICA8ZmVNb3JwaG9sb2d5IHJhZGl1cz0iMC41IiBvcGVyYXRvcj0iZGlsYXRlIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0ic2hhZG93U3ByZWFkT3V0ZXIxIj48L2ZlTW9ycGhvbG9neT4KICAgICAgICAgICAgPGZlT2Zmc2V0IGR4PSIyIiBkeT0iMiIgaW49InNoYWRvd1NwcmVhZE91dGVyMSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRPdXRlcjEiPjwvZmVPZmZzZXQ+CiAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNSIgaW49InNoYWRvd09mZnNldE91dGVyMSIgcmVzdWx0PSJzaGFkb3dCbHVyT3V0ZXIxIj48L2ZlR2F1c3NpYW5CbHVyPgogICAgICAgICAgICA8ZmVDb21wb3NpdGUgaW49InNoYWRvd0JsdXJPdXRlcjEiIGluMj0iU291cmNlQWxwaGEiIG9wZXJhdG9yPSJvdXQiIHJlc3VsdD0ic2hhZG93Qmx1ck91dGVyMSI+PC9mZUNvbXBvc2l0ZT4KICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdmFsdWVzPSIwIDAgMCAwIDAuMTM3MjU0OTAyICAgMCAwIDAgMCAwLjE2MDc4NDMxNCAgIDAgMCAwIDAgMC4yMDc4NDMxMzcgIDAgMCAwIDAuMTYxNjU4NjU0IDAiIHR5cGU9Im1hdHJpeCIgaW49InNoYWRvd0JsdXJPdXRlcjEiPjwvZmVDb2xvck1hdHJpeD4KICAgICAgICA8L2ZpbHRlcj4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJXaWRnZXRzIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iQXJ0Ym9hcmQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zMjAuMDAwMDAwLCAtMjA3LjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0iQ29kZS1Ob3ciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMyMS4wMDAwMDAsIDIwOC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnIGlkPSJSZWN0YW5nbGUiPgogICAgICAgICAgICAgICAgICAgIDx1c2UgZmlsbD0iYmxhY2siIGZpbGwtb3BhY2l0eT0iMSIgZmlsdGVyPSJ1cmwoI2ZpbHRlci0yKSIgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgPHVzZSBzdHJva2U9IiMwMkI0QUUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0iIzAwRDFDQSIgZmlsbC1ydWxlPSJldmVub2RkIiB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDx0ZXh0IGlkPSJSZWdpc3Rlci1ub3chIiBmb250LWZhbWlseT0iQ2lyY3VsYXJTdGQtQm9sZCwgQ2lyY3VsYXIgU3RkIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iYm9sZCIgbGV0dGVyLXNwYWNpbmc9Ii0wLjgzODcyMzQwNCIgZmlsbD0iIzIzMjkzNSI+CiAgICAgICAgICAgICAgICAgICAgPHRzcGFuIHg9IjM3IiB5PSIyNSI+UmVnaXN0ZXIgbm93ITwvdHNwYW4+CiAgICAgICAgICAgICAgICA8L3RleHQ+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==" width="183" height="43" class="img_ev3q"></p>
</a>
<p>This month, our Developer Advocate <a href="https://twitter.com/kvng_zeez" target="_blank" rel="noopener noreferrer" class="">Abdul</a> will be talking about how to use <code>okteto up</code> with StatefulSets. Do you have any questions you'd like to submit ahead of time? Or perhaps you'd like to join the call? Let us know on <a href="https://twitter.com/oktetohq/" target="_blank" rel="noopener noreferrer" class="">Twitter</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-to-use-statefulsets">When to use StatefulSets<a href="https://www.okteto.com/blog/sept-2021-community-call/#when-to-use-statefulsets" class="hash-link" aria-label="Direct link to When to use StatefulSets" title="Direct link to When to use StatefulSets" translate="no">​</a></h2>
<p>StatefulSets become useful in applications that require things like:</p>
<ul>
<li class="">Stable, unique network identifiers.</li>
<li class="">Stable, persistent storage.</li>
<li class="">Ordered, graceful deployment and scaling.</li>
<li class="">Ordered, automated rolling updates. <a href="https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/" target="_blank" rel="noopener noreferrer" class="">from kubernetes.io</a></li>
</ul>
<p>If you’re using Okteto and want to make use of StatefulSets, you won’t want to miss Abdul's demonstration at the next Community Call.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="special-guest-speaker">Special guest speaker<a href="https://www.okteto.com/blog/sept-2021-community-call/#special-guest-speaker" class="hash-link" aria-label="Direct link to Special guest speaker" title="Direct link to Special guest speaker" translate="no">​</a></h2>
<p>Wajahat Gilani, Founder of strikevaluation.com and Assistant Professor of Professional Practice at Rutgers Business School. He will be talking about his experience using Okteto in one of the courses he teaches for Rutger’s MBA.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="register-for-upcoming-community-calls">Register for upcoming community calls<a href="https://www.okteto.com/blog/sept-2021-community-call/#register-for-upcoming-community-calls" class="hash-link" aria-label="Direct link to Register for upcoming community calls" title="Direct link to Register for upcoming community calls" translate="no">​</a></h2>
<p>Our community calls are a time for Okteto customers to get together, learn about new features, hear from guest speakers, and have a chance to share the cool things they’re working on with Okteto.</p>
<p>When you <a href="https://lu.ma/dqbc7s3v" target="_blank" rel="noopener noreferrer" class="">register for this month’s Community Call</a>, you can select to register for the entire series so that you’ll always be on the list for future events.</p>
<p>We look forward to seeing you there!</p>
<a href="https://lu.ma/dqbc7s3v" target="_blank" rel="noopener noreferrer" class="">
<p><img decoding="async" loading="lazy" alt="Register" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTgzcHgiIGhlaWdodD0iNDNweCIgdmlld0JveD0iMCAwIDE4MyA0MyIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDx0aXRsZT5Db2RlIE5vdzwvdGl0bGU+CiAgICA8ZGVmcz4KICAgICAgICA8cmVjdCBpZD0icGF0aC0xIiB4PSIwIiB5PSIwIiB3aWR0aD0iMTc4IiBoZWlnaHQ9IjM4IiByeD0iNCI+PC9yZWN0PgogICAgICAgIDxmaWx0ZXIgeD0iLTEuMSUiIHk9Ii01LjMlIiB3aWR0aD0iMTAzLjklIiBoZWlnaHQ9IjExOC40JSIgZmlsdGVyVW5pdHM9Im9iamVjdEJvdW5kaW5nQm94IiBpZD0iZmlsdGVyLTIiPgogICAgICAgICAgICA8ZmVNb3JwaG9sb2d5IHJhZGl1cz0iMC41IiBvcGVyYXRvcj0iZGlsYXRlIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0ic2hhZG93U3ByZWFkT3V0ZXIxIj48L2ZlTW9ycGhvbG9neT4KICAgICAgICAgICAgPGZlT2Zmc2V0IGR4PSIyIiBkeT0iMiIgaW49InNoYWRvd1NwcmVhZE91dGVyMSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRPdXRlcjEiPjwvZmVPZmZzZXQ+CiAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNSIgaW49InNoYWRvd09mZnNldE91dGVyMSIgcmVzdWx0PSJzaGFkb3dCbHVyT3V0ZXIxIj48L2ZlR2F1c3NpYW5CbHVyPgogICAgICAgICAgICA8ZmVDb21wb3NpdGUgaW49InNoYWRvd0JsdXJPdXRlcjEiIGluMj0iU291cmNlQWxwaGEiIG9wZXJhdG9yPSJvdXQiIHJlc3VsdD0ic2hhZG93Qmx1ck91dGVyMSI+PC9mZUNvbXBvc2l0ZT4KICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdmFsdWVzPSIwIDAgMCAwIDAuMTM3MjU0OTAyICAgMCAwIDAgMCAwLjE2MDc4NDMxNCAgIDAgMCAwIDAgMC4yMDc4NDMxMzcgIDAgMCAwIDAuMTYxNjU4NjU0IDAiIHR5cGU9Im1hdHJpeCIgaW49InNoYWRvd0JsdXJPdXRlcjEiPjwvZmVDb2xvck1hdHJpeD4KICAgICAgICA8L2ZpbHRlcj4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJXaWRnZXRzIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iQXJ0Ym9hcmQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zMjAuMDAwMDAwLCAtMjA3LjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0iQ29kZS1Ob3ciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMyMS4wMDAwMDAsIDIwOC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnIGlkPSJSZWN0YW5nbGUiPgogICAgICAgICAgICAgICAgICAgIDx1c2UgZmlsbD0iYmxhY2siIGZpbGwtb3BhY2l0eT0iMSIgZmlsdGVyPSJ1cmwoI2ZpbHRlci0yKSIgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgPHVzZSBzdHJva2U9IiMwMkI0QUUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0iIzAwRDFDQSIgZmlsbC1ydWxlPSJldmVub2RkIiB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDx0ZXh0IGlkPSJSZWdpc3Rlci1ub3chIiBmb250LWZhbWlseT0iQ2lyY3VsYXJTdGQtQm9sZCwgQ2lyY3VsYXIgU3RkIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iYm9sZCIgbGV0dGVyLXNwYWNpbmc9Ii0wLjgzODcyMzQwNCIgZmlsbD0iIzIzMjkzNSI+CiAgICAgICAgICAgICAgICAgICAgPHRzcGFuIHg9IjM3IiB5PSIyNSI+UmVnaXN0ZXIgbm93ITwvdHNwYW4+CiAgICAgICAgICAgICAgICA8L3RleHQ+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==" width="183" height="43" class="img_ev3q"></p>
</a>
<p>See you there!</p>]]></content:encoded>
            <category>events</category>
            <category>startup</category>
            <category>youtube</category>
            <category>statefulsets</category>
            <category>okteto-up</category>
        </item>
        <item>
            <title><![CDATA[Production-First Mindset Podcast with LaunchDarkly]]></title>
            <link>https://www.okteto.com/blog/production-first-mindset-podcast-launchdarkly/</link>
            <guid>https://www.okteto.com/blog/production-first-mindset-podcast-launchdarkly/</guid>
            <pubDate>Mon, 13 Sep 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Ephemeral environments can improve the quality of your product because you have that extra level of testing and review. Find out why LaunchDarkly uses Okteto for ephemeral environments.]]></description>
            <content:encoded><![CDATA[<p>We recently listened to this great episode of Production-First Mindset Podcast with guest John Kodumal, CTO for LaunchDarkly. In the episode “The Nirvana of Deploying a 100x A Day” John talks about ephemeral environments for productivity, whether you should build a tool or buy it, how LaunchDarkly maintains consistency as their organization scales and much more.</p>
<p><a href="https://web.archive.org/web/20220930093654/https://www.productionfirstmindset.com/1815444/9103285-john-kodumal-launchdarkly-cto-the-nirvana-of-deploying-100x-a-day" target="_blank" rel="noopener noreferrer" class="">You can check out the full episode here.</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ephemeral-environments-for-productivity">Ephemeral environments for productivity<a href="https://www.okteto.com/blog/production-first-mindset-podcast-launchdarkly/#ephemeral-environments-for-productivity" class="hash-link" aria-label="Direct link to Ephemeral environments for productivity" title="Direct link to Ephemeral environments for productivity" translate="no">​</a></h2>
<p>LaunchDarkly uses Okteto to create <a class="" href="https://www.okteto.com/blog/preview-environments-for-kubernetes/">ephemeral environments to improve productivity</a>. One reason ephemeral environments are useful is the ability to spin up a copy of software for every PR. John shared his view that anything you merge to master should be deployable, but if no one has tried the code out, you’re missing something.</p>
<p>Using ephemeral environments can improve the quality of what you’re producing because you have that extra level of testing, review, and comfort.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="build-it-or-buy-it">Build it or buy it?<a href="https://www.okteto.com/blog/production-first-mindset-podcast-launchdarkly/#build-it-or-buy-it" class="hash-link" aria-label="Direct link to Build it or buy it?" title="Direct link to Build it or buy it?" translate="no">​</a></h2>
<p>Sometimes, the decision is not, should we have ephemeral environments, but should we use a SaaS product or should we build our own. John pointed out several reasons why investing in a SaaS rather than building your own could be a good solution for your company. Some examples he gave were:</p>
<ul>
<li class="">Being able to make sure an environment is spun down when a branch is closed</li>
<li class="">The ability to see a list of available environments, and also the ability to test one quickly</li>
<li class="">Having the ability to collaborate with someone in local development, especially in a microservices situation</li>
</ul>
<p>Another thing to consider is that costs will go up when you start spinning up more environments, so having a lifecycle management system becomes really important.</p>
<p>Take a listen to the episode to learn more about this and other ways LaunchDarkly is maintaining quality and consistency in their products as their organization scales. Have questions about how preview environments can help your organization be more productive? <a href="https://okteto.com/schedule/" target="_blank" rel="noopener noreferrer" class="">Schedule a time to talk with us</a> about ephemeral environments for your company.</p>]]></content:encoded>
            <category>ephemeral-environments</category>
            <category>launchdarkly</category>
            <category>production-first-mindset</category>
            <category>podcast</category>
        </item>
        <item>
            <title><![CDATA[Automating the deployment of your development environment using Okteto Actions and GitHub Actions.]]></title>
            <link>https://www.okteto.com/blog/ci-cd-using-gh-actions-and-okteto/</link>
            <guid>https://www.okteto.com/blog/ci-cd-using-gh-actions-and-okteto/</guid>
            <pubDate>Fri, 10 Sep 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how you can include preview environments and automate your CI/CD process using GitHub Actions and Okteto.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>Nwani Victory works remotely as a software engineer, building scalable and sustainable software.
Outside working hours, he doubles as a technical writer, creating technical articles focused on modern web technologies and public cloud providers.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://www.okteto.com/blog/ci-cd-using-gh-actions-and-okteto/#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h2>
<p>GitHub Actions provides developers with the functionality of building and automating the execution of their software development workflows directly in a project’s repository.</p>
<p>In this tutorial you'll learn how you can automate the workflow of an existing Flask API whose continuous integration process is managed using <a href="https://github.com/features/actions/" target="_blank" rel="noopener noreferrer" class="">GitHub Actions</a>.
You'll learn about the GitHub actions created by Okteto and how you can use them to work with Okteto with a GitHub Action workflow.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-automate-your-workflow">Why automate your workflow?<a href="https://www.okteto.com/blog/ci-cd-using-gh-actions-and-okteto/#why-automate-your-workflow" class="hash-link" aria-label="Direct link to Why automate your workflow?" title="Direct link to Why automate your workflow?" translate="no">​</a></h2>
<p>The <a href="https://www.okteto.com/docs/get-started/install-okteto-cli" target="_blank" rel="noopener noreferrer" class="">Okteto CLI</a> does a fantastic job at simplifying the process of working with your Okteto resources. However, over time, executing commands to build and deploy your docker image to Okteto after major changes could become repetitive and tiring.</p>
<p>According to <a href="https://sre.google/" target="_blank" rel="noopener noreferrer" class="">Google’s SRE</a> practices, a way to <a href="https://sre.google/sre-book/eliminating-toil/" target="_blank" rel="noopener noreferrer" class="">eliminate the toil time</a> resulting from such operations is to automate the execution of such commands through the use of a script, or an external automation service.</p>
<p>For this article, we'll be using <a href="https://github.com/features/actions" target="_blank" rel="noopener noreferrer" class="">GitHub Actions</a> as an automation tool to build a docker image from merged code changes and deploy the docker image to Okteto using the available <a href="https://github.com/okteto/actions/" target="_blank" rel="noopener noreferrer" class="">Okteto Actions</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://www.okteto.com/blog/ci-cd-using-gh-actions-and-okteto/#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<p>In order to follow along with this tutorial, it's expected that you satisfy the following requirements;</p>
<ul>
<li class="">Have <a href="https://www.okteto.com/docs/" target="_blank" rel="noopener noreferrer" class="">access to an Okteto instance</a>.</li>
<li class="">Have the <a href="https://www.okteto.com/docs/get-started/install-okteto-cli" target="_blank" rel="noopener noreferrer" class="">Okteto CLI</a> installed on your machine.</li>
<li class="">Have a <a href="https://github.com/" target="_blank" rel="noopener noreferrer" class="">GitHub account</a> with <a href="https://git-scm.com/" target="_blank" rel="noopener noreferrer" class="">Git</a> installed on your machine.</li>
<li class="">Have an understanding of the <a href="https://www.python.org/" target="_blank" rel="noopener noreferrer" class="">Python</a> programming language, with an installation of <a href="https://www.python.org/" target="_blank" rel="noopener noreferrer" class="">python</a> on your machine.</li>
<li class="">Have an installation of <a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer" class="">Docker</a> on your machine.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-clone-a-sample-python-flask-app">Step 1: Clone a sample Python Flask app<a href="https://www.okteto.com/blog/ci-cd-using-gh-actions-and-okteto/#step-1-clone-a-sample-python-flask-app" class="hash-link" aria-label="Direct link to Step 1: Clone a sample Python Flask app" title="Direct link to Step 1: Clone a sample Python Flask app" translate="no">​</a></h2>
<p>To get started, fork the sample application from its repository <a href="https://github.com/okteto-community/okteto-flask-app" target="_blank" rel="noopener noreferrer" class="">here</a>. After forking the repository, execute the command below from your terminal to clone your forked copy of the repository to your host machine;</p>
<blockquote>
<p>Replace the <code>GITHUB_USERNAME</code> in the URL below with your GitHub username to match the remote origin of the forked repository.</p>
</blockquote>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ git clone https://github.com/{{GITHUB_USERNAME}}/okteto-flask-app</span><br></div></code></pre></div></div>
<p>In the <code>flaskr.py</code> file, there are three API routes defined for performing a create, retrieve, and delete operation against a connected <a href="https://couchdb.apache.org/" target="_blank" rel="noopener noreferrer" class="">Couch database</a>.</p>
<p>The cloned project also contains a <code>Dockerfile</code> and <code>docker-compose.yml</code> file that contains all defined steps and services needed to create a multi-stage build for this application.</p>
<p>To run this application, execute the <a href="https://docs.docker.com/compose/" target="_blank" rel="noopener noreferrer" class="">docker-compose</a> command below to build and run the application container that consists of a <code>database</code> and <code>app</code> service.</p>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ docker-compose up --build</span><br></div></code></pre></div></div>
<p>To test the application above, execute the command below from a new terminal window to make a POST request to the <code>/api/customer</code> api route within the flask API using <a href="https://curl.se/" target="_blank" rel="noopener noreferrer" class="">cURL</a> which inserts a new document into the customer collection within the running Couch database through it’s RESTful Apiserver.</p>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ curl -X POST -d '{"name":"Victory Nwani","occupation":"Software Engineer"}'  -H 'Content-Type: application/json' http://localhost:5050/api/customer</span><br></div></code></pre></div></div>
<p>To view the data inserted from the <code>POST</code> request above, execute the command below from your terminal to make a GET request to the <code>/api/customer</code> api route within the flask API using <a href="https://curl.se/" target="_blank" rel="noopener noreferrer" class="">cURL</a> which retrieves all documents in the customer collection within the couch database.</p>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ curl http://localhost:5050/api/customer</span><br></div></code></pre></div></div>
<p>You can also work with the running couch database through the <a href="https://couchdb.apache.org/fauxton-visual-guide/index.html" target="_blank" rel="noopener noreferrer" class="">Fauxton web interface</a> that comes by default with couchdb image at <a href="http://localhost:5984/_utils" target="_blank" rel="noopener noreferrer" class="">http://localhost:5984/_utils</a>.</p>
<blockquote>
<p>As defined in the environment field within the database service in the <code>docker-compose.yml</code> file, the couchdb username is <strong>couchdb-admin</strong>, while the password is <strong>couchdb-password</strong>. Feel free to change them to your own preferred secured values.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-deploy-flask-application-to-okteto">Step 2: Deploy Flask application To Okteto<a href="https://www.okteto.com/blog/ci-cd-using-gh-actions-and-okteto/#step-2-deploy-flask-application-to-okteto" class="hash-link" aria-label="Direct link to Step 2: Deploy Flask application To Okteto" title="Direct link to Step 2: Deploy Flask application To Okteto" translate="no">​</a></h2>
<p>Now that you have the cloned application working locally on your computer, you'll deploy the cloned version to Okteto to serve as a deployment for your development environment. The folder already contains a <code>Dockerfile</code> and a <code>docker-compose.yml</code> file that defines the services and steps needed to build the image for this application.</p>
<p>To begin the deployment from your terminal using the Okteto CLI, execute the command below to log in and create a session between your Okteto account and your local terminal;</p>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ okteto context</span><br></div></code></pre></div></div>
<p>Next, build a docker image of the entire application using the <code>docker-compose.yml</code> file and deploy it to your Okteto namespace:</p>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ okteto deploy --build</span><br></div></code></pre></div></div>
<p>Going through the resources listed in your Okteto dashboard, you would find the deployed application, and the two services specified in the <code>docker-compose.yml</code> file.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-write-unit-tests-for-the-flask-application">Step 3: Write unit tests for the Flask application<a href="https://www.okteto.com/blog/ci-cd-using-gh-actions-and-okteto/#step-3-write-unit-tests-for-the-flask-application" class="hash-link" aria-label="Direct link to Step 3: Write unit tests for the Flask application" title="Direct link to Step 3: Write unit tests for the Flask application" translate="no">​</a></h2>
<p>One important step within any continuous integration pipeline is to <strong>Test</strong> new commits made to the code source before a new release is pushed to the continuous deployment pipeline to avoid a regression.</p>
<p>To get started, execute the command below from your terminal to create a new <a href="https://git-scm.com/docs/git-branch" target="_blank" rel="noopener noreferrer" class="">git branch</a> where you would create unit tests for the flask API.</p>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ git checkout -b feat/ci-pipeline</span><br></div></code></pre></div></div>
<p>From your code editor, create a <code>tests</code> directory with a <code>test_flask.py</code> file within the <code>okteto-flask-app</code> project. This file would be used to test the three API endpoints within the flask application. Executing the commands below will create the test file, or you can alternatively use the editor interface to create the file.</p>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ mkdir tests &amp;&amp; cd tests</span><br></div><div class="token-line" style="color:white"><span class="token plain">$ touch test_flaskr.py</span><br></div></code></pre></div></div>
<blockquote>
<p>All HTTP requests that were to be made to the Couch Apiserver from the API routes were intercepted and mocked in the test suites using the <a href="https://httpretty.readthedocs.io/" target="_blank" rel="noopener noreferrer" class="">Httpretty package</a>.</p>
</blockquote>
<p>Add the test suite in the code block below to test the default route handler that returns a response with some information about the REST API.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> os</span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> requests </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> get</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> post</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">STAGING_API_ENDPOINT </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">environ</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"STAGING_COUCHDB_URL"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">test_handle_default_route</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"> request </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> get</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">STAGING_API_ENDPOINT</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"> response </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">json</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">response</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">'status'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"OK"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">assert</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'description'</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> response</span><br></div></code></pre></div></div>
<p>The test suite above asserts that a JSON response containing an “OK” status, and description field will be returned each time a request is made to the default route. Looking through the code block, you might have taken note of the <code>STAGING_API_ENDPOINT</code> variable whose value will be gotten from the <code>STAGING_COUCHDB_URL</code> environment variable. The <code>STAGING_COUCHDB_URL</code> environment variable will be set during the continuous flow, and will point to a staging version of the API within an Okteto namespace. You will learn more about this when setting up the GitHub actions flow.</p>
<p>Next, add the code block below into the <code>test_flaskr.py</code> file to test the route POST request handler within the <code>api/customer</code> endpoint by making a POST HTTP verb to insert a new document into the <code>customer</code> collection.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">test_handle_items_post</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    request </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> post</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'/api/customer'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> json</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">           </span><span class="token string" style="color:rgb(206, 145, 120)">'name'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'John Mike'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">           </span><span class="token string" style="color:rgb(206, 145, 120)">'occupation'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'Software Eng'</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    responseData </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">json</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">assert</span><span class="token plain"> responseData</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">'status'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"USER CREATED"</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<p>The test case above asserts that a <code>status</code> field with a <code>USER CREATED</code> value was returned from the POST request to insert a test document into the customer collection. After the test case above is executed successfully, you can rightly expect that a sample document will exist within the customer collection. The next test case will use this sample document to assert that the GET handler is within the <code>api/customer</code> endpoint.</p>
<p>Add the code block below into the <code>test_flaskr.py</code> file to test the route handling all requests made to the <code>api/customer</code> route with a GET HTTP verb to fetch all documents within the <code>customer</code> collection.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> json</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">test_handle_items_fetch</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    request </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> get</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'{}/api/customer'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token builtin" style="color:rgb(86, 156, 214)">format</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">STAGING_API_ENDPOINT</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    data </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">json</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">'status'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'OK'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">assert</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'customers'</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> data</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">assert</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'_id'</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">'customers'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><br></div></code></pre></div></div>
<p>When the test case above is executed, a GET request will be made to the GET handler within <code>api/customer</code> route. The test case will further run assertions against the JSON response to ensure that an OK status field was returned, alongside a list of customers.</p>
<p>At this point we have three test suites to test the three corresponding endpoints exposed within this API. In the next step you'll create a GitHub Actions workflow that runs them automatically.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-automate-deployments-with-a-github-actions-workflow">Step 4: Automate deployments with a GitHub Actions workflow<a href="https://www.okteto.com/blog/ci-cd-using-gh-actions-and-okteto/#step-4-automate-deployments-with-a-github-actions-workflow" class="hash-link" aria-label="Direct link to Step 4: Automate deployments with a GitHub Actions workflow" title="Direct link to Step 4: Automate deployments with a GitHub Actions workflow" translate="no">​</a></h2>
<p>With tests in place, you can create a GitHub Actions workflow that spins up an Okteto <a href="https://www.okteto.com/docs/previews/" target="_blank" rel="noopener noreferrer" class="">preview environment</a> for every pull request and runs your tests against it. Okteto publishes a set of <a href="https://github.com/okteto/actions" target="_blank" rel="noopener noreferrer" class="">GitHub Actions</a> for this; the two you'll use here are <code>okteto/context</code>, to authenticate against your Okteto instance, and <code>okteto/deploy-preview</code>, to deploy the preview environment.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configure-the-required-secrets">Configure the required secrets<a href="https://www.okteto.com/blog/ci-cd-using-gh-actions-and-okteto/#configure-the-required-secrets" class="hash-link" aria-label="Direct link to Configure the required secrets" title="Direct link to Configure the required secrets" translate="no">​</a></h3>
<p>The workflow authenticates to your Okteto instance using two repository secrets:</p>
<ul>
<li class=""><code>OKTETO_TOKEN</code>: an Okteto personal access token. See <a href="https://www.okteto.com/docs/core/credentials/personal-access-tokens" target="_blank" rel="noopener noreferrer" class="">Personal Access Tokens</a> for how to create one.</li>
<li class=""><code>OKTETO_CONTEXT</code>: the URL of your Okteto instance (for example, <code>https://okteto.example.com</code>).</li>
</ul>
<p>Add both to your forked repository by following <a href="https://docs.github.com/en/actions/security-guides/encrypted-secrets" target="_blank" rel="noopener noreferrer" class="">GitHub's encrypted secrets guide</a>. GitHub provides <code>GITHUB_TOKEN</code> automatically.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-the-workflow">Add the workflow<a href="https://www.okteto.com/blog/ci-cd-using-gh-actions-and-okteto/#add-the-workflow" class="hash-link" aria-label="Direct link to Add the workflow" title="Direct link to Add the workflow" translate="no">​</a></h3>
<p>Create a <code>.github/workflows/ci.yml</code> file in your repository with the following content:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Okteto Flask REST API CI</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">on</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">pull_request</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">branches</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> master</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">concurrency</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">group</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> github.workflow </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">$</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> github.ref </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">cancel-in-progress</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean important">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain"></span><span class="token key atrule" style="color:rgb(86, 156, 214)">jobs</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">  </span><span class="token key atrule" style="color:rgb(86, 156, 214)">preview</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">runs-on</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:white"><span class="token plain">    </span><span class="token key atrule" style="color:rgb(86, 156, 214)">steps</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">uses</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> actions/checkout@v4</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Set context to Okteto</span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">uses</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> okteto/context@latest</span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">with</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">url</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> secrets.OKTETO_CONTEXT </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">token</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> secrets.OKTETO_TOKEN </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Deploy preview environment</span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">uses</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> okteto/deploy</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">preview@latest</span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">env</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">GITHUB_TOKEN</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> secrets.GITHUB_TOKEN </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">with</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> pr</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">$</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> github.event.number </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">timeout</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> 15m</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Set up Python</span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">uses</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> actions/setup</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">python@v5</span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">with</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">python-version</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'3.12'</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Install python dependencies</span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">run</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> pip install </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">r requirements.txt</span><br></div><div class="token-line" style="color:white"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:white"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:rgb(86, 156, 214)">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Run API tests against the preview environment</span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">run</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> pytest</span><br></div><div class="token-line" style="color:white"><span class="token plain">        </span><span class="token key atrule" style="color:rgb(86, 156, 214)">env</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:white"><span class="token plain">          </span><span class="token key atrule" style="color:rgb(86, 156, 214)">STAGING_COUCHDB_URL</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">//api</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">pr</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">$</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> github.event.number </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">your</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">namespace.okteto.example.com</span><br></div></code></pre></div></div>
<p>Each time a pull request is opened against your default branch, this workflow authenticates to your Okteto instance, deploys an isolated preview environment for that pull request, and runs the test suite against it. The <code>STAGING_COUCHDB_URL</code> value points pytest at the endpoint Okteto generates for the preview, so your tests exercise a production-like deployment instead of a local mock.</p>
<p>To keep your instance tidy, Okteto can tear the preview down automatically when the pull request is closed, using the <code>okteto/destroy-preview</code> action in a companion workflow. The <a href="https://www.okteto.com/docs/previews/using-github-actions" target="_blank" rel="noopener noreferrer" class="">Preview Environments with GitHub Actions</a> guide walks through the complete, maintained setup, including the cleanup workflow and the exact secret configuration.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="trigger-the-workflow">Trigger the workflow<a href="https://www.okteto.com/blog/ci-cd-using-gh-actions-and-okteto/#trigger-the-workflow" class="hash-link" aria-label="Direct link to Trigger the workflow" title="Direct link to Trigger the workflow" translate="no">​</a></h3>
<p>Commit and push your changes to a branch in your fork, then open a pull request against the default branch:</p>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:white;--prism-background-color:rgb(33, 37, 48)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:white;background-color:rgb(33, 37, 48)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:white"><span class="token plain">$ git add .</span><br></div><div class="token-line" style="color:white"><span class="token plain">$ git commit -m "ci: add tests and Okteto preview workflow"</span><br></div><div class="token-line" style="color:white"><span class="token plain">$ git push -u origin feat/ci-pipeline</span><br></div></code></pre></div></div>
<p>When the pull request is opened, GitHub Actions runs the workflow: it deploys the preview environment and runs your tests against it. You can follow the run from the <strong>Actions</strong> tab of your repository, and Okteto adds the preview environment's endpoints to the pull request so you can review the running application before merging.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://www.okteto.com/blog/ci-cd-using-gh-actions-and-okteto/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In this article you cloned a sample Python application, built and deployed a docker image of the application to Okteto, and automated testing against an Okteto preview environment for every pull request using a GitHub Actions workflow.</p>
<p>For the complete, maintained reference, including the preview cleanup workflow, see <a href="https://www.okteto.com/docs/previews/using-github-actions" target="_blank" rel="noopener noreferrer" class="">Preview Environments with GitHub Actions</a> in the Okteto docs.</p>
<p>The sample application used in this tutorial is available on GitHub in <a href="https://github.com/okteto-community/okteto-flask-app" target="_blank" rel="noopener noreferrer" class="">this repository</a>, for you to clone and use.</p>]]></content:encoded>
            <category>kubernetes</category>
            <category>python</category>
            <category>flask</category>
            <category>gh-actions</category>
        </item>
        <item>
            <title><![CDATA[Okteto’s Monthly Community Call is on July 22nd]]></title>
            <link>https://www.okteto.com/blog/july-2021-community-call/</link>
            <guid>https://www.okteto.com/blog/july-2021-community-call/</guid>
            <pubDate>Mon, 12 Jul 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Register for the July 2021 Community Call and learn about how Octobot uses Okteto, experiments with preview environments and more.]]></description>
            <content:encoded><![CDATA[<p>On July 22nd at 10am Pacific/1pm Eastern we’ll be hosting our third Community Call and you’re invited to join us! This month, we’ll be meeting on Zoom and YouTube, and we’d like to have members of our community participate with questions or any cool Okteto use cases you’d like to share.</p>
<p><a href="https://lu.ma/qgm1qff3" target="_blank" rel="noopener noreferrer" class="">Register now</a></p>
<p>This month, we’ll be hearing from some members of the team at <a href="https://github.com/Drakkar-Software/OctoBot" target="_blank" rel="noopener noreferrer" class="">Octobot</a>. <a href="https://github.com/GuillaumeDSM" target="_blank" rel="noopener noreferrer" class="">Guillaume De Saint Martin</a>, and <a href="https://github.com/Herklos" target="_blank" rel="noopener noreferrer" class="">Herklos</a> will talk about their experience using Okteto with Octobot, plus their recent experiments with preview environments.</p>
<p>Also, our Developer Advocate <a href="https://twitter.com/kvng_zeez" target="_blank" rel="noopener noreferrer" class="">Abdulazeez Abdulazeez</a>, will be giving a sneak peak walkthrough of our new preview environments UI. Get a first look at the updated UI and the dedicated CLI command that are coming soon!</p>
<p>Our community calls are for you—our community! We want to hear your voices, so come prepared to chat if you’d like to, or feel free to just sit back and watch.</p>
<p>Come meet your fellow Okteto users, learn what’s new, and get your questions answered!</p>
<p><a href="https://lu.ma/qgm1qff3" target="_blank" rel="noopener noreferrer" class="">Register Here</a></p>
<p>See you there!</p>]]></content:encoded>
            <category>events</category>
            <category>startup</category>
            <category>youtube</category>
            <category>octobot</category>
        </item>
        <item>
            <title><![CDATA[Introducing Okteto Divert—Video Tutorial]]></title>
            <link>https://www.okteto.com/blog/divert-video-tutorial/</link>
            <guid>https://www.okteto.com/blog/divert-video-tutorial/</guid>
            <pubDate>Fri, 09 Jul 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[In this tutorial, you'll learn how to use Okteto divert, a feature that allows you to have multiple versions of your cloud native app in development.]]></description>
            <content:encoded><![CDATA[<p>We're excited to introduce Okteto divert, our newest feature! Divert allows you to have multiple versions of your application in development. This can help with development flow, testing, canary deployments, and more.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/qD7Sxj4EfYA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<p>You can now easily compare side by side versions of your application by adding an optional divert to your Okteto manifest. Please follow along with the video tutorial to see how it works.</p>
<p>Ready to give it a try? Here are some resources to get you started:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://www.okteto.com/blog/divert-video-tutorial/#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h3>
<ul>
<li class="">✨ <a href="https://okteto.com/docs/tutorials/getting-started-with-divert/" target="_blank" rel="noopener noreferrer" class="">Getting Started with Divert</a></li>
<li class="">✨ <a href="https://cloud.okteto.com/" target="_blank" rel="noopener noreferrer" class="">Okteto Cloud</a></li>
<li class="">✨ <a href="https://okteto.com/docs/cloud/" target="_blank" rel="noopener noreferrer" class="">Documentation</a></li>
</ul>
<p>If you have questions about divert, feel free to reach out in the <a href="https://kubernetes.slack.com/messages/CM1QMQGS0/" target="_blank" rel="noopener noreferrer" class="">#okteto</a> channel in the <a href="http://slack.k8s.io/" target="_blank" rel="noopener noreferrer" class="">Kubernetes community Slack</a>.</p>
<p>Happy Coding!</p>]]></content:encoded>
            <category>divert</category>
            <category>features</category>
            <category>cloud-native</category>
            <category>kubernetes</category>
            <category>tutorial</category>
        </item>
        <item>
            <title><![CDATA[Okteto Partners with Girls in Tech Spain]]></title>
            <link>https://www.okteto.com/blog/okteto-partners-with-girls-in-tech/</link>
            <guid>https://www.okteto.com/blog/okteto-partners-with-girls-in-tech/</guid>
            <pubDate>Wed, 30 Jun 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Okteto Partners with Girls in Tech Spain]]></description>
            <content:encoded><![CDATA[<p>We believe in the importance of a diverse tech industry and look forward to the day when diversity is embraced by our entire industry. As it stands now, <a href="https://builtin.com/women-tech/women-in-tech-workplace-statistics" target="_blank" rel="noopener noreferrer" class="">only 26% of computing jobs are held by women</a>. While this is a lower than ideal percentage, here at Okteto we’re still hopeful because we see many positive changes happening in the industry. One of the most impactful changes we’ve seen is the growth of organizations that focus on eliminating the gender gap and helping candidates from non-traditional backgrounds break into the industry.</p>
<p>That’s why we’re excited to announce our partnership with Girls in Tech Spain! We want to be part of the transformation already happening in the tech industry and start helping more female-identifying candidates find success in the tech job market.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="girls-in-tech">Girls in Tech<a href="https://www.okteto.com/blog/okteto-partners-with-girls-in-tech/#girls-in-tech" class="hash-link" aria-label="Direct link to Girls in Tech" title="Direct link to Girls in Tech" translate="no">​</a></h2>
<p>Girls in Tech is a nonprofit organization that exists to help eliminate the gender gap in the tech industry. Started in 2007 by Adriana Gascoigne, Girls in Tech now has more than 60,000 members and more than 50 chapters around the world. So far, they’ve funded over 5K entrepreneurs, had over 59K participants in hackathons, and have had over 75K participants in coding, design, and startup bootcamps. Their website also hosts a job board where companies post open roles across many sectors of the tech industry such as software engineering, product management, and business operations.</p>
<p>Girls in Tech Spain launched in March of 2015, and hosts events, webinars and more for local tech talent in Spain. Their goal is to make a difference and encourage more women to become involved in technology through their chapter.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-were-partnering-with-girls-in-tech">How we’re partnering with Girls in Tech<a href="https://www.okteto.com/blog/okteto-partners-with-girls-in-tech/#how-were-partnering-with-girls-in-tech" class="hash-link" aria-label="Direct link to How we’re partnering with Girls in Tech" title="Direct link to How we’re partnering with Girls in Tech" translate="no">​</a></h2>
<p>Okteto is partnering with Girls in Tech Spain because we believe in their mission—to eliminate the gender gap in the tech industry. We’ll be working together with them on webinars, online classes, and a Hackathon in October. As a company, we wanted to do our part in helping women in tech succeed and we’re excited to work with this organization that is doing so much good in our industry.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-you-can-help">How you can help<a href="https://www.okteto.com/blog/okteto-partners-with-girls-in-tech/#how-you-can-help" class="hash-link" aria-label="Direct link to How you can help" title="Direct link to How you can help" translate="no">​</a></h2>
<p>If you’re interested in seeing those from non-traditional backgrounds find their future in the tech industry, our advice is to get involved! Offer to volunteer with one of the many organizations out there like Girls in Tech. It could be as simple as assisting with a webinar, or encouraging the company you work for to offer sponsorship or scholarship opportunities to underrepresented groups. You can also spread the word about the need for more diversity in tech. Speak up during hiring meetings and champion candidates who come from a non-traditional background. If your company is not getting applicants from underrepresented groups, try posting jobs in places like the Girls in Tech job board and other similar job boards geared to reaching those you’re looking for.</p>
<p>Here at Okteto, <a href="https://www.workatastartup.com/companies/okteto" target="_blank" rel="noopener noreferrer" class="">we’re currently hiring</a> and would love to chat with you! We also recently started our guest tech writer program and we’d be thrilled to feature voices from non-traditional backgrounds on our blog. Please check out our <a href="https://okteto.com/tech-writer/" target="_blank" rel="noopener noreferrer" class="">tech writer info page</a> and get in touch with any questions!</p>
<p>Together we can help bridge the gender gap and see more diversity in the tech industry!</p>
<p>Check out Girls in Tech for ways to get involved in this organization.</p>]]></content:encoded>
            <category>announcement</category>
            <category>startups</category>
        </item>
        <item>
            <title><![CDATA[Run your Pull Request Preview Environments on Kubernetes]]></title>
            <link>https://www.okteto.com/blog/preview-environments-for-kubernetes/</link>
            <guid>https://www.okteto.com/blog/preview-environments-for-kubernetes/</guid>
            <pubDate>Mon, 07 Jun 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Run your Pull Request Preview Environments on Kubernetes]]></description>
            <content:encoded><![CDATA[<p>Have you ever wanted to test the changes in one of your teammate's pull requests? Today it looks like this: commit your local changes, switch your local branch, redeploy your application in your local environment, and test the changes if nothing breaks... Have you ever attached a gif in your pull request to help people validate visual changes in your application? Shouldn't there be a better way to do these things?</p>
<p>Preview environments are the answer. A preview environment is an ephemeral environment associated to the life cycle of a pull request. Preview environments make it super simple to validate the changes in a pull request by anyone in your team. These changes are tested in isolation before merging the branch to master and without polluting other integration environments.</p>
<p>In this blog post, you'll learn how preview environments can increase your team productivity and why Kubernetes is the perfect place to deploy your preview environments.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-a-preview-environment">What is a preview environment<a href="https://www.okteto.com/blog/preview-environments-for-kubernetes/#what-is-a-preview-environment" class="hash-link" aria-label="Direct link to What is a preview environment" title="Direct link to What is a preview environment" translate="no">​</a></h2>
<p>Code reviews are a powerful tool to catch issues before code gets merged to master. But some issues are hard to discover from just reading code. Think about design changes, user onboarding workflows, or performance improvements. If you want to see the code of a pull request in action you will need to clone the branch in your local machine, redeploy your local environment, probably reconfigure your data, and then validate the changes. This is a lot of friction. And it could be hard to do by people from the product team, for example. Luckily, preview environments are here to help!</p>
<p>A <strong>preview environment</strong> is an ephemeral environment created with the code of your pull requests. It provides a realistic environment to see your changes live before merging to master. A link to the preview environment is added to the pull request, so everyone in your team can see your changes live with just one click. The preview environment will be updated on each commit, and finally destroyed when the pull request is closed. They help to catch errors before bad code is merged to master and breaks your staging environments for everyone.</p>
<p>What is the best way to create your preview environments? Do you need a lot of scripts and automations? No, you don't. You can leverage Kubernetes to simplify the management of your preview environments.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="deploying-preview-environments-on-kubernetes">Deploying preview environments on Kubernetes<a href="https://www.okteto.com/blog/preview-environments-for-kubernetes/#deploying-preview-environments-on-kubernetes" class="hash-link" aria-label="Direct link to Deploying preview environments on Kubernetes" title="Direct link to Deploying preview environments on Kubernetes" translate="no">​</a></h2>
<p><a href="https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/" target="_blank" rel="noopener noreferrer" class="">Kubernetes</a> is the de facto standard to deploy applications. In their own documentation words:</p>
<div class="book-quote">
Kubernetes is a portable, extensible, open-source platform for managing containerized workloads and services, that facilitates both declarative configuration and automation. It has a large, rapidly growing ecosystem.
</div>
<p>I'm not going to extend on the benefits of Kubernetes here (there are tons of blog posts about it). Instead, I will focus on the key features provided by Kubernetes that make it a perfect fit to deploy your preview environments. These features are:</p>
<ul>
<li class="">Namespaces</li>
<li class="">Fast application startup times</li>
<li class="">Ingress, certificates, and wildcards</li>
<li class="">Optimized resource allocation</li>
<li class="">Declarative workloads and dynamic infrastructure</li>
<li class="">Production-like integrations</li>
</ul>
<p>Let's get into each of them in detail!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="namespaces">Namespaces<a href="https://www.okteto.com/blog/preview-environments-for-kubernetes/#namespaces" class="hash-link" aria-label="Direct link to Namespaces" title="Direct link to Namespaces" translate="no">​</a></h3>
<p>A namespace is similar to a virtual cluster inside your Kubernetes cluster. You can have multiple namespaces inside a single Kubernetes cluster, and they are all logically isolated from each other.</p>
<p>Namespaces are the perfect boundary for preview environments. Namespaces are easy to create and dispose.
Deploy each preview environment on a different namespace to make sure you don't have name collisions and incompatibilities between your different environments. When your pull request is closed, remove the associated namespace and eveything created by your preview environment will be destroyed in seconds.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="fast-application-startup-times">Fast application startup times<a href="https://www.okteto.com/blog/preview-environments-for-kubernetes/#fast-application-startup-times" class="hash-link" aria-label="Direct link to Fast application startup times" title="Direct link to Fast application startup times" translate="no">​</a></h3>
<p>A Kubernetes cluster serves as a (pre-created) pool for your preview environments. Each time there's a pull request, you should create a namespace (almost instant), build your Docker images (very fast if you optimize your docker cache behavior) and deploy your application on Kubernetes. Kubernetes is built for high scale and fast deployments. Your containers will be ready in seconds. This is much faster, cheaper, and easier to configure than creating VMs for each preview environment.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ingress-certificates-and-wildcards">Ingress, certificates, and wildcards<a href="https://www.okteto.com/blog/preview-environments-for-kubernetes/#ingress-certificates-and-wildcards" class="hash-link" aria-label="Direct link to Ingress, certificates, and wildcards" title="Direct link to Ingress, certificates, and wildcards" translate="no">​</a></h3>
<p>A Kubernetes Ingress Controller is a specialized load balancer for Kubernetes environments. It can be used to share a single cloud load balancer between all the applications running in the cluster. It provides L7 support to route traffic to your application based on the incoming request domain.</p>
<p>Ingress controllers make it easier, faster, and cheaper to configure access to your preview environments. For example, you can create an ingress rule to forward traffic from the <a href="https://my-app-pull-request-1.previews.com/" target="_blank" rel="noopener noreferrer" class="">https://my-app-pull-request-1.previews.com</a> domain to the preview environment deployed in the namespace <code>pull-request-1</code>. And you can create another ingress rule to forward traffic from the <a href="https://my-app-pull-request-2.previews.com/" target="_blank" rel="noopener noreferrer" class="">https://my-app-pull-request-2.previews.com</a> domain to the preview environment deployed in the namespace <code>pull-request-2</code>.</p>
<p>And this is not all. You can associate a wildcard certificate (*.previews.com) to these ingress rules, point the wildcard domain *.previews.com to the public IP of your ingress controller, and you will be good to go. All your preview environments will have a different domain with TLS support 💥.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="optimized-resource-allocation">Optimized resource allocation<a href="https://www.okteto.com/blog/preview-environments-for-kubernetes/#optimized-resource-allocation" class="hash-link" aria-label="Direct link to Optimized resource allocation" title="Direct link to Optimized resource allocation" translate="no">​</a></h3>
<p>Containers running on the same Kubernetes cluster node share the CPU and Memory resources of the node. This can be fine tuned with <a href="https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/" target="_blank" rel="noopener noreferrer" class="">requests and limits</a>, but it's very convenient for preview environments.</p>
<p>Preview environments don't usually receive much traffic. There could be a spike while your application is starting, but they will probably consume almost no CPU and very little memory once they're up and running. This makes it possible to deploy dozens of containers on the same cluster node and reduce your cloud bill when using preview environments 💸.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="declarative-workloads-and-dynamic-infrastructure">Declarative workloads and dynamic infrastructure<a href="https://www.okteto.com/blog/preview-environments-for-kubernetes/#declarative-workloads-and-dynamic-infrastructure" class="hash-link" aria-label="Direct link to Declarative workloads and dynamic infrastructure" title="Direct link to Declarative workloads and dynamic infrastructure" translate="no">​</a></h3>
<p>One of the core features of Kubernetes is its declarative application deployment approach. This means, for example, that you tell Kubernetes to deploy your application and Kubernetes takes care of recreating your application pods if a cluster node goes down.</p>
<p>This is very handy because you can configure your Kubernetes <a href="https://github.com/kubernetes/autoscaler" target="_blank" rel="noopener noreferrer" class="">Cluster Autoscaler</a> to create and destroy nodes in the cluster to fit the current number of preview environments. As nodes get created and destroyed, your application pods will be moved between nodes with no downtime. Moreover, you can configure your cluster with AWS spot instances or GCP preemptible nodes and save up to 75% of your cloud provider cost.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="production-like-integrations">Production-like integrations<a href="https://www.okteto.com/blog/preview-environments-for-kubernetes/#production-like-integrations" class="hash-link" aria-label="Direct link to Production-like integrations" title="Direct link to Production-like integrations" translate="no">​</a></h3>
<p>Finally, running your preview environments in Kubernetes gives you a much more realistic environment. You'll test your preview environments with the same security, network, ingress configuration, cloud infrastructure, etc...as your production environments. You could even integrate your preview environments with vault secret managers, network policies, monitor tools like Prometheus, visualization tools like Grafana, and any other tool from the rich Kubernetes ecosystem.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps">Next steps<a href="https://www.okteto.com/blog/preview-environments-for-kubernetes/#next-steps" class="hash-link" aria-label="Direct link to Next steps" title="Direct link to Next steps" translate="no">​</a></h2>
<p>Kubernetes has the right building blocks to manage preview environments on each pull request, but it requires you to glue a few pieces together. At <a href="https://okteto.com/" target="_blank" rel="noopener noreferrer" class="">Okteto</a> we have done this for you to make it super easy to configure preview environments on your Git repositories. Okteto supports your favorite application formats: Helm, Kustomize, Kubectl, or Docker Compose. Head over to our getting started guides to configure preview environments with <a href="https://www.okteto.com/docs/cloud/preview-environments/preview-environments-github/" target="_blank" rel="noopener noreferrer" class="">GitHub Actions</a> or <a href="https://www.okteto.com/docs/cloud/preview-environments/preview-environments-gitlab/" target="_blank" rel="noopener noreferrer" class="">Gitlab</a> and start enjoying the benefits of preview environments today.</p>]]></content:encoded>
            <category>kubernetes</category>
            <category>preview</category>
            <category>okteto</category>
            <category>development</category>
        </item>
        <item>
            <title><![CDATA[Okteto and Chaos Testing with Litmus - Webinar]]></title>
            <link>https://www.okteto.com/blog/okteto-and-litmus-webinar/</link>
            <guid>https://www.okteto.com/blog/okteto-and-litmus-webinar/</guid>
            <pubDate>Sun, 02 May 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Okteto and Chaos Testing with Litmus - Webinar]]></description>
            <content:encoded><![CDATA[<p>Ramiro did a webinar last week along with Uma and Karthik of ChaosNative on how to use Okteto and Litmus Chaos to get your Chaos Engineering practice started.</p>
<p>One of the advantages of tools like Okteto and Litmus is that once you have all your infrastructure and experiments codified, both Okteto portal and Litmus portal help your entire team take advantage of all the benefits. Your team can go faster without having to touch Kubernetes commands, or having to learn how to create experiments. One expert can create a setup for the team, and everyone can take advantage of those features, while avoiding the bottleneck of having just one person responsible for testing.</p>
<p>Check out the video and let us know what you think!</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/tlnRVM27PZc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>]]></content:encoded>
            <category>development</category>
            <category>kubernetes</category>
            <category>cloud-native</category>
            <category>chaos</category>
            <category>litmus</category>
            <category>youtube</category>
            <category>events</category>
            <category>open-source</category>
        </item>
        <item>
            <title><![CDATA[Okteto On The Kubernetes Podcast]]></title>
            <link>https://www.okteto.com/blog/okteto-on-the-kubernetes-podcast/</link>
            <guid>https://www.okteto.com/blog/okteto-on-the-kubernetes-podcast/</guid>
            <pubDate>Thu, 29 Oct 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Okteto On The Kubernetes Podcast]]></description>
            <content:encoded><![CDATA[<p>Last week, <a href="https://kubernetespodcast.com/about" target="_blank" rel="noopener noreferrer" class="">Adam and Craig</a> interviewed me on the <em>Kubernetes Podcast from Google</em>. It was a very fun interview where we talked about the origin of the company, the state of the Kubernetes development experience, what was it like to go through YCombinator's demo day, and many more things.</p>
<p>If you always wondered why Okteto is named Okteto, who is Cindy Lopez, or where to get a burrito in San Francisco, this is the podcast episode for you!</p>
<p><a href="https://kubernetespodcast.com/episode/125-okteto/" target="_blank" rel="noopener noreferrer" class="">Listen to the episode on the Kubernetes Podcast from Google</a>.</p>
<p>If you're interested in the Cloud Native space, I highly recommend you <a href="https://kubernetespodcast.com/subscribe/index.html" target="_blank" rel="noopener noreferrer" class="">subscribe to it</a>. Every episode I've listened to has been great so far.</p>
<p>What do you think about the interview? Do you agree with my 🌯 taste? <a href="https://twitter.com/oktetohq" target="_blank" rel="noopener noreferrer" class="">Let us know over at twitter</a>!</p>
<blockquote>
<p>If you prefer reading the interview, <a href="https://kubernetespodcast.com/episode/125-okteto#transcript" target="_blank" rel="noopener noreferrer" class="">a full transcript of the interview</a> is also available on their site.</p>
</blockquote>]]></content:encoded>
            <category>kubernetes</category>
            <category>cloud-native</category>
            <category>events</category>
            <category>startups</category>
        </item>
        <item>
            <title><![CDATA[Manage your Kubernetes Context Directly from VS Code]]></title>
            <link>https://www.okteto.com/blog/manage-your-kubernetes-context-directly-from-vs-code/</link>
            <guid>https://www.okteto.com/blog/manage-your-kubernetes-context-directly-from-vs-code/</guid>
            <pubDate>Sun, 22 Sep 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[Manage your Kubernetes Context Directly from VS Code]]></description>
            <content:encoded><![CDATA[<p>Do you keep deploying your applications into the wrong namespace? Now you can see and manage your Kubernetes context directly from VS Code with <a href="https://marketplace.visualstudio.com/items?itemName=okteto.kubernetes-context" target="_blank" rel="noopener noreferrer" class="">our new extension</a> 🚀.</p>
<p>Visual Studio Code has taken the IDE world by storm. On <a href="https://insights.stackoverflow.com/survey/2019#technology-_-most-popular-development-environments" target="_blank" rel="noopener noreferrer" class="">Stack Overflow’s 2019 Developer survey</a> it already appears as the most popular development environment. I’m a big fan of it, mostly because of the extension model. These days, I spend most of my coding time in VS Code windows.</p>
<p>When I’m building Cloud Native applications, I use namespaces extensively. I have dedicated Kubernetes namespace for every application I’m working on, and then I also create one for every branch I’m working on. This lets me switch very quickly not only between branches, but also between different versions of an entire application.</p>
<p>I love working in this way, but every now and then I’ll lose track of which namespace I’m on and I’ll end up running <code>kubectl apply -f deployment.yaml</code> in the wrong place. Nothing catastrophic (gotta love this whole infrastructure as code trend), but it makes me lose my flow 😒. On my terminal I use <a href="https://github.com/superbrothers/zsh-kubectl-prompt" target="_blank" rel="noopener noreferrer" class="">this plugin</a>, but I couldn’t find anything like this for my IDE.</p>
<p>Until now…</p>
<p><img decoding="async" loading="lazy" alt="Manage your Kubernetes context from VS Code" src="https://www.okteto.com/blog/assets/images/demo-4c6d6eda880f22c8d5cdb3de4392d437.gif" width="1192" height="752" class="img_ev3q"></p>
<p>Like everything else we do around here, we build this extension to make our lives as Cloud Native Developers easier than ever. <a href="https://marketplace.visualstudio.com/items?itemName=okteto.kubernetes-context" target="_blank" rel="noopener noreferrer" class="">Install the Kubernetes context extension</a>, reload your VS Code instance, and your current context name and namespace will be displayed in the bottom right of the screen. Need to change it? Click on the status bar, and select another one, without losing your flow.</p>
<p>I hope you find it as useful as we do. Let us know what you think about it <a href="https://twitter.com/oktetohq" target="_blank" rel="noopener noreferrer" class="">on Twitter</a>, or in the <a href="https://community.okteto.com/" target="_blank" rel="noopener noreferrer" class="">Okteto community forum</a>.</p>]]></content:encoded>
            <category>visual-studio-code</category>
            <category>development</category>
            <category>kubernetes</category>
            <category>cloud-native</category>
        </item>
        <item>
            <title><![CDATA[Cloud Native Application Development Survey]]></title>
            <link>https://www.okteto.com/blog/cloud-native-application-development-survey/</link>
            <guid>https://www.okteto.com/blog/cloud-native-application-development-survey/</guid>
            <pubDate>Mon, 09 Sep 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[Cloud Native Application Development Survey]]></description>
            <content:encoded><![CDATA[<p>We’d like to invite you to participate in a survey we’re conducting of our customers, users and community members. The purpose of the survey is to learn more about how you build Cloud Native applications, what you enjoy about it and the challenges that you're facing.</p>
<p><a href="https://docs.google.com/forms/d/e/1FAIpQLSeVAfZTARMxDuqVl_Etukgk-JstcpHhOlxE2CVd2eYNrCxvwA/viewform" target="_blank" rel="noopener noreferrer" class="">Click here to participate</a>.</p>
<p>Your input is important so take the survey before it closes on <em>Friday, September 20th</em>. It only takes 2 minutes to complete 🙏.</p>
<p>We'll publish a follow up post with the aggregate results of survey once the survey closes, so stay tuned!</p>]]></content:encoded>
            <category>kubernetes</category>
            <category>development</category>
            <category>cloud-native</category>
            <category>docker</category>
        </item>
    </channel>
</rss>