<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>metal-stack.io Blog</title>
        <link>https://metal-stack.io/blog</link>
        <description>metal-stack.io Blog</description>
        <lastBuildDate>Tue, 10 Mar 2026 08:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Support for Dell Servers]]></title>
            <link>https://metal-stack.io/blog/2026/03-dell-support</link>
            <guid>https://metal-stack.io/blog/2026/03-dell-support</guid>
            <pubDate>Tue, 10 Mar 2026 08:00:00 GMT</pubDate>
            <description><![CDATA[With release v0.22.6, metal-stack now supports Dell server hardware.]]></description>
            <content:encoded><![CDATA[<p>With release v0.22.6, we are pleased to announce that <a href="http://metal-stack.io/" target="_blank" rel="noopener noreferrer" class="">metal-stack.io</a> has been officially tested and validated to run on Dell server hardware.</p>
<p>This milestone continues a journey we started last year when we <a class="" href="https://metal-stack.io/blog/2025/12-ocp-hardware">introduced</a> support for an additional hardware vendor. With Dell adding to the list of supported hardware, metal-stack takes another step toward broader hardware compatibility — giving users greater flexibility when setting up bare-metal private cloud environments and reducing dependency on any single vendor.</p>
<p>The testing process validated the operation of metal-stack.io on Dell servers, confirming its readiness for enterprise-grade deployments.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vendor-agnostic-serial-console-access">Vendor-Agnostic Serial Console Access<a href="https://metal-stack.io/blog/2026/03-dell-support#vendor-agnostic-serial-console-access" class="hash-link" aria-label="Direct link to Vendor-Agnostic Serial Console Access" title="Direct link to Vendor-Agnostic Serial Console Access" translate="no">​</a></h2>
<p>Alongside Dell support, our pixiecore component was improved: it can now detect the server manufacturer during the boot process. As a result, the serial console is now available for maintenance tasks across all machines in your partition, regardless of vendor — something that was not possible before this release.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-information">More Information<a href="https://metal-stack.io/blog/2026/03-dell-support#more-information" class="hash-link" aria-label="Direct link to More Information" title="Direct link to More Information" translate="no">​</a></h2>
<p>You want to know more about everything that landed in this release? Check out the full <a href="https://github.com/metal-stack/releases/releases/tag/v0.22.6" target="_blank" rel="noopener noreferrer" class="">release notes</a>.</p>]]></content:encoded>
            <category>News</category>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[The smallest installation of metal-stack]]></title>
            <link>https://metal-stack.io/blog/2026/03-mini-rack</link>
            <guid>https://metal-stack.io/blog/2026/03-mini-rack</guid>
            <pubDate>Wed, 18 Feb 2026 08:00:00 GMT</pubDate>
            <description><![CDATA[After finally finishing my bachelor-thesis on this topic, I'd like to give you some insights on how we built a functional metal-stack installation in a 10-inch mini-rack]]></description>
            <content:encoded><![CDATA[<p>During my time as working student at <a href="https://www.f-i-ts.de/" target="_blank" rel="noopener noreferrer" class="">Finanz Informatik Technologie Service (FI-TS)</a>, I ended up at the team operating the Finance Cloud Native. That is a Kubernetes-platform with around 1700 Machines and over 100 clusters for our customers in the financial industry in Germany, which is based on a metal-stack/Gardener setup. Actually it is the reason why the development of metal-stack was initially started. As I immediately got hooked by this sovereign cloud, I wanted to write my bachelor thesis about it in order to learn more about the underlying concepts of the architecture.</p>
<p>And luckily there was the perfect opportunity, as we now start to migrate our control-plane from the public-cloud to our own data-center. In the last 5-6 months I analyzed the concepts on autonomous control-planes presented in <a href="https://metal-stack.io/docs/v0.22.2/MEP-18-autonomous-control-plane" target="_blank" rel="noopener noreferrer" class="">MEP-18</a>, built up a minimal prototype of it in a mini-rack and even did some failure scenarios to test my theories. So in this article I want to provide you some details on the hard- and software we used to build the mini-rack and the results I found in my thesis.</p>
<p>But first of all I need to say a big "Thank you!" to the whole team at FI-TS for supporting me during this journey, especially to <a href="https://github.com/Honigeintopf" target="_blank" rel="noopener noreferrer" class="">@honigeintopf</a>, who helped me a lot building up the mini-rack, and to my supervisor at <a href="https://hm.edu/" target="_blank" rel="noopener noreferrer" class="">Hochschule München</a> for accepting the thesis and giving scientific advice on how to write it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="as-always-bare-metal">As always: bare metal<a href="https://metal-stack.io/blog/2026/03-mini-rack#as-always-bare-metal" class="hash-link" aria-label="Direct link to As always: bare metal" title="Direct link to As always: bare metal" translate="no">​</a></h2>
<p>At first we had to find some hardware, which is physically small enough to fit into our 10-inch-rack but at the same time functional enough to host a complete metal-stack/Gardener-Setup including the Control-Planes and a Partition with Shoot-Clusters.
Inspired by <a href="https://github.com/geerlingguy/mini-rack" target="_blank" rel="noopener noreferrer" class="">Jeff Geerlings mini-rack guide</a> we bought the following devices:</p>
<ul>
<li class="">GeeekPi / DeskPi RackMate T1</li>
<li class="">1x Teltonika RUTX10 - Wireless Router 4-Port-Switch</li>
<li class="">3x CWWK Mini PC N150 (Upgraded N100) Firewall Appliance</li>
<li class="">5x Beelink EQR6 Mini PC</li>
<li class="">GL.iNet KVM Remote Control via the Internet</li>
<li class="">AIMOS HDMI KVM Switch, 8 In 1 Out</li>
</ul>
<p>The router is used to provide internet access for the whole rack through Wifi and is also our endpoint for tailscale to access the rack from remote. With the CWWKs having six ethernet ports we can use them to simulate the CLOS-architecture of the switches. So we had one spine-switch connected to the router and each of the leaf-switches. The leaf-switches are linked with four of the Beelinks, which are the machines managed by metal-stack. The remaining Beelink is used for an initial k3s-cluster, that is hosting the control-planes of metal-stack and Gardener. The KVM devices are used to remotely access the console of the machines.</p>
<p><img decoding="async" loading="lazy" src="https://metal-stack.io/assets/images/mini-rack-c6b2b8ccf6d523f6a6ba0c5590087f60.jpg" width="1200" height="1600" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="deploying-the-stack">Deploying the stack<a href="https://metal-stack.io/blog/2026/03-mini-rack#deploying-the-stack" class="hash-link" aria-label="Direct link to Deploying the stack" title="Direct link to Deploying the stack" translate="no">​</a></h2>
<p>Next we brought the system to life by deploying our software on it. The initial k3s-cluster could be easily started with the Ansible roles provided by the k3s-project. For the control-planes we were able to re-use the mini-lab playbooks.</p>
<p>The biggest challenge was to set up the whole network infrastructure. As the metal-core running on the leaf-switches is dependent on the SONiC operating system, we had to somehow get SONiC on those CWWK machines. We solved this problem by installing a virtual machine and mapping all of the physical ports into that VM.</p>
<p>As we do not have a dedicated management network and servers, we also had to dually attach the leaves to the spine and the spine to the router: one cable for the management-address provided by a dhcp-server and one cable for the BGP-network. On top of that underlay BGP we have the standard overlay routing with Vxlan and VRFs.</p>
<p>The machines and switches could then reach the control-planes and communicate with it using self-signed certificates. For the PXE-Booting process of the machines we had to install another dhcp-server and the pixiecore on one of the leaves. As the machines do not have a BMC we weren't able to do the lifecycle management with metal-stack, but luckily they have a nice little Power-Button on the front and can be PXE-booted again.</p>
<p>The four machines were used to install two shoot-clusters with Gardener, each with one firewall and one worker-node. The DNS-entries of the clusters are provided by PowerDNS. As described in the "Matryoshka principle" in MEP-18 we then installed another metal-stack- and Gardener-Control-Plane in these two clusters. In a real setup these two would be used to manage the productive partition and clusters, which we do not have in the mini-rack.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="everything-failed-">Everything failed ...<a href="https://metal-stack.io/blog/2026/03-mini-rack#everything-failed-" class="hash-link" aria-label="Direct link to Everything failed ..." title="Direct link to Everything failed ..." translate="no">​</a></h2>
<p>With that the first question of my thesis was answered: Building an autonomous control-plane the way it is described in MEP-18 is a very good solution for our bootstrapping-problem regarding automation and low complexity for the operators. But the second question is still open: What consequences do specific failure scenarios have and how can we return back to normal operation? That's why I did three different failure scenarios on the mini-rack. First I deleted only the k3s-cluster, then only the worker-nodes of the shoots and lastly all five Beelinks at once.</p>
<p>The short-term consequences of the outage were just as expected. When the k3s-cluster fails, there is no direct impact on the productive control-planes.
But the automatic restore-process with the backup-restore-mechanisms of metal-stack and Gardener made some trouble. Because sometimes there was made a new backup instead of restoring an old one. In these case it is important that you have more than just one backup version in your S3-Storage to restore it manually.</p>
<p>And of course this S3-Storage must still be placed on external infrastructure in the public cloud since we do not want to have the backup in the same data-center as the running control-plane. And also we do not have S3-Storage outside of the Finance Cloud Native. So the backup itself would be dependent on the control-planes, if we placed it there.</p>]]></content:encoded>
            <category>Infrastructure</category>
            <category>Architecture</category>
            <category>Gardener</category>
        </item>
        <item>
            <title><![CDATA[Looking back at FOSDEM 2026]]></title>
            <link>https://metal-stack.io/blog/2026/02-fosdem-recap</link>
            <guid>https://metal-stack.io/blog/2026/02-fosdem-recap</guid>
            <pubDate>Tue, 03 Feb 2026 09:00:00 GMT</pubDate>
            <description><![CDATA[What an event! Please read the recap on this year's visit of the biggest Open Source conference we have in Europe.]]></description>
            <content:encoded><![CDATA[<p>First and foremost, I would like to say that, once again, this year's journey to Brussels was an absolute bliss. Talking to this number of people in such a short period of time is truly overwhelming. It brings you in touch with the open-source community in a way that would never seem possible through the internet. And it makes us thankful to be able to reach out to you in this place.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-smallest-functional-metal-stack-installation">The "smallest functional metal-stack installation"<a href="https://metal-stack.io/blog/2026/02-fosdem-recap#the-smallest-functional-metal-stack-installation" class="hash-link" aria-label="Direct link to The &quot;smallest functional metal-stack installation&quot;" title="Direct link to The &quot;smallest functional metal-stack installation&quot;" translate="no">​</a></h2>
<p>The DIY-rack that <a href="https://github.com/qrnvttrl" target="_blank" rel="noopener noreferrer" class="">@qrnvttrl</a> brought to our stand in Brussels was an absolute eye-catcher. It was built for his bachelor thesis at <a href="https://www.f-i-ts.de/" target="_blank" rel="noopener noreferrer" class="">FI-TS</a> and is such a good starting point for conversations. It allowed us to show data center technology in a very compact, functional format for the first time. Quirin even offered to write a blog article about it to provide some background information on how it came into existence and what parts were used to build it. I guess a lot of people wanted to know it in more detail, so keep an eye on the blog to find out soon.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="we-have-a-gui">We have a GUI?<a href="https://metal-stack.io/blog/2026/02-fosdem-recap#we-have-a-gui" class="hash-link" aria-label="Direct link to We have a GUI?" title="Direct link to We have a GUI?" translate="no">​</a></h2>
<p>With the <a href="https://github.com/metal-stack/metal-ui" target="_blank" rel="noopener noreferrer" class="">metal-ui</a> that <a href="https://github.com/ostempel" target="_blank" rel="noopener noreferrer" class="">@ostempel</a> implemented specifically for the FOSDEM, it became so much easier to show the possibilities of our new V2 API (as described in <a href="https://metal-stack.io/docs/next/MEP-4-multi-tenancy-for-the-metal-api" target="_blank" rel="noopener noreferrer" class="">MEP-4</a>). Thanks Oliver for bringing this shiny little thing to our stand and showing it to people! In my opinion we should invest more time into it, give people a chance to contribute to the repository in case they see a need for managing metal-stack not only through CLI but also through a desktop application.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="people-noticeably-shifting-to-sovereign-infrastructure">People noticeably shifting to sovereign infrastructure<a href="https://metal-stack.io/blog/2026/02-fosdem-recap#people-noticeably-shifting-to-sovereign-infrastructure" class="hash-link" aria-label="Direct link to People noticeably shifting to sovereign infrastructure" title="Direct link to People noticeably shifting to sovereign infrastructure" translate="no">​</a></h2>
<p>From speaking to so many people, it became even more apparent than last year, that the current political world situation forces many deciders and engineers to explore sovereign infrastructure technology. The times are definitely over when we are asked why one should not just move all the workload to the cloud. Almost everybody had an understanding by now of what chances are in there for Europe to define our version of data and cloud sovereignty. We would be more than happy if we can give back something to you with the metal-stack project on your journey to modern data center infrastructure. It was really incredible that so many of you actively approached us and just wanted to talk and know more about what we do.</p>
<p>Another thanks go out to the organizers of the event and all the people who made the conference possible. It's a safe space for everyone who attends, and you can just be who you are. We appreciate this a lot. During a perfect Belgian beer this weekend, the following sentence was said (not sure if I am allowed to say who said it, but it was great): Computer science is a treasure of our planet that represents what we're able to achieve. It's collective intellectual property and everybody can contribute to that. Openly and without fear. 🍻</p>
<p><img decoding="async" loading="lazy" src="https://metal-stack.io/assets/images/fosdem_2026-8f206e6077167c4a6c75e55412700d71.jpg" width="2632" height="1974" class="img_ev3q"></p>
<blockquote>
<p>Before the tide comes in.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="frequently-asked-questions">Frequently Asked Questions<a href="https://metal-stack.io/blog/2026/02-fosdem-recap#frequently-asked-questions" class="hash-link" aria-label="Direct link to Frequently Asked Questions" title="Direct link to Frequently Asked Questions" translate="no">​</a></h2>
<p>To round up this blog article, I would like to include some of the most common questions we heard at the conference. In many respects, we never really covered them anywhere on the web, so I guess it's a good moment to answer them here. Of course, you can also ask again if we meet one day. 😛</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="does-this-run-on-raspberry-pi"><strong>Does this run on Raspberry Pi?</strong><a href="https://metal-stack.io/blog/2026/02-fosdem-recap#does-this-run-on-raspberry-pi" class="hash-link" aria-label="Direct link to does-this-run-on-raspberry-pi" title="Direct link to does-this-run-on-raspberry-pi" translate="no">​</a></h3>
<p>Unfortunately, we do not release many ARM64 artifacts by now. Depending on which parts you want to run on a Raspberry Pi it would mean to add the build to all our repositories, which in our opinion burns quite a lot of resources without having an idea what should be done with it. If there's a more serious need to release artifacts for certain platforms, we are more than happy to add it to our CI. Please reach out to us, if you need it. ARM64 artifacts are specifically built already for <a href="https://github.com/metal-stack/csi-driver-lvm" target="_blank" rel="noopener noreferrer" class="">csi-driver-lvm</a> or <a href="https://github.com/metal-stack/metalctl" target="_blank" rel="noopener noreferrer" class="">metalctl</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="can-i-install-this-in-my-home-lab"><strong>Can I install this in my home lab?</strong><a href="https://metal-stack.io/blog/2026/02-fosdem-recap#can-i-install-this-in-my-home-lab" class="hash-link" aria-label="Direct link to can-i-install-this-in-my-home-lab" title="Direct link to can-i-install-this-in-my-home-lab" translate="no">​</a></h3>
<p>Theoretically, yes. Theoretically, you can do a lot of things. 🤓</p>
<p>metal-stack is definitely classified as data center technology and installing this at home is kind of overkill. The bigger your environment gets, the more value you can get from metal-stack. It enables a small team of just a few people to manage thousands of servers. Maybe consider the company you work for to use metal-stack, as it fits their needs more likely than at home.</p>
<p>However, for educational purposes, like learning about networking, booting Linux, switches and so on, metal-stack might be a perfect playground for that. Specifically, <a href="https://containerlab.dev/" target="_blank" rel="noopener noreferrer" class="">containerlab</a> turned out to be a really cool project to test out ideas regarding network topologies and using BGP in the data center. This is used in our virtual lab, called the <a href="https://github.com/metal-stack/mini-lab" target="_blank" rel="noopener noreferrer" class="">mini-lab</a>, too.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-did-you-start"><strong>When did you start?</strong><a href="https://metal-stack.io/blog/2026/02-fosdem-recap#when-did-you-start" class="hash-link" aria-label="Direct link to when-did-you-start" title="Direct link to when-did-you-start" translate="no">​</a></h3>
<p>We started in 2018 with metal-stack and went into production with the software in 2020. Today, we manage more than 2000 servers with metal-stack, and we do not see any particular bottlenecks yet. Through the years, we are quite confident to say you can use it for production.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="but-if-youre-open-source-how-do-you-make-money-with-this-do-you-offer-support-for-this"><strong>But if you're open source, how do you make money with this? Do you offer support for this?</strong><a href="https://metal-stack.io/blog/2026/02-fosdem-recap#but-if-youre-open-source-how-do-you-make-money-with-this-do-you-offer-support-for-this" class="hash-link" aria-label="Direct link to but-if-youre-open-source-how-do-you-make-money-with-this-do-you-offer-support-for-this" title="Direct link to but-if-youre-open-source-how-do-you-make-money-with-this-do-you-offer-support-for-this" translate="no">​</a></h3>
<p>As we are a consulting company, Yes, we do offer support for metal-stack! We can help you to plan, support and operate Kubernetes as a Service on Bare Metal in your own data center and also have experts on digital transformation regarding other topics. If you need more information on who we are, check out <a href="https://x-cellent.com/" target="_blank" rel="noopener noreferrer" class="">https://x-cellent.com/</a>.</p>
<p>Also keep in mind we have a hosted version of metal-stack that is named <a href="https://metalstack.cloud/" target="_blank" rel="noopener noreferrer" class="">metalstack.cloud</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-sets-your-solution-apart-from-similar-projects-like-openstack-ironic-or-ubuntu-maas"><strong>What sets your solution apart from similar projects like OpenStack Ironic or Ubuntu MaaS?</strong><a href="https://metal-stack.io/blog/2026/02-fosdem-recap#what-sets-your-solution-apart-from-similar-projects-like-openstack-ironic-or-ubuntu-maas" class="hash-link" aria-label="Direct link to what-sets-your-solution-apart-from-similar-projects-like-openstack-ironic-or-ubuntu-maas" title="Direct link to what-sets-your-solution-apart-from-similar-projects-like-openstack-ironic-or-ubuntu-maas" translate="no">​</a></h3>
<p>When we built metal-stack we wanted to make it a driver for Kubernetes as a Service in an on-premise data center. For this reason, we are more opinionated on certain topics than other projects. For example:</p>
<ul>
<li class=""><strong>Networking</strong>: The network is part of the solution of metal-stack. We require BGP in the data center and a switch that can run <a href="https://github.com/metal-stack/metal-core" target="_blank" rel="noopener noreferrer" class="">metal-core</a> to dynamically apply port reconfiguration during machine allocation. With this, we can lower operational overhead, run <a href="https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/" target="_blank" rel="noopener noreferrer" class="">Kubernetes CNIs</a> with native routing (i.e. without overlay networks), provide services of type <code>LoadBalancer</code> with <a href="https://metallb.io/" target="_blank" rel="noopener noreferrer" class="">MetalLB</a> and achieve efficient routing even in case of failover.</li>
<li class=""><strong>Firewalls</strong>: We did not want to see any more big external firewalls that hold a complex state. This is why firewalls are an essential part of our infrastructure that can be managed by the <a href="https://github.com/metal-stack/firewall-controller" target="_blank" rel="noopener noreferrer" class="">firewall-controller</a> through Kubernetes resources. This brings firewall rules as close as they get to the applications that require them and are automatically cleaned up when, for instance, the service resource does not exist anymore.</li>
<li class=""><strong>Slim and Fast</strong>: Kubernetes needs to be able to scale quickly, and we wanted the provisioning process to be really quick. The provisioning time of a machine (depending on the vendor) can take only a minute. We wrote everything in Go in an API-driven manner such that users can easily access services without requiring manual interaction from operators.</li>
<li class=""><strong>Runs on K8s but also without</strong>: We want metal-stack to not rely on Kubernetes per se. We have an imperative REST (soon only gRPC) API that does not require the Kubernetes API to operate. To us, this provides us the best of two worlds: Staying open to future platforms (because we're not locked into Kubernetes) while utilizing effective infrastructure under the hood to run the control plane.</li>
</ul>]]></content:encoded>
            <category>News</category>
            <category>Events</category>
        </item>
        <item>
            <title><![CDATA[metal-stack.io is at FOSDEM 2026!]]></title>
            <link>https://metal-stack.io/blog/2026/01-fosdem</link>
            <guid>https://metal-stack.io/blog/2026/01-fosdem</guid>
            <pubDate>Wed, 07 Jan 2026 08:00:00 GMT</pubDate>
            <description><![CDATA[We are thrilled to announce a stand at FOSDEM 2026 in Brussels again.]]></description>
            <content:encoded><![CDATA[<p>It's a great honor for us that we were accepted a stand at the FOSDEM 2026 again.</p>
<p>The conference brings together thousands of developers and enthusiasts to talk, learn and collaborate.</p>
<p>It will take place on the weekend from January 31st to February 1st. Entrance is free for everyone.</p>
<p>This year the stand will be located in the K-Building (K1-B-08). We're looking forward to meet you again soon. 😊</p>]]></content:encoded>
            <category>News</category>
            <category>Events</category>
        </item>
        <item>
            <title><![CDATA[Gardener Hackathon Winter 2025 Highlights]]></title>
            <link>https://metal-stack.io/blog/2025/12-blog-article-for-gardener-hackathon</link>
            <guid>https://metal-stack.io/blog/2025/12-blog-article-for-gardener-hackathon</guid>
            <pubDate>Mon, 08 Dec 2025 08:00:00 GMT</pubDate>
            <description><![CDATA[27 people joined the winter Gardener Hackathon, pushing MEP-18 gardenadm work, Gateway API migration plans, and scale tests forward.]]></description>
            <content:encoded><![CDATA[<p>This winter's Hack the Garden ended up being our biggest gathering yet. Twenty-seven contributors squeezed into our temporary headquarters, making it the most crowded (and productive) hackathon we have ever organized. That headcount translated directly into output: we closed long-standing issues, revived ambitious ideas, and compared notes late into the night. If you are looking for the complete list of tracks, check out the official <a href="https://gardener.cloud/community/hackathons/2025-11/" target="_blank" rel="noopener noreferrer" class="">Gardener Hackathon recap</a>, but here are my highlights.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="venue-and-mood-snapshot">Venue and Mood Snapshot<a href="https://metal-stack.io/blog/2025/12-blog-article-for-gardener-hackathon#venue-and-mood-snapshot" class="hash-link" aria-label="Direct link to Venue and Mood Snapshot" title="Direct link to Venue and Mood Snapshot" translate="no">​</a></h2>
<p>The house was filled to the brim with 27 engineers from different companies and backgrounds—almost twice as many as the early days of the hackathon. That energy was palpable from breakfast to the late-night laptop sessions. We still followed the “everyone cooks, everyone cleans” rule, but this time the kitchen was more of a welcome distraction than another meeting room. Getting a break from terminals while chopping vegetables together was honestly one of my favorite parts of the week.</p>
<p><img decoding="async" loading="lazy" alt="Hackathon team standing in front of Blautopf" src="https://metal-stack.io/assets/images/group-photo-69ae22959a467e1f05378234d925f38c.jpg" width="2766" height="1718" class="img_ev3q"></p>







<table><thead><tr><th><img decoding="async" loading="lazy" alt="Participants cooking together in the kitchen" src="https://metal-stack.io/assets/images/kitchen-collab-2c0eaa34c8bb27497483723a29ecc845.jpg" width="1536" height="2048" class="img_ev3q"></th><th><img decoding="async" loading="lazy" alt="Desk covered in laptops and monitors" src="https://metal-stack.io/assets/images/desk-setup-1f6dd6f6f5c7f7dbd9793c51e92a9884.jpg" width="1536" height="2048" class="img_ev3q"></th></tr></thead></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="track-overview">Track Overview<a href="https://metal-stack.io/blog/2025/12-blog-article-for-gardener-hackathon#track-overview" class="hash-link" aria-label="Direct link to Track Overview" title="Direct link to Track Overview" translate="no">​</a></h2>
<p>With so many people on-site we divided into multiple tracks. The recap page lists everything, but a few threads stood out to me.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="autonomous-control-plane-and-gardenadm">Autonomous Control Plane and gardenadm<a href="https://metal-stack.io/blog/2025/12-blog-article-for-gardener-hackathon#autonomous-control-plane-and-gardenadm" class="hash-link" aria-label="Direct link to Autonomous Control Plane and gardenadm" title="Direct link to Autonomous Control Plane and gardenadm" translate="no">​</a></h3>
<p>I'm knee-deep in <a href="https://docs.metal-stack.io/stable/contributing/04-Proposals/MEP18/README/" target="_blank" rel="noopener noreferrer" class="">MEP-18</a> at the moment, so I gravitated toward the <code>gardenadm</code> workstream even though it wasn't the main hackathon theme. The Gardener team pushed the tool to roughly 95% completion, ironing out installation flows and HA concerns so that bootstrapping an autonomous Gardener control plane finally feels repeatable. A handful of annoyingly small bugs are still blocking day-to-day usage, yet the remaining work is well understood and in flight.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="networking-modernization">Networking Modernization<a href="https://metal-stack.io/blog/2025/12-blog-article-for-gardener-hackathon#networking-modernization" class="hash-link" aria-label="Direct link to Networking Modernization" title="Direct link to Networking Modernization" translate="no">​</a></h3>
<p>Around the middle of the week we mapped the migration path from legacy Ingress definitions to the Gateway API. Having everyone around in person helped us compare production experiences and validate the analysis with folks maintaining multi-cluster setups. The outcome is a clear plan for introducing the Gateway API gradually without shocking existing landscapes, plus a backlog of prototype PRs that we can continue remotely.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="reliability--scale-testing">Reliability &amp; Scale Testing<a href="https://metal-stack.io/blog/2025/12-blog-article-for-gardener-hackathon#reliability--scale-testing" class="hash-link" aria-label="Direct link to Reliability &amp; Scale Testing" title="Direct link to Reliability &amp; Scale Testing" translate="no">​</a></h3>
<p>Another team stress-tested Gardener to understand how many seeds and shoots a realistic deployment can host before hitting bottlenecks. These scale-out experiments surfaced valuable data for capacity planning and gave us confidence about the limits before we need to add more control planes or tune etcd. It's one thing to assume Gardener will grow with our needs; it's much better to measure it together.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="community-takeaways">Community Takeaways<a href="https://metal-stack.io/blog/2025/12-blog-article-for-gardener-hackathon#community-takeaways" class="hash-link" aria-label="Direct link to Community Takeaways" title="Direct link to Community Takeaways" translate="no">​</a></h2>
<p>Personally, I learned a ton by pairing with people I usually only see in issue trackers. The cross-company collaboration was excellent—everyone brought their perspective, whether they were touching networking, control planes, or documentation. Watching first-timers blend in so quickly, and seeing how much the event has grown compared to previous years, makes me even more excited for the next one.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="call-to-action">Call to Action<a href="https://metal-stack.io/blog/2025/12-blog-article-for-gardener-hackathon#call-to-action" class="hash-link" aria-label="Direct link to Call to Action" title="Direct link to Call to Action" translate="no">​</a></h2>
<p>If this sounds like a week you would enjoy, join the Gardener Slack, follow the hackathon announcements, and bring your ideas next time. The momentum is real—each event gets bigger, kinder, and more impactful, and we would love to build the next chapter with you.</p>]]></content:encoded>
            <category>Hackathon</category>
            <category>Gardener</category>
            <category>Kubernetes</category>
            <category>Events</category>
        </item>
        <item>
            <title><![CDATA[Support for Gigabyte OCP Open Rack Line Servers]]></title>
            <link>https://metal-stack.io/blog/2025/12-ocp-hardware</link>
            <guid>https://metal-stack.io/blog/2025/12-ocp-hardware</guid>
            <pubDate>Wed, 29 Oct 2025 09:00:00 GMT</pubDate>
            <description><![CDATA[metal-stack now supports Gigabyte OCP Open Rack line servers.]]></description>
            <content:encoded><![CDATA[<p>With release v0.21.10, metal-stack now fully supports Gigabyte OCP Open Rack line servers, marking another step toward broader Open Compute Project (OCP) integration.</p>
<p>This update extends metal-stack's open infrastructure capabilities from OCP-based network switches to server hardware, enabling:</p>
<ul>
<li class="">Seamless provisioning and lifecycle management of OCP Open Rack line systems</li>
<li class="">Improved scalability for data center environments</li>
<li class="">Standardized, energy-efficient hardware integration</li>
</ul>
<p>Release Notes: <a href="https://metal-stack.io/docs/release-notes/v0.21.10" target="_blank" rel="noopener noreferrer" class="">https://metal-stack.io/docs/release-notes/v0.21.10</a></p>
<p>GitHub Release: <a href="https://github.com/metal-stack/releases/releases/tag/v0.21.10" target="_blank" rel="noopener noreferrer" class="">https://github.com/metal-stack/releases/releases/tag/v0.21.10</a></p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[metal-stack v0.22.0 🎃]]></title>
            <link>https://metal-stack.io/blog/2025/11-metal-stack-v0.22.0</link>
            <guid>https://metal-stack.io/blog/2025/11-metal-stack-v0.22.0</guid>
            <pubDate>Tue, 28 Oct 2025 09:00:00 GMT</pubDate>
            <description><![CDATA[This release comes with support for the Gardener Operator and enhanced Cluster API integration tests.]]></description>
            <content:encoded><![CDATA[<p>This release has come a long way, and it's finally here. In this version of metal-stack, we expect all users with an existing Gardener integration to migrate to the Gardener Operator. This blog article briefly describes how this can be done and what other changes are included in this release.</p>
<ul>
<li class=""><a href="https://metal-stack.io/blog/2025/11-metal-stack-v0.22.0#gardener-operator" class="">Gardener Operator</a></li>
<li class=""><a href="https://metal-stack.io/blog/2025/11-metal-stack-v0.22.0#cluster-api-integration" class="">Cluster API Integration</a></li>
<li class=""><a href="https://metal-stack.io/blog/2025/11-metal-stack-v0.22.0#sboms-for-release-artifacts" class="">SBOMs for Release Artifacts</a></li>
<li class=""><a href="https://metal-stack.io/blog/2025/11-metal-stack-v0.22.0#mep-4-in-alpha-stage" class="">MEP-4 in Alpha Stage</a></li>
<li class=""><a href="https://metal-stack.io/blog/2025/11-metal-stack-v0.22.0#improvements-on-sonic-integration" class="">Improvements on SONiC Integration</a></li>
<li class=""><a href="https://metal-stack.io/blog/2025/11-metal-stack-v0.22.0#gardener-ontap-extension" class="">Gardener Ontap Extension</a></li>
<li class=""><a href="https://metal-stack.io/blog/2025/11-metal-stack-v0.22.0#more-information" class="">More Information</a></li>
</ul>
<p>Check out the direct link to the release <a href="https://github.com/metal-stack/releases/releases/tag/v0.22.0" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="gardener-operator">Gardener Operator<a href="https://metal-stack.io/blog/2025/11-metal-stack-v0.22.0#gardener-operator" class="hash-link" aria-label="Direct link to Gardener Operator" title="Direct link to Gardener Operator" translate="no">​</a></h2>
<p>With the introduction of the <a href="https://gardener.cloud/docs/gardener/concepts/operator/" target="_blank" rel="noopener noreferrer" class="">Gardener Operator</a>, the Gardener Project has started to provide a standardized way to deploy and manage Gardener installations for the community. It comes with a lot of beneficial traits allowing high-availability of the Virtual Garden (no downtime during updates anymore), provisioning extensions through OCI artifacts and enforced kubeconfig secret rotation such that there is no static admin kubeconfig anymore, etc.</p>
<p>Historically, metal-stack shipped with an own approach for deploying the Gardener through the <a href="https://github.com/metal-stack/metal-roles" target="_blank" rel="noopener noreferrer" class="">metal-roles</a> based on Ansible. It utilized the upstream helm charts for the Gardener Control Plane and a self-managed Virtual Garden Helm chart (which was based on the garden-setup repository). Luckily, some of these charts are now obsolete, minimizing the maintenance burden, and it's sufficient to rely on a single Helm chart during the deployment: The one that sets up the Gardener Operator. So, we still ship the Ansible roles but with a new set of Ansible roles that are using Gardener Operator resources to install the Gardener.</p>
<p>In general, the migration path that we use is described <a href="https://github.com/metal-stack/metal-roles/tree/v0.17.19/control-plane/roles/gardener-operator#migration-path" target="_blank" rel="noopener noreferrer" class="">here</a>. The idea is to restore the data of the Virtual Garden from the backup, re-registering the existing Gardenlets and migrating the shooted seeds to a new Gardenlet. As the migration of existing production setups can be pretty complex, please reach out to us at our <a href="https://join.slack.com/t/metal-stack/shared_invite/zt-3eqheaymr-obQueWBLOMkhbEWTZZyDRg" target="_blank" rel="noopener noreferrer" class="">Slack Community</a>. We're here to help if necessary.</p>
<p>After this release, we will try to catch up with the most recent Gardener releases again in order to be able to provide K8s 1.33 support soon.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cluster-api-integration">Cluster API Integration<a href="https://metal-stack.io/blog/2025/11-metal-stack-v0.22.0#cluster-api-integration" class="hash-link" aria-label="Direct link to Cluster API Integration" title="Direct link to Cluster API Integration" translate="no">​</a></h2>
<p>Another big aspect of this release are extended integration tests for the <a href="https://github.com/metal-stack/cluster-api-provider-metal-stack" target="_blank" rel="noopener noreferrer" class="">cluster-api-provider-metal-stack</a>. The tests are running in the big integration suite hosted at the FI-TS, ensuring compatibility with our metal-stack components for every release from now on. This makes Cluster API an integral part for providing Kubernetes on metal-stack for users that do not rely on the Gardener integration.</p>
<p>The release adds new OS images on <code>images.metal-stack.io</code> that include expected components for Cluster API bootstrapping like <code>kubeadm</code>.</p>
<p>The tests for the provider are based on the official <a href="https://cluster-api.sigs.k8s.io/developer/core/e2e" target="_blank" rel="noopener noreferrer" class="">e2e framework</a>. For now, they only include cluster creation tests. In the following releases we will work on extending the test cases and we are also planning to run CNCF conformance tests against CAPI clusters, too.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sboms-for-release-artifacts">SBOMs for Release Artifacts<a href="https://metal-stack.io/blog/2025/11-metal-stack-v0.22.0#sboms-for-release-artifacts" class="hash-link" aria-label="Direct link to SBOMs for Release Artifacts" title="Direct link to SBOMs for Release Artifacts" translate="no">​</a></h2>
<p>In order to provide a common basis for identifying software vulnerabilities, all our release artifacts consistently contain an SPDX-formatted software bill of material now. Usually, we embed the SBOM directly into the container artifacts using Buildx. Please note that these SBOMs are also available for the OS images of metal-stack.</p>
<p>Using these artifacts for CVE scanning can be done pretty easily. Please find examples for this in our documentation on <a href="https://metal-stack.io/docs/sbom" target="_blank" rel="noopener noreferrer" class="">metal-stack.io/docs</a>.</p>
<p>This task was mainly driven by <a href="https://github.com/mac641" target="_blank" rel="noopener noreferrer" class="">@mac641</a>. Kudos to him!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="mep-4-in-alpha-stage">MEP-4 in Alpha Stage<a href="https://metal-stack.io/blog/2025/11-metal-stack-v0.22.0#mep-4-in-alpha-stage" class="hash-link" aria-label="Direct link to MEP-4 in Alpha Stage" title="Direct link to MEP-4 in Alpha Stage" translate="no">​</a></h2>
<p>MEP-4 is definitely the longest running enhancement proposal that we have ever worked on. It finally makes it to the alpha stage and is soon to be expected to become GA. It contains an entire update of the metal-stack API, deprecating the Swagger-based REST API and replacing it with <a href="https://protobuf.dev/" target="_blank" rel="noopener noreferrer" class="">protobuf</a> and <a href="https://connectrpc.com/" target="_blank" rel="noopener noreferrer" class="">ConnectRPC</a>.</p>
<p>The project that implements our <a href="https://github.com/metal-stack/api" target="_blank" rel="noopener noreferrer" class="">V2 API definition</a> is called the <a href="https://github.com/metal-stack/metal-apiserver" target="_blank" rel="noopener noreferrer" class="">metal-apiserver</a>. The implementation is capable of creating API tokens with fine-grained access permissions, such that technical components can access the metal-stack API with minimum access privileges and without the possibility to reach into unintended project and tenant scopes.</p>
<p>In addition to that, the network business layer was completely modernized, such that it will be possible to set up namespaced networks for allocating IP addresses, creating super networks (scoped and unscoped) instead of just having a single super network for a partition, and more.</p>
<p>Also, the metal-apiserver drops the dependency on NSQ and will instead use <a href="https://valkey.io/" target="_blank" rel="noopener noreferrer" class="">valkey</a> to introduce asynchronous task queueing for the implementation of more complex endpoints.</p>
<p>The metal-apiserver is already deployed in mini-lab by default. You can access it using the <a href="https://github.com/metal-stack/cli" target="_blank" rel="noopener noreferrer" class="">metalctlv2 CLI</a>. There are also first Ansible modules available using the fairly new and awesome <a href="https://github.com/connectrpc/connect-python" target="_blank" rel="noopener noreferrer" class="">connect-python</a> project for implementation.</p>
<p>We will keep you informed on the development progress. If you want to contribute thoughts to the new API you may want to visit our <a href="https://metal-stack.io/docs/planning-meetings" target="_blank" rel="noopener noreferrer" class="">public planning meetings</a> and discuss ideas together with us.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="improvements-on-sonic-integration">Improvements on SONiC Integration<a href="https://metal-stack.io/blog/2025/11-metal-stack-v0.22.0#improvements-on-sonic-integration" class="hash-link" aria-label="Direct link to Improvements on SONiC Integration" title="Direct link to Improvements on SONiC Integration" translate="no">​</a></h2>
<p>A lot of work from our contributor <a href="https://github.com/iljarotar" target="_blank" rel="noopener noreferrer" class="">@iljarotar</a> was put into improving and stabilizing SONiC switches over the course of this year. The deployment now follows a completely new approach using a <a href="https://github.com/metal-stack/sonic-configdb-utils" target="_blank" rel="noopener noreferrer" class="">generator</a> to provide a <code>config_db.json</code>.</p>
<p>In case you still use the <code>sonic</code> role we advise operators to migrate to the <a href="https://github.com/metal-stack/metal-roles/tree/master/partition/roles/sonic-config" target="_blank" rel="noopener noreferrer" class="">sonic-config</a>, which utilizes the generator for the switch configuration.</p>
<p>Another important step was made in the mini-lab, which now allows spinning up the lab with different versions of SONiC. In our integration tests we can also ensure support for Enterprise SONiC now. We're aiming for more sophisticated testing of different flavors of SONiC to suit more real-world scenarios.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="gardener-ontap-extension">Gardener Ontap Extension<a href="https://metal-stack.io/blog/2025/11-metal-stack-v0.22.0#gardener-ontap-extension" class="hash-link" aria-label="Direct link to Gardener Ontap Extension" title="Direct link to Gardener Ontap Extension" translate="no">​</a></h2>
<p>As another storage solutation in Gardener setups, we included beta integration for <a href="https://www.netapp.com/de/ontap-data-management-software/" target="_blank" rel="noopener noreferrer" class="">NetApp ONTAP storage</a>. This integration is provided by a dedicated Gardener extension, which is called <a href="https://github.com/metal-stack/gardener-extension-ontap" target="_blank" rel="noopener noreferrer" class="">gardener-extension-ontap</a>.</p>
<p>The person who made this possible is <a href="https://github.com/honigeintopf" target="_blank" rel="noopener noreferrer" class="">@honigeintopf</a> and we'd like to thank him for the huge amount of efforts that went into this extension.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-information">More Information<a href="https://metal-stack.io/blog/2025/11-metal-stack-v0.22.0#more-information" class="hash-link" aria-label="Direct link to More Information" title="Direct link to More Information" translate="no">​</a></h2>
<p>Please check out the <a href="https://github.com/metal-stack/releases/releases/tag/v0.22.0" target="_blank" rel="noopener noreferrer" class="">release notes</a> to find a full overview over every change that went part of this release.</p>
<p>As always, feel free to visit our <a href="https://join.slack.com/t/metal-stack/shared_invite/zt-3eqheaymr-obQueWBLOMkhbEWTZZyDRg" target="_blank" rel="noopener noreferrer" class="">Slack</a> channel and ask if there are any questions. 😄</p>]]></content:encoded>
            <category>Release</category>
            <category>Kubernetes</category>
            <category>Network</category>
        </item>
        <item>
            <title><![CDATA[🧑‍💻 metal-stack.io Planning Meetings]]></title>
            <link>https://metal-stack.io/blog/2025/06-planning-meeting</link>
            <guid>https://metal-stack.io/blog/2025/06-planning-meeting</guid>
            <pubDate>Mon, 30 Jun 2025 07:00:00 GMT</pubDate>
            <description><![CDATA[This gives a chance for our community to bring up relevant topics and increase transparency.]]></description>
            <content:encoded><![CDATA[<p>Since the GitHub Projects V2 API has enough features for our project, we decided to set up public planning meetings for our development on the metal-stack project. The planning board can be found <a href="https://github.com/orgs/metal-stack/projects/34" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<p>The meetings are held <strong>biweekly on odd calendar weeks</strong> from <strong>14:00 to 14:30</strong> on Microsoft Teams. The purpose is to provide an overview of our current projects and priorities, as well as to discuss new topics and issues within the group.</p>
<p>You can find the link to join in our documentation <a href="https://docs.metal-stack.io/dev/developers/planning-meetings/" target="_blank" rel="noopener noreferrer" class="">here</a>. If you want to get an invitation to the event, please drop us a line on our <a href="https://join.slack.com/t/metal-stack/shared_invite/zt-3eqheaymr-obQueWBLOMkhbEWTZZyDRg" target="_blank" rel="noopener noreferrer" class="">Slack channel</a>.</p>
<p>Planning meetings are currently not recorded. The meetings are held either in English or German depending on the attendees.</p>
<p>Hope to see you there!</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Highlights from the 7th Hack the Garden 🔨]]></title>
            <link>https://metal-stack.io/blog/2025/06-hack-the-garden</link>
            <guid>https://metal-stack.io/blog/2025/06-hack-the-garden</guid>
            <pubDate>Wed, 11 Jun 2025 16:00:00 GMT</pubDate>
            <description><![CDATA[The Gardener community joined for the 7th Hack the Garden Hackathon to improve the Ecosystem.]]></description>
            <content:encoded><![CDATA[<p>At the start of June 2025, the Gardener community met again for the 7th Gardener Hackathon. By now it's a tradition that brings together multiple companies, minds and topics for a week of coding, documentation and community building. This time, the event took place in Schelklingen, Germany, from June 2nd to 6th, and it was a week filled with innovation, collaboration, and a shared passion for enhancing the Gardener ecosystem.</p>
<p>As the previous three times, we doubled down to choose the <a href="https://schlosshof-info.de/" target="_blank" rel="noopener noreferrer" class="">Schlosshof</a> in Schelklingen, Germany, as our location as it served us well in the past.</p>
<p><img decoding="async" loading="lazy" src="https://metal-stack.io/assets/images/schlosshof-d93647fbb4368fbeb6ee50fab0127d87.jpg" width="800" height="599" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="topics">Topics<a href="https://metal-stack.io/blog/2025/06-hack-the-garden#topics" class="hash-link" aria-label="Direct link to Topics" title="Direct link to Topics" translate="no">​</a></h2>
<p>Coordinating a sprint of a new team for one week is no easy task and needed to be prepared beforehand. We collected all possible topic ideas, prioritized by votes. Thereafter everyone commented below their favorite topics where they'd like to participate.
Before the event started everybody knew their track and we mixed the teams up to ensure a diverse range of skills and perspectives.</p>
<p>What made this hackathon's topics special was the inclusion of frontend developers, which broadened the scope of tracks and allowed for significant improvements in user interfaces and user experience of the Gardener Dashboard and the documentation website itself.</p>
<p><img decoding="async" loading="lazy" src="https://metal-stack.io/assets/images/hack-the-garden-hands-on-867eb7e1ae39bf002630d13b77d437fa.jpg" width="1920" height="1440" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="documentation-revamp">Documentation Revamp<a href="https://metal-stack.io/blog/2025/06-hack-the-garden#documentation-revamp" class="hash-link" aria-label="Direct link to Documentation Revamp" title="Direct link to Documentation Revamp" translate="no">​</a></h3>
<p>While Gardener is well documented, finding the right information can be challenging. This is what this track is all about. For one the glossary was updated to reflect the latest changes and technologies.</p>
<p>But more importantly metadata was attached to every single documentation page. This drastically improves the search results.</p>
<p>As a result the documentation should be much more welcoming for new users and for more experienced users alike.</p>
<p>In addition to that, the team made a proposal for exchanging the existing docs framework with <a href="https://vitepress.dev/" target="_blank" rel="noopener noreferrer" class="">vitepress</a>. The result looks very promising and even simplifies the developer experience significantly. Maybe we'll gonna see a new Gardener docs website soon?</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dashboard-usability-improvements">Dashboard Usability Improvements<a href="https://metal-stack.io/blog/2025/06-hack-the-garden#dashboard-usability-improvements" class="hash-link" aria-label="Direct link to Dashboard Usability Improvements" title="Direct link to Dashboard Usability Improvements" translate="no">​</a></h3>
<p>What do the users of Gardener actually see? In many cases it's mostly the Gardener Dashboard. Currently all options are displayed and can be edited - regardless if they would break the cluster or not.</p>
<p>To mitigate this, the project administrators are now able to define defaults and even hide UI elements within the form to prevent users from unintended or overly complex configurations.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="l7-load-balancing-for-kube-apiserver">L7 Load Balancing for <code>kube-apiserver</code><a href="https://metal-stack.io/blog/2025/06-hack-the-garden#l7-load-balancing-for-kube-apiserver" class="hash-link" aria-label="Direct link to l7-load-balancing-for-kube-apiserver" title="Direct link to l7-load-balancing-for-kube-apiserver" translate="no">​</a></h3>
<p>In the <a class="" href="https://metal-stack.io/blog/2024/12-hack-the-garden">previous hackathon</a> proper load balancing of the Gardener kube-apiservers was implemented for external traffic. Though the internal traffic is still not load balanced leading to bad distributions of requests and potentially overloading a single kube-apiserver. The resulting throttling cannot be solved by simply scaling things up.</p>
<p>Instead the internal traffic will now be load balanced, too. This is achieved by routing the internal traffic through the Istio Gateway and thereby treating the internal traffic similar to the external traffic.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="single-node-ready-gardener-operator">Single-Node Ready Gardener Operator<a href="https://metal-stack.io/blog/2025/06-hack-the-garden#single-node-ready-gardener-operator" class="hash-link" aria-label="Direct link to Single-Node Ready Gardener Operator" title="Direct link to Single-Node Ready Gardener Operator" translate="no">​</a></h3>
<p>Gardener is configured and deployed with high availability in mind. Though in some bootstrapping bare-metal scenarios a reduced amount of nodes are available.
When running only on one node multiple replicas of some components impossible or simply overkill.</p>
<p>In this track lots of small adjustments and tests were made to ensure supporting this scenario as well.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="community-and-collaboration">Community and Collaboration<a href="https://metal-stack.io/blog/2025/06-hack-the-garden#community-and-collaboration" class="hash-link" aria-label="Direct link to Community and Collaboration" title="Direct link to Community and Collaboration" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Hackathon attendees" src="https://metal-stack.io/assets/images/hack-the-garden-attendees-e453b6fac7f7e9a2cfbd05238b22bb3e.jpg" width="1920" height="1279" class="img_ev3q"></p>
<p>This time 19 contributors from <a href="https://www.x-cellent.com/" target="_blank" rel="noopener noreferrer" class="">x-cellent technologies</a>, <a href="https://sap.com/" target="_blank" rel="noopener noreferrer" class="">SAP</a> and <a href="https://www.noris.de/" target="_blank" rel="noopener noreferrer" class="">noris network</a> joined. Most from Germany, but some from Bulgaria. In general we were younger and welcomed more first-timers.  What sets this event apart is the way it elevates collaboration across company boundaries, leading to a rich exchange of ideas and perspectives.</p>
<p>During breaks and evenings, we had the opportunity to cook, relax and bond over good food and drinks. The relaxed atmosphere fostered open discussions, idea exchanges, and a sense of camaraderie among participants. Quite a few kilometers were walked and jogged, multiple Volleyball matches played and many table tennis balls were hit.</p>
<h1>Conclusion</h1>
<p>A huge thanks to all contributors: you were awesome. If you are keen to dig deeper into the full list of topics and pull requests, check out the <a href="https://github.com/gardener-community/hackathon/tree/main/2025-06_Schelklingen" target="_blank" rel="noopener noreferrer" class="">gardener-community/hackathon</a> writeup or <a href="https://youtu.be/TCLXovw43HA" target="_blank" rel="noopener noreferrer" class="">watch the demos</a> from the review meeting.</p>
<p>And we are to proud to be able to announce the next Hackathon in early December 2025. If you'd like to join, head over the <a href="https://join.slack.com/t/gardener-cloud/shared_invite/zt-33c9daems-3oOorhnqOSnldZPWqGmIBw" target="_blank" rel="noopener noreferrer" class="">Gardener Slack</a>.
Happy to meet you there!</p>]]></content:encoded>
            <category>Hackathon</category>
            <category>Kubernetes</category>
            <category>Gardener</category>
            <category>Events</category>
        </item>
        <item>
            <title><![CDATA[metal-stack v0.21.0 🙄]]></title>
            <link>https://metal-stack.io/blog/2025/03-metal-stack-v0.21.0</link>
            <guid>https://metal-stack.io/blog/2025/03-metal-stack-v0.21.0</guid>
            <pubDate>Fri, 21 Mar 2025 09:00:00 GMT</pubDate>
            <description><![CDATA[Sorry, but there are no new features in this release! Just a breaking change that operators need to be aware of.]]></description>
            <content:encoded><![CDATA[<p>In this release we do not have any new features to present but a rather unfortunate breaking change in one of our dependencies we use for semantic versioning. If you are an operator of metal-stack, please read this article.</p>
<ul>
<li class=""><a href="https://metal-stack.io/blog/2025/03-metal-stack-v0.21.0#breaking-change-in-semantic-versioning-for-os-images" class="">Breaking Change in Semantic Versioning for OS Images</a>
<ul>
<li class=""><a href="https://metal-stack.io/blog/2025/03-metal-stack-v0.21.0#naming-of-os-image-releases" class="">Naming of OS Image Releases</a></li>
</ul>
</li>
<li class=""><a href="https://metal-stack.io/blog/2025/03-metal-stack-v0.21.0#more-information" class="">More Information</a></li>
</ul>
<p>Check out the direct link to the release <a href="https://github.com/metal-stack/releases/releases/tag/v0.21.0" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-change-in-semantic-versioning-for-os-images">Breaking Change in Semantic Versioning for OS Images<a href="https://metal-stack.io/blog/2025/03-metal-stack-v0.21.0#breaking-change-in-semantic-versioning-for-os-images" class="hash-link" aria-label="Direct link to Breaking Change in Semantic Versioning for OS Images" title="Direct link to Breaking Change in Semantic Versioning for OS Images" translate="no">​</a></h2>
<p>A <a href="https://github.com/Masterminds/semver/issues/258" target="_blank" rel="noopener noreferrer" class="">change in the semver library</a> that is used by metal-stack and in the Gardener project forces us to rename the identifiers that we typically use for OS images like Ubuntu 24.04. The library now requires stricter semantic versions, not allow leading zeroes in version segments.</p>
<p>In case you use for example <code>ubuntu-24.04.20250228</code> as an ID for an <code>image</code> in the metal-api, this needs to become <code>ubuntu-24.4.20250228</code>.</p>
<p>In order to introduce the new identifier-format, before updating to this release of metal-stack, an image has to be created according to the new version format. This image then co-exists with the old image format. After this, all machines referencing the old image must be reprovisioned with the new image ID format.</p>
<p>After all the references were migrated to the new image format, the old versions must be removed from the metal-api before upgrading to this release. Please adapt your deployments accordingly.</p>
<p>Unfortunately, there is no better way to migrate this ID. Another option was to fork the Gardener project, which we did not want to do. If you encounter bigger issues during this step, please contact us in our Slack channel.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="naming-of-os-image-releases">Naming of OS Image Releases<a href="https://metal-stack.io/blog/2025/03-metal-stack-v0.21.0#naming-of-os-image-releases" class="hash-link" aria-label="Direct link to Naming of OS Image Releases" title="Direct link to Naming of OS Image Releases" translate="no">​</a></h3>
<p>The Ubuntu OS images we release through <a href="https://github.com/metal-stack/metal-images" target="_blank" rel="noopener noreferrer" class="">metal-images</a> will continue to use the existing naming scheme. The download paths for our OS images will still contain leading zeros for Ubuntu LTS versions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-information">More Information<a href="https://metal-stack.io/blog/2025/03-metal-stack-v0.21.0#more-information" class="hash-link" aria-label="Direct link to More Information" title="Direct link to More Information" translate="no">​</a></h2>
<p>Please check out the <a href="https://github.com/metal-stack/releases/releases/tag/v0.21.0" target="_blank" rel="noopener noreferrer" class="">release notes</a> to find a full overview over every change that went part of this release.</p>
<p>As always, feel free to visit our Slack channel and ask if there are any questions. 😄</p>]]></content:encoded>
            <category>Release</category>
            <category>Kubernetes</category>
            <category>Network</category>
        </item>
        <item>
            <title><![CDATA[metal-stack v0.20.0 💯]]></title>
            <link>https://metal-stack.io/blog/2025/02-metal-stack-v0.20.0</link>
            <guid>https://metal-stack.io/blog/2025/02-metal-stack-v0.20.0</guid>
            <pubDate>Wed, 26 Feb 2025 09:00:00 GMT</pubDate>
            <description><![CDATA[Finally IPv6 made it into the metal-api. This and more interesting features of the latest release can be read in this blog article.]]></description>
            <content:encoded><![CDATA[<p>Admittedly, we planned supporting IPv6 for metal-stack years ago. 😅</p>
<p>As we all know, good things take time, and that time has finally come! In this release, IPv6 addresses can be provisioned to machines through the metal-api. Read on to learn how it works.</p>
<ul>
<li class=""><a href="https://metal-stack.io/blog/2025/02-metal-stack-v0.20.0#basic-ipv6-support" class="">Basic IPv6 Support</a></li>
<li class=""><a href="https://metal-stack.io/blog/2025/02-metal-stack-v0.20.0#gardener-support-to-v1106" class="">Gardener Support to v1.106</a></li>
<li class=""><a href="https://metal-stack.io/blog/2025/02-metal-stack-v0.20.0#audit-backend-based-on-timescaledb" class="">Audit Backend Based on TimescaleDB</a></li>
<li class=""><a href="https://metal-stack.io/blog/2025/02-metal-stack-v0.20.0#metal-core-reporting-bgp-states" class="">metal-core Reporting BGP States</a></li>
<li class=""><a href="https://metal-stack.io/blog/2025/02-metal-stack-v0.20.0#relaunch-of-cluster-api-provider" class="">Relaunch of Cluster API Provider</a></li>
<li class=""><a href="https://metal-stack.io/blog/2025/02-metal-stack-v0.20.0#more-information" class="">More Information</a></li>
</ul>
<p>Check out the direct link to the release <a href="https://github.com/metal-stack/releases/releases/tag/v0.20.0" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="basic-ipv6-support">Basic IPv6 Support<a href="https://metal-stack.io/blog/2025/02-metal-stack-v0.20.0#basic-ipv6-support" class="hash-link" aria-label="Direct link to Basic IPv6 Support" title="Direct link to Basic IPv6 Support" translate="no">​</a></h2>
<p>Back in 2021 we published a <a href="https://metal-stack.io/blog/2021/02/ipv6-part1" target="_blank" rel="noopener noreferrer" class="">first blog article</a> talking specifically about IPv6. However, work on the topic was frequently interrupted and postponed. As IPv6 has become a recurring track in the Gardener Hackathons, this year we finally gained enough confidence to merge our first version of basic IPv6 support in the <a href="https://github.com/metal-stack/metal-api" target="_blank" rel="noopener noreferrer" class="">metal-api</a>.</p>
<p>A really big bunch of the work was done by <a href="https://github.com/majst01" target="_blank" rel="noopener noreferrer" class="">@majst01</a>, who also wrote the corresponding enhancement proposal <a href="https://docs.metal-stack.io/dev/development/proposals/MEP13/README/" target="_blank" rel="noopener noreferrer" class="">MEP-13</a>. Thanks for the effort and the never-ending will to finish this up. 😌</p>
<p>With the new API, operators can add a list of prefixes containing both IPv4 and IPv6 addresses, which looks like this:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> tenant</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">super</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">network</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">mini</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">lab</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Project Super Network</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Super network of all project networks</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">partitionid</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> mini</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">lab</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">prefixes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> 10.0.0.0/16</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> 2001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">db8</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">0</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">10</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/64</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">defaultchildprefixlength</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">IPv4</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">22</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">IPv6</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">96</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">privatesuper</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">consumption</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ipv4</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">available_ips</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">65536</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">available_prefixes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">16384</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">used_ips</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">used_prefixes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ipv6</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">available_ips</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2147483647</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">available_prefixes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2147483647</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">used_ips</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">used_prefixes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><br></span></code></pre></div></div>
<p>Both families have specific default prefix lengths that are used for child network allocation. Also there is dedicated usage reporting per IP address family. The consumption of IPv6 address families is only an approximation, as counting free addresses would otherwise be costly.</p>
<p>By default, <code>metalctl</code> users allocating a child network automatically inherit the prefixes from the address families defined by the parent network:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">❯ metalctl network allocate </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> my-node-network </span><span class="token parameter variable" style="color:#36acaa">--partition</span><span class="token plain"> mini-lab </span><span class="token parameter variable" style="color:#36acaa">--project</span><span class="token plain"> 4b9b17c4-2d7c-4190-ae95-dda44e430fa6</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">---</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">id: 2d2c0350-3f66-4597-ae97-ef6797232212</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">name: my-node-network</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">parentnetworkid: tenant-super-network-mini-lab</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">partitionid: mini-lab</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">prefixes:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- </span><span class="token number" style="color:#36acaa">10.0</span><span class="token plain">.0.0/22</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- </span><span class="token number" style="color:#36acaa">2001</span><span class="token plain">:db8:0:10::/96</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">projectid: 4b9b17c4-2d7c-4190-ae95-dda44e430fa6</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">vrf: </span><span class="token number" style="color:#36acaa">20</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">consumption:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ipv4:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    available_ips: </span><span class="token number" style="color:#36acaa">1024</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    available_prefixes: </span><span class="token number" style="color:#36acaa">256</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    used_ips: </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    used_prefixes: </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ipv6:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    available_ips: </span><span class="token number" style="color:#36acaa">2147483647</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    available_prefixes: </span><span class="token number" style="color:#36acaa">1073741824</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    used_ips: </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    used_prefixes: </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">privatesuper: </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">.</span><br></span></code></pre></div></div>
<p>With the <code>--addressfamily</code> flag it is also possible to extract only child prefixes from the given address family. However, this release also introduces the ability for users to create child networks with a custom prefix length, so it is also possible to allocate smaller or larger prefixes.</p>
<p>When an IP address is allocated from a network without explicitly specifying an address family, a user acquires an IPv4 address, unless the network consists only of IPv6 prefixes. In the latter case, a user gets an IPv6 address by default.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">❯ metalctl network </span><span class="token function" style="color:#d73a49">ip</span><span class="token plain"> create </span><span class="token parameter variable" style="color:#36acaa">--network</span><span class="token plain"> 2d2c0350-3f66-4597-ae97-ef6797232212 </span><span class="token parameter variable" style="color:#36acaa">--project</span><span class="token plain"> 4b9b17c4-2d7c-4190-ae95-dda44e430fa6</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">---</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">allocationuuid: 2dde5c08-78b4-4765-9862-c24dc073b64f</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ipaddress: </span><span class="token number" style="color:#36acaa">10.0</span><span class="token plain">.0.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">networkid: 2d2c0350-3f66-4597-ae97-ef6797232212</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">projectid: 4b9b17c4-2d7c-4190-ae95-dda44e430fa6</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tags: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">type: ephemeral</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">.</span><br></span></code></pre></div></div>
<p>Again, the <code>--addressfamily</code> flag can be used to explicitly specify the kind of IP address to obtain:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">metalctl network </span><span class="token function" style="color:#d73a49">ip</span><span class="token plain"> create </span><span class="token parameter variable" style="color:#36acaa">--network</span><span class="token plain"> 2d2c0350-3f66-4597-ae97-ef6797232212 </span><span class="token parameter variable" style="color:#36acaa">--project</span><span class="token plain"> 4b9b17c4-2d7c-4190-ae95-dda44e430fa6 </span><span class="token parameter variable" style="color:#36acaa">--addressfamily</span><span class="token plain"> IPv6</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">---</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">allocationuuid: 0312f0b7-2a87-460f-95dd-7b67fdfcddd7</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ipaddress: </span><span class="token number" style="color:#36acaa">2001</span><span class="token plain">:db8:0:10::1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">networkid: 2d2c0350-3f66-4597-ae97-ef6797232212</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">projectid: 4b9b17c4-2d7c-4190-ae95-dda44e430fa6</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tags: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">type: ephemeral</span><br></span></code></pre></div></div>
<p>IPs and networks can be associated with machines and firewalls as usual. In case network IP auto-acquisition is used, a machine or firewall retrieves an IP from all available IP address families of the corresponding network.</p>
<p>At this stage, the implementation works for metal-stack without the integration of the Gardener. These parts will require adaption as well. However, it is required to run Gardener with at least version v1.109 in order to support dual-stack thoroughly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="gardener-support-to-v1106">Gardener Support to v1.106<a href="https://metal-stack.io/blog/2025/02-metal-stack-v0.20.0#gardener-support-to-v1106" class="hash-link" aria-label="Direct link to Gardener Support to v1.106" title="Direct link to Gardener Support to v1.106" translate="no">​</a></h2>
<p>With this release, metal-stack supports Gardener to version <code>v1.106</code>, which offers shoot clusters running on Kubernetes version 1.31.</p>
<p>In addition to this, the mini-lab release integration now has a new <code>gardener</code> flavor, which uses our Gardener deployment role from the <a href="https://github.com/metal-stack/metal-roles" target="_blank" rel="noopener noreferrer" class="">metal-roles</a> repository. With this flavor, the mini-lab spins up the Gardener Control Plane while the release integration checks that all components are running and report readiness. Shoot creation was not yet tried out but we are keen to support this in the mini-lab for one of the future releases.</p>
<p>One upcoming topic will also be the migration of the Gardener installation using Helm charts to the Gardener Operator. This requires thorough testing and hopefully we can integrate the migration into one of our next releases.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="audit-backend-based-on-timescaledb">Audit Backend Based on TimescaleDB<a href="https://metal-stack.io/blog/2025/02-metal-stack-v0.20.0#audit-backend-based-on-timescaledb" class="hash-link" aria-label="Direct link to Audit Backend Based on TimescaleDB" title="Direct link to Audit Backend Based on TimescaleDB" translate="no">​</a></h2>
<p>As an alternative to the Meilisearch backend, it is now possible to use <a href="https://www.timescale.com/" target="_blank" rel="noopener noreferrer" class="">TimescaleDB</a> as the audit backend for the metal-api audit traces. It has useful features like fast inserts and searches in hypertable chunks, data retention and compression. As this is built as an extension to Postgres, we have good experience maintaining this integration and can reuse our integration with the <a href="https://github.com/metal-stack/backup-restore-sidecar" target="_blank" rel="noopener noreferrer" class="">backup-restore-sidecar</a> including its database update capabilities.</p>
<p>The interface of querying the backend is identical to what it was with Meilisearch. So, users do not feel any difference.</p>
<p>In the future, we plan to offer at one more audit backend for Splunk.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="metal-core-reporting-bgp-states">metal-core Reporting BGP States<a href="https://metal-stack.io/blog/2025/02-metal-stack-v0.20.0#metal-core-reporting-bgp-states" class="hash-link" aria-label="Direct link to metal-core Reporting BGP States" title="Direct link to metal-core Reporting BGP States" translate="no">​</a></h2>
<p>In order to keep track of the BGP connections between the leaf switches and the provisioned machines for operators there is now a way to see the connection state directly through the metal-api.</p>
<p>For instance, this can be observed through the <code>switch connected-machines</code> command in combination with <code>-o wide</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">❯ metalctl switch connected-machines </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> wide</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ID                                           NIC NAME                           IDENTIFIER   PARTITION   RACK        SIZE           </span><span class="token environment constant" style="color:#36acaa">HOSTNAME</span><span class="token plain">   PRODUCT SERIAL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">leaf01                                                                                       mini-lab    test-rack</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├─╴00000000-0000-0000-0000-000000000001      Ethernet0 </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">BGP:Established</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">54s</span><span class="token punctuation" style="color:#393A34">))</span><span class="token plain">   Eth1/1       mini-lab    test-rack   v1-small-x86   </span><span class="token builtin class-name">test</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└─╴00000000-0000-0000-0000-000000000002      Ethernet1                          Eth1/2       mini-lab    test-rack   v1-small-x86</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">leaf02                                                                                       mini-lab    test-rack</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├─╴00000000-0000-0000-0000-000000000001      Ethernet0 </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">BGP:Established</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">58s</span><span class="token punctuation" style="color:#393A34">))</span><span class="token plain">   Eth1/1       mini-lab    test-rack   v1-small-x86   </span><span class="token builtin class-name">test</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└─╴00000000-0000-0000-0000-000000000002      Ethernet1                          Eth1/2       mini-lab    test-rack   v1-small-x86</span><br></span></code></pre></div></div>
<p>Mainly, <a href="https://github.com/mwennrich" target="_blank" rel="noopener noreferrer" class="">@mwennrich</a> was responsible for this handy addition. Thanks! 🐕</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="relaunch-of-cluster-api-provider">Relaunch of Cluster API Provider<a href="https://metal-stack.io/blog/2025/02-metal-stack-v0.20.0#relaunch-of-cluster-api-provider" class="hash-link" aria-label="Direct link to Relaunch of Cluster API Provider" title="Direct link to Relaunch of Cluster API Provider" translate="no">​</a></h2>
<p>As time went on, we decided to give our <a href="https://github.com/metal-stack/cluster-api-provider-metal-stack" target="_blank" rel="noopener noreferrer" class="">cluster-api-provider-metal-stack</a> another try and rebuild it from scratch. So from a broken state we are back: It works again!</p>
<p>Over time, the Cluster API has added experimental support for the ignition file format, which we now use for machine provisioning. We also support installing the provider using <code>clusterctl</code>. Commands like <code>clusterctl move</code> also work.</p>
<p>The entire solution can be fully developed in the mini-lab, which simulates the entire stack from the API down to the switches and machines.</p>
<p>If you are interested, feel free to check out the local setup of the cluster-api provider by following our <a href="https://github.com/metal-stack/cluster-api-provider-metal-stack/blob/main/DEVELOPMENT.md#getting-started-locally" target="_blank" rel="noopener noreferrer" class="">developer guide</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-information">More Information<a href="https://metal-stack.io/blog/2025/02-metal-stack-v0.20.0#more-information" class="hash-link" aria-label="Direct link to More Information" title="Direct link to More Information" translate="no">​</a></h2>
<p>This is only a small extract of what went into our v0.20.0 release.</p>
<p>Please check out the <a href="https://github.com/metal-stack/releases/releases/tag/v0.20.0" target="_blank" rel="noopener noreferrer" class="">release notes</a> to find a full overview over every change that went part of this release.</p>
<p>As always, feel free to visit our Slack channel and ask if there are any questions. 😄</p>]]></content:encoded>
            <category>Release</category>
            <category>Kubernetes</category>
            <category>Network</category>
        </item>
        <item>
            <title><![CDATA[FOSDEM 2025 ️❤️]]></title>
            <link>https://metal-stack.io/blog/2025/02-fosdem</link>
            <guid>https://metal-stack.io/blog/2025/02-fosdem</guid>
            <pubDate>Mon, 03 Feb 2025 08:00:00 GMT</pubDate>
            <description><![CDATA[For the first time metal-stack was part of the biggest Open Source conference in Europe.]]></description>
            <content:encoded><![CDATA[<p>Without high expectations, we submitted an application to <a href="https://fosdem.org/" target="_blank" rel="noopener noreferrer" class="">FOSDEM</a> at the end of last year. So we were very excited when we heard that metal-stack had been accepted with a stand and a presentation at FOSDEM 2025. It was a sign for us. It proved to us that there is a demand for solutions that provide highly scalable infrastructure in on-premises data centers.</p>
<p>FOSDEM is an open source conference held in the heart of Europe in Brussels, Belgium. It is one of the largest, if not the largest, open source software conference in the world. As a visitor we have been there in the past and enjoyed the high amount of technical talks and the diversity of the conference. In fact, it is a melting pot of people from all kinds of areas - from project maintainers to decision makers, from eminent authorities to hobbyists, from computer enthusiasts to the press.</p>
<p>All in all, we are very grateful for the opportunity to present our project to a wider audience. We have never met so many new faces and people to talk to about this project in such a short time. It was great to be able to talk about the software and the ideas and concepts that we have come up with with metal-stack - to exchange thoughts with others, get new inspiration and identify potential partners for future collaborations.</p>
<p>You can find our talk <a href="https://fosdem.org/2025/schedule/event/fosdem-2025-4665-on-prem-kubernetes-at-scale-with-metal-stack-io/" target="_blank" rel="noopener noreferrer" class="">here</a>. At the time of writing the video has not become publicly available yet, but we are sure it will be available soon.</p>
<p>In the meantime, we would like to thank everyone who came and showed interest. And of course a big thank you to the organizers of FOSDEM, the Virtualization and Cloud Infrastructure Dev Room, for their trust. We had a great time and hope to stay in touch with all of you! See you soon!</p>
<p><img decoding="async" loading="lazy" src="https://metal-stack.io/assets/images/IMG_5353-872dbe6c0a95384ddacd883349c6fad5.jpeg" width="800" height="600" class="img_ev3q"></p>]]></content:encoded>
            <category>News</category>
            <category>Events</category>
        </item>
        <item>
            <title><![CDATA[Hack the Garden vol. 6 🔨]]></title>
            <link>https://metal-stack.io/blog/2024/12-hack-the-garden</link>
            <guid>https://metal-stack.io/blog/2024/12-hack-the-garden</guid>
            <pubDate>Tue, 10 Dec 2024 15:00:00 GMT</pubDate>
            <description><![CDATA[Engineers from four different companies and two countries hacked together on Gardener.]]></description>
            <content:encoded><![CDATA[<p>At the beginning of December we came together and started the 6th Hack the Garden event. With 22 participants from Germany and Bulgaria, this hackathon set a new record. Participating were <a href="https://sap.com/" target="_blank" rel="noopener noreferrer" class="">SAP</a>, <a href="https://stackit.de/" target="_blank" rel="noopener noreferrer" class="">STACKIT</a>, <a href="https://www.x-cellent.com/" target="_blank" rel="noopener noreferrer" class="">x-cellent technologies GmbH</a> and <a href="https://www.inovex.de/" target="_blank" rel="noopener noreferrer" class="">inovex</a>.</p>
<p>For the third time in a row, we visited the <a href="https://schlosshof-info.de/" target="_blank" rel="noopener noreferrer" class="">Schlosshof</a> in Schelklingen, Germany, because the location and the space fit so well.</p>
<p><img decoding="async" loading="lazy" src="https://metal-stack.io/assets/images/schlosshof-d93647fbb4368fbeb6ee50fab0127d87.jpg" width="800" height="599" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="topics">Topics<a href="https://metal-stack.io/blog/2024/12-hack-the-garden#topics" class="hash-link" aria-label="Direct link to Topics" title="Direct link to Topics" translate="no">​</a></h2>
<p>An event of this magnitude cannot begin without proper preparation. One of the biggest keys to success is knowing the topics and who will work on them.
So, as in previous events, we collected all the ideas in advance, voted on interesting topics, and said what everyone would like to work on.
That way, we were able to form teams before the event started. As always, the teams came from different companies to benefit from a wider range of experience.</p>
<p>As the hackathon progressed, the list of topics grew considerably. This time a whopping 23 topics were covered! A complete list with an overview of each topic can be found at <a href="https://github.com/gardener-community/hackathon/tree/main/2024-12_Schelklingen" target="_blank" rel="noopener noreferrer" class="">gardener-community/hackathon</a>.</p>
<p><img decoding="async" loading="lazy" src="https://metal-stack.io/assets/images/hands-on-61760faa1b9329fb14b4f82e8e2aeb3d.jpg" width="4032" height="3024" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ipv6-support">IPv6 Support<a href="https://metal-stack.io/blog/2024/12-hack-the-garden#ipv6-support" class="hash-link" aria-label="Direct link to IPv6 Support" title="Direct link to IPv6 Support" translate="no">​</a></h3>
<p>A Gardener hackathon is no hackathon if IPv6 support is not a topic. This time this was no different.
Here we tested Gardener's DualStack compatibility against antother IaaS. After all the previous hackathons working on this topic, we finally found no bug in Gardener itself and new shoots could be reconciled to 100%!</p>
<p>Next time Gardener with metal-stack and DualStack is on the list. Stay tuned!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="version-classification-lifecycle-in-cloud-profiles">Version Classification Lifecycle in Cloud Profiles<a href="https://metal-stack.io/blog/2024/12-hack-the-garden#version-classification-lifecycle-in-cloud-profiles" class="hash-link" aria-label="Direct link to Version Classification Lifecycle in Cloud Profiles" title="Direct link to Version Classification Lifecycle in Cloud Profiles" translate="no">​</a></h3>
<p>In Gardener versions of Kubernetes and machine images can be declared using a <code>CloudProfile</code>. Versions can be classified as <code>preview</code>, <code>supported</code> and <code>deprecated</code>. Automatic updates are only considered for <code>supported</code> versions. Once the administrators decide to promote a given version to the next stage of its lifecycle, a new deployment is required. The only exception is marking a version as expired.</p>
<p>With the changes proposed in <a href="https://github.com/gardener/gardener/pull/10982" target="_blank" rel="noopener noreferrer" class="">GEP-32</a> it is now possible to plan the entire classification lifecycle of a version without manual interaction based on date. Of course it is still possible to change the planned lifecycle later.
A corresponding reference implementation has also been created.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gardener-slis-shoot-cluster-creation-and-deletion-times">Gardener SLIs: Shoot Cluster Creation and Deletion Times<a href="https://metal-stack.io/blog/2024/12-hack-the-garden#gardener-slis-shoot-cluster-creation-and-deletion-times" class="hash-link" aria-label="Direct link to Gardener SLIs: Shoot Cluster Creation and Deletion Times" title="Direct link to Gardener SLIs: Shoot Cluster Creation and Deletion Times" translate="no">​</a></h3>
<p>Do you know how long your shoots take to prepare or how much time they spend in deletion? Have you observed how this has changed over time and have you introduced regression? Which phase should be improved first? These questions and many more can now be answered with new metrics.</p>
<p>The goal is to improve productivity and overall quality. Here, a new Prometheus instance has been deployed in the Prow cluster and dashboards for the new metrics provide nice insights.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://metal-stack.io/blog/2024/12-hack-the-garden#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://metal-stack.io/assets/images/attendees-6f21d04623cebf49b299edfa85285f3b.jpg" width="5263" height="3425" class="img_ev3q"></p>
<p>This hackathon was incredibly productive, we were able to tackle many challenges and connect with each other!
If you want to dig deeper into all these topics, have a look on the <a href="https://github.com/gardener-community/hackathon/tree/main/2024-12_Schelklingen" target="_blank" rel="noopener noreferrer" class="">Gardener Community Hackathon</a> repository.
We are already looking forward to the next <strong>Hack the Garden</strong>!</p>]]></content:encoded>
            <category>Kubernetes</category>
            <category>Gardener</category>
            <category>VPN</category>
            <category>Hackathon</category>
            <category>Events</category>
        </item>
        <item>
            <title><![CDATA[metal-stack v0.19.0 ✂️]]></title>
            <link>https://metal-stack.io/blog/2024/11-metal-stack-v0.19.0</link>
            <guid>https://metal-stack.io/blog/2024/11-metal-stack-v0.19.0</guid>
            <pubDate>Tue, 12 Nov 2024 09:30:00 GMT</pubDate>
            <description><![CDATA[We published metal-stack v0.19.0 with more features for isolated environments. Read on to learn more.]]></description>
            <content:encoded><![CDATA[<p>It's been a while since the last minor release of metal-stack. However, under the hood there has been more activity on our repository landscape than ever before. We had many new first-time contributors and we are really happy to see so much participation in our open source project. metal-stack <code>v0.19.0</code> contains a huge amount of updates, features and fixes, which you will learn about in this blog article.</p>
<ol>
<li class=""><a href="https://metal-stack.io/blog/2024/11-metal-stack-v0.19.0#running-metal-stack-in-offline-environments" class="">Running metal-stack in Offline Environments</a></li>
<li class=""><a href="https://metal-stack.io/blog/2024/11-metal-stack-v0.19.0#gardener-integration-from-version-181-to-197" class="">Gardener Integration From Version 1.81 to 1.97</a></li>
<li class=""><a href="https://metal-stack.io/blog/2024/11-metal-stack-v0.19.0#new-features-on-machine-sizes" class="">New Features on Machine Sizes</a></li>
<li class=""><a href="https://metal-stack.io/blog/2024/11-metal-stack-v0.19.0#encryption-of-backup-restore-sidecar-backups" class="">Encryption of backup-restore-sidecar backups</a></li>
<li class=""><a href="https://metal-stack.io/blog/2024/11-metal-stack-v0.19.0#migration-from-cumulus-to-sonic" class="">Migration From Cumulus to SONiC</a></li>
<li class=""><a href="https://metal-stack.io/blog/2024/11-metal-stack-v0.19.0#organizing-user-memberships-through-the-masterdata-api" class="">Organizing User Memberships Through the masterdata-api</a></li>
<li class=""><a href="https://metal-stack.io/blog/2024/11-metal-stack-v0.19.0#more-information" class="">More Information</a></li>
</ol>
<p>Check out the direct link to the release <a href="https://github.com/metal-stack/releases/releases/tag/v0.19.0" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="running-metal-stack-in-offline-environments">Running metal-stack in Offline Environments<a href="https://metal-stack.io/blog/2024/11-metal-stack-v0.19.0#running-metal-stack-in-offline-environments" class="hash-link" aria-label="Direct link to Running metal-stack in Offline Environments" title="Direct link to Running metal-stack in Offline Environments" translate="no">​</a></h2>
<p>Our users typically run metal-stack in regulated environments that have certain restrictions on internet connectivity. With our isolated clusters feature introduced in <a href="https://metal-stack.io/blog/2024/02/metal-stack-v0.17.0" target="_blank" rel="noopener noreferrer" class="">metal-stack v0.17.0</a>, we have ensured that machines do not need to ever reach the internet during the machine allocation time. We have now completed the same requirement for machines during their provisioning phase, theoretically allowing metal-stack to run in offline or air-gapped environments.</p>
<p>This has been made possible by providing configuration options for specifying DNS and NTP servers at all necessary locations in a metal-stack installation. Note that the problem of providing your own container registry, DNS provider and NTP servers is not solved by metal-stack and must be done manually. We have only removed hard-coded dependencies on internet resources.</p>
<p>The necessary changes were described in <a href="https://docs.metal-stack.io/stable/development/proposals/MEP14/README/" target="_blank" rel="noopener noreferrer" class="">MEP-14</a> and implemented by <a href="https://github.com/simcod" target="_blank" rel="noopener noreferrer" class="">@simcod</a>. 👏</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="gardener-integration-from-version-181-to-197">Gardener Integration From Version 1.81 to 1.97<a href="https://metal-stack.io/blog/2024/11-metal-stack-v0.19.0#gardener-integration-from-version-181-to-197" class="hash-link" aria-label="Direct link to Gardener Integration From Version 1.81 to 1.97" title="Direct link to Gardener Integration From Version 1.81 to 1.97" translate="no">​</a></h2>
<p>Primarily, metal-stack is designed for provisioning Kubernetes nodes. As a main cluster orchestrator, we recommend using metal-stack along with the power of <a href="https://gardener.cloud/" target="_blank" rel="noopener noreferrer" class="">Gardener</a>. The Gardener project has a biweekly release cycle, which forces our Gardener integrations to be updated, tested and released regularly.</p>
<p>To give you an idea, here is a list of changes that have been made along the way:</p>
<ul>
<li class="">Migration from the cloud-config-downloader to the Gardener Node Agent</li>
<li class="">Migration to the new audit extension called <a href="https://github.com/metal-stack/gardener-extension-audit" target="_blank" rel="noopener noreferrer" class="">gardener-extension-audit</a></li>
<li class="">Firewall auto updates through our <a href="https://github.com/metal-stack/firewall-controller-manager" target="_blank" rel="noopener noreferrer" class="">firewall-controller-manager</a></li>
<li class="">Offering K8s clusters up to version 1.30</li>
<li class="">Updating Calico and Cilium CNI extensions including new configuration options for both of them
<ul>
<li class="">Calico can now be run "kube-proxyless" utilizing eBPF and Direct Server Return (DSR)</li>
<li class="">Cilium can now leverage its own BGP load balancer capabilities such that MetalLB is not required anymore</li>
</ul>
</li>
<li class="">The <a href="https://github.com/stackitcloud/gardener-extension-acl" target="_blank" rel="noopener noreferrer" class="">gardener-exstension-acl</a> can now be used without static CIDR whitelisting to ensure connectivity between kube-apiserver and kubelets, outgoing source IPs are now dynamically configured</li>
</ul>
<p>We cannot emphasize enough our respect for the work that goes into the Gardener project, and we are very happy to announce that another Gardener Hackathon will take place in December of this year, in which the metal-stack team will once again participate. We look forward to seeing you all again guys. 😄</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-features-on-machine-sizes">New Features on Machine Sizes<a href="https://metal-stack.io/blog/2024/11-metal-stack-v0.19.0#new-features-on-machine-sizes" class="hash-link" aria-label="Direct link to New Features on Machine Sizes" title="Direct link to New Features on Machine Sizes" translate="no">​</a></h2>
<p>There are two notable new features for machine sizes.</p>
<p>First, it is now supported to match sizes against specific vendors/models of CPUs, GPUs, and disk types. This has been made possible by some improvements to our size matching algorithm in the metal-api, and by extending the hardware detection information reported by metal-hammer.</p>
<p>To match specific hardware, there is now an <code>identifier</code> field that can be used with glob pattern matching to select machines by their discovered hardware specifications. This can look like this:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> n2</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">medium</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">x86</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">constraints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cores</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  	</span><span class="token key atrule" style="color:#00a4db">identifier</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Intel Xeon Silver*"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">min</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">max</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gpu</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">min</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">max</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">identifier</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"H100*"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> storage</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">identifier</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/dev/nvme*"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">min</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ '800GB' | humanfriendly }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">max</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ '1000GB' | humanfriendly }}"</span><br></span></code></pre></div></div>
<p>We have also removed the restriction that only certain NVIDIA graphics cards could be used. There is no longer a restriction, so popular models like the H100 are now supported.</p>
<p>Second, we did another iteration on the size reservation API. Starting as an operator only feature, it is now possible to easily pass this feature to higher level APIs more easily. Reservations can now be selected by IDs and are included throughout the API, e.g. reservation counts are included in the partition capacity calculation. This is a nice feature when certain customers want to reserve machines in the datacenter without having to allocate them immediately.</p>
<p>In previous releases of metal-stack, the metal-api attempted to ensure size reservations and rack spreading (<a href="https://docs.metal-stack.io/stable/development/proposals/MEP12/README/" target="_blank" rel="noopener noreferrer" class="">MEP-12</a>) on a best effort basis. In the case of concurrency, it was possible for the metal-api to make non-ideal decisions for both of these features. Starting with this release, both features are now guaranteed to make the right decision for each allocation by serializing the machine allocations in the metal-api.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="encryption-of-backup-restore-sidecar-backups">Encryption of backup-restore-sidecar backups<a href="https://metal-stack.io/blog/2024/11-metal-stack-v0.19.0#encryption-of-backup-restore-sidecar-backups" class="hash-link" aria-label="Direct link to Encryption of backup-restore-sidecar backups" title="Direct link to Encryption of backup-restore-sidecar backups" translate="no">​</a></h2>
<p>Another mentionable feature for this release is the ability of our <a href="https://github.com/metal-stack/backup-restore-sidecar" target="_blank" rel="noopener noreferrer" class="">backup-restore-sidecar</a> to encrypt backups before uploading them to a backup provider. The used encryption algorithm for it is AES-256.</p>
<p>This work was implemented by our new colleague <a href="https://github.com/ostempel" target="_blank" rel="noopener noreferrer" class="">@ostempel</a>. Really glad to have you in the team and looking forward to see more soon! 😻</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="migration-from-cumulus-to-sonic">Migration From Cumulus to SONiC<a href="https://metal-stack.io/blog/2024/11-metal-stack-v0.19.0#migration-from-cumulus-to-sonic" class="hash-link" aria-label="Direct link to Migration From Cumulus to SONiC" title="Direct link to Migration From Cumulus to SONiC" translate="no">​</a></h2>
<p>Initially, metal-stack started with support for Cumulus Linux on network switches. Keep in mind that metal-stack is tightly integrated with the network to minimize management costs, provide the best possible performance, and ensure the availability and scalability of these components. After NVIDIA acquired Cumulus Linux, we decided to migrate our switch infrastructure to SONiC, an open source alternative that works better with metal-stack.</p>
<p>In order to migrate existing environments, we developed special migration commands to simplify the switch migration. It also allows the migration to occur without any downtime to the customer's production workload.</p>
<p>There is now a new command added to <a href="https://github.com/metal-stack/metalctl" target="_blank" rel="noopener noreferrer" class="">metalctl</a> called <code>switch migrate</code>. The general idea behind the migration flow is as follows</p>
<ul>
<li class="">Deploy the new switch through CI and <a href="https://github.com/metal-stack/metal-roles" target="_blank" rel="noopener noreferrer" class="">metal-roles</a> without connecting the machines.</li>
<li class="">The <a href="https://github.com/metal-stack/metal-core" target="_blank" rel="noopener noreferrer" class="">metal-core</a> will register with the metal-api as a new switch in the rack.</li>
<li class="">Now run <code>metalctl switch migrate</code> to copy the existing machine connections in the metal-api to the new switch, port mappings will be automatically translated from Cumulus to the SONiC naming scheme if necessary.</li>
<li class="">Cables can now be swapped out without downtime, as the machines are dual-connected to two switches by design.</li>
</ul>
<p>Much of this migration was designed and written by <a href="https://github.com/iljarotar" target="_blank" rel="noopener noreferrer" class="">@iljarotar</a>! ❤️</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="organizing-user-memberships-through-the-masterdata-api">Organizing User Memberships Through the masterdata-api<a href="https://metal-stack.io/blog/2024/11-metal-stack-v0.19.0#organizing-user-memberships-through-the-masterdata-api" class="hash-link" aria-label="Direct link to Organizing User Memberships Through the masterdata-api" title="Direct link to Organizing User Memberships Through the masterdata-api" translate="no">​</a></h2>
<p>The birth of <a href="https://metalstack.cloud/" target="_blank" rel="noopener noreferrer" class="">metalstack.cloud</a> - our hosted version of metal-stack - left some traces in our code base. With metalstack.cloud we implemented a multi-tenant API and UI for metal-stack, which required us to implement some user management.</p>
<p>Therefore we added new entities to the <a href="https://github.com/metal-stack/masterdata-api" target="_blank" rel="noopener noreferrer" class="">masterdata-api</a> called <code>ProjectMembership</code> and <code>TenantMembership</code>. With these entities it is now possible to create n:n relationships between users and their memberships within organizations and projects.</p>
<p>Check out metalstack.cloud if you haven't already and get a free trial. We host our infrastructure in Germany and are ISO 27001 certified. You can also ask us if you want to set up metalstack on-premises in your own datacenter and we will be happy to support you there if necessary.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-information">More Information<a href="https://metal-stack.io/blog/2024/11-metal-stack-v0.19.0#more-information" class="hash-link" aria-label="Direct link to More Information" title="Direct link to More Information" translate="no">​</a></h2>
<p>This is only a small extract of what went into our v0.19.0 release.</p>
<p>Please check out the <a href="https://github.com/metal-stack/releases/releases/tag/v0.19.0" target="_blank" rel="noopener noreferrer" class="">release notes</a> to find a full overview over every change that went part of this release.</p>
<p>As always, feel free to visit our Slack channel and ask if there are any questions. 😄</p>]]></content:encoded>
            <category>Release</category>
            <category>Kubernetes</category>
            <category>Network</category>
        </item>
        <item>
            <title><![CDATA[Hack the Garden again🔨]]></title>
            <link>https://metal-stack.io/blog/2024/12-hack-the-garden/03-hack-the-garden</link>
            <guid>https://metal-stack.io/blog/2024/12-hack-the-garden/03-hack-the-garden</guid>
            <pubDate>Fri, 17 May 2024 15:00:00 GMT</pubDate>
            <description><![CDATA[For the fifth time the people from different companies held the Gardener Hackathon to hack together]]></description>
            <content:encoded><![CDATA[<p>It was the fifth time that people from different companies came together to hack and improve the Gardener project.
With 17 participants, it was the biggest event yet.
Companies involved, besides the Gardener core team from <a href="https://sap.com/" target="_blank" rel="noopener noreferrer" class="">SAP</a>, <a href="https://stackit.de/" target="_blank" rel="noopener noreferrer" class="">STACKIT</a>, <a href="https://f-i-ts.de/" target="_blank" rel="noopener noreferrer" class="">FI-TS</a>, <a href="https://www.x-cellent.com/" target="_blank" rel="noopener noreferrer" class="">x-cellent technologies GmbH</a> and <a href="https://www.inovex.de/" target="_blank" rel="noopener noreferrer" class="">inovex</a>.</p>
<p>As last time, the event took place at <a href="https://schlosshof-info.de/" target="_blank" rel="noopener noreferrer" class="">Schlosshof</a> nearby Schelklingen.</p>
<p><img decoding="async" loading="lazy" src="https://metal-stack.io/assets/images/schlosshof-d93647fbb4368fbeb6ee50fab0127d87.jpg" width="800" height="599" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="preparation">Preparation<a href="https://metal-stack.io/blog/2024/12-hack-the-garden/03-hack-the-garden#preparation" class="hash-link" aria-label="Direct link to Preparation" title="Direct link to Preparation" translate="no">​</a></h2>
<p>Before we come together for the <em>Hack the Garden</em> event, we collect all the ideas which might be worth hacking on from the attendees. After that everyone votes for 3 topics he is interested in. The voting result are a good starting point. We also try to have people from different companies taking care of each topic to ensure the mixed knowledge will bring the best ideas.</p>
<p>The following sections contain a brief summary of the topics that we were working on. A fully detailed summary including all topics can be found in the <a href="https://github.com/gardener-community/hackathon/tree/main/2024-05_Schelklingen" target="_blank" rel="noopener noreferrer" class="">Gardener Community Hackathon Repo</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="topics">Topics<a href="https://metal-stack.io/blog/2024/12-hack-the-garden/03-hack-the-garden#topics" class="hash-link" aria-label="Direct link to Topics" title="Direct link to Topics" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="tailscale-vpn-access-to-the-kubernetes-api-server">Tailscale VPN Access to the Kubernetes API Server<a href="https://metal-stack.io/blog/2024/12-hack-the-garden/03-hack-the-garden#tailscale-vpn-access-to-the-kubernetes-api-server" class="hash-link" aria-label="Direct link to Tailscale VPN Access to the Kubernetes API Server" title="Direct link to Tailscale VPN Access to the Kubernetes API Server" translate="no">​</a></h3>
<p>A Shoot cluster created by Gardener can be secured with a <a href="https://github.com/stackitcloud/gardener-extension-acl" target="_blank" rel="noopener noreferrer" class="">Gardener ACL Extension</a> to restrict who can access the Kubernetes API Server by specifying an access control list which restricts the allowed Source IPs. This is fine for a lot of use cases. Though in some scenarios like working from home this does not work.</p>
<p>Here comes <a href="https://tailscale.com/" target="_blank" rel="noopener noreferrer" class="">Tailscale VPN</a> in handy. This is a very simple to use VPN, which is based on <a href="https://wireguard.com/" target="_blank" rel="noopener noreferrer" class="">Wireguard</a>. Tailscale already offers an Operator for Kubernetes which simplifies the setup for Kubernetes a lot.</p>
<p>With this, it was not necessary to implement something for Gardener to make this work, writing a How-To-Guide was enough.</p>
<p>And it has already been published: <a href="https://gardener.cloud/docs/guides/administer-shoots/tailscale/" target="_blank" rel="noopener noreferrer" class="">Tailscale for Kubernetes API Server</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vpn2">VPN2<a href="https://metal-stack.io/blog/2024/12-hack-the-garden/03-hack-the-garden#vpn2" class="hash-link" aria-label="Direct link to VPN2" title="Direct link to VPN2" translate="no">​</a></h3>
<p><a href="https://github.com/gardener/vpn2" target="_blank" rel="noopener noreferrer" class="">VPN2</a> is a critical component which enables the Kubernetes API Server in the control plane to talk to Pods and Services in the Shoot. This is done via an OpenVPN Server on the control plane side and an OpenVPN client on the Shoot. The logic to setup this VPN is mostly written in bash.</p>
<p>During the Hackathon several topics regarding VPN2 have been addressed:</p>
<ul>
<li class="">Rewrite of the whole setup logic in go <a href="https://github.com/gardener/vpn2/pull/84" target="_blank" rel="noopener noreferrer" class="">PR84</a></li>
<li class="">Use of IPv6 only as transfernetwork <a href="https://github.com/gardener/vpn2/pull/83" target="_blank" rel="noopener noreferrer" class="">PR83</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="node-agent">Node Agent<a href="https://metal-stack.io/blog/2024/12-hack-the-garden/03-hack-the-garden#node-agent" class="hash-link" aria-label="Direct link to Node Agent" title="Direct link to Node Agent" translate="no">​</a></h3>
<p>The node-agent replaced the former logic written in bash which is responsible to bootstrap and further manage the worker node since the last Gardener Hackathon.
As it is now a controller-runtime based operator, a lot of further improvements are possible.</p>
<p>One of the topics on the wishlist for the node-agent was to make its configuration more type safe. Up to now, the configuration is based on files and systemd units. This is problematic for configurations files where multiple parties want to ship modifications, e.g. the <code>containerd.toml</code> which requires modifications when a different container runtime should be used, a GPU is in the worker node or a Registry Mirror should be used.</p>
<p>To make such modifications possible without destroying the configuration of another requirement, a type safe configuration for the node-agent was introduced and some extensions where already converted to take advantage of this new feature.</p>
<p><a href="https://github.com/metal-stack/gardener/tree/enh.osc-api" target="_blank" rel="noopener noreferrer" class="">Branch</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="garden-local-setup">Garden Local Setup<a href="https://metal-stack.io/blog/2024/12-hack-the-garden/03-hack-the-garden#garden-local-setup" class="hash-link" aria-label="Direct link to Garden Local Setup" title="Direct link to Garden Local Setup" translate="no">​</a></h3>
<p>The garden local setup is critical for development, as it allows developers of gardener to run a whole setup with seed and shoot in a kind cluster on the laptop.
Since a few month, development of the gardener operator is ongoing. The gardener operator will simplify the installation of the garden cluster dramatically.
The gardener operator was not configured in the garden local setup to spin up the initial gardener components. During the hackathon this was achieved.</p>
<p><a href="https://github.com/gardener/gardener/pull/9763" target="_blank" rel="noopener noreferrer" class="">PR</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://metal-stack.io/blog/2024/12-hack-the-garden/03-hack-the-garden#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://metal-stack.io/assets/images/attendees-3c0016308f890b5c360e1e08aa732cd7.jpg" width="3366" height="1387" class="img_ev3q"></p>
<p>This was the second <strong>Hack the Garden</strong> Hackathon celebrated at the same location <a href="https://schlosshof-info.de/" target="_blank" rel="noopener noreferrer" class="">Schlosshof</a>, we all tend to keep this as our go-to location for the next ones.</p>]]></content:encoded>
            <category>Kubernetes</category>
            <category>Gardener</category>
            <category>Hackathon</category>
            <category>VPN</category>
            <category>Events</category>
        </item>
        <item>
            <title><![CDATA[metal-stack v0.18.0 🧠]]></title>
            <link>https://metal-stack.io/blog/2024/05-metal-stack-v0.18.0</link>
            <guid>https://metal-stack.io/blog/2024/05-metal-stack-v0.18.0</guid>
            <pubDate>Wed, 08 May 2024 09:30:00 GMT</pubDate>
            <description><![CDATA[In metal-stack v0.18.0 we introduced support for servers with GPUs. Read on to learn more.]]></description>
            <content:encoded><![CDATA[<p>With the latest rise of Large Language Models (LLMs) and generative AI technologies, we started facing a high demand for providing GPUs through metal-stack. In reaction to this trend, we added support for provisioning servers with graphic cards in metal-stack <code>v0.18.0</code>. Our solution for this is presented in this blog article.</p>
<ul>
<li class=""><a href="https://metal-stack.io/blog/2024/05-metal-stack-v0.18.0#support-for-graphic-cards" class="">Support for Graphic Cards</a></li>
<li class=""><a href="https://metal-stack.io/blog/2024/05-metal-stack-v0.18.0#switch-port-management" class="">Switch Port Management</a></li>
<li class=""><a href="https://metal-stack.io/blog/2024/05-metal-stack-v0.18.0#hello-ubuntu-2404" class="">Hello Ubuntu 24.04</a></li>
<li class=""><a href="https://metal-stack.io/blog/2024/05-metal-stack-v0.18.0#more-information" class="">More Information</a></li>
</ul>
<p>Check out the direct link to the release <a href="https://github.com/metal-stack/releases/releases/tag/v0.18.0" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-for-graphic-cards">Support for Graphic Cards<a href="https://metal-stack.io/blog/2024/05-metal-stack-v0.18.0#support-for-graphic-cards" class="hash-link" aria-label="Direct link to Support for Graphic Cards" title="Direct link to Support for Graphic Cards" translate="no">​</a></h2>
<p>Since ChatGPT everybody talks about AI and is looking for use-cases to utilize GPU-assisted processing in the own data center.</p>
<p>For metal-stack to support GPUs, we enabled the <a href="https://github.com/metal-stack/metal-hammer" target="_blank" rel="noopener noreferrer" class="">metal-hammer</a> to detect a server's installed graphic cards during machine discovery. The information reported by the metal-hammer for a server with installed graphic card may look like this:</p>
<div class="language-plain codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plain codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">❯ metactl machine describe cc37651f-a9ec-4b28-808d-2b78f4d4bfde</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">hardware:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  cpu_cores: 32</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  cpus:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - cores: 16</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    model: Intel(R) Xeon(R) Gold 6426Y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    threads: 32</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    vendor: GenuineIntel</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - cores: 16</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    model: Intel(R) Xeon(R) Gold 6426Y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    threads: 32</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    vendor: GenuineIntel</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  disks:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - name: /dev/nvme0n1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    size: 1600321314816</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - name: /dev/sda</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    size: 240057409536</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  gpus:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - model: AD102GL [RTX 6000 Ada Generation]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    vendor: NVIDIA Corporation</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  memory: 274877906944</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">...</span><br></span></code></pre></div></div>
<p>This specific hardware configuration of a server type can be matched to a dedicated machine size by the metal-api. For this to happen, the <code>size</code> API was extended to contain GPU type constraints. Coming with this release, a matching size can also be generated through <code>metalctl</code> (thanks to <a href="https://github.com/m1kepeter" target="_blank" rel="noopener noreferrer" class="">@m1kepeter</a> for this neat little feature!) using the <code>size suggest</code> command:</p>
<div class="language-plain codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plain codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">❯ metalctl size suggest g1-medium-x86 --machine-id cc37651f-a9ec-4b28-808d-2b78f4d4bfde</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">---</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">constraints:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- max: 32</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  min: 32</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  type: cores</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- max: 274877906944</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  min: 274877906944</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  type: memory</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- max: 1840378724352</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  min: 1840378724352</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  type: storage</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- identifier: AD102GL [RTX 6000 Ada Generation]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  max: 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  min: 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  type: gpu</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">id: g1-medium-x86</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">labels: {}</span><br></span></code></pre></div></div>
<p>The new <code>identifier</code> field also allows glob patterns to allow more variations.</p>
<p>After creating this size in the API, machines registering with the presented hardware configuration are successfully identified as <code>g1-medium-x86</code> type servers, ready for being allocated by the users.</p>
<p>In order to further optimize the user-experience, we decided to introduce a new OS image called <code>debian-nvidia-12</code>, which is based on our Debian-based operating system image. The new image additionally contains the proprietary graphic cards drivers and the CUDA toolkit from NVIDIA. When using a GPU-typed servers in a Kubernetes cluster, it is still necessary to run the NVIDIA operator in order to utilize the GPUs inside a Pod. However, there is no need to reboot a server before being able to utilize the GPUs inside a container. Further information about this can be found in our documentation <a href="https://docs.metal-stack.io/stable/overview/gpu-support/" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<p>Currently we only support the NVIDIA RTX series. It is not possible to have a mixed set of graphic cards inside a server. As soon as we can get our hands on more hardware, we will expand the support for more graphic cards and can probably also relax the constraint for mixed graphic cards inside a server.</p>
<p>This epic was driven by <a href="https://github.com/majst01" target="_blank" rel="noopener noreferrer" class="">@majst01</a>! 👏</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="switch-port-management">Switch Port Management<a href="https://metal-stack.io/blog/2024/05-metal-stack-v0.18.0#switch-port-management" class="hash-link" aria-label="Direct link to Switch Port Management" title="Direct link to Switch Port Management" translate="no">​</a></h2>
<p>With this metal-stack release it is possible to observe and change the link statuses on a switch through the metal-api. Despite this feature being handy for our own release integration in order to ensure BGP-failover scenarios work properly throughout every metal-stack release, this feature is also beneficial for operators to get a better overview over their switch hardware inside the data center partition.</p>
<p>The new API endpoints can be accessed through the <code>metalctl switch port</code> subcommand.</p>
<p>The <code>describe</code> command shows the actual state and the desired state for the switch port including the machine that's connected on the switch port:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">❯ metalctl switch port describe fra01-r01leaf01 </span><span class="token parameter variable" style="color:#36acaa">--port</span><span class="token plain"> swp1s0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">---</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">actual:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  machine_id: a44d5600-d332-11ec-8000-3cecefcda340</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  nic:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    actual: UP</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    identifier: </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    mac: 6c:9c:6a:4e:40:0b</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name: swp1s0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">desired:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  actual: UP</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  identifier: </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  mac: 6c:9c:6a:4e:40:0b</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  name: swp1s0</span><br></span></code></pre></div></div>
<p>The switch port can be toggled using the <code>switch port up</code> and <code>switch port down</code> commands. During the next sync the desired state is reconciled by our controller running on the leaf switch called <a href="https://github.com/metal-stack/metal-core" target="_blank" rel="noopener noreferrer" class="">metal-core</a>.</p>
<p>Unexpected down ports are reflected in the <code>switch list</code> and <code>switch connected-machines</code> view in order to quickly identify unexpected port states through the CLI.</p>
<p>This feature was developed by one of our original core developers of the metal-stack project, who lately re-joined our team. <a href="https://github.com/ulrichSchreiner" target="_blank" rel="noopener noreferrer" class="">@ulrichSchreiner</a>, we're glad to have you back! 😊</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hello-ubuntu-2404">Hello Ubuntu 24.04<a href="https://metal-stack.io/blog/2024/05-metal-stack-v0.18.0#hello-ubuntu-2404" class="hash-link" aria-label="Direct link to Hello Ubuntu 24.04" title="Direct link to Hello Ubuntu 24.04" translate="no">​</a></h2>
<p>We now provide new worker and firewall images based on the latest version of Ubuntu, which is 24.04 LTS. Please note that the 22.04 will not be maintained any longer.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-information">More Information<a href="https://metal-stack.io/blog/2024/05-metal-stack-v0.18.0#more-information" class="hash-link" aria-label="Direct link to More Information" title="Direct link to More Information" translate="no">​</a></h2>
<p>This is only a small extract of what went into our v0.18.0 release.</p>
<p>Please check out the <a href="https://github.com/metal-stack/releases/releases/tag/v0.18.0" target="_blank" rel="noopener noreferrer" class="">release notes</a> to find a full overview over every change that went part of this release.</p>
<p>As always, feel free to visit our Slack channel and ask if there are any questions. 😄</p>]]></content:encoded>
            <category>Release</category>
            <category>Kubernetes</category>
            <category>Network</category>
        </item>
        <item>
            <title><![CDATA[metal-stack v0.17.0 ☔]]></title>
            <link>https://metal-stack.io/blog/2024/02-metal-stack-v0.17.0</link>
            <guid>https://metal-stack.io/blog/2024/02-metal-stack-v0.17.0</guid>
            <pubDate>Thu, 08 Feb 2024 09:30:00 GMT</pubDate>
            <description><![CDATA[In this release metal-stack implemented support for Kubernetes cluster isolation. Read on to learn what this feature is about.]]></description>
            <content:encoded><![CDATA[<p>The <code>v0.17.0</code> release presents an interesting feature for users who want to be able to benefit from Kubernetes while having to fulfill strict regulatory requirements. We call this feature cluster isolation. Read on to learn what it is and how it works.</p>
<ul>
<li class=""><a href="https://metal-stack.io/blog/2024/02-metal-stack-v0.17.0#whats-cluster-isolation" class="">What's Cluster Isolation?</a>
<ul>
<li class=""><a href="https://metal-stack.io/blog/2024/02-metal-stack-v0.17.0#how-does-it-work" class="">How Does it Work?</a></li>
</ul>
</li>
<li class=""><a href="https://metal-stack.io/blog/2024/02-metal-stack-v0.17.0#timescaledb-update-support-for-backup-restore-sidecar" class="">TimescaleDB Update Support for backup-restore-sidecar</a></li>
<li class=""><a href="https://metal-stack.io/blog/2024/02-metal-stack-v0.17.0#more-information" class="">More Information</a></li>
</ul>
<p>Check out the direct link to the release <a href="https://github.com/metal-stack/releases/releases/tag/v0.17.0" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-cluster-isolation">What's Cluster Isolation?<a href="https://metal-stack.io/blog/2024/02-metal-stack-v0.17.0#whats-cluster-isolation" class="hash-link" aria-label="Direct link to What's Cluster Isolation?" title="Direct link to What's Cluster Isolation?" translate="no">​</a></h2>
<p>For certain users it is a strict requirement that servers never face the public internet. In the world of geo-distributed, cloud-driven container workloads this scenario is rarely looked at because usually users assume that applications come from publicly reachable container registries and external services are consumable from inside our Kubernetes cluster at any times, be it DNS, NTP or Let's Encrypt certificate management.</p>
<p>To minimize the burden to move to Kubernetes for those users that require to avoid a connection to the internet as much as possible, we came up with the design for cluster isolation. The solution adds restrictions on external network connectivity to firewalls, effectively preventing the situation that a cluster worker node ever sees a connection to the internet.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-does-it-work">How Does it Work?<a href="https://metal-stack.io/blog/2024/02-metal-stack-v0.17.0#how-does-it-work" class="hash-link" aria-label="Direct link to How Does it Work?" title="Direct link to How Does it Work?" translate="no">​</a></h3>
<p>This is how it works:</p>
<ul>
<li class="">The new <a href="https://github.com/metal-stack/oci-mirror" target="_blank" rel="noopener noreferrer" class="">oci-mirror</a> project gives an easy possibility to specify container images that an operator wants to mirror to another registry.</li>
<li class="">The operator now provides a private registry, DNS and NTP servers residing inside the data center partition.</li>
<li class="">The private container registry contains the minimal set of images required to spin up a Kubernetes worker node (e.g. the Calico CNI images).</li>
<li class="">The firewall now drops the entire traffic from the private node network by default as long as the firewall-controller is not connected to its control plane in the seed cluster.</li>
<li class="">As soon as the firewall-controller has connected, it opens the connections to the partition-specific container registry, DNS and NTP servers.</li>
<li class="">The worker node will then be able bootstrap, the container runtime is configured to pull the mirrored images from the private registry.</li>
</ul>
<p>From there we offer two different flavors of cluster isolation, one that is called <code>restricted</code> and one that is called <code>forbidden</code>.</p>
<p>For clusters of type <code>forbidden</code> there is no possibility for users to effectively deploy ingress or egress <code>ClusterwideNetworkPolicy</code> resources (CWNPs) that would open connections outside of operator-provided network ranges. This way, the operator can prevent connectivity to the internet or other external networks. Also, services of type load balancer do not acquire IP addresses for services to these external networks as the connection to the service is not being allowed by the firewall-controller anyway.</p>
<p>This also implies that the user needs to provide own private registries that reside inside private networks attached to the cluster. Otherwise it is not possible to deploy any applications to the cluster.</p>
<p>For <code>restricted</code> clusters, the responsibility is handed over to the user to open up external network connections through CWNPs, which for us is the compromise between a non-isolated cluster (we call this <code>baseline</code>) and <code>forbidden</code> mode.</p>
<p>With this feature we are starting to deprecate DMZ-clusters as proposed in <a href="https://docs.metal-stack.io/stable/development/proposals/MEP6/README/" target="_blank" rel="noopener noreferrer" class="">MEP-6</a> and planning to remove the <code>RestrictEgress</code> feature gate from our metal-stack shoot specification. The new cluster isolation approach replaces both these ideas from the past.</p>
<p>Full documentation of cluster isolation feature can be found in our <a href="https://docs.metal-stack.io/v0.17/overview/isolated-kubernetes/" target="_blank" rel="noopener noreferrer" class="">docs</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="timescaledb-update-support-for-backup-restore-sidecar">TimescaleDB Update Support for backup-restore-sidecar<a href="https://metal-stack.io/blog/2024/02-metal-stack-v0.17.0#timescaledb-update-support-for-backup-restore-sidecar" class="hash-link" aria-label="Direct link to TimescaleDB Update Support for backup-restore-sidecar" title="Direct link to TimescaleDB Update Support for backup-restore-sidecar" translate="no">​</a></h2>
<p>In our landscape we use the <a href="https://github.com/metal-stack/backup-restore-sidecar/" target="_blank" rel="noopener noreferrer" class="">backup-restore-sidecar</a> in combination with the popular TimescaleDB extension for Postgres. Even though the backup-restore-sidecar already supports easy upgrades for standalone Postgres instances running in Kubernetes, we struggled updating databases that utilize the TimescaleDB extension.</p>
<p>We were able to identify the problems in the upgrade process and can now also support raising Postgres versions for databases that use the TimescaleDB extension. 😇</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-information">More Information<a href="https://metal-stack.io/blog/2024/02-metal-stack-v0.17.0#more-information" class="hash-link" aria-label="Direct link to More Information" title="Direct link to More Information" translate="no">​</a></h2>
<p>This is only a small extract of what went into our v0.17.0 release.</p>
<p>Please check out the <a href="https://github.com/metal-stack/releases/releases/tag/v0.17.0" target="_blank" rel="noopener noreferrer" class="">release notes</a> to find a full overview over every change that went part of this release.</p>
<p>As always, feel free to visit our Slack channel and ask if there are any questions. 😄</p>]]></content:encoded>
            <category>Release</category>
            <category>Kubernetes</category>
            <category>Network</category>
        </item>
        <item>
            <title><![CDATA[metal-stack v0.16.0 🎆]]></title>
            <link>https://metal-stack.io/blog/2024/01-metal-stack-v0.16.0</link>
            <guid>https://metal-stack.io/blog/2024/01-metal-stack-v0.16.0</guid>
            <pubDate>Thu, 11 Jan 2024 08:00:00 GMT</pubDate>
            <description><![CDATA[The New Year's release contains a ton of updates. Read about it in this blog article.]]></description>
            <content:encoded><![CDATA[<p>Happy New Year everyone! In this post we are gonna present the first metal-stack release of 2024, which is <code>v0.16.0</code>. 😺</p>
<ul>
<li class=""><a href="https://metal-stack.io/blog/2024/01-metal-stack-v0.16.0#machine-size-reservations" class="">Machine Size Reservations</a></li>
<li class=""><a href="https://metal-stack.io/blog/2024/01-metal-stack-v0.16.0#gardener-compatibility-to-v173" class="">Gardener Compatibility to v1.73</a></li>
<li class=""><a href="https://metal-stack.io/blog/2024/01-metal-stack-v0.16.0#birth-of-gardener-extension-audit" class="">Birth of gardener-extension-audit</a></li>
<li class=""><a href="https://metal-stack.io/blog/2024/01-metal-stack-v0.16.0#backup-restore-sidecar-support-for-meilisearch" class="">backup-restore-sidecar support for Meilisearch</a></li>
<li class=""><a href="https://metal-stack.io/blog/2024/01-metal-stack-v0.16.0#more-information" class="">More Information</a></li>
</ul>
<p>Check out the direct link to the release <a href="https://github.com/metal-stack/releases/releases/tag/v0.16.0" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="machine-size-reservations">Machine Size Reservations<a href="https://metal-stack.io/blog/2024/01-metal-stack-v0.16.0#machine-size-reservations" class="hash-link" aria-label="Direct link to Machine Size Reservations" title="Direct link to Machine Size Reservations" translate="no">​</a></h2>
<p>When a metal-stack partition runs out of machines some unpleasant scenarios can arise: For example when the operator who maintains the metal-stack infrastructure needs to replace a machine that runs another crucial infrastructure service for the cloud platform. When other users allocated all the available compute resources already, you get stuck as an operator. For these cases it would be great to reserve some spare machines, which other projects cannot allocate. This is now possible with size reservations.</p>
<p>The reservation can now be added to the size entity, which may look like this:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">❯ metalctl size describe n1-medium-x86</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">---</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">id: n1-medium-x86</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">labels:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  size.metal-stack.io/cpu-description: 1x Intel</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">R</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> Xeon</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">R</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> D-2141I CPU @ </span><span class="token number" style="color:#36acaa">2</span><span class="token plain">.20GHz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  size.metal-stack.io/drive-description: 960GB NVMe</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">name: n1-medium-x86</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">reservations:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- amount: </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  description: Keep machines </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> firewall updates</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  partitionids:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - fra-equ01</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  projectid: 55a2f43f-d297-4cdf-990d-ff042e001f58</span><br></span></code></pre></div></div>
<p>This configuration will ensure that three machines of the size <code>n1-medium-x86</code> are kept for allocation of project <code>55a2f43f-d297-4cdf-990d-ff042e001f58</code> in the partition with the ID <code>fra-equ01</code>. There is also the possibility to show an overview over all size reservations:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">❯ metalctl size reservations list</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PARTITION   SIZE            TENANT       PROJECT                                PROJECT NAME             USED/AMOUNT   PROJECT ALLOCATIONS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fra-equ01   c1-xlarge-x86   metal-stack  55a2f43f-d297-4cdf-990d-ff042e001f58   gardener-seeds-workers   </span><span class="token number" style="color:#36acaa">4</span><span class="token plain">/8           </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fra-equ01   n1-medium-x86   metal-stack  55a2f43f-d297-4cdf-990d-ff042e001f58   seed-firewalls           </span><span class="token number" style="color:#36acaa">1</span><span class="token plain">/2           </span><span class="token number" style="color:#36acaa">1</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="gardener-compatibility-to-v173">Gardener Compatibility to v1.73<a href="https://metal-stack.io/blog/2024/01-metal-stack-v0.16.0#gardener-compatibility-to-v173" class="hash-link" aria-label="Direct link to Gardener Compatibility to v1.73" title="Direct link to Gardener Compatibility to v1.73" translate="no">​</a></h2>
<p>During the lifecycle of the last metal-stack release, we primarily focused on catching up with our Gardener integration. This is tough as we need to cycle through every version, understand the changes for this release and make necessary adjustments to our self-maintained controllers, integration test all our components and finally update our production landscapes with hundreds of Kubernetes clusters to the new version. Within the last four months we were able to catch up 13 minor versions of Gardener, which is a huge step for all platform users enabling support for Kubernetes cluster up to 1.27.</p>
<p>We will continue this effort in order to make all metal-stack users benefit from most up-to-date versions of Gardener and Kubernetes as soon as possible.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="birth-of-gardener-extension-audit">Birth of gardener-extension-audit<a href="https://metal-stack.io/blog/2024/01-metal-stack-v0.16.0#birth-of-gardener-extension-audit" class="hash-link" aria-label="Direct link to Birth of gardener-extension-audit" title="Direct link to Birth of gardener-extension-audit" translate="no">​</a></h2>
<p>During the last <a href="https://metal-stack.io/blog/2023/11/hack-the-garden/" target="_blank" rel="noopener noreferrer" class="">Gardener Hackathon</a> in Schelklingen we started with a new Gardener extension called <a href="https://github.com/metal-stack/gardener-extension-audit" target="_blank" rel="noopener noreferrer" class="">gardener-extension-audit</a>. As the name already suggests this extension is intended for shipping the audit logs of the shoot's kube-apiserver instances which reside in the Gardener seed cluster. Somehow it seems that within the community everybody started with an own, closed-source solution for this problem. With this extension we want to offer a publicly available solution to tackle the problem of shipping API server audit logs.</p>
<p>The extension deploys a buffering sink based on fluent-bit, which is receiving the audit logs through the webhook configuration from the kube-apiserver instances. From there, audit logs are carried further to a user-configured destination.</p>
<p>The extension is still under development but we already started to use it in our production landscapes as it is way superior to our previous solutions which were directly integrated into the <a href="https://github.com/metal-stack/gardener-extension-provider-metal" target="_blank" rel="noopener noreferrer" class="">gardener-extension-provider-metal#</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="backup-restore-sidecar-support-for-meilisearch">backup-restore-sidecar support for Meilisearch<a href="https://metal-stack.io/blog/2024/01-metal-stack-v0.16.0#backup-restore-sidecar-support-for-meilisearch" class="hash-link" aria-label="Direct link to backup-restore-sidecar support for Meilisearch" title="Direct link to backup-restore-sidecar support for Meilisearch" translate="no">​</a></h2>
<p>As our metal-api audit traces are stored in Meilisearch, we extended the support for this database in the <a href="https://github.com/metal-stack/backup-restore-sidecar" target="_blank" rel="noopener noreferrer" class="">backup-restore-sidecar</a> project. Just like for Postgres, we additionally implemented the <code>Update</code> interface, such that updating Meilisearch becomes as easy as deploying the newer container image in the <code>StatefulSet</code> definition.</p>
<p>For this to be possible, the backup-restore-sidecar preserves the current version's binary in its data directory. When the sidecar starts up with a newer version of Meilisearch, the sidecar detects the upcoming version mismatch and begins to dump the data with the old preserved binary into the dedicated backup directory. After that it spawns a process with the new database version and restores the dump into it. As soon as the data was migrated to the new version successfully, the actual Meilisearch container will start up and take over the data from there.</p>
<p>Because this project is so important for meltdown scenarios, we now provided integration tests directly inside the project. The tests transparently proof that the entire backup-restore functionality works with every new commit from now on. The tests can be run easily through Go tests against a <code>kind</code> cluster. Even the deployment example manifests are now generated through the integration tests to make sure manifests are always up-to-date and can be adopted easily by the community.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-information">More Information<a href="https://metal-stack.io/blog/2024/01-metal-stack-v0.16.0#more-information" class="hash-link" aria-label="Direct link to More Information" title="Direct link to More Information" translate="no">​</a></h2>
<p>This is only a small extract of what went into our v0.16.0 release.</p>
<p>Please check out the <a href="https://github.com/metal-stack/releases/releases/tag/v0.16.0" target="_blank" rel="noopener noreferrer" class="">release notes</a> to find a full overview over every change that went part of this release.</p>
<p>As always, feel free to visit our Slack channel and ask if there are any questions. 😄</p>]]></content:encoded>
            <category>Release</category>
            <category>Kubernetes</category>
            <category>Network</category>
        </item>
        <item>
            <title><![CDATA[Hack the Garden again🔨]]></title>
            <link>https://metal-stack.io/blog/2023/11-hack-the-garden</link>
            <guid>https://metal-stack.io/blog/2023/11-hack-the-garden</guid>
            <pubDate>Fri, 10 Nov 2023 06:00:00 GMT</pubDate>
            <description><![CDATA[Four companies using the Gardener project a lot came together for a week for fun and better software]]></description>
            <content:encoded><![CDATA[<p>It has already become a regular event to come together every six months to hack and improve the Gardener Project.
This time it was the fourth time this <em>Hack the Garden</em> event took place. Everybody who was participating one of the previous events was keen to join the next.</p>
<p>This time attendees from four different companies joined. Obviously, the Gardener core and onmetal team from <a href="https://sap.com/" target="_blank" rel="noopener noreferrer" class="">SAP</a>, but also from <a href="https://stackit.de/" target="_blank" rel="noopener noreferrer" class="">STACKIT</a>, <a href="https://f-i-ts.de/" target="_blank" rel="noopener noreferrer" class="">FI-TS</a> and <a href="https://www.x-cellent.com/" target="_blank" rel="noopener noreferrer" class="">x-cellent technologies GmbH</a>.</p>
<p>The event took place in the heart of the <em>Swabian Alb</em> nearby Schelklingen at <a href="https://schlosshof-info.de/" target="_blank" rel="noopener noreferrer" class="">Schlosshof</a>.</p>
<p><img decoding="async" loading="lazy" src="https://metal-stack.io/assets/images/schlosshof-d93647fbb4368fbeb6ee50fab0127d87.jpg" width="800" height="599" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="preparation">Preparation<a href="https://metal-stack.io/blog/2023/11-hack-the-garden#preparation" class="hash-link" aria-label="Direct link to Preparation" title="Direct link to Preparation" translate="no">​</a></h2>
<p>Before we come together for the <em>Hack the Garden</em> event, we collect all the ideas which might be worth hacking on from the attendees. After that everyone votes for 3 topics he is interested in. The voting result are a good starting point. We also try to have people from different companies taking care of each topic to ensure the mixed knowledge will bring the best ideas.</p>
<p>The following sections contain a brief summary of the topics that we were working on. A fully detailed summary can be found in the <a href="https://github.com/gardener-community/hackathon/tree/main/2023-11_Schelklingen" target="_blank" rel="noopener noreferrer" class="">Gardener Community Hackathon Repo</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="topics">Topics<a href="https://metal-stack.io/blog/2023/11-hack-the-garden#topics" class="hash-link" aria-label="Direct link to Topics" title="Direct link to Topics" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="generic-extension-for-shoot-cluster-audit-logs">Generic Extension For Shoot Cluster Audit Logs<a href="https://metal-stack.io/blog/2023/11-hack-the-garden#generic-extension-for-shoot-cluster-audit-logs" class="hash-link" aria-label="Direct link to Generic Extension For Shoot Cluster Audit Logs" title="Direct link to Generic Extension For Shoot Cluster Audit Logs" translate="no">​</a></h3>
<p>Audit logs of shoot clusters need to be managed outside of Gardener (no built-in/out-of-the-box solution available). Every community member has developed their own closed-source implementations of an audit log extension.</p>
<p>A new design has been proposed for reworking the existing implementation (contributed by x-cellent) to be more reliable and reusable: A new StatefulSet is added to the shoot control plane that can receive the API server's audit logs via an audit webhook. The webhook backend's logs can be collected via fluent-bit and transported to a desired sink from there. The backend basically acts as an audit log buffer. The first steps for implementing the new design were finished and collecting the audit logs in the buffer works.</p>
<p>Code: <a href="https://github.com/metal-stack/gardener-extension-audit" target="_blank" rel="noopener noreferrer" class="">Gardener Extension Audit</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="stop-vendoring-third-party-code-in-vendor-folder">Stop Vendoring Third-Party Code In vendor Folder<a href="https://metal-stack.io/blog/2023/11-hack-the-garden#stop-vendoring-third-party-code-in-vendor-folder" class="hash-link" aria-label="Direct link to Stop Vendoring Third-Party Code In vendor Folder" title="Direct link to Stop Vendoring Third-Party Code In vendor Folder" translate="no">​</a></h3>
<p>The vendor folder in the root of Go modules contains a copy of all third-party code the module depends on. This blows up the repository and source code releases, makes reviewing pull requests harder because many different files are changed, and creates merge conflicts for many files when both master and a PR change dependencies. Committing the vendor folder to version control systems is discouraged with newer versions of Golang.</p>
<p>This is already merged into the <code>master</code> branch of Gardener.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="make-acl-extension-production-ready">Make ACL Extension Production-Ready<a href="https://metal-stack.io/blog/2023/11-hack-the-garden#make-acl-extension-production-ready" class="hash-link" aria-label="Direct link to Make ACL Extension Production-Ready" title="Direct link to Make ACL Extension Production-Ready" translate="no">​</a></h3>
<p>The ACL extension for restricting shoot cluster API server access via IP allow-lists only had support for the OpenStack infrastructure and single istio-ingressgateways (i.e., it did neither support HA control planes nor the ExposureClass feature of Gardener).</p>
<p>Code: <a href="https://github.com/stackitcloud/gardener-extension-acl" target="_blank" rel="noopener noreferrer" class="">Gardener Extension ACL</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="discussion-air-gapped-shoot-clusters">Discussion: Air-Gapped Shoot Clusters<a href="https://metal-stack.io/blog/2023/11-hack-the-garden#discussion-air-gapped-shoot-clusters" class="hash-link" aria-label="Direct link to Discussion: Air-Gapped Shoot Clusters" title="Direct link to Discussion: Air-Gapped Shoot Clusters" translate="no">​</a></h3>
<p>Customers are interested in limiting internet access for shoot clusters. Today, the clusters need access to the internet by default for bootstrapping nodes, pulling images from the container registry, resolving DNS names, etc.</p>
<p>Ideas and the underlying problems were discussed. The conclusion is that it would be possible to achieve restricting internet access by hosting a container registry with the required images, and by either running the seed cluster in a restricted environment or by explicitly allow-listing the access to the seed networks. Overall, the concrete goals of the interested customers are not perfectly clear yet.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://metal-stack.io/blog/2023/11-hack-the-garden#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://metal-stack.io/assets/images/attendees-7afd7c7999c86e7d2ff789e63a618668.jpg" width="3397" height="1644" class="img_ev3q"></p>
<p>It is getting a tradition to celebrate this <em>Hack the Garden</em> event, which everyone enjoys and benefits from. I am sure we will continue this for the foreseeable future, maybe even twice a year as before. We are all sure that the amount of progress and good ideas is not possible for one party alone. It is collaboration in its purest form and best sense. This is also why the idea of <em>Open Source</em> works, and we all are strong believers in this form of software development.</p>]]></content:encoded>
            <category>Kubernetes</category>
            <category>Gardener</category>
            <category>Scalability</category>
            <category>Hackathon</category>
        </item>
        <item>
            <title><![CDATA[A Private Cloud That Developers Like (cloudahead.de Interview, German)]]></title>
            <link>https://metal-stack.io/blog/2023/08-private-clouds-interview</link>
            <guid>https://metal-stack.io/blog/2023/08-private-clouds-interview</guid>
            <pubDate>Mon, 28 Aug 2023 07:30:00 GMT</pubDate>
            <description><![CDATA[Our lead engineer [@majst01](https://github.com/majst01) lately had the opportunity to get interviewed by Gregor Schumacher, a German blogger and author of [cloudahead.de](https://www.cloudahead.de/).]]></description>
            <content:encoded><![CDATA[<p>Our lead engineer <a href="https://github.com/majst01" target="_blank" rel="noopener noreferrer" class="">@majst01</a> lately had the opportunity to get interviewed by Gregor Schumacher, a German blogger and author of <a href="https://www.cloudahead.de/" target="_blank" rel="noopener noreferrer" class="">cloudahead.de</a>. It touches topics such as open-source, data sovereignty and, of course, metal-stack. Thanks for talking about these vast topics. 💪</p>
<p>The interview is in German, you can find it <a href="https://www.cloudahead.de/eine-private-cloud-die-entwickler-moegen" target="_blank" rel="noopener noreferrer" class="">here</a>:</p>
<a href="https://www.cloudahead.de/eine-private-cloud-die-entwickler-moegen" target="_blank" rel="noopener noreferrer" class="">
    <img decoding="async" loading="lazy" src="https://www.cloudahead.de/wp-content/uploads/Stefan-Majer-Interview-Titelbild-20230723.jpg" alt="interview" width="100%" class="img_ev3q">
</a>]]></content:encoded>
            <category>Architecture</category>
            <category>Infrastructure</category>
            <category>Kubernetes</category>
            <category>Network</category>
        </item>
    </channel>
</rss>