<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Lorenzo Tettamanti</title>
    <description>The latest articles on DEV Community by Lorenzo Tettamanti (@lorenzo_tettamanti).</description>
    <link>https://dev.to/lorenzo_tettamanti</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1729837%2Faef315c6-b00f-43fd-b305-ea9e76f92d6f.jpg</url>
      <title>DEV Community: Lorenzo Tettamanti</title>
      <link>https://dev.to/lorenzo_tettamanti</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lorenzo_tettamanti"/>
    <language>en</language>
    <item>
      <title>Have you ever heard about proxy injection? Discover how to build an automatic proxy injector (Linkerd like) in Rust</title>
      <dc:creator>Lorenzo Tettamanti</dc:creator>
      <pubDate>Mon, 28 Apr 2025 09:01:09 +0000</pubDate>
      <link>https://dev.to/lorenzo_tettamanti/have-you-ever-heard-about-proxy-injection-discover-how-to-build-an-automatic-proxy-injector-1lm5</link>
      <guid>https://dev.to/lorenzo_tettamanti/have-you-ever-heard-about-proxy-injection-discover-how-to-build-an-automatic-proxy-injector-1lm5</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/cortexflow/service-mesh-explained-building-a-proxy-injector-in-rust-with-code-5c48" class="crayons-story__hidden-navigation-link"&gt;Service Mesh Explained: How to build a Proxy Injector in Rust (with code) 💻&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/cortexflow"&gt;
            &lt;img alt="CortexFlow   logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F9657%2Fa49bf40e-d4ba-4f60-a5a6-812d1232f6c6.png" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/lorenzo_tettamanti" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1729837%2Faef315c6-b00f-43fd-b305-ea9e76f92d6f.jpg" alt="lorenzo_tettamanti profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/lorenzo_tettamanti" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Lorenzo Tettamanti
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Lorenzo Tettamanti
                
              
              &lt;div id="story-author-preview-content-2366115" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/lorenzo_tettamanti" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1729837%2Faef315c6-b00f-43fd-b305-ea9e76f92d6f.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Lorenzo Tettamanti&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/cortexflow" class="crayons-story__secondary fw-medium"&gt;CortexFlow  &lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/cortexflow/service-mesh-explained-building-a-proxy-injector-in-rust-with-code-5c48" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 23 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/cortexflow/service-mesh-explained-building-a-proxy-injector-in-rust-with-code-5c48" id="article-link-2366115"&gt;
          Service Mesh Explained: How to build a Proxy Injector in Rust (with code) 💻
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/kubernetes"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;kubernetes&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tutorial"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tutorial&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/softwaredevelopment"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;softwaredevelopment&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/rust"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;rust&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/cortexflow/service-mesh-explained-building-a-proxy-injector-in-rust-with-code-5c48" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;11&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/cortexflow/service-mesh-explained-building-a-proxy-injector-in-rust-with-code-5c48#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            8 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>kubernetes</category>
      <category>tutorial</category>
      <category>softwaredevelopment</category>
      <category>rust</category>
    </item>
    <item>
      <title>Do you know how a traditional service mesh injects a sidecar proxy into a Pod? Discover how to build a basic automatic proxy injector using the Rust programming language and Kubernetes🎉</title>
      <dc:creator>Lorenzo Tettamanti</dc:creator>
      <pubDate>Mon, 28 Apr 2025 08:58:46 +0000</pubDate>
      <link>https://dev.to/lorenzo_tettamanti/do-you-know-how-a-traditional-service-mesh-injects-a-sidecar-proxy-into-a-pod-discover-how-to-4mp8</link>
      <guid>https://dev.to/lorenzo_tettamanti/do-you-know-how-a-traditional-service-mesh-injects-a-sidecar-proxy-into-a-pod-discover-how-to-4mp8</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/cortexflow/service-mesh-explained-building-a-proxy-injector-in-rust-with-code-5c48" class="crayons-story__hidden-navigation-link"&gt;Service Mesh Explained: How to build a Proxy Injector in Rust (with code) 💻&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/cortexflow"&gt;
            &lt;img alt="CortexFlow   logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F9657%2Fa49bf40e-d4ba-4f60-a5a6-812d1232f6c6.png" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/lorenzo_tettamanti" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1729837%2Faef315c6-b00f-43fd-b305-ea9e76f92d6f.jpg" alt="lorenzo_tettamanti profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/lorenzo_tettamanti" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Lorenzo Tettamanti
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Lorenzo Tettamanti
                
              
              &lt;div id="story-author-preview-content-2366115" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/lorenzo_tettamanti" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1729837%2Faef315c6-b00f-43fd-b305-ea9e76f92d6f.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Lorenzo Tettamanti&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/cortexflow" class="crayons-story__secondary fw-medium"&gt;CortexFlow  &lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/cortexflow/service-mesh-explained-building-a-proxy-injector-in-rust-with-code-5c48" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 23 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/cortexflow/service-mesh-explained-building-a-proxy-injector-in-rust-with-code-5c48" id="article-link-2366115"&gt;
          Service Mesh Explained: How to build a Proxy Injector in Rust (with code) 💻
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/kubernetes"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;kubernetes&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tutorial"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tutorial&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/softwaredevelopment"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;softwaredevelopment&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/rust"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;rust&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/cortexflow/service-mesh-explained-building-a-proxy-injector-in-rust-with-code-5c48" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;11&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/cortexflow/service-mesh-explained-building-a-proxy-injector-in-rust-with-code-5c48#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            8 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>kubernetes</category>
      <category>tutorial</category>
      <category>softwaredevelopment</category>
      <category>rust</category>
    </item>
    <item>
      <title>Have you ever heard about proxy injection? Discover how to build an automatic proxy injector (Linkerd like) in Rust</title>
      <dc:creator>Lorenzo Tettamanti</dc:creator>
      <pubDate>Mon, 28 Apr 2025 08:55:50 +0000</pubDate>
      <link>https://dev.to/lorenzo_tettamanti/have-you-ever-heard-about-proxy-injection-discover-how-to-build-an-automatic-proxy-injector-53n5</link>
      <guid>https://dev.to/lorenzo_tettamanti/have-you-ever-heard-about-proxy-injection-discover-how-to-build-an-automatic-proxy-injector-53n5</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/cortexflow/service-mesh-explained-building-a-proxy-injector-in-rust-with-code-5c48" class="crayons-story__hidden-navigation-link"&gt;Service Mesh Explained: How to build a Proxy Injector in Rust (with code) 💻&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/cortexflow"&gt;
            &lt;img alt="CortexFlow   logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F9657%2Fa49bf40e-d4ba-4f60-a5a6-812d1232f6c6.png" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/lorenzo_tettamanti" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1729837%2Faef315c6-b00f-43fd-b305-ea9e76f92d6f.jpg" alt="lorenzo_tettamanti profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/lorenzo_tettamanti" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Lorenzo Tettamanti
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Lorenzo Tettamanti
                
              
              &lt;div id="story-author-preview-content-2366115" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/lorenzo_tettamanti" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1729837%2Faef315c6-b00f-43fd-b305-ea9e76f92d6f.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Lorenzo Tettamanti&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/cortexflow" class="crayons-story__secondary fw-medium"&gt;CortexFlow  &lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/cortexflow/service-mesh-explained-building-a-proxy-injector-in-rust-with-code-5c48" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 23 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/cortexflow/service-mesh-explained-building-a-proxy-injector-in-rust-with-code-5c48" id="article-link-2366115"&gt;
          Service Mesh Explained: How to build a Proxy Injector in Rust (with code) 💻
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/kubernetes"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;kubernetes&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tutorial"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tutorial&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/softwaredevelopment"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;softwaredevelopment&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/rust"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;rust&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/cortexflow/service-mesh-explained-building-a-proxy-injector-in-rust-with-code-5c48" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;11&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/cortexflow/service-mesh-explained-building-a-proxy-injector-in-rust-with-code-5c48#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            8 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>kubernetes</category>
      <category>tutorial</category>
      <category>softwaredevelopment</category>
      <category>rust</category>
    </item>
    <item>
      <title>Service Mesh Explained: How to build a Proxy Injector in Rust (with code) 💻</title>
      <dc:creator>Lorenzo Tettamanti</dc:creator>
      <pubDate>Wed, 23 Apr 2025 21:55:43 +0000</pubDate>
      <link>https://dev.to/cortexflow/service-mesh-explained-building-a-proxy-injector-in-rust-with-code-5c48</link>
      <guid>https://dev.to/cortexflow/service-mesh-explained-building-a-proxy-injector-in-rust-with-code-5c48</guid>
      <description>&lt;p&gt;Kubernetes service meshes rely on &lt;strong&gt;“sidecar”&lt;/strong&gt; proxies to handle traffic routing transparently, security &lt;br&gt;
policies, and observability for your microservices—but manually bolting those proxies onto every Pod &lt;br&gt;
spec quickly becomes a maintenance nightmare.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What if you could have Kubernetes do the work for you, automatically injecting the proxy whenever a Pod is created?&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;In this tutorial, we’re going to build exactly that: a &lt;strong&gt;Mutating Admission Webhook&lt;/strong&gt; in Rust that hooks &lt;br&gt;
into the Kubernetes API server, inspects incoming Pod specs, and—if they meet your criteria—patches &lt;br&gt;
them on the fly to include an init‑container (for iptables setup) and your proxy‑sidecar.   &lt;/p&gt;

&lt;p&gt;Along the way, you’ll learn how to: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define the AdmissionReview/AdmissionRequest and AdmissionResponse data structures
&lt;/li&gt;
&lt;li&gt;Wire up an async handler in Axum, complete with #[instrument] tracing for per-request logging
&lt;/li&gt;
&lt;li&gt;Craft a JSONPatch that adds init‑containers and sidecar containers via a base64-encoded payload
&lt;/li&gt;
&lt;li&gt;Stand up a TLS‑secured HTTP server using Rustls so Kubernetes can trust your webhook
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end, you’ll have a drop‑in proxy injector that can be deployed alongside your service mesh &lt;br&gt;
control plane—no more manual injection, no more drift, just automatic, consistent proxy injection &lt;br&gt;
across your cluster. &lt;/p&gt;

&lt;p&gt;All the code we walk through here is available on our GitHub &lt;a href="https://github.com/CortexFlow/CortexBrain" rel="noopener noreferrer"&gt;repository&lt;/a&gt;—feel free to clone and explore it!&lt;/p&gt;

&lt;p&gt;Let’s dive in!🚀&lt;/p&gt;
&lt;h2&gt;
  
  
  Admission Webhooks
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;What Are Admission Webhooks?&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;Admission webhooks are a type of dynamic admission controller in Kubernetes. They allow you to validate or modify (mutate) Kubernetes objects as they are submitted to the cluster.&lt;/p&gt;

&lt;p&gt;There are two types of admission webhooks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Validating Admission Webhooks&lt;/strong&gt; – used to validate requests to the Kubernetes API server. They can accept or reject the request, but &lt;strong&gt;cannot&lt;/strong&gt; modify the object.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mutating Admission Webhooks&lt;/strong&gt; – used to &lt;strong&gt;modify&lt;/strong&gt; (mutate) objects before they are persisted. They can change or enrich the resource definition, such as injecting sidecars into pods.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Admission webhooks are HTTP callbacks that are invoked during the admission phase of an API request. The Kubernetes API server sends an AdmissionReview request to the webhook service, which then evaluates the request and responds with an AdmissionReview response.&lt;/p&gt;

&lt;p&gt;The admission phase takes place &lt;strong&gt;after&lt;/strong&gt; authentication and authorization, but &lt;strong&gt;before&lt;/strong&gt; the object is stored in etcd.&lt;/p&gt;

&lt;p&gt;You can configure the Kubernetes API server to call specific webhook services when certain operations (like &lt;code&gt;CREATE&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt;, or &lt;code&gt;DELETE&lt;/code&gt;) are performed on specific resources (such as Pods, Deployments, etc.).&lt;/p&gt;
&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;p&gt;When a request is made to the Kubernetes API:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The request is authenticated and authorized.&lt;/li&gt;
&lt;li&gt;The object goes through the admission phase, where it is passed to:

&lt;ul&gt;
&lt;li&gt;Mutating webhooks (in sequence),&lt;/li&gt;
&lt;li&gt;Followed by validating webhooks (in parallel).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Based on the webhook responses, the request is either allowed, denied, or modified.&lt;/li&gt;
&lt;li&gt;If allowed, the object is persisted in etcd.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Controllers vs. Webhooks
&lt;/h3&gt;

&lt;p&gt;It’s important to distinguish between &lt;strong&gt;admission controllers&lt;/strong&gt; and &lt;strong&gt;webhooks&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Admission controllers&lt;/strong&gt; are built into the Kubernetes API server binary. They are enabled and configured by cluster administrators and cannot be extended at runtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhooks&lt;/strong&gt;, on the other hand, are &lt;strong&gt;external HTTP services&lt;/strong&gt; configured through the Kubernetes API. They provide a more flexible and extensible way to implement custom admission logic, and can be written in any language or framework.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Admission controllers can validate, mutate, or perform both operations depending on their configuration. While validating controllers can &lt;strong&gt;only inspect and accept/reject&lt;/strong&gt; objects, mutating controllers can &lt;strong&gt;modify&lt;/strong&gt; them before they are stored.&lt;/p&gt;
&lt;h2&gt;
  
  
  Building a Proxy Injector: The Structures
&lt;/h2&gt;

&lt;p&gt;To begin, we need to define the data structures that will be used within our injector code. We use the &lt;code&gt;pub&lt;/code&gt; keyword to make these structures accessible from other files within the module.&lt;br&gt;
The first structure we need is &lt;code&gt;AdmissionRequest&lt;/code&gt;, which represents a request sent to the admission webhook:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#[derive(Debug, Serialize, Deserialize)]
pub struct AdmissionRequest {
    uid: String,
    object: serde_json::Value,
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;uid: A unique identifier for this admission request, provided by the Kubernetes API server. It's used to correlate requests and responses.&lt;/li&gt;
&lt;li&gt;object: This field contains the Kubernetes object (usually a Pod) being submitted. It's stored as a raw JSON value so we can inspect or mutate it flexibly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next, we define the AdmissionReview structure. This wraps the admission request and is used to process it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#[derive(Debug, Deserialize, Serialize)]
pub struct AdmissionReview {
    #[serde(rename = "apiVersion", default = "default_api_version")]
    pub api_version: String,
    #[serde(default = "default_kind")]
    pub kind: String,
    pub request: AdmissionRequest,
    #[serde(skip_deserializing)]
    pub response: Option&amp;lt;AdmissionResponse&amp;gt;,
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;api_version: The version of the AdmissionReview API we're handling.&lt;/li&gt;
&lt;li&gt;kind: Always "AdmissionReview" for admission webhooks.&lt;/li&gt;
&lt;li&gt;request: Contains the actual AdmissionRequest sent by the API server.&lt;/li&gt;
&lt;li&gt;response: Optional at deserialization time (we don't receive it from the client), but we populate it before responding to the API server.
The default values for &lt;code&gt;apiVersion&lt;/code&gt; and &lt;code&gt;kind&lt;/code&gt; are provided by the following functions:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fn default_api_version() -&amp;gt; String {
    "admission.k8s.io/v1".to_string()
}

fn default_kind() -&amp;gt; String {
    "AdmissionReview".to_string()
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, we define the AdmissionResponse structure, which is used to send a response back from the admission webhook:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#[derive(Debug, Serialize)]
pub struct AdmissionResponse {
    uid: String,
    allowed: bool,
    patch: Option&amp;lt;String&amp;gt;,
    #[serde(rename = "patchType")]
    patch_type: Option&amp;lt;String&amp;gt;,
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;uid: Must match the request's UID so Kubernetes knows which request this response is for.&lt;/li&gt;
&lt;li&gt;allowed: Indicates whether the request is approved or denied.&lt;/li&gt;
&lt;li&gt;patch: If set, this is a base64-encoded JSON patch to modify the original object before it's persisted in etcd.&lt;/li&gt;
&lt;li&gt;patch_type: Typically "JSONPatch" if you're modifying the object. Required when patch is provided.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Building a Proxy injector: The injection logic
&lt;/h2&gt;

&lt;p&gt;After defining the main structures, we need to create the proper injection logic.&lt;br&gt;&lt;br&gt;
We want a &lt;strong&gt;modular logic&lt;/strong&gt; that can adapt to future changes and users' needs, while maintaining a &lt;strong&gt;simple program structure&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;First of all, we need to create a simple function called &lt;code&gt;check_and_validate_pod&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
This function ensures that the pod meets our requirements &lt;strong&gt;before injecting the sidecar proxy&lt;/strong&gt; into a pod.&lt;/p&gt;

&lt;p&gt;The function follows this logic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Checks if containers are present&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Iterates over each container in the pod's &lt;code&gt;spec.containers&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If a container's name contains &lt;code&gt;"cortexflow-proxy"&lt;/code&gt;:&lt;/li&gt;
&lt;li&gt;Logs an error.&lt;/li&gt;
&lt;li&gt;Returns an error: "The pod is not eligible for proxy injection. Sidecar proxy already present."`&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Validates namespace annotations&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retrieves the pod's namespace from &lt;code&gt;metadata.namespace&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Checks &lt;code&gt;metadata.annotations&lt;/code&gt; for the key &lt;code&gt;"proxy-injection"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If it's set to &lt;code&gt;"disabled"&lt;/code&gt;:

&lt;ul&gt;
&lt;li&gt;Logs a warning.&lt;/li&gt;
&lt;li&gt;Returns an error: &lt;code&gt;"Automatic namespace injection is disabled."&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Validates pod-level annotations&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Checks if the pod itself has &lt;code&gt;"proxy-injection": "disabled"&lt;/code&gt; in &lt;code&gt;metadata.annotations&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If so:

&lt;ul&gt;
&lt;li&gt;Logs a warning.&lt;/li&gt;
&lt;li&gt;Returns an error: &lt;code&gt;"Automatic pod injection is disabled."&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;If all checks pass&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Returns &lt;code&gt;Ok(true)&lt;/code&gt; indicating the pod is eligible for injection.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;For the sake of brevity, I am not including the code below, but you can find the &lt;code&gt;check_and_validate_pod&lt;/code&gt; code &lt;a href="https://github.com/CortexFlow/CortexBrain/blob/main/core/src/components/proxy-injector/src/validation.rs" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Going back to our inject function, after calling the validation function, we expect two behaviours:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The pod is ready and eligible for injection&lt;/li&gt;
&lt;li&gt;The pod is not eligible for injection&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the first case, we can apply the patch, which we'll define in the next chapter, and return an &lt;code&gt;allowed: true&lt;/code&gt; Admission Response.&lt;br&gt;
In the second case, we are not injecting the patch, and we return an &lt;code&gt;allowed: false&lt;/code&gt; Admission Response.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;⚠️For an unexpected issue, I can't include the code directly. You can find the code &lt;a href="https://github.com/CortexFlow/CortexBrain/blob/main/core/src/components/proxy-injector/src/inject.rs" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foxuydmvdeqkelgc1bran.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foxuydmvdeqkelgc1bran.png" alt="Inject function code" width="551" height="681"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a Proxy injector: The patch
&lt;/h2&gt;

&lt;p&gt;Now the magic happens ⭐. The patch is one of the most crucial parts in the proxy injector and is where all the variables are defined.&lt;br&gt;&lt;br&gt;
We are using &lt;a href="https://docs.rs/serde_json/latest/serde_json/" rel="noopener noreferrer"&gt;&lt;code&gt;serde_json&lt;/code&gt;&lt;/a&gt; to create a JSON Patch and &lt;a href="https://docs.rs/lazy_static/latest/lazy_static/" rel="noopener noreferrer"&gt;&lt;code&gt;lazy_static&lt;/code&gt;&lt;/a&gt; to optimize the resources by initializing the variable when it is first accessed, in contrast to the regular static data, which is initialized at compile time.&lt;/p&gt;

&lt;p&gt;The patch is divided into two parts:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Initialize Iptables
&lt;/li&gt;
&lt;li&gt;Initialize the proxy
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the first part, we are using &lt;code&gt;iptables&lt;/code&gt; to redirect all the external traffic — in particular, TCP and UDP traffic — to specific ports.&lt;br&gt;&lt;br&gt;
We decided to bind the &lt;strong&gt;TCP traffic&lt;/strong&gt; to port &lt;strong&gt;5054&lt;/strong&gt; and the &lt;strong&gt;UDP traffic&lt;/strong&gt; to port &lt;strong&gt;5053&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt;The &lt;code&gt;init-iptables&lt;/code&gt; operation cannot be skipped. Otherwise, our system will not bind the traffic to the ports we chose, resulting in endless hours of debugging.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In the second part, we're doing another &lt;code&gt;add&lt;/code&gt; operation to include the image of the proxy server.&lt;br&gt;&lt;br&gt;
We're also explicitly setting the TCP (&lt;code&gt;5054&lt;/code&gt;) and UDP (&lt;code&gt;5053&lt;/code&gt;) ports using the &lt;code&gt;containerPort&lt;/code&gt; key.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;⚠️For an unexpected issue, I can't include the patch code directly. You can find the code &lt;a href="https://github.com/CortexFlow/CortexBrain/blob/main/core/src/components/proxy-injector/src/vars.rs" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmp5fuo7w0h6lo6lgcv8r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmp5fuo7w0h6lo6lgcv8r.png" alt="Patch" width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a Proxy injector: The server logic
&lt;/h2&gt;

&lt;p&gt;In the last part we need to create a server to serve the API we made in the previous step. For this step we use the axum crate and we proceed creating a route. We decided to call the endpoint &lt;code&gt;/mutate&lt;/code&gt; as a reminder for our &lt;em&gt;Mutating Admission Webhook&lt;/em&gt;. As second step we proceed to associate the inject function as POST request and we bind the 9443, this ends the route configuration. The last step is to load the &lt;em&gt;TLS&lt;/em&gt; certificate files tls.crt and tls.key. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;br&gt;
Kubernetes requires TLS certificates to serve APIs over HTTPS. Failing to provide the certificates will result in a non-functional webhook service&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How to generate a TLS certificate?&lt;/em&gt;&lt;br&gt;&lt;br&gt;
Working with TLS certificates may be something unfamiliar to the majority of people reading this article. &lt;em&gt;Cert-manager&lt;/em&gt; is the easiest way to generate the tls.key and tls.crt keys. All you have to do is installing cert-manager using the kubernetes CLI&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;kubectl apply -f https://github.com/cert-manager/certmanager/releases/latest/download/cert-manager.yaml&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The installation may take a while so you can take a small break to let your mind rest a little bit!&lt;br&gt;&lt;br&gt;
After cert-manager is installed you can get the secrets using the following commands&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Return the data.ca file
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
kubectl get secret proxy-injector-tls -n cortexflow -o jsonpath='{.data.ca\.crt}'&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Return the tls.key file
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
kubectl get secret proxy-injector-tls -n cortexflow -o jsonpath='{.data.tls\.key}'&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Return the tls.crt file
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
kubectl get secret proxy-injector-tls -n cortexflow -o jsonpath='{.data.tls\.crt}'&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;br&gt;
For security reasons, do not share these secrets with anyone. Leaking them may compromise your system’s security and get you in trouble.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We decided to automate this process in the install.sh script that you can find in the &lt;a href="https://github.com/CortexFlow/CortexBrain/blob/58d97ca96cf79b82363c6553240e996409a667b0/Scripts/install.sh#L4" rel="noopener noreferrer"&gt;repository&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;⚠️For an unexpected issue, I can't include the code directly. You can find the code &lt;a href="https://github.com/CortexFlow/CortexBrain/blob/main/core/src/components/proxy-injector/src/inject.rs" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7c4pxs2u8nz0up6fj1u1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7c4pxs2u8nz0up6fj1u1.png" alt="server logic " width="615" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a Proxy injector: Deploying to Kubernetes
&lt;/h2&gt;

&lt;p&gt;Now that all components are in place, the final step is to create a Kubernetes manifest to deploy the application into our cluster.&lt;br&gt;
Below is an example YAML file we used to deploy the proxy injector within our namespace.&lt;/p&gt;

&lt;p&gt;Pay special attention to the spec section: here, we define a custom selector that grants the necessary permissions for the injector to modify incoming Pod definitions—specifically, to add the sidecar proxy container automatically.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;⚠️For an unexpected issue, I can't include the manifest code directly. You can find the code &lt;a href="https://github.com/CortexFlow/CortexBrain/blob/main/core/src/testing/proxy-injector.yaml" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1jehug5k8m9nqllhjslm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1jehug5k8m9nqllhjslm.png" alt="manifest" width="426" height="728"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;In the first part, we've covered the foundamentals of proxy injection,going through admission webhooks and admission controllers, while in the second part we have built all the logic from scratch using the Rust programming covering a lot of practical aspects such as defining the structures,building the patch, launching the axum server and interacting with the Kubernetes API.&lt;/p&gt;

&lt;p&gt;In the next part of this series, we’ll create a sidecar proxy and all the basic functions such as service discovery, metrics, observability and messaging 🚀&lt;/p&gt;

&lt;p&gt;Enjoying the content? Show us some love with a ⭐ on &lt;a href="https://github.com/CortexFlow/CortexBrain" rel="noopener noreferrer"&gt;GitHub!&lt;/a&gt; And be sure to catch the first episode of the series, where we take a deep dive into the world of service meshes.&lt;br&gt;
&lt;strong&gt;Stay tuned—and stay curious.&lt;/strong&gt; 🌐🧩&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>tutorial</category>
      <category>softwaredevelopment</category>
      <category>rust</category>
    </item>
    <item>
      <title>What is a service mesh? Discover the key functionalities, pros and cons of modern service mesh technologies [6 min read] 🚀</title>
      <dc:creator>Lorenzo Tettamanti</dc:creator>
      <pubDate>Mon, 14 Apr 2025 22:59:18 +0000</pubDate>
      <link>https://dev.to/lorenzo_tettamanti/what-is-a-service-mesh-discover-the-key-functionalities-pros-and-cons-of-modern-service-mesh-599f</link>
      <guid>https://dev.to/lorenzo_tettamanti/what-is-a-service-mesh-discover-the-key-functionalities-pros-and-cons-of-modern-service-mesh-599f</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/cortexflow/service-mesh-explained-whats-a-service-mesh-9gc" class="crayons-story__hidden-navigation-link"&gt;Service Mesh Explained: What's a service mesh?&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/cortexflow"&gt;
            &lt;img alt="CortexFlow   logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F9657%2Fa49bf40e-d4ba-4f60-a5a6-812d1232f6c6.png" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/lorenzo_tettamanti" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1729837%2Faef315c6-b00f-43fd-b305-ea9e76f92d6f.jpg" alt="lorenzo_tettamanti profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/lorenzo_tettamanti" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Lorenzo Tettamanti
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Lorenzo Tettamanti
                
              
              &lt;div id="story-author-preview-content-2366118" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/lorenzo_tettamanti" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1729837%2Faef315c6-b00f-43fd-b305-ea9e76f92d6f.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Lorenzo Tettamanti&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/cortexflow" class="crayons-story__secondary fw-medium"&gt;CortexFlow  &lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/cortexflow/service-mesh-explained-whats-a-service-mesh-9gc" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 14 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/cortexflow/service-mesh-explained-whats-a-service-mesh-9gc" id="article-link-2366118"&gt;
          Service Mesh Explained: What's a service mesh?
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/kubernetes"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;kubernetes&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/microservices"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;microservices&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/architecture"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;architecture&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/learning"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;learning&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/cortexflow/service-mesh-explained-whats-a-service-mesh-9gc" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;14&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/cortexflow/service-mesh-explained-whats-a-service-mesh-9gc#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>kubernetes</category>
      <category>microservices</category>
      <category>architecture</category>
      <category>learning</category>
    </item>
    <item>
      <title>Service Mesh Explained: What's a service mesh?</title>
      <dc:creator>Lorenzo Tettamanti</dc:creator>
      <pubDate>Mon, 14 Apr 2025 13:00:00 +0000</pubDate>
      <link>https://dev.to/cortexflow/service-mesh-explained-whats-a-service-mesh-9gc</link>
      <guid>https://dev.to/cortexflow/service-mesh-explained-whats-a-service-mesh-9gc</guid>
      <description>&lt;p&gt;Hey there, super curious minds,&lt;/p&gt;

&lt;p&gt;let’s be really honest here...if you’ve been working with microservices long enough, you’ve probably hit that point where everything feels like a group project with no team lead. Services yelling at each other across the cluster, authentication scattered everywhere, observability held together by logs and prayer, and your brain quietly whispering, &lt;em&gt;“This was supposed to be better than monoliths?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That’s where the idea of a service mesh sneaks in. It promises to solve a lot of those problems: better traffic control, resilience, security, &lt;strong&gt;observability&lt;/strong&gt;—all packed into a neat, layered abstraction. It’s the glue between your services... or maybe the smart traffic cop, the bouncer, and the observability dashboard all rolled into one.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;But what exactly is a service mesh?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why is everyone in the Kubernetes ecosystem talking about it?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And more importantly: &lt;em&gt;&lt;strong&gt;do you really need one&lt;/strong&gt;?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this article, we’ll break down the core concepts behind service meshes, including what they are, what problems they solve, and how they work under the hood. We’ll dig into &lt;strong&gt;control planes, data planes, proxies&lt;/strong&gt;, and other buzzwords—but with a practical mindset (and hopefully, no tears).&lt;/p&gt;

&lt;p&gt;No YAML dumps or complex install guides here—this is the conceptual groundwork. Think of it as your first casual conversation with the service mesh world before things get serious. Now let’s get started! 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  Microservices
&lt;/h2&gt;

&lt;p&gt;In the past, applications were smaller, with fewer functionalities, and most of them followed a monolithic architecture. However, as businesses grew and applications became more complex, a new approach started to emerge. This shift was driven by challenges like handling dynamic traffic demands, improving observability, and ensuring better monitoring. As applications began to scale, companies needed a more flexible and efficient way to tackle these challenges. That’s where microservices architecture came into play.&lt;/p&gt;

&lt;p&gt;In a monolithic architecture, the entire application exists as a single unit (a monolith). In contrast, a microservices architecture breaks down the application into smaller, independently deployable services, which communicate with each other using APIs.&lt;/p&gt;

&lt;p&gt;Let’s consider an example: an e-commerce platform that features a main page for purchasing products, a payment page, a recommendation page, a customer care page, and so on. In a monolithic approach, the entire platform – including the main product page, payment gateway, recommendation system, customer care, and more – would all reside in one large application. Instead of this, with a microservices approach, we can break down the platform into individual services (or deployable units) for each functionality. This is similar to the "divide et impera" strategy that anyone familiar with data structures and algorithms has heard at least once in their life. Using this methodology, each service has a single responsibility. For our e-commerce platform, this makes maintenance easier and helps avoid the risk of introducing unexpected bugs with every update.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fulja9r76n0einvb219ss.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fulja9r76n0einvb219ss.jpg" alt="Monolithic vs microservices architecture: in a monolithic architecture all the application is concentrated in one place while in a microservices architecture, every service is independent and can be easily maintained without influencing other services." width="800" height="402"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Image: Monolithic vs microservices architecture: in a monolithic architecture all the application is concentrated in one place while in a microservices architecture, every service is independent and can be easily maintained without influencing other services&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a service mesh?
&lt;/h2&gt;

&lt;p&gt;When we talk about microservice architecture, we’re implicitly referring to a distributed environment where services communicate solely through APIs. In such an environment, a service mesh introduces an abstract infrastructure layer that manages service-to-service communication. It ensures efficient handling of service requests by controlling traffic, providing observability, enforcing security, and enabling service discovery.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key components of a service mesh
&lt;/h2&gt;

&lt;p&gt;The Control Plane is the heart of the service mesh. It coordinates the behavior of proxies and provides APIs for operations and maintenance teams to manipulate and monitor the entire network. This plane is crucial in the context of network design and cloud computing as it manages how data packets travel across the network.&lt;/p&gt;

&lt;p&gt;Here, decisions are made regarding the routing of network traffic. On the other hand, the Data Plane is responsible for moving the data based on the routing choices made by the control plane.&lt;/p&gt;

&lt;p&gt;The Control Plane performs several important functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Network Layout Management: It defines and manages the structure of the network.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Routing Tables &amp;amp; Traffic Flow: It updates routing tables and controls how traffic flows through the network.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enforcing Rules: It ensures that network policies are followed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Control planes are also common in traditional networking with protocols like OSPF and BGP. They are a key part of Software-Defined Networking (SDN) through centralized controllers and are managed by tools like Kubernetes in cloud computing to handle container orchestration.&lt;/p&gt;

&lt;p&gt;The control plane ensures that the network operates smoothly and securely, optimizing the overall network performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Plane: Moving the Data
&lt;/h2&gt;

&lt;p&gt;The Data Plane intercepts the communication between different services and processes it based on the decisions made by the control plane. &lt;/p&gt;

&lt;h2&gt;
  
  
  Key Tasks of the Sidecar Proxy
&lt;/h2&gt;

&lt;p&gt;In a service mesh, the sidecar proxy is responsible for performing various key tasks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Service Discovery: The sidecar proxy identifies all the available upstream or backend service instances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Health Checking: It ensures the upstream service instances are healthy and capable of handling network traffic. This can be done &lt;br&gt;
through:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Active health checks (e.g., sending pings to a /healthcheck endpoint).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Passive health checks (e.g., detecting unhealthy states based on &lt;br&gt;
repeated 5xx errors).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Routing: Based on a REST request the proxy determines which upstream service cluster should handle the request.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Load Balancing: Once the appropriate service cluster is identified, the proxy decides which specific service instance should handle the request, including settings for timeouts, circuit breaking, and retry policies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Security &amp;amp; Authentication : For incoming requests, the proxy verifies the caller's identity using mechanisms like mTLS. It then checks whether the caller is authorized to access the requested endpoint. If not, the proxy returns an unauthenticated response.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Observability: The proxy generates detailed statistics, logs, and distributed tracing data for each request. This helps operators understand the flow of traffic across the services and troubleshoot any issues that arise.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Benefits of using a service mesh
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Centralized Traffic Management: A service mesh allows for fine-grained control over communication between services, including advanced routing capabilities, retries, and failovers. This can be crucial in ensuring high availability and resilience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Security at Scale: Security is paramount in microservices architecture, and service mesh addresses this by providing a uniform layer for implementing security measures like encryption, authentication, and authorization. It ensures that communication between services remains secure without burdening individual services with security concerns.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resilience and Fault Tolerance: Service mesh introduces capabilities for implementing circuit breaking, retries, and timeouts, promoting resilience in the face of failures. It enables applications to gracefully handle faults, preventing cascading failures and ensuring optimal user experiences.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enhanced Observability: Service mesh provides unparalleled visibility into the interactions between microservices. With features like distributed tracing and monitoring, organizations can gain insights into the performance and behavior of their applications, facilitating efficient troubleshooting and optimization.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  But Wait... Why Not Use a Service Mesh?
&lt;/h2&gt;

&lt;p&gt;Before we hand the service mesh the keys to our infrastructure, let’s pump the brakes.&lt;/p&gt;

&lt;p&gt;Service meshes are incredibly powerful—but they’re also not free. Not in performance, complexity, or cognitive load. Here’s why you might not want one just yet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It’s Heavy&lt;/strong&gt;: You’re adding sidecar proxies to every service. That’s more network hops, more memory, more CPU, and more configuration. You better have a good reason (or a beefy cluster).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steep Learning Curve&lt;/strong&gt;: Control planes, mTLS, traffic shifting, retries... these are all good things, but they require real understanding and new operational tooling. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not Always Needed&lt;/strong&gt;: If you’re running five services in dev with no real need for advanced routing or auth, a service mesh is like bringing Kubernetes to a shell script. Start with simpler tools and scale your complexity as needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging Becomes... “Fun”&lt;/strong&gt;: That one sidecar proxy that failed to inject? That Envoy config you didn’t understand? Debugging service mesh issues can sometimes feel like playing 4D chess while blindfolded.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So no, a service mesh is not mandatory. It’s not a badge of honor. It’s a tool—and like any tool, you need to reach for it when and if it solves your specific problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up: The Mesh Is Only the Beginning
&lt;/h2&gt;

&lt;p&gt;The service mesh world is vast, fast-moving, and—let’s admit it—a little intimidating. But if you’re building &lt;strong&gt;distributed systems&lt;/strong&gt;, or just tired of duct-taping together retries, mTLS, and observability, it’s a space worth exploring.&lt;/p&gt;

&lt;p&gt;In this first part, we’ve covered why service meshes exist, what they are, and when they make sense (or don’t). Hopefully, you’re walking away with a solid mental model, a few new questions, and a bit more clarity about what all the buzz is about.&lt;/p&gt;

&lt;p&gt;Service meshes aren’t just a passing trend—they’re part of a broader shift toward smarter, more composable infrastructure. While the concepts can feel heavy at first, the payoff in resilience, visibility, and security is real.&lt;/p&gt;

&lt;p&gt;Whether you’re just peeking into this space or already wrestling with sidecars and control planes, remember: you’re not alone._ And this journey?_ It's only just begun.&lt;/p&gt;

&lt;p&gt;In the next part of this series, we’ll dive into real-world implementations 🚀&lt;/p&gt;

&lt;p&gt;Until then, keep your services chatty (but secure), your architectures simple (until they can’t be), and your curiosity sharp.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mesh wisely. Stay tuned—and stay curious.&lt;/strong&gt; 🌐🧩&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>microservices</category>
      <category>architecture</category>
      <category>learning</category>
    </item>
    <item>
      <title>Kubernetes Explained: Understanding the Key Components Driving Modern Infrastructure ⚙️</title>
      <dc:creator>Lorenzo Tettamanti</dc:creator>
      <pubDate>Sun, 05 Jan 2025 19:57:16 +0000</pubDate>
      <link>https://dev.to/lorenzo_tettamanti/kubernetes-explained-understanding-the-key-components-driving-modern-infrastructure-4eef</link>
      <guid>https://dev.to/lorenzo_tettamanti/kubernetes-explained-understanding-the-key-components-driving-modern-infrastructure-4eef</guid>
      <description>&lt;h2&gt;
  
  
  📖 Introduction
&lt;/h2&gt;

&lt;p&gt;Hi everyone, in today's episode we'll explore the Kubernetes key components. In the latest episode, we learned why Kubernetes is so important for software engineering and why almost every big company relies on it. Our journey will be supported with examples and illustrations to help everyone understand the essential functionalities of Kubernetes.&lt;/p&gt;

&lt;p&gt;Let's dive into it! 🚢&lt;/p&gt;

&lt;h2&gt;
  
  
  📒 Glossary:
&lt;/h2&gt;

&lt;p&gt;Here’s a list of common words and terms used in this article. This will help you form a basic understanding before reading the full article.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Container:&lt;/strong&gt; &lt;br&gt;
A container is a standardized unit of software that packages an application’s code along with all its dependencies, libraries, and configuration files needed to run. Containers ensure that the software behaves consistently regardless of the environment. Common container technologies include Docker and Kubernetes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Distributed system:&lt;/strong&gt;&lt;br&gt;
A distributed system is a collection of independent computers or nodes that work together to appear as a single coherent system to the end user. These systems communicate with one another over a network to coordinate tasks, share resources, and achieve common objectives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Daemon:&lt;/strong&gt;&lt;br&gt;
In the field of container orchestration, a daemon refers to a background service or process that continuously runs and manages tasks without user intervention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Production Environment:&lt;/strong&gt;&lt;br&gt;
The production environment is the setting where an application or service is made available to end-users. In this environment, the application is expected to operate stably, efficiently, and securely, often under real-world traffic conditions and with configurations optimized for performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API:&lt;/strong&gt;&lt;br&gt;
An API (Application Programming Interface) is a set of rules and definitions that allows different software applications to communicate with each other. APIs define how requests are sent, data is structured, and responses are received. APIs are commonly used for web services (e.g., REST, GraphQL), hardware, operating systems, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;YAML:&lt;/strong&gt;&lt;br&gt;
YAML (YAML Ain't Markup Language) is a human-readable data serialization format often used for configuration files. YAML uses hierarchical indentation to represent data structures like maps, lists, and scalar values. It is easy to read and write, making it popular in container configuration and resource orchestration.&lt;/p&gt;
&lt;h2&gt;
  
  
  🏗️ Architecture
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;What's a Kubernetes cluster?&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;A Kubernetes cluster is a set of machines, called nodes, that can run containerized applications. Kubernetes adopts a distributed architecture based on a client-server model to orchestrate the containers. The Kubernetes architecture is composed of two core components:&lt;/p&gt;
&lt;h2&gt;
  
  
  👨🏻‍⚖️ Master Node
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🧠 The control plane
&lt;/h3&gt;

&lt;p&gt;The brain of the cluster. It is responsible for managing the state of the cluster. In production environments,  the control plane usually runs on multiple nodes that span across several data center zones. The second is a set of worker nodes. These nodes run the containerized application workloads. The containerized applications run in a Pod. &lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;em&gt;What's a Pod?&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Pods are the smallest deployable units in Kubernetes. A pod hosts one or more containers and provides shared storage and networking for those containers. Pods are created and managed by the Kubernetes control plane. They are the basic building blocks of Kubernetes applications. &lt;/p&gt;

&lt;p&gt;Now let’s dive a bit deeper into the control plane. It consists of several core components such as the API server, etc, scheduler, and controller manager. &lt;/p&gt;
&lt;h3&gt;
  
  
  🤖 API server:
&lt;/h3&gt;

&lt;p&gt;This is the primary interface between the control plane and the rest of the cluster. It exposes a RESTful API that allows clients to interact with the control plane and submit requests to manage the cluster. The API server is the gateway for the &lt;a href="https://kubernetes.io/docs/reference/kubectl/" rel="noopener noreferrer"&gt;kubectl&lt;/a&gt; which is a command line tool for communicating with the the control plane using the API.&lt;/p&gt;

&lt;p&gt;For example the command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; kubectl run "pod-name" --image="image-name"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is used to create a Pod with a desired &lt;em&gt;pod-name&lt;/em&gt; and with the desidered &lt;em&gt;image-name&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  💾 etcd
&lt;/h3&gt;

&lt;p&gt;Etcd is an open-source distributed key-value store and plays an essential role in the Kubernetes control plane. It stores the cluster's persistent state. In Kubernetes etcd acts as the primary datastore, storing all the cluster data including all the configuration, state, and metadata. It is used by the API server to retrieve and update the cluster's state, ensuring that the actual state of the cluster matches the desired state defined by the users and the administrator.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fun fact: ETCD is composed of the words "etc" and "d." "etc" is derived from the UNIX directory "/etc," which houses configuration files, and "d" stands for "distributed"&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📓 Scheduler:
&lt;/h3&gt;

&lt;p&gt;The scheduler is responsible for scheduling pods onto the worker nodes in the cluster. It uses information about the resources required by the pods and the available resources on the worker nodes to make placement decisions. &lt;br&gt;
In a cluster, Nodes that meet the scheduling requirements for a Pod are called feasible nodes. If none of the nodes are suitable, the pod remains unscheduled until the scheduler is able to place it.&lt;/p&gt;

&lt;p&gt;Kube-scheduler selects a node for the pod in a 2-step operation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Filtering:&lt;br&gt;
The filtering step identifies the nodes where the Pod can be scheduled. After this step, the node list contains the suitable nodes (usually more than one). If the list is empty, the Pod is not (yet) schedulable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scoring:&lt;br&gt;
In the scoring step, the scheduler ranks the remaining nodes to choose the best placement for the Pod. Each node that passed the filtering is given a score based on the active scoring rules.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, kube-scheduler assigns the Pod to the Node with the highest ranking. If there is more than one node with equal scores, kube-scheduler selects one of these at random.&lt;/p&gt;
&lt;h3&gt;
  
  
  🧑🏻‍💼 Controller manager:
&lt;/h3&gt;

&lt;p&gt;The controller manager is responsible for running controllers that manage the state of the cluster. The replication controller ensures that the desired number of replicas of a pod is running, the deployment controller manages the rolling update and rollback of deployments, and the endpoint controller manages the endpoint of the services.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fchu8ty0y8ayhsqxgqfdv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fchu8ty0y8ayhsqxgqfdv.png" alt="Image 1: A summary of the main components of the master node" width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Image 1: A summary of the main components of the master node&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  👷🏻 Worker Nodes
&lt;/h2&gt;

&lt;p&gt;The core components of Kubernetes running on the worker nodes include the kubelet, container runtime, and kube-proxy.&lt;/p&gt;
&lt;h3&gt;
  
  
  📦 Kubelet
&lt;/h3&gt;

&lt;p&gt;The kubelet is a daemon that runs on each worker node. It's the primary node-agent that runs on each node. It is responsible for communicating with the control plane. It can register the node with the apiserver using one of: the hostname; a flag to override the hostname; or specific logic for a cloud provider. It receives instructions from the control plane about which pods to run on the node, and ensures that the desired state of the pods is maintained.&lt;br&gt;
The kubelet works in terms of a PodSpec. It takes a set of PodSpecs and ensures that the containers, described in those PodSpecs are running and healthy.&lt;br&gt;
The Kubelet doesn't manage containers that were not created by Kubernetes.&lt;br&gt;
Here's an example of a PodSpec:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
    - name: nginx-container
      image: nginx:latest
      ports:
        - containerPort: 80
      resources:
        requests:
          memory: "64Mi"
          cpu: "250m"
        limits:
          memory: "128Mi"
          cpu: "500m"
      volumeMounts:
        - name: nginx-config
          mountPath: /etc/nginx/conf.d
  volumes:
    - name: nginx-config
      configMap:
        name: nginx-config-map
  restartPolicy: Always

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this context the Kubelet reads the PodSpec and tells the container runtime to download the container image "nginx:latest", next it runs the containers and mounts the volume defined in spec.volumes. The kubelet allocates the resource defined in spec.resources and monitors the health of the container.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚙️ Container Runtime
&lt;/h3&gt;

&lt;p&gt;The container runtime runs the containers on the worker nodes. It is responsible for pulling the container images from a registry. Start and stop the containers and manage the containers' resources. Kubernetes supports container runtimes such as containered, CRI-O, and any other implementation of the Kubernetes CRI (Container Runtime Interface). There are 2 types of Container Runtimes: Low-level Container Runtime and High-Level Container Runtimes. Since this is a broad topic I will expand on the concept of runtime containers in a future article.&lt;/p&gt;

&lt;h3&gt;
  
  
  💻 Proxy
&lt;/h3&gt;

&lt;p&gt;The kube-proxy is a network proxy that runs on each worker node. It is responsible for routing traffic to the correct pods. It also provides load balancing for the pods and ensures that traffic is distributed evenly across them. After kube-proxy is installed it authenticates with the API server and when new services or endpoints are added or removed the API server communicates these changes to the kube-proxy, then kube-proxy applies these changes as NAT rules. When traffic is sent to a service it's redirected to a backend Pod based on these rules. As for the Container Runtimes this is a small introduction about what's the kube-proxy and what are his main functionalities and I'll expand on all these concepts in a dedicated article.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpx98hha739igybxr65pl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpx98hha739igybxr65pl.png" alt="Image2: A summary of the main components of a kubernetes cluster that includes the master node and two worker nodes. In the first worker node there are 5 pods running microservices and the second worker node there are 3 pods running microservices" width="800" height="623"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Image2: A summary of the main components of a kubernetes cluster that includes the master node and two worker nodes. In the first worker node there are 5 pods running microservices and the second worker node there are 3 pods running microservices&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Conclusions
&lt;/h2&gt;

&lt;p&gt;Kubernetes components are a beautiful example of technology and sophisticated infrastructure. Today we explored how the core components work and interact to enable efficient application deployment and scaling. In the next episode, I'll show you how to start your first Kubernetes cluster and how to deploy an application!&lt;/p&gt;

&lt;p&gt;Thank you for reading! 🙏&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
      <category>learning</category>
    </item>
    <item>
      <title>Learn the benefits of Kubernetes and why Airbnb, Spotify and CERN use it!</title>
      <dc:creator>Lorenzo Tettamanti</dc:creator>
      <pubDate>Sat, 04 Jan 2025 13:19:07 +0000</pubDate>
      <link>https://dev.to/lorenzo_tettamanti/learn-the-benefits-of-kubernetes-and-why-airbnb-spotify-and-cern-use-it-1fe1</link>
      <guid>https://dev.to/lorenzo_tettamanti/learn-the-benefits-of-kubernetes-and-why-airbnb-spotify-and-cern-use-it-1fe1</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/lorenzo_tettamanti" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1729837%2Faef315c6-b00f-43fd-b305-ea9e76f92d6f.jpg" alt="lorenzo_tettamanti"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/lorenzo_tettamanti/kubernetes-explained-benefits-use-cases-and-why-airbnbspotify-and-cern-rely-on-it--315f" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Kubernetes Explained: Benefits, Use Cases, and Why Airbnb,Spotify and CERN Rely on It 🤖&lt;/h2&gt;
      &lt;h3&gt;Lorenzo Tettamanti ・ Jan 1&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#kubernetes&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#learning&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#softwaredevelopment&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#softwareengineering&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Kubernetes Explained: Benefits, Use Cases, and Why Airbnb,Spotify and CERN Rely on It 🤖</title>
      <dc:creator>Lorenzo Tettamanti</dc:creator>
      <pubDate>Wed, 01 Jan 2025 22:27:12 +0000</pubDate>
      <link>https://dev.to/lorenzo_tettamanti/kubernetes-explained-benefits-use-cases-and-why-airbnbspotify-and-cern-rely-on-it--315f</link>
      <guid>https://dev.to/lorenzo_tettamanti/kubernetes-explained-benefits-use-cases-and-why-airbnbspotify-and-cern-rely-on-it--315f</guid>
      <description>&lt;h2&gt;
  
  
  📖 Introduction
&lt;/h2&gt;

&lt;p&gt;Hi everyone, in today's episode we'll dive into Kubernetes, one of the most impactful tools in modern software development. We'll learn why Kubernetes is a game-changer for developers and why almost every big company relies on it. Our journey will be supported by several examples taken from some success stories in the modern world of software engineering such as AirBnb, Spotify and the European Organization for Nuclear Research.&lt;/p&gt;

&lt;p&gt;Originally designed by Google in 2014 as an upgrade of their internal cluster manager "Borg" to handle Google’s massive scale of operations, Kubernetes started gaining traction among developers in 2015. Over the years, the Kubernetes community has grown exponentially, numbering thousands of contributors all over the world. This growth has consolidated Kubernetes' position as one of the largest and most influential open-source projects globally, second only to Linux in terms of its impact on modern IT infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Developers Love Kubernetes 💓
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🖥️ Simplifies Work for Developers
&lt;/h3&gt;

&lt;p&gt;Kubernetes helps manage applications by automating tasks like deploying, scaling, and updating. This means less manual work for developers and IT teams, allowing them to focus on building and improving apps. Kubernetes helps companies deliver reliable, scalable, and cost-effective applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  📈 Scalability Made Simple
&lt;/h3&gt;

&lt;p&gt;As companies grow, so do their applications. But there's a catch: as applications scale up, managing all the containers manually becomes a real nightmare. Nowadays, companies can easily reach dozens or hundreds of microservices, leading to highly complex infrastructures to orchestrate. &lt;br&gt;
&lt;em&gt;What if a node fails? How do you manage traffic and handle request peaks?&lt;/em&gt; For a simple website, this might not be a problem, but for a big company, this is an everyday challenge.&lt;br&gt;&lt;br&gt;
Kubernetes makes it easy to scale up or down based on how many people are using an app. This ensures everything runs smoothly, even during busy times. Think of Kubernetes as a conductor for your applications!&lt;/p&gt;

&lt;p&gt;Kubernetes also supports horizontal and vertical scaling, allowing applications to handle increased traffic and workload demands efficiently. By adjusting the number of running instances or the resources allocated to each instance, Kubernetes ensures that applications can scale up or down seamlessly, thereby enhancing performance and reliability.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Horizontal scaling&lt;/th&gt;
&lt;th&gt;Vertical scaling&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Aim&lt;/td&gt;
&lt;td&gt;Increasing/decreasing the number of machines&lt;/td&gt;
&lt;td&gt;Adjusting the CPU memory on existing machine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best Use In&lt;/td&gt;
&lt;td&gt;stateless applications&lt;/td&gt;
&lt;td&gt;stateful applications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Limited to maximum resources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fault tolerance&lt;/td&gt;
&lt;td&gt;Higher, one fault doesn't effect other&lt;/td&gt;
&lt;td&gt;lower, one fault can effect other&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cost&lt;/td&gt;
&lt;td&gt;Can be cost-effective&lt;/td&gt;
&lt;td&gt;Can lead to higher costs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Table 1: Examples of horizontal and vertical scaling&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🤸‍♀️ Adapts to Changing Needs (Flexibility)
&lt;/h3&gt;

&lt;p&gt;Kubernetes let companies quickly deploy new features or make updates. It also works with multiple cloud services, so businesses can use the best tools for their needs without being locked into one provider.&lt;br&gt;
The Kubernetes community has developed several strategies and best practices to tackle challenges related to scalability and high availability. These include using multi-replica deployments, configuring readiness and liveness probes, implementing Pod Disruption Budgets, and utilizing node affinity and anti-affinity rules. These strategies help ensure that services remain operational and accessible even during node maintenance or failures. For example, Spotify and Airbnb benefit from these HA strategies by maintaining continuous service availability despite underlying infrastructure changes or failures.&lt;/p&gt;

&lt;h3&gt;
  
  
  💵 Cost Efficiency Through Automation
&lt;/h3&gt;

&lt;p&gt;Imagine this: You and your team have successfully proposed and worked on a new feature and the Head of Software Engineering has approved it. &lt;br&gt;
&lt;em&gt;What could go wrong?&lt;/em&gt; A hidden bug resulting in downtime! Downtime can be costly for your application leading to a bad user experience, a damaged reputation, and a loss of profit.&lt;br&gt;&lt;br&gt;
Kubernetes helps an application remain accessible with minimal interruptions. By efficiently managing resources, Kubernetes helps reduce costs. Companies only use what they need, avoiding wasted computing power.&lt;/p&gt;

&lt;h3&gt;
  
  
  🥳 Ensuring High Availability with Kubernetes
&lt;/h3&gt;

&lt;p&gt;Kubernetes plays a critical role in enhancing the high availability and reliability of microservices. It offers a powerful framework for building highly available applications by running multiple replicas of containers and managing them through controllers like ReplicaSets and Deployments. These controllers ensure that the desired number of replicas is always running while maintaining service availability even during failures. The Kubernetes community has developed several strategies and best practices to tackle challenges related to scalability and high availability. These include using multi-replica deployments, configuring readiness and liveness probes, implementing Pod Disruption Budgets, and utilizing node affinity and anti-affinity rules. These strategies help ensure that services remain operational and accessible even during node maintenance or failures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open-Source 🧑‍💻
&lt;/h3&gt;

&lt;p&gt;With over 120k+ commits, 112k stars, and a community of over 7k developers, Kubernetes is the second-largest project on GitHub. Its vast and active community ensures continuous development, with regular updates and continuous monitoring from contributors worldwide. This collaborative effort not only accelerates innovation but also ensures the platform remains secure, scalable, and adaptable to evolving industry needs. The growing ecosystem around Kubernetes, which includes many plugins, tools, and integrations, showcases its importance in today's technology landscape.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧑‍💻 Success Stories: How Top Companies Use Kubernetes
&lt;/h2&gt;

&lt;p&gt;Big names like Airbnb and Spotify use Kubernetes to keep their services running smoothly and to handle millions of users. They’ve seen better performance and faster updates, helping them stay ahead of competitors.&lt;/p&gt;

&lt;h3&gt;
  
  
  🏩 Airbnb: From Monolith to Microservices
&lt;/h3&gt;

&lt;p&gt;Initially, Airbnb operated on a &lt;a href="https://rubyonrails.org/" rel="noopener noreferrer"&gt;Ruby on Rails&lt;/a&gt; monolith known as Monorail. However, as the company grew, this monolithic architecture became a bottleneck, leading to dependency issues and operational inefficiencies. To address these challenges, Airbnb began migrating to a service-oriented architecture &lt;a href="https://dev.to/cortexflow/mastering-essential-software-architecture-patterns-a-comprehensive-guide-part-3-50o9"&gt;SOA&lt;/a&gt; in 2018, which helped in managing dependencies more effectively and enhancing scalability&lt;br&gt;
Airbnb leverages Kubernetes to efficiently manage its cloud infrastructure and handle the daily fluctuations in traffic.&lt;br&gt;
Airbnb has transitioned almost all of its online services from manually orchestrated AWS EC2 instances to Kubernetes, significantly enhancing its operational efficiency.&lt;/p&gt;

&lt;p&gt;Airbnb's infrastructure comprises thousands of nodes spread across nearly a hundred Kubernetes clusters 😲. The Kubernetes Cluster Autoscaler plays a crucial role in dynamically adjusting the size of these clusters based on current demand. This dynamic scaling ensures that Airbnb can handle peak travel seasons without unnecessary overspending during off-peak times. &lt;/p&gt;

&lt;h3&gt;
  
  
  🎵 Spotify: Scaling Music Streaming with Kubernetes:
&lt;/h3&gt;

&lt;p&gt;Spotify was an early adopter of microservices and Docker, deploying containerized microservices across its fleet of virtual machines (VMs) with a homegrown container orchestration system called Helios. However, by late 2017, it became apparent that a small team managing Helios was less efficient compared to adopting a solution supported by a larger community. Recognizing the potential benefits of Kubernetes, Spotify decided to migrate to this open-source container orchestration platform. Jai Chakrabarti, Director of Engineering, Infrastructure and Operations at Spotify, noted that Kubernetes not only complemented Helios but eventually replaced it due to its feature richness and robust community support. This migration allowed Spotify to handle its rapidly growing infrastructure more effectively, automate deployments, and ensure high availability across different regions.&lt;/p&gt;

&lt;p&gt;One of the significant challenges Spotify faced before adopting Kubernetes was managing the scalability strain during major music events, album releases, or viral song trends. Manually scaling resources to handle traffic surges was slow and often led to service disruptions. Kubernetes provided a solution by enabling Spotify to automate resource scaling and improve resource utilization, ensuring a seamless user experience even during peak demand periods.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚛️ CERN: Managing Big Data with Kubernetes:
&lt;/h3&gt;

&lt;p&gt;The European Organization for Nuclear Research is a great example of big data and high-demanding infrastructure. Currently, CERN stores over 500 petabytes (1PB = 1000 TB) of data and the number is expected to increase to 5,000 PB with future upgrades to its accelerators. To put it into perspective, nowadays, common computers use a typical 1TB hard disk to store data, if we stacked 5,000,000 1TB hard drives on top of each other, the stack would be 130 kilometers high 😮. This is an extreme example but is useful to help us visualize the magnitude of the problem.&lt;/p&gt;

&lt;p&gt;To address the challenges of data storage, processing, and scalability, CERN has increasingly turned to Kubernetes. It has enabled CERN to handle its extreme data workload peaks, particularly during periods leading up to major conferences. The organization is looking towards a more hybrid infrastructure, leveraging both on-premises resources and public cloud services to meet these demands efficiently.&lt;/p&gt;

&lt;p&gt;The transition to Kubernetes was also driven by the need for scalable infrastructure to support Continuous Integration and Continuous Delivery (CI/CD) workflows. The traditional Docker-based solution became obsolete, prompting CERN to adopt Kubernetes Runners, which provide a more flexible and scalable environment for GitLab CI/CD pipelines.&lt;/p&gt;

&lt;p&gt;Furthermore, the application of Kubernetes extends to the efficient utilization of GPU resources for machine learning tasks. CERN's Large Hadron Collider (LHC) generates billions of particle collisions per second, resulting in hundreds of petabytes of data that need to be reconstructed and analyzed.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Conclusions
&lt;/h2&gt;

&lt;p&gt;Kubernetes has transformed modern IT by simplifying app management, enabling scalability, and optimizing resources. Its adoption by companies like Airbnb, Spotify, and CERN highlights its value in handling complex infrastructures and ensuring high availability.&lt;/p&gt;

&lt;p&gt;In the next episode, I'll dive into how Kubernetes infrastructure works.&lt;/p&gt;

&lt;p&gt;Thank you for reading! 🙏&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>learning</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
