<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>RKE2 the Hard Way on Support Tools</title><link>https://support.tools/training/rke2-hard-way/</link><description>Recent content in RKE2 the Hard Way on Support Tools</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Tue, 01 Apr 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://support.tools/training/rke2-hard-way/index.xml" rel="self" type="application/rss+xml"/><item><title>RKE2 the Hard Way: Part 1 – Introduction and Prerequisites for Building a Kubernetes Cluster</title><link>https://support.tools/training/rke2-hard-way/01-introduction-prerequisites/</link><pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate><guid>https://support.tools/training/rke2-hard-way/01-introduction-prerequisites/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;Welcome to the &lt;strong&gt;&amp;ldquo;RKE2 the Hard Way&amp;rdquo;&lt;/strong&gt; training series! In this series, we’ll embark on a journey to build a Kubernetes cluster from scratch—mimicking the robust features of Rancher Kubernetes Engine 2 (RKE2)—without relying on any distribution-specific tools or installers.&lt;/p&gt;&#10;&lt;p&gt;It&amp;rsquo;s called the &lt;em&gt;&amp;ldquo;hard way&amp;rdquo;&lt;/em&gt; because we&amp;rsquo;ll manually configure and set up each component of the Kubernetes cluster. This approach is designed to provide a deep understanding of how Kubernetes works under the hood and to highlight the automation and simplification RKE2 provides.&lt;/p&gt;</description></item><item><title>RKE2 the Hard Way: Part 10 – Installing Ingress Nginx</title><link>https://support.tools/training/rke2-hard-way/10-installing-ingress-nginx/</link><pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate><guid>https://support.tools/training/rke2-hard-way/10-installing-ingress-nginx/</guid><description>&lt;h2 id="part-10--installing-ingress-nginx"&gt;Part 10 – Installing Ingress Nginx&lt;/h2&gt;&#10;&lt;p&gt;In this part of the &lt;strong&gt;&amp;ldquo;RKE2 the Hard Way&amp;rdquo;&lt;/strong&gt; training series, we will install and configure &lt;strong&gt;Ingress Nginx&lt;/strong&gt; for external access to services in our Kubernetes cluster. Ingress Nginx is a popular ingress controller for Kubernetes that uses NGINX as a reverse proxy and load balancer.&lt;/p&gt;&#10;&lt;p&gt;An ingress controller is essential because it:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Provides a single entry point to multiple services in your cluster&lt;/li&gt;&#10;&lt;li&gt;Handles SSL/TLS termination for your services&lt;/li&gt;&#10;&lt;li&gt;Enables host-based and path-based routing to backend services&lt;/li&gt;&#10;&lt;li&gt;Allows you to expose applications to the outside world without creating a LoadBalancer service for each one&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;At this point in our series, we have:&lt;/p&gt;</description></item><item><title>RKE2 the Hard Way: Part 11 – Cluster Verification and Access</title><link>https://support.tools/training/rke2-hard-way/11-cluster-verification-and-access/</link><pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate><guid>https://support.tools/training/rke2-hard-way/11-cluster-verification-and-access/</guid><description>&lt;h2 id="part-11--cluster-verification-and-access"&gt;Part 11 – Cluster Verification and Access&lt;/h2&gt;&#10;&lt;p&gt;Congratulations! You&amp;rsquo;ve reached the final part of the &lt;strong&gt;&amp;ldquo;RKE2 the Hard Way&amp;rdquo;&lt;/strong&gt; training series. At this point, we have:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Set up containerd and kubelet on all nodes&lt;/li&gt;&#10;&lt;li&gt;Generated all the necessary TLS certificates&lt;/li&gt;&#10;&lt;li&gt;Deployed etcd, kube-apiserver, kube-controller-manager, and kube-scheduler as static pods&lt;/li&gt;&#10;&lt;li&gt;Configured kubelet and kube-proxy on worker nodes&lt;/li&gt;&#10;&lt;li&gt;Installed Cilium CNI for pod networking&lt;/li&gt;&#10;&lt;li&gt;Deployed CoreDNS for cluster DNS resolution&lt;/li&gt;&#10;&lt;li&gt;Installed Ingress Nginx for external access&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Now, let&amp;rsquo;s verify that everything is working correctly and set up kubectl for convenient cluster access.&lt;/p&gt;</description></item><item><title>RKE2 the Hard Way: Part 2 – Certificate Authority and TLS Certificates</title><link>https://support.tools/training/rke2-hard-way/02-certificate-authority-tls-certificates/</link><pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate><guid>https://support.tools/training/rke2-hard-way/02-certificate-authority-tls-certificates/</guid><description>&lt;h2 id="part-2--certificate-authority-and-tls-certificates"&gt;Part 2 – Certificate Authority and TLS Certificates&lt;/h2&gt;&#10;&lt;p&gt;In this part of the &lt;strong&gt;&amp;ldquo;RKE2 the Hard Way&amp;rdquo;&lt;/strong&gt; training series, we will set up our own &lt;strong&gt;Certificate Authority (CA)&lt;/strong&gt; and generate the necessary &lt;strong&gt;TLS certificates&lt;/strong&gt; for securing our Kubernetes cluster. Kubernetes components communicate over TLS, and properly configured certificates are crucial for cluster security.&lt;/p&gt;&#10;&lt;p&gt;We&amp;rsquo;ll use &lt;a href="https://github.com/cloudflare/cfssl"&gt;&lt;code&gt;cfssl&lt;/code&gt;&lt;/a&gt;, Cloudflare&amp;rsquo;s TLS toolkit, to create our CA and generate certificates.&lt;/p&gt;&#10;&lt;blockquote&gt;&lt;p&gt;✅ &lt;strong&gt;Assumption:&lt;/strong&gt; All commands in this guide are run from &lt;code&gt;node01&lt;/code&gt;, which is a Linux box.&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>RKE2 the Hard Way: Part 3 – Setting up containerd and kubelet</title><link>https://support.tools/training/rke2-hard-way/03-setting-up-containerd-and-kubelet/</link><pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate><guid>https://support.tools/training/rke2-hard-way/03-setting-up-containerd-and-kubelet/</guid><description>&lt;h2 id="part-3--setting-up-containerd-and-kubelet"&gt;Part 3 – Setting up containerd and kubelet&lt;/h2&gt;&#10;&lt;p&gt;In this part of the &lt;strong&gt;&amp;ldquo;RKE2 the Hard Way&amp;rdquo;&lt;/strong&gt; training series, we will install and configure &lt;strong&gt;containerd&lt;/strong&gt; (the container runtime) and &lt;strong&gt;kubelet&lt;/strong&gt; (the Kubernetes node agent) on all our nodes. These components form the foundation of our Kubernetes cluster.&lt;/p&gt;&#10;&lt;p&gt;One of the key design decisions in RKE2 is to run the Kubernetes control plane components (etcd, kube-apiserver, kube-controller-manager, and kube-scheduler) as static pods managed by kubelet, rather than as systemd services. This approach simplifies deployment and maintenance, as kubelet manages the lifecycle of these critical components.&lt;/p&gt;</description></item><item><title>RKE2 the Hard Way: Part 4 – Setting up etcd Cluster as Static Pods</title><link>https://support.tools/training/rke2-hard-way/04-setting-up-etcd-cluster/</link><pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate><guid>https://support.tools/training/rke2-hard-way/04-setting-up-etcd-cluster/</guid><description>&lt;h2 id="part-4--setting-up-etcd-cluster-as-static-pods"&gt;Part 4 – Setting up etcd Cluster as Static Pods&lt;/h2&gt;&#10;&lt;p&gt;In this part of the &lt;strong&gt;&amp;ldquo;RKE2 the Hard Way&amp;rdquo;&lt;/strong&gt; training series, we will set up &lt;strong&gt;etcd&lt;/strong&gt; as a clustered key-value store using &lt;strong&gt;static pods&lt;/strong&gt; managed by kubelet. etcd is a consistent and highly-available key-value store used by Kubernetes to store all cluster data, including the state of the cluster, configuration data, and metadata.&lt;/p&gt;&#10;&lt;p&gt;In RKE2, etcd is deployed as a static pod managed by kubelet, instead of running directly as a systemd service. This makes it easier to manage, as kubelet handles lifecycle operations, restarts, and monitoring.&lt;/p&gt;</description></item><item><title>RKE2 the Hard Way: Part 5 – Setting up kube-apiserver as Static Pods</title><link>https://support.tools/training/rke2-hard-way/05-setting-up-kube-apiserver/</link><pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate><guid>https://support.tools/training/rke2-hard-way/05-setting-up-kube-apiserver/</guid><description>&lt;h2 id="part-5--setting-up-kube-apiserver-as-static-pods"&gt;Part 5 – Setting up kube-apiserver as Static Pods&lt;/h2&gt;&#10;&lt;p&gt;In this part of the &lt;strong&gt;&amp;ldquo;RKE2 the Hard Way&amp;rdquo;&lt;/strong&gt; training series, we will set up the &lt;strong&gt;Kubernetes API Server&lt;/strong&gt; (&lt;code&gt;kube-apiserver&lt;/code&gt;) as static pods managed by kubelet on each of our nodes. The API server is the central component of the Kubernetes control plane that exposes the Kubernetes API.&lt;/p&gt;&#10;&lt;p&gt;Using static pods for the API server is a key design principle in RKE2. This approach simplifies deployment and management, as kubelet will automatically start the API server and ensure it stays running. If an API server instance fails, kubelet will automatically restart it.&lt;/p&gt;</description></item><item><title>RKE2 the Hard Way: Part 6 – Setting up kube-controller-manager and kube-scheduler as Static Pods</title><link>https://support.tools/training/rke2-hard-way/06-setting-up-kube-controller-manager-and-kube-scheduler/</link><pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate><guid>https://support.tools/training/rke2-hard-way/06-setting-up-kube-controller-manager-and-kube-scheduler/</guid><description>&lt;h2 id="part-6--setting-up-kube-controller-manager-and-kube-scheduler-as-static-pods"&gt;Part 6 – Setting up kube-controller-manager and kube-scheduler as Static Pods&lt;/h2&gt;&#10;&lt;p&gt;In this part of the &lt;strong&gt;&amp;ldquo;RKE2 the Hard Way&amp;rdquo;&lt;/strong&gt; training series, we will set up the &lt;strong&gt;Kubernetes Controller Manager&lt;/strong&gt; (&lt;code&gt;kube-controller-manager&lt;/code&gt;) and &lt;strong&gt;Scheduler&lt;/strong&gt; (&lt;code&gt;kube-scheduler&lt;/code&gt;) as static pods managed by kubelet on each of our nodes.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;The Controller Manager runs controller processes that regulate the state of the cluster (such as replication controllers, node controllers, and service account controllers)&lt;/li&gt;&#10;&lt;li&gt;The Scheduler is responsible for watching for newly created pods and assigning them to nodes&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Using static pods for these components is a key design principle in RKE2, just like we did for etcd and kube-apiserver. This approach ensures high availability and automatic recovery in case of failures.&lt;/p&gt;</description></item><item><title>RKE2 the Hard Way: Part 7 – Setting up kubelet and kube-proxy on Worker Nodes</title><link>https://support.tools/training/rke2-hard-way/07-setting-up-kubelet-and-kube-proxy/</link><pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate><guid>https://support.tools/training/rke2-hard-way/07-setting-up-kubelet-and-kube-proxy/</guid><description>&lt;h2 id="part-7--setting-up-kubelet-and-kube-proxy-on-worker-nodes"&gt;Part 7 – Setting up kubelet and kube-proxy on Worker Nodes&lt;/h2&gt;&#10;&lt;p&gt;In this part of the &lt;strong&gt;&amp;ldquo;RKE2 the Hard Way&amp;rdquo;&lt;/strong&gt; training series, we will configure &lt;strong&gt;kubelet&lt;/strong&gt; to register with the Kubernetes API server and set up &lt;strong&gt;kube-proxy&lt;/strong&gt; on our nodes. We already installed containerd and kubelet in &lt;a href="https://support.tools/training/rke2-hard-way/03-setting-up-containerd-and-kubelet/"&gt;Part 3&lt;/a&gt;, but now we need to finalize their configuration to connect to our Kubernetes control plane.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;kubelet&lt;/strong&gt; is the primary node agent that runs on each node. It ensures containers are running in a Pod and healthy.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;kube-proxy&lt;/strong&gt; maintains network rules on nodes. These network rules allow network communication to your Pods from inside or outside of your cluster.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;blockquote&gt;&lt;p&gt;✅ &lt;strong&gt;Note:&lt;/strong&gt; In our setup, all nodes (node01, node02, node03) are both control plane and worker nodes. This is common for smaller clusters and provides high availability without needing separate worker nodes.&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>RKE2 the Hard Way: Part 8 – Installing Cilium CNI</title><link>https://support.tools/training/rke2-hard-way/08-installing-cilium-cni/</link><pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate><guid>https://support.tools/training/rke2-hard-way/08-installing-cilium-cni/</guid><description>&lt;h2 id="part-8--installing-cilium-cni"&gt;Part 8 – Installing Cilium CNI&lt;/h2&gt;&#10;&lt;p&gt;In this part of the &lt;strong&gt;&amp;ldquo;RKE2 the Hard Way&amp;rdquo;&lt;/strong&gt; training series, we will install and configure the &lt;strong&gt;Cilium CNI&lt;/strong&gt; (Container Network Interface). Cilium is a powerful, open-source CNI solution that provides advanced networking, security, and observability features for Kubernetes clusters.&lt;/p&gt;&#10;&lt;p&gt;At this point in our tutorial series, we have:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Set up all the core Kubernetes components (etcd, kube-apiserver, kube-controller-manager, kube-scheduler)&lt;/li&gt;&#10;&lt;li&gt;Configured kubelet and kube-proxy on our nodes&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;However, our cluster network is not yet functional for pod-to-pod communication. The CNI plugin is essential for implementing the Kubernetes networking model, which requires that:&lt;/p&gt;</description></item><item><title>RKE2 the Hard Way: Part 9 – Installing CoreDNS</title><link>https://support.tools/training/rke2-hard-way/09-installing-coredns/</link><pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate><guid>https://support.tools/training/rke2-hard-way/09-installing-coredns/</guid><description>&lt;h2 id="part-9--installing-coredns"&gt;Part 9 – Installing CoreDNS&lt;/h2&gt;&#10;&lt;p&gt;In this part of the &lt;strong&gt;&amp;ldquo;RKE2 the Hard Way&amp;rdquo;&lt;/strong&gt; training series, we will install and configure &lt;strong&gt;CoreDNS&lt;/strong&gt; for Kubernetes cluster DNS resolution. CoreDNS is a flexible, extensible DNS server that serves as the cluster DNS provider in Kubernetes, allowing service discovery by DNS name.&lt;/p&gt;&#10;&lt;p&gt;DNS resolution is critical in a Kubernetes cluster because:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;It enables services to be discovered by their names rather than IP addresses&lt;/li&gt;&#10;&lt;li&gt;It allows pods to find and communicate with other pods and services&lt;/li&gt;&#10;&lt;li&gt;It provides a stable naming scheme even when IPs change due to pod rescheduling&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;blockquote&gt;&lt;p&gt;✅ &lt;strong&gt;Note:&lt;/strong&gt; We already configured kubelet in &lt;a href="https://support.tools/training/rke2-hard-way/07-setting-up-kubelet-and-kube-proxy/"&gt;Part 7&lt;/a&gt; to use 10.43.0.10 as the DNS server, which is the IP we&amp;rsquo;ll use for the CoreDNS service.&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item></channel></rss>