{"id":33112,"date":"2023-04-02T13:27:38","date_gmt":"2023-04-02T13:27:38","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=33112"},"modified":"2025-01-23T12:45:19","modified_gmt":"2025-01-23T12:45:19","slug":"deploy-ha-kubernetes-cluster-on-linux-using-rancher-rke2","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/deploy-ha-kubernetes-cluster-on-linux-using-rancher-rke2\/","title":{"rendered":"Deploy HA Kubernetes Cluster on Linux using Rancher RKE2"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">What is RKE2?<\/h2>\n\n\n\n<p>RKE stands for&nbsp;<strong>Rancher Kubernetes Engine<\/strong>. RKE2 also known as the (RKE Government) is a combination of RKE1 and K3s. It inherits usability, ease-of-operations, and deployment model from K3s and close alignment with upstream Kubernetes from RKE1. Normally, RKE2 doesn\u2019t rely on docker, it launches the control plane components as static pods that are managed by the kubelet.<\/p>\n\n\n\n<p>The diagram below will help you understand the RKE2 cluster topology.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"372\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-4-1024x372.png\" alt=\"\" class=\"wp-image-33113\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-4-1024x372.png 1024w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-4-300x109.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-4-768x279.png 768w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-4.png 1306w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>RKE2 ships a number of open-source components that include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>K3s\n<ul class=\"wp-block-list\">\n<li>Helm Controller<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>K8s\n<ul class=\"wp-block-list\">\n<li>API Server<\/li>\n\n\n\n<li>Controller Manager<\/li>\n\n\n\n<li>Kubelet<\/li>\n\n\n\n<li>SchedulerSet up Linux Nodes<\/li>\n\n\n\n<li>Proxy<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>etcd<\/li>\n\n\n\n<li>containerd\/cri<\/li>\n\n\n\n<li>runc<\/li>\n\n\n\n<li>Helm<\/li>\n\n\n\n<li>Metrics Server<\/li>\n\n\n\n<li>NGINX Ingress Controller<\/li>\n\n\n\n<li>CoreDNS<\/li>\n\n\n\n<li>CNI: Canal (Calico &amp; Flannel), Cilium or Calico<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">System Requirements<\/h3>\n\n\n\n<p>Use a system that meets the below requirements:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RAM: 4GB Minimum (we recommend at least 8GB)<\/li>\n\n\n\n<li>CPU: 2 Minimum (we recommend at least 4CPU)<\/li>\n\n\n\n<li>3 Rocky Linux 8 Nodes<\/li>\n\n\n\n<li><strong>Zero<\/strong>&nbsp;or&nbsp;<em>more agent<\/em>&nbsp;nodes that are designated to run your apps and services<\/li>\n\n\n\n<li>A&nbsp;<strong>load balancer<\/strong>&nbsp;to direct front-end traffic to the three nodes.<\/li>\n\n\n\n<li>A&nbsp;<strong>DNS record&nbsp;<\/strong>to map a URL to the load balancer<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1 \u2013 Set up Rocky Linux 8 Nodes<\/h2>\n\n\n\n<p>For this guide, we will use 3 Rocky Linux nodes, a load balancer, and RKE2 agents(1 or more).<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>TASK<\/strong><\/td><td><strong>HOSTNAME<\/strong><\/td><td><strong>IP<\/strong>&nbsp;<strong>ADDRESS<\/strong><\/td><\/tr><tr><td><em>Server Node 1<\/em><\/td><td><em>server1.computingforgeeks.com<\/em><\/td><td>192.168.205.2<\/td><\/tr><tr><td><em>Server Node 2<\/em><\/td><td><em>server2.computingforgeeks.com<\/em><\/td><td>192.168.205.3<\/td><\/tr><tr><td><em>Server Node&nbsp;<\/em>3<\/td><td><em>server3.computingforgeeks.com<\/em><\/td><td>192.168.205.33<\/td><\/tr><tr><td><em>Load Balancer<\/em><\/td><td><em>rke.computingforgeeks.com<\/em><\/td><td>192.168.205.9<\/td><\/tr><tr><td><em>Agent Node1<\/em><\/td><td><em>agent1.computingforgeeks.com<\/em><\/td><td>192.168.205.43<\/td><\/tr><tr><td><em>Agent Node2<\/em><\/td><td><em>agent2.computingforgeeks.com<\/em><\/td><td>192.168.205.44<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Set the hostnames as shown:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"853\" height=\"684\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-5.png\" alt=\"\" class=\"wp-image-33114\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-5.png 853w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-5-300x241.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-5-768x616.png 768w\" sizes=\"auto, (max-width: 853px) 100vw, 853px\" \/><figcaption class=\"wp-element-caption\">Add the hostnames to \/etc\/hosts on each node<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"843\" height=\"306\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-6.png\" alt=\"\" class=\"wp-image-33115\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-6.png 843w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-6-300x109.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-6-768x279.png 768w\" sizes=\"auto, (max-width: 843px) 100vw, 843px\" \/><figcaption class=\"wp-element-caption\">Configure the firewall on all the nodes as shown:<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"853\" height=\"207\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-7.png\" alt=\"\" class=\"wp-image-33116\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-7.png 853w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-7-300x73.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-7-768x186.png 768w\" sizes=\"auto, (max-width: 853px) 100vw, 853px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2 \u2013 Configure the Fixed Registration Address<\/h2>\n\n\n\n<p>To achieve high availability, you are required to set up an odd number of server plane nodes(runs etcd, the Kubernetes API, and other control plane services). The other server nodes and agent nodes need a URL they can use to register against. This is either an IP or domain name of any of the control nodes. This is mainly done to maintain quorum so that the cluster can afford to lose connection with one of the nodes without impacting the functionality cluster.<\/p>\n\n\n\n<p>This can be achieved using the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A layer 4 (TCP) load balancer<\/li>\n\n\n\n<li>Round-robin DNS<\/li>\n\n\n\n<li>Virtual or elastic IP addresses<\/li>\n<\/ul>\n\n\n\n<p>In this guide, we will configure NGINX as a layer 4 (TCP) load balancer to forward the connection to one of the RKE nodes.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"874\" height=\"390\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-8.png\" alt=\"\" class=\"wp-image-33117\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-8.png 874w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-8-300x134.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-8-768x343.png 768w\" sizes=\"auto, (max-width: 874px) 100vw, 874px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">user nginx;\r\nworker_processes 4;\r\nworker_rlimit_nofile 40000;\r\nerror_log \/var\/log\/nginx\/error.log;\r\npid \/run\/nginx.pid;\r\n\r\n# Load dynamic modules. See \/usr\/share\/doc\/nginx\/README.dynamic.\r\ninclude \/usr\/share\/nginx\/modules\/*.conf;\r\n\r\nevents {\r\n    worker_connections 8192;\r\n}\r\n\r\nstream {\r\nupstream backend {\r\n        least_conn;\r\n        server <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">IP_NODE_1<\/span>&gt;<\/span>:9345 max_fails=3 fail_timeout=5s;\r\n        server <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">IP_NODE_2<\/span>&gt;<\/span>:9345 max_fails=3 fail_timeout=5s;\r\n        server <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">IP_NODE_3<\/span>&gt;<\/span>:9345 max_fails=3 fail_timeout=5s;\r\n   }\r\n\r\n   # This server accepts all traffic to port 9345 and passes it to the upstream. \r\n   # Notice that the upstream name and the proxy_pass need to match.\r\n   server {\r\n\r\n      listen 9345;\r\n\r\n          proxy_pass backend;\r\n   }\r\n    upstream rancher_api {\r\n        least_conn;\r\n        server <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">IP_NODE_1<\/span>&gt;<\/span>:6443 max_fails=3 fail_timeout=5s;\r\n        server <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">IP_NODE_2<\/span>&gt;<\/span>:6443 max_fails=3 fail_timeout=5s;\r\n        server <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">IP_NODE_3<\/span>&gt;<\/span>:6443 max_fails=3 fail_timeout=5s;\r\n    }\r\n        server {\r\n        listen     6443;\r\n        proxy_pass rancher_api;\r\n        }\r\n    upstream rancher_http {\r\n        least_conn;\r\n        server 192.168.205.2:80 max_fails=3 fail_timeout=5s;\r\n        server 192.168.205.3:80 max_fails=3 fail_timeout=5s;\r\n        server 192.168.205.33:80 max_fails=3 fail_timeout=5s;\r\n    }\r\n        server {\r\n        listen     80;\r\n        proxy_pass rancher_http;\r\n        }\r\n    upstream rancher_https {\r\n        least_conn;\r\n        server 192.168.205.2:443 max_fails=3 fail_timeout=5s;\r\n        server 192.168.205.3:443 max_fails=3 fail_timeout=5s;\r\n        server 192.168.205.33:443 max_fails=3 fail_timeout=5s;\r\n    }\r\n        server {\r\n        listen     443;\r\n        proxy_pass rancher_https;\r\n        }\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"862\" height=\"180\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-9.png\" alt=\"\" class=\"wp-image-33118\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-9.png 862w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-9-300x63.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-9-768x160.png 768w\" sizes=\"auto, (max-width: 862px) 100vw, 862px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3 \u2013 Download installer script on Rocky Linux 8 Nodes<\/h2>\n\n\n\n<p>All the Rocky Linux 8 nodes intended for this use need to be configured with the RKE2 repositories that provide the required packages. Instal curl tool on your system:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo yum -y install curl vim wget<\/code><\/span><\/pre>\n\n\n<p>With curl download the script used to install RKE2 server on your Rocky Linux 8 servers.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl -sfL https:<span class=\"hljs-comment\">\/\/get.rke2.io --output install.sh<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Make the script executable:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">chmod<\/span> +<span class=\"hljs-selector-tag\">x<\/span> <span class=\"hljs-selector-tag\">install<\/span><span class=\"hljs-selector-class\">.sh<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>To see script usage options run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">less .\/install.sh <\/code><\/span><\/pre>\n\n\n<p>Once added, you can install and configure both the RKE2 server and agent on the desired nodes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4 \u2013 Set up the First Server Node (Master Node)<\/h2>\n\n\n\n<p>Install RKE2 server:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo INSTALL_RKE2_TYPE=server .\/install.sh<\/code><\/span><\/pre>\n\n\n<p>Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">&#91;INFO]  finding release <span class=\"hljs-keyword\">for<\/span> channel stable\n&#91;INFO]  using <span class=\"hljs-number\">1.23<\/span> series <span class=\"hljs-keyword\">from<\/span> channel stable\nRocky Linux <span class=\"hljs-number\">8<\/span> - AppStream                                                                                                                                              <span class=\"hljs-number\">19<\/span> kB\/s | <span class=\"hljs-number\">4.8<\/span> kB     <span class=\"hljs-number\">00<\/span>:<span class=\"hljs-number\">00<\/span>\nRocky Linux <span class=\"hljs-number\">8<\/span> - AppStream                                                                                                                                              <span class=\"hljs-number\">11<\/span> MB\/s | <span class=\"hljs-number\">9.6<\/span> MB     <span class=\"hljs-number\">00<\/span>:<span class=\"hljs-number\">00<\/span>\nRocky Linux <span class=\"hljs-number\">8<\/span> - BaseOS                                                                                                                                                 <span class=\"hljs-number\">18<\/span> kB\/s | <span class=\"hljs-number\">4.3<\/span> kB     <span class=\"hljs-number\">00<\/span>:<span class=\"hljs-number\">00<\/span>\nRocky Linux <span class=\"hljs-number\">8<\/span> - BaseOS                                                                                                                                                 <span class=\"hljs-number\">11<\/span> MB\/s | <span class=\"hljs-number\">6.7<\/span> MB     <span class=\"hljs-number\">00<\/span>:<span class=\"hljs-number\">00<\/span>\nRocky Linux <span class=\"hljs-number\">8<\/span> - Extras                                                                                                                                                 <span class=\"hljs-number\">13<\/span> kB\/s | <span class=\"hljs-number\">3.5<\/span> kB     <span class=\"hljs-number\">00<\/span>:<span class=\"hljs-number\">00<\/span>\nRocky Linux <span class=\"hljs-number\">8<\/span> - Extras                                                                                                                                                 <span class=\"hljs-number\">41<\/span> kB\/s |  <span class=\"hljs-number\">11<\/span> kB     <span class=\"hljs-number\">00<\/span>:<span class=\"hljs-number\">00<\/span>\nRancher RKE2 Common (stable)                                                                                                                                          <span class=\"hljs-number\">1.7<\/span> kB\/s | <span class=\"hljs-number\">1.7<\/span> kB     <span class=\"hljs-number\">00<\/span>:<span class=\"hljs-number\">00<\/span>\nRancher RKE2 <span class=\"hljs-number\">1.23<\/span> (stable)                                                                                                                                            <span class=\"hljs-number\">4.8<\/span> kB\/s | <span class=\"hljs-number\">4.6<\/span> kB     <span class=\"hljs-number\">00<\/span>:<span class=\"hljs-number\">00<\/span>\nDependencies resolved.\n======================================================================================================================================================================================================\n.......\n\nTransaction Summary\n======================================================================================================================================================================================================\nInstall  <span class=\"hljs-number\">5<\/span> Packages\n\nTotal download size: <span class=\"hljs-number\">34<\/span> M\nInstalled size: <span class=\"hljs-number\">166<\/span> M\nDownloading Packages:\n.....<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Once installed, you need to create a config file manually. The config file contains the<code>&nbsp;tls-san<\/code>parameter which avoids certificate errors with the fixed registration address.<\/p>\n\n\n\n<p>The config file can be created with the command:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo vim \/etc\/rancher\/rke2\/config.yaml<\/code><\/span><\/pre>\n\n\n<p>Add the below lines to the file replacing where required.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">write-kubeconfig-mode: <span class=\"hljs-string\">\"0644\"<\/span>\ntls-san:\n  - <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">mark<\/span>&gt;<\/span>rke.computingforgeeks.com<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">mark<\/span>&gt;<\/span><\/span>\n  - <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">mark<\/span>&gt;<\/span>192.168.205.9<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">mark<\/span>&gt;<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Replace&nbsp;<mark>rke.computingforgeeks.com<\/mark>&nbsp;with your fixed registration address and&nbsp;<mark>192.168.205.9<\/mark>&nbsp;with its IP address.<\/p>\n\n\n\n<p>Save the file and start the service;<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo systemctl start rke2-server\nsudo systemctl enable rke2-server<\/code><\/span><\/pre>\n\n\n<p>Confirm status of the service after starting it:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"802\" height=\"792\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-10.png\" alt=\"\" class=\"wp-image-33119\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-10.png 802w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-10-300x296.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-10-768x758.png 768w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-10-80x80.png 80w\" sizes=\"auto, (max-width: 802px) 100vw, 802px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"745\" height=\"831\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-11.png\" alt=\"\" class=\"wp-image-33120\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-11.png 745w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-11-269x300.png 269w\" sizes=\"auto, (max-width: 745px) 100vw, 745px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"778\" height=\"664\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-12.png\" alt=\"\" class=\"wp-image-33121\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-12.png 778w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-12-300x256.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-12-768x655.png 768w\" sizes=\"auto, (max-width: 778px) 100vw, 778px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"736\" height=\"637\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-13.png\" alt=\"\" class=\"wp-image-33122\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-13.png 736w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-13-300x260.png 300w\" sizes=\"auto, (max-width: 736px) 100vw, 736px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"724\" height=\"352\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-14.png\" alt=\"\" class=\"wp-image-33123\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-14.png 724w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-14-300x146.png 300w\" sizes=\"auto, (max-width: 724px) 100vw, 724px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"757\" height=\"754\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-15.png\" alt=\"\" class=\"wp-image-33124\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-15.png 757w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-15-300x300.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-15-150x150.png 150w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-15-250x250.png 250w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/04\/image-15-80x80.png 80w\" sizes=\"auto, (max-width: 757px) 100vw, 757px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step 7 \u2013 Deploy an Application.<\/h2>\n\n\n\n<p>Once the above configurations have been made, deploy and application on your cluster. For this guide, we will deploy a demo Nginx application.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">kubectl apply -f - &lt;&lt;EOF\napiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: nginx-deployment\nspec:\n  selector:\n    matchLabels:\n      app: nginx\n  replicas: 2 \n  template:\n    metadata:\n      labels:\n        app: nginx\n    spec:\n      containers:\n      - name: nginx\n        image: nginx:latest\n        ports:\n        - containerPort: 80\nEOF<\/code><\/span><\/pre>\n\n\n<p>Check if the pod is up:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">$ <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">mark<\/span>&gt;<\/span>kubectl get pods<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">mark<\/span>&gt;<\/span>\nNAME                               READY   STATUS    RESTARTS   AGE\nnginx-deployment-cc7df4f8f-frv65   1\/1     Running   0          13s\nnginx-deployment-cc7df4f8f-l9xdb   1\/1     Running   0          13s<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Now expose the service:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">$ <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">mark<\/span>&gt;<\/span>kubectl expose deployment nginx-deployment --type=NodePort --port=80<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">mark<\/span>&gt;<\/span>\nservice\/nginx-deployment exposed<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Obtain the port to which the service has been exposed:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">$ <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">mark<\/span>&gt;<\/span>kubectl get svc<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">mark<\/span>&gt;<\/span>\nNAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE\nkubernetes         ClusterIP   10.43.0.1       <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">none<\/span>&gt;<\/span>        443\/TCP          85m\nnginx-deployment   NodePort    10.43.135.164   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">none<\/span>&gt;<\/span>        80:<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">mark<\/span>&gt;<\/span>31042<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">mark<\/span>&gt;<\/span>\/TCP     2s<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In my case, the service has been exposed to port&nbsp;<strong>31042<\/strong>. Access the application using any controller or worker node IP address with the syntax&nbsp;<a href=\"http:\/\/ip_address:31042\/\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/IP_Address:31042<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Reference<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>https:\/\/ranchermanager.docs.rancher.com\/how-to-guides\/new-user-guides\/kubernetes-cluster-setup\/rke2-for-rancher<\/li>\n\n\n\n<li><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>What is RKE2? RKE stands for&nbsp;Rancher Kubernetes Engine. RKE2 also known as the (RKE Government) is a combination of RKE1 and K3s. It inherits usability, ease-of-operations, and deployment model from&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[4859],"tags":[],"class_list":["post-33112","post","type-post","status-publish","format-standard","hentry","category-kubernetes"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/33112","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=33112"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/33112\/revisions"}],"predecessor-version":[{"id":33128,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/33112\/revisions\/33128"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=33112"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=33112"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=33112"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}