<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Rahimah Sulayman</title>
    <description>The latest articles on Forem by Rahimah Sulayman (@rahimah_dev).</description>
    <link>https://forem.com/rahimah_dev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3673037%2Fd084c1b1-6c80-43de-8b42-c48bd0cad2f8.png</url>
      <title>Forem: Rahimah Sulayman</title>
      <link>https://forem.com/rahimah_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/rahimah_dev"/>
    <language>en</language>
    <item>
      <title>Create DNS zones and configure DNS settings</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Tue, 26 May 2026 13:12:28 +0000</pubDate>
      <link>https://forem.com/rahimah_dev/create-dns-zones-and-configure-dns-settings-18a7</link>
      <guid>https://forem.com/rahimah_dev/create-dns-zones-and-configure-dns-settings-18a7</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Reliable name resolution is a critical part of modern cloud infrastructure, especially in secure, private network environments. In this hands-on guide, we’ll configure Azure Private DNS to enable seamless internal communication using custom domain names instead of IP addresses. The exercise covers creating a private DNS zone, linking it to a virtual network, and configuring DNS records for backend resources: demonstrating practical Azure networking and cloud administration skills used in real-world enterprise environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your organization requires workloads to use domain names instead of IP addresses for internal communications. The organization doesn’t want to add a custom DNS solution. You identify these requirements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A private DNS zone is required for contoso.com.&lt;/li&gt;
&lt;li&gt;The DNS will use a virtual network link to app-vnet.&lt;/li&gt;
&lt;li&gt;A new DNS record is required for the backend subnet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Skilling tasks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create and configure a private DNS zone.&lt;/li&gt;
&lt;li&gt;Create and configure DNS records.&lt;/li&gt;
&lt;li&gt;Configure DNS settings on a virtual network.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Exercise instructions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This exercise requires the Lab 01 virtual networks and subnets to be installed. A template is provided if you need to deploy those resources.&lt;br&gt;
Create a private DNS zone&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Azure Private DNS&lt;/code&gt; provides a reliable, secure DNS service to manage and resolve domain names in a virtual network without the need to add a custom DNS solution. By using private DNS zones, you can use your own custom domain names rather than the Azure-provided names.&lt;/p&gt;

&lt;p&gt;1.On the Azure portal, search for and select &lt;code&gt;Private dns zones&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;2.Select &lt;strong&gt;+ Create&lt;/strong&gt; and configure the DNS zone.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Property&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Subscription&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Select your subscription&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource group&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;RG1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;private.contoso.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;East US&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;3.Select &lt;strong&gt;Review + create&lt;/strong&gt; and then select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;4.Wait for the DNS zone to deploy, and then select &lt;strong&gt;Go to resource&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a virtual network link to your private DNS zone
&lt;/h2&gt;

&lt;p&gt;To resolve DNS records in a private DNS zone, resources must be linked to the private zone. A virtual network link associates the virtual network to the private zone.&lt;/p&gt;

&lt;p&gt;1.In the portal, continue working on the &lt;strong&gt;private.contoso.com&lt;/strong&gt; DNS zone.&lt;/p&gt;

&lt;p&gt;2.In the &lt;strong&gt;DNS Management&lt;/strong&gt; blade, select + &lt;strong&gt;Virtual network links&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;3.Select &lt;strong&gt;+ Add&lt;/strong&gt; and configure the virtual network link.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Property&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Link name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;app-vnet-link&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virtual network&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;app-vnet&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enable auto registration&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Enabled&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;4.Select &lt;strong&gt;Create&lt;/strong&gt; and wait for the deployment to finish. If necessary, &lt;strong&gt;Refresh&lt;/strong&gt; the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a DNS record set
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;DNS records&lt;/code&gt; provide information about the DNS zone.&lt;/p&gt;

&lt;p&gt;1.In the portal, continue working on the private.contoso.com DNS zone.&lt;/p&gt;

&lt;p&gt;2.In the &lt;strong&gt;DNS Management&lt;/strong&gt; blade, select + &lt;strong&gt;Recordsets&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;3.Notice that two A records have automatically been created for each of the virtual machines.&lt;/p&gt;

&lt;p&gt;4.Select &lt;strong&gt;+ Add&lt;/strong&gt; and configure a record set. When finished select &lt;strong&gt;Add&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Property&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;backend&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TTL&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IP address&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.1.1.5&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This record set implies there is a virtual machine in app-vnet with a private IP address of 10.1.1.5.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key takeaways&lt;/strong&gt;&lt;br&gt;
Here are the main takeaways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure DNS is a cloud service that allows you to host and manage domain name system (DNS) domains, also known as DNS zones.&lt;/li&gt;
&lt;li&gt;Azure DNS public zones host domain name zone data for records that you intend to be resolved by any host on the internet.&lt;/li&gt;
&lt;li&gt;Azure Private DNS zones allow you to configure a private DNS zone namespace for private Azure resources.&lt;/li&gt;
&lt;li&gt;A DNS zone is a collection of DNS records. DNS records provide information about the domain.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;In this exercise, we configured Azure Private DNS to enable secure and reliable internal name resolution within a virtual network. We created a private DNS zone for private.contoso.com, linked it to the app-vnet virtual network, and configured DNS record sets for backend resources. This setup demonstrates how &lt;em&gt;Azure Private DNS simplifies internal communication by allowing workloads to use custom domain names instead of IP addresses, while maintaining centralized and secure DNS management in Azure&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>azureprivatedns</category>
      <category>dns</category>
      <category>networking</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>Configure network routing</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Tue, 26 May 2026 12:00:41 +0000</pubDate>
      <link>https://forem.com/rahimah_dev/configure-network-routing-10ij</link>
      <guid>https://forem.com/rahimah_dev/configure-network-routing-10ij</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In modern cloud environments, controlling how network traffic flows is just as important as securing the workloads themselves. In this guide, we’ll configure custom network routing in Azure by creating route tables, associating them with subnets, and directing outbound traffic through an Azure Firewall for centralized inspection and filtering. This hands-on exercise demonstrates practical cloud networking and security skills that are essential for designing secure, enterprise-grade Azure infrastructures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To ensure the firewall policies are enforced, outbound application traffic must be routed through the firewall. You identify these requirements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A route table is required. This route table will be associated with the frontend and backend subnets.&lt;/li&gt;
&lt;li&gt;A route is required to filter all outbound IP traffic from the subnets to the firewall. The firewall’s private IP address will be used.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Skilling tasks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create and configure a route table.&lt;/li&gt;
&lt;li&gt;Link a route table to a subnet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Exercise instructions
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Create a route table
&lt;/h2&gt;

&lt;p&gt;Azure automatically creates a &lt;code&gt;route table&lt;/code&gt; for each subnet within an Azure virtual network. The route table includes the default &lt;code&gt;system routes&lt;/code&gt;. You can create route tables and routes to override Azure’s default system routes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Record the private IP address of app-vnet-firewall&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1.In the search box at the top of the portal, enter &lt;strong&gt;Firewall&lt;/strong&gt;. Select &lt;strong&gt;Firewall&lt;/strong&gt; in the search results.&lt;/p&gt;

&lt;p&gt;2.Select &lt;strong&gt;app-vnet-firewall&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;3.Select &lt;strong&gt;Overview&lt;/strong&gt; and record the &lt;strong&gt;Private IP address&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Add the route table&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1.In the search box, enter &lt;strong&gt;Route tables&lt;/strong&gt;. When Route table appears in the search results, select it.&lt;/p&gt;

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

&lt;p&gt;2.In the Route table page, select &lt;strong&gt;+ Create&lt;/strong&gt; and create the route table.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Property&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Subscription&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Select your subscription&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource group&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;RG1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;East US&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;app-vnet-firewall-rt&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;3.Select &lt;strong&gt;Review + create&lt;/strong&gt; and then select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;4.Wait for the route table to deploy, then select &lt;strong&gt;Go to resource&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Associate the route table to the subnets
&lt;/h2&gt;

&lt;p&gt;1.In the portal, continue working with the route table, select &lt;strong&gt;app-vnet-firewall-rt&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;2.In the &lt;strong&gt;Settings&lt;/strong&gt; blade, select &lt;strong&gt;Subnets&lt;/strong&gt; and then &lt;strong&gt;+ Associate&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;3.Configure an association to the frontend subnet, then select &lt;strong&gt;OK&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Property&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Virtual network&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;app-vnet&lt;/strong&gt; (RG1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subnet&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;frontend&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;4.Configure an association to the backend subnet, then select &lt;strong&gt;OK&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Property&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Virtual network&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;app-vnet&lt;/strong&gt; (RG1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subnet&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;backend&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

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

&lt;h2&gt;
  
  
  Create a route in the route table
&lt;/h2&gt;

&lt;p&gt;1.In the portal, continue working with the route table, select &lt;strong&gt;app-vnet-firewall-rt&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;2.In the &lt;strong&gt;Settings&lt;/strong&gt; blade, select &lt;strong&gt;Routes&lt;/strong&gt; and then &lt;strong&gt;+ Add&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;3.Configure the route, then select &lt;strong&gt;Add&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Property&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Route name&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;outbound-firewall&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Destination type&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IP addresses&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Destination IP addresses/CIDR range&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.0.0.0/0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next hop type&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Virtual appliance&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next hop address&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;private IP address of the firewall&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

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

&lt;p&gt;&lt;strong&gt;Key takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here are the main takeaways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Network traffic in Azure is automatically routed across Azure subnets, virtual networks, and on-premises networks. System routes control this routing.&lt;/li&gt;
&lt;li&gt;User-defined routes override the default system routes so traffic can be routed through a network virtual appliances (NVAs).&lt;/li&gt;
&lt;li&gt;Network virtual appliances (NVAs) control the flow of network traffic. Examples of NVAs are firewalls, load balancers, and routers.&lt;/li&gt;
&lt;li&gt;Route tables contain routing information and are associated with a subnet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;In this exercise, we configured Azure network routing to ensure outbound traffic is securely inspected through an Azure Firewall. We created a custom route table, associated it with the frontend and backend subnets, and added a user-defined route that forwards all outbound traffic to the firewall’s private IP address. This setup demonstrates how Azure route tables and network virtual appliances work together to provide centralized traffic control, improved security, and enterprise-grade network management.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>azurefirewall</category>
      <category>devops</category>
      <category>cloudsecurity</category>
    </item>
    <item>
      <title>Create and configure Azure Firewall</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Mon, 25 May 2026 21:21:10 +0000</pubDate>
      <link>https://forem.com/rahimah_dev/create-and-configure-azure-firewall-3lja</link>
      <guid>https://forem.com/rahimah_dev/create-and-configure-azure-firewall-3lja</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;As cloud applications scale, simple subnet-level filtering isn't enough to defend against &lt;strong&gt;sophisticated attack&lt;/strong&gt; vectors. This project demonstrates how to implement a centralized network security strategy in Microsoft Azure by deploying &lt;code&gt;Azure Firewall&lt;/code&gt; to protect corporate workloads (app-vnet). Moving beyond basic port restrictions, this guide covers how to design and enforce Firewall Policies,including Layer 7 Application Rules to securely &lt;strong&gt;lock down egress traffic&lt;/strong&gt; to Azure DevOps pipelines (dev.azure.com) and Network Rules to &lt;strong&gt;safeguard core infrastructure traffic&lt;/strong&gt; like DNS resolution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your organization requires centralized network security for the application virtual network. As the application usage increases, more granular application-level filtering and advanced threat protection will be needed. Also, it is expected the application will need continuous updates from Azure DevOps pipelines. You identify these requirements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure Firewall is required for additional security in the app-vnet.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;firewall policy&lt;/strong&gt; should be configured to help manage access to the application.&lt;/li&gt;
&lt;li&gt;A firewall policy &lt;strong&gt;application rule&lt;/strong&gt; is required. This rule will allow the application access to Azure DevOps so the application code can be updated.&lt;/li&gt;
&lt;li&gt;A firewall policy &lt;strong&gt;network rule&lt;/strong&gt; is required. This rule will allow DNS resolution.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Skilling tasks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create an Azure Firewall.&lt;/li&gt;
&lt;li&gt;Create and configure a firewall policy&lt;/li&gt;
&lt;li&gt;Create an application rule collection.&lt;/li&gt;
&lt;li&gt;Create a network rule collection.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Create Azure Firewall subnet in our existing virtual network
&lt;/h2&gt;

&lt;p&gt;1.In the search box at the top of the portal, enter &lt;strong&gt;Virtual networks&lt;/strong&gt;. Select &lt;strong&gt;Virtual networks&lt;/strong&gt; in the search results.&lt;/p&gt;

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

&lt;p&gt;2.Select &lt;strong&gt;app-vnet&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;3.Select &lt;strong&gt;Subnets&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;4.Select &lt;strong&gt;+ Subnet&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;5.Enter the following information and select &lt;strong&gt;Add&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Property&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AzureFirewallSubnet&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Address range&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.1.63.0/26&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Leave all other settings as default.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Create an Azure Firewall
&lt;/h2&gt;

&lt;p&gt;1.In the search box at the top of the portal, enter &lt;strong&gt;Firewall&lt;/strong&gt;. Select &lt;strong&gt;Firewall&lt;/strong&gt; in the search results.&lt;/p&gt;

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

&lt;p&gt;2.Select &lt;strong&gt;+ Create&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;3.Create a firewall by using the values in the following table. For any property that is not specified, use the default value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Azure Firewall can take a few minutes to deploy.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Property&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Resource group&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;RG1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;app-vnet-firewall&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firewall SKU&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Standard&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firewall management&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Use a Firewall Policy to manage this firewall&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firewall policy&lt;/td&gt;
&lt;td&gt;select &lt;strong&gt;Add new&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Policy name&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;fw-policy&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;East US&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Policy Tier&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Standard&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Choose a virtual network&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Use existing&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virtual network&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;app-vnet&lt;/strong&gt; (RG1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public IP address&lt;/td&gt;
&lt;td&gt;Add new: &lt;strong&gt;fwpip&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enable Firewall Management NIC&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;uncheck the box&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;4.Select &lt;strong&gt;Review + create&lt;/strong&gt; and then select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Update the Firewall Policy
&lt;/h2&gt;

&lt;p&gt;1.In the portal, search for and select &lt;code&gt;Firewall Policies&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;2.Select &lt;strong&gt;fw-policy&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add an application rule
&lt;/h2&gt;

&lt;p&gt;1.In the &lt;strong&gt;Rules&lt;/strong&gt; blade, select &lt;strong&gt;Application rules&lt;/strong&gt; and then &lt;strong&gt;Add a rule collection&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;2.Configure the application rule collection and then select &lt;strong&gt;Add&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Property&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;app-vnet-fw-rule-collection&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule collection type&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Application&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Priority&lt;/td&gt;
&lt;td&gt;&lt;code&gt;200&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule collection action&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Allow&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule collection group&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;DefaultApplicationRuleCollectionGroup&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AllowAzurePipelines&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source type&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IP address&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.1.0.0/23&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocol&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Destination type&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;FQDN&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Destination&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dev.azure.com, azure.microsoft.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The &lt;strong&gt;AllowAzurePipelines&lt;/strong&gt; rule allows the web application to access Azure Pipelines. The rule allows the web application to access the Azure DevOps service and the Azure website.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add a network rule
&lt;/h2&gt;

&lt;p&gt;1.In the &lt;strong&gt;Rules&lt;/strong&gt; blade, select &lt;strong&gt;Network rules&lt;/strong&gt; and then &lt;strong&gt;Add a rule collection&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;2.Configure the network rule and then select &lt;strong&gt;Add&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Property&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;app-vnet-fw-nrc-dns&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule collection type&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Network&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Priority&lt;/td&gt;
&lt;td&gt;&lt;code&gt;200&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule collection action&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Allow&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule collection group&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;DefaultNetworkRuleCollectionGroup&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AllowDns&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.1.0.0/23&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocol&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;UDP&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Destination ports&lt;/td&gt;
&lt;td&gt;&lt;code&gt;53&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Destination addresses&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.1.1.1, 1.0.0.1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;h2&gt;
  
  
  Verify the firewall and firewall policy status
&lt;/h2&gt;

&lt;p&gt;1.In the portal search for and select &lt;strong&gt;Firewall&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;2.View the &lt;strong&gt;app-vnet-firewall&lt;/strong&gt; and ensure the &lt;strong&gt;Provisioning state&lt;/strong&gt; is &lt;strong&gt;Succeeded&lt;/strong&gt;. This may take a few minutes.&lt;/p&gt;

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

&lt;p&gt;3.In the portal serach for and select &lt;strong&gt;Firewall policies&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;4.View the &lt;strong&gt;fw-policy&lt;/strong&gt; and ensure the &lt;strong&gt;Provisioning state&lt;/strong&gt; is &lt;strong&gt;Succeeded&lt;/strong&gt;. This may take a few minutes.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;This project demonstrates the implementation of a centralized network security perimeter within Microsoft Azure using &lt;strong&gt;Azure Firewall&lt;/strong&gt; and &lt;strong&gt;Firewall Policies&lt;/strong&gt;. By shifting from decentralized security rules to a unified firewall model, this architecture enforces granular Layer 4 (network) and Layer 7 (application) filtering to protect cloud workloads from malicious egress traffic while enabling secure &lt;strong&gt;CI/CD automation&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>azurefirewall</category>
      <category>cloudsecurity</category>
      <category>infrastructure</category>
      <category>networking</category>
    </item>
    <item>
      <title>Create and configure network security groups</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Mon, 25 May 2026 15:25:22 +0000</pubDate>
      <link>https://forem.com/rahimah_dev/create-and-configure-network-security-groups-p9j</link>
      <guid>https://forem.com/rahimah_dev/create-and-configure-network-security-groups-p9j</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Want to ensure your web infrastructure is tightly controlled and protected against unauthorized traffic?&lt;/strong&gt; In this hands-on lab breakdown, I dive into securing a multi-tier architecture in Microsoft Azure. From configuring Network Security Groups (NSGs) for backend subnets to leveraging Application Security Groups (ASGs) to abstract network configurations for Ubuntu web servers, this walkthrough covers the exact skilling tasks required to manage enterprise-grade network filtering policies cleanly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your organization requires the network traffic in the app-vnet to be tightly controlled. You identify these requirements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The frontend subnet has web servers that can be accessed from the internet. An &lt;strong&gt;application security group&lt;/strong&gt; (ASG) is required for those servers. The ASG should be associated with any virtual machine interface that is part of the group. This will allow the web servers to be easily managed.&lt;/li&gt;
&lt;li&gt;The backend subnet has database servers used by the frontend web servers. A &lt;strong&gt;network security group&lt;/strong&gt; (NSG) is required to control this traffic. The NSG should be associated with any virtual machine interface that will be accessed by the web servers.&lt;/li&gt;
&lt;li&gt;For testing, a virtual machine should be installed in the frontend subnet (VM1) and the backend subnet (VM2). The IT group has provided an Azure resource manager template to deploy these &lt;strong&gt;Ubuntu servers&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Skilling tasks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create a network security group.&lt;/li&gt;
&lt;li&gt;Create network security group rules.&lt;/li&gt;
&lt;li&gt;Associate a network security group to a subnet.&lt;/li&gt;
&lt;li&gt;Create and use application security groups in network security group rules.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create the network infrastructure for the exercise&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This exercise requires the Create and Configure Virtual Networks Exercise's virtual networks and subnets to be installed. &lt;br&gt;
A &lt;a href="https://github.com/MicrosoftLearning/Configure-secure-access-to-workloads-with-Azure-virtual-networking-services/blob/main/Allfiles/Labs/All-Labs/create-vnet-subnets-template.json" rel="noopener noreferrer"&gt;template&lt;/a&gt; is provided if you need to deploy those resources.&lt;/p&gt;

&lt;p&gt;1.Use the icon (top right) to launch a &lt;strong&gt;Cloud Shell&lt;/strong&gt; session. Alternately, navigate directly to &lt;code&gt;https://shell.azure.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;2.If prompted to select either &lt;strong&gt;Bash&lt;/strong&gt; or &lt;strong&gt;PowerShell&lt;/strong&gt;, select &lt;strong&gt;PowerShell&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;3.Storage is not required for this task Select your subscription. &lt;strong&gt;Apply&lt;/strong&gt; your changes.&lt;/p&gt;

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

&lt;p&gt;4.Use these commands to deploy the virtual machines required for this exercise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If the deployment fails for capacity restriction, edit the template and change the “location” value.&lt;/p&gt;

&lt;p&gt;Copy:&lt;/p&gt;

&lt;p&gt;$RGName = "RG1"&lt;/p&gt;

&lt;p&gt;New-AzResourceGroupDeployment -ResourceGroupName $RGName -TemplateUri &lt;a href="https://raw.githubusercontent.com/MicrosoftLearning/Configure-secure-access-to-workloads-with-Azure-virtual-networking-services/main/Instructions/Labs/azuredeploy.json" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/MicrosoftLearning/Configure-secure-access-to-workloads-with-Azure-virtual-networking-services/main/Instructions/Labs/azuredeploy.json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE: It failed and I had to edit the Template&lt;/strong&gt;. I also did not use TemplateUri because I now have the file to my local environment.&lt;/p&gt;

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

&lt;p&gt;1.In the portal search for and select &lt;code&gt;virtual machines&lt;/code&gt;. Verify both vm1 and vm2 are &lt;strong&gt;Running&lt;/strong&gt;.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Create Application Security Group
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Application security groups (ASGs)&lt;/strong&gt; let you group together servers with similar functions. For example, all the web servers hosting your application.&lt;/p&gt;

&lt;p&gt;1.In the portal, search for and select &lt;code&gt;Application security groups&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;2.Select &lt;strong&gt;+ Create&lt;/strong&gt; and configure the application security group.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Property&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Subscription&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Select your subscription&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource group&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;RG1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;app-frontend-asg&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;East US&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;3.Select &lt;strong&gt;Review + create&lt;/strong&gt; and then select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;

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

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

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You are creating the application security group in the same region as the existing virtual network.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Associate the application security group to the network interface of the VM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1.In the Azure portal, search for and select &lt;code&gt;VM1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;2.In the &lt;strong&gt;Networking&lt;/strong&gt; blade, select &lt;strong&gt;Application security groups&lt;/strong&gt; and then select &lt;strong&gt;Add application security groups&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;3.Select the &lt;strong&gt;app-frontend-asg&lt;/strong&gt; and then select &lt;strong&gt;Add&lt;/strong&gt;.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Create and Associate the Network Security Group
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Network security groups (NSGs)&lt;/strong&gt; secure network traffic in a virtual network.&lt;/p&gt;

&lt;p&gt;1.In the portal search for and select &lt;code&gt;Network security group&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;2.Select &lt;strong&gt;+ Create&lt;/strong&gt; and configure the network security group.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Property&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Subscription&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Select your subscription&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource group&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;RG1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;app-vnet-nsg&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;East US&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;3.Select &lt;strong&gt;Review + create&lt;/strong&gt; and then select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Associate the NSG with the app-vnet backend subnet&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;NSGs can be associated with subnets and/or individual network interfaces attached to Azure virtual machines.&lt;/p&gt;

&lt;p&gt;1.Select &lt;strong&gt;Go to resource&lt;/strong&gt; or navigate to the &lt;strong&gt;app-vnet-nsg&lt;/strong&gt; resource.&lt;/p&gt;

&lt;p&gt;2.In the &lt;strong&gt;Settings&lt;/strong&gt; blade select &lt;strong&gt;Subnets&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;3.Select &lt;strong&gt;+ Associate&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;4.Select &lt;strong&gt;app-vnet (RG1)&lt;/strong&gt; and then the &lt;strong&gt;Backend&lt;/strong&gt; subnet. Select &lt;strong&gt;OK&lt;/strong&gt;.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Create Network Security Group rules
&lt;/h2&gt;

&lt;p&gt;An NSG use &lt;strong&gt;security rules&lt;/strong&gt; to filter inbound and outbound network traffic.&lt;/p&gt;

&lt;p&gt;1.In the search box at the top of the portal, enter &lt;strong&gt;Network security groups&lt;/strong&gt;. Select Network security groups in the search results.&lt;/p&gt;

&lt;p&gt;2.Select &lt;strong&gt;app-vnet-nsg&lt;/strong&gt; from the list of network security groups.&lt;/p&gt;

&lt;p&gt;3.In the &lt;strong&gt;Settings&lt;/strong&gt; blade, select &lt;strong&gt;Inbound security rules&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;4.Select &lt;strong&gt;+ Add&lt;/strong&gt; and configure an inbound security rule.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Property&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Source&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Any&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source port ranges&lt;/td&gt;
&lt;td&gt;***&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Destination&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Application Security group&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Destination application security group&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;app-frontend-asg&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SSH&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Action&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Allow&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Priority&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AllowSSH&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;&lt;strong&gt;Key takeaways&lt;/strong&gt;&lt;br&gt;
Here are the main takeaways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application security groups let you organize virtual machines and define network security policies based on your organization’s applications.&lt;/li&gt;
&lt;li&gt;An Azure network security group is used to filter network traffic between Azure resources in an Azure virtual network.&lt;/li&gt;
&lt;li&gt;You can associate zero, or one, network security group to each virtual network subnet and network interface in a virtual machine.&lt;/li&gt;
&lt;li&gt;A network security group contains security rules that allow or deny inbound network traffic to, or outbound network traffic from, Azure resources.&lt;/li&gt;
&lt;li&gt;You join virtual machines to an application security group. Then you use the application security group as a source or destination in the network security group rules.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This technical project demonstrates how to implement a Zero-Trust network architecture within Microsoft Azure to secure a multi-tier application. By decoupling network security rules from IP addresses and subnets, the design ensures that communication between frontend web servers and backend database workloads is &lt;strong&gt;tightly controlled, audited, and scalable&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>cloudsecurity</category>
      <category>network</category>
      <category>powershell</category>
      <category>azure</category>
    </item>
    <item>
      <title>Create and configure virtual networks</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Mon, 25 May 2026 11:17:19 +0000</pubDate>
      <link>https://forem.com/rahimah_dev/create-and-configure-virtual-networks-14nl</link>
      <guid>https://forem.com/rahimah_dev/create-and-configure-virtual-networks-14nl</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Imagine migrating a critical enterprise web application to the cloud, only to face &lt;strong&gt;network bottlenecks&lt;/strong&gt;, &lt;strong&gt;unsegmented traffic&lt;/strong&gt;, or &lt;strong&gt;exposure to the public internet&lt;/strong&gt;. Designing a resilient, production-ready cloud environment always begins at the foundational layer: &lt;em&gt;secure, scalable networking&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In this article, I demonstrate how to architect a modern cloud infrastructure blueprint using a &lt;code&gt;Hub-and-Spoke&lt;/code&gt; topology in Microsoft Azure. &lt;em&gt;This structural design isolates workloads, enforces security boundaries, and minimizes latency&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;As a cloud professional, my focus isn't just on clicking buttons in the portal,it is on delivering &lt;strong&gt;architectural patterns that protect data, optimize costs, and align with the Azure Well-Architected Framework&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;&lt;br&gt;
Your organization is migrating a web-based application to Azure. Your first task is to put in place the virtual networks and subnets. You also need to securely peer the virtual networks. You identify these requirements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two virtual networks are required, &lt;strong&gt;app-vnet&lt;/strong&gt; and &lt;strong&gt;hub-vnet&lt;/strong&gt;. This simulates a hub and spoke network architecture.&lt;/li&gt;
&lt;li&gt;The app-vnet will host the application. This virtual network requires two subnets. The &lt;strong&gt;frontend subnet&lt;/strong&gt; will host the web servers. The &lt;strong&gt;backend subnet&lt;/strong&gt; will host the database servers.&lt;/li&gt;
&lt;li&gt;The hub-vnet only requires a subnet for the firewall.&lt;/li&gt;
&lt;li&gt;The two virtual networks must be able to communicate with each other securely and privately through &lt;strong&gt;virtual network peering&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Both virtual networks should be in the same region.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Skilling tasks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create a virtual network.&lt;/li&gt;
&lt;li&gt;Create a subnet.&lt;/li&gt;
&lt;li&gt;Configure vnet peering.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; To complete this lab you will need an Azure subscription with &lt;strong&gt;Contributor&lt;/strong&gt; RBAC role assigned. In this lab, when you are asked to create a resource, for any properties that are not specified, use the default value.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create hub and spoke virtual networks and subnets
&lt;/h2&gt;

&lt;p&gt;An &lt;code&gt;Azure virtual network&lt;/code&gt; enables many types of Azure resources to securely communicate with each other, the internet, and on-premises networks. All Azure resources in a virtual network are deployed into &lt;code&gt;subnets&lt;/code&gt; within the virtual network.&lt;/p&gt;

&lt;p&gt;1.Sign in to the &lt;strong&gt;Azure portal&lt;/strong&gt; - &lt;code&gt;https://portal.azure.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;2.Search for and select &lt;code&gt;Virtual Networks&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;3.Select &lt;strong&gt;+ Create&lt;/strong&gt; and complete the configuration of the &lt;strong&gt;app-vnet&lt;/strong&gt;. &lt;/p&gt;

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

&lt;p&gt;This virtual network requires two subnets, &lt;strong&gt;frontend&lt;/strong&gt; and &lt;strong&gt;backend&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Property&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Resource group&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;RG1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virtual network name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;app-vnet&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;East US&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IPv4 address space&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.1.0.0/16&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subnet name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;frontend&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subnet address range&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.1.0.0/24&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subnet name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;backend&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subnet address range&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.1.1.0/24&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;:Leave all other settings as their defaults. &lt;/p&gt;

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

&lt;p&gt;When finished select &lt;strong&gt;Review + create&lt;/strong&gt; and then &lt;strong&gt;Create&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbyai9wq8g3dp88kjifjk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbyai9wq8g3dp88kjifjk.png" alt="reviewncreate" width="800" height="482"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh6tpht3qbqp2trfd9daj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh6tpht3qbqp2trfd9daj.png" alt="create" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.Create the &lt;strong&gt;Hub-vnet&lt;/strong&gt; virtual network configuration. This virtual network has the firewall subnet.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Property&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Resource group&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;RG1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hub-vnet&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;East US&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IPv4 address space&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.0.0.0/16&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subnet name&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AzureFirewallSubnet&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subnet address range&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.0.0.0/26&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

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

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

&lt;p&gt;5.Once the deployments are complete, search for and select your ‘virtual networks`.&lt;/p&gt;

&lt;p&gt;6.Verify your virtual networks and subnets were deployed.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Configure a peer relationship between the virtual networks
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Virtual network peering&lt;/code&gt; enables you to seamlessly connect two or more Virtual Networks in Azure.&lt;/p&gt;

&lt;p&gt;1.Search for and select the &lt;code&gt;app-vnet&lt;/code&gt; virtual network.&lt;/p&gt;

&lt;p&gt;2.In the &lt;strong&gt;Settings&lt;/strong&gt; blade, select &lt;strong&gt;Peerings&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;3.&lt;strong&gt;+ Add&lt;/strong&gt; a peering between the two virtual networks.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Property&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Remote peering link name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;app-vnet-to-hub&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virtual network&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hub-vnet&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local virtual network peering link name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hub-to-app-vnet&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Leave all other settings as their defaults. Select &lt;strong&gt;“Add”&lt;/strong&gt; to create the virtual network peering.&lt;/p&gt;

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

&lt;p&gt;4.Once the deployment completes, verify the &lt;strong&gt;Peering status&lt;/strong&gt; is &lt;strong&gt;Connected&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Key takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here are the main takeaways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure virtual networks (VNets) provide a secure and isolated network environment for your cloud resources. You can create multiple virtual networks per region per subscription.&lt;/li&gt;
&lt;li&gt;When designing virtual networks make sure the VNet address space (CIDR block) doesn’t overlap with your organization’s other network ranges.&lt;/li&gt;
&lt;li&gt;A subnet is a range of IP addresses in the VNet. You can segment VNets into different size subnets, creating as many subnets as you require for organization and security within the subscription limit. Each subnet must have a unique address range.&lt;/li&gt;
&lt;li&gt;Certain Azure services, such as Azure Firewall, require their own subnet.&lt;/li&gt;
&lt;li&gt;Virtual network peering enables you to seamlessly connect two Azure virtual networks. The virtual networks appear as one for connectivity purposes. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;This project isn't just about spinning up resources, it is a demonstration of &lt;strong&gt;secure, production-grade cloud architecture&lt;/strong&gt;. By implementing this Hub-and-Spoke topology, I have successfully:&lt;/p&gt;

&lt;p&gt;1.Enforced Strict Network Isolation: Segmented the application layer into dedicated frontend and backend subnets to implement a defense-in-depth security model.&lt;/p&gt;

&lt;p&gt;2.Designed for Enterprise Scale: Established a central hub-vnet to allow seamless, future integration of centralized security appliances like Azure Firewall.&lt;/p&gt;

&lt;p&gt;3.Optimized Performance &amp;amp; Security: Leveraged VNet Peering to ensure high-bandwidth, low-latency communication that remains entirely off the public internet.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I designed this infrastructure with a &lt;strong&gt;Zero-Trust mindset&lt;/strong&gt;, ensuring that every deployment is scalable, compliant, and structurally aligned with enterprise security standards&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>security</category>
      <category>networking</category>
      <category>devops</category>
    </item>
    <item>
      <title>From Code to Clouds: Hosting a Professional Resume on GitHub Pages(2)</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Sat, 02 May 2026 22:55:35 +0000</pubDate>
      <link>https://forem.com/rahimah_dev/from-code-to-clouds-hosting-a-professional-resume-on-github-pages2-3poi</link>
      <guid>https://forem.com/rahimah_dev/from-code-to-clouds-hosting-a-professional-resume-on-github-pages2-3poi</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In &lt;em&gt;Part 1&lt;/em&gt;, we successfully moved the resume from a &lt;em&gt;local editor to a live URL&lt;/em&gt;. But an empty repository is like a house without a front door, functional, yet inaccessible to those looking in. In this second &lt;strong&gt;installment, we’re going back into the terminal to master the art of the README&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I’ll show you how to turn a folder of code into a polished, technical portfolio that speaks for itself&lt;/em&gt;. Whether you’re a Cloud aspirant or a DevOps enthusiast, your documentation is your handshake. Let’s make it count.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Navigating and Initializing the README&lt;/strong&gt;&lt;br&gt;
In the previous guide, we set up the environment. Now, we return to the terminal to add the "front door" of our project, that is the &lt;strong&gt;the README.md file&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Changing Directory&lt;/strong&gt;: We start by using &lt;code&gt;cd ~/Desktop/website&lt;/code&gt; to ensure we are working inside the correct project folder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creating the File&lt;/strong&gt;: The &lt;code&gt;touch README.md&lt;/code&gt; command is used to generate a blank Markdown file. Using the &lt;code&gt;.md&lt;/code&gt; extension is crucial as it tells GitHub to render this as a formatted document rather than just plain text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opening the Editor&lt;/strong&gt;: To add content, we use the &lt;code&gt;vi README.md&lt;/code&gt; command. This opens the Vi text editor directly in the terminal, it's a lightweight, powerful tool that every &lt;strong&gt;Cloud and DevOps&lt;/strong&gt; professional should be comfortable using.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 2: Inspecting and Verifying Content&lt;/strong&gt;&lt;br&gt;
Once I’ve finished editing in &lt;code&gt;Vi&lt;/code&gt;, it’s best practice to verify that your data was saved exactly how you intended.&lt;/p&gt;

&lt;p&gt;We use &lt;code&gt;cat README.md&lt;/code&gt; to display the entire contents of the file directly in the terminal. This &lt;em&gt;check&lt;/em&gt; ensures there are no typos or formatting errors in our Markdown syntax before we push.&lt;/p&gt;

&lt;p&gt;The output shows a structured, professional layout:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Project Title&lt;/em&gt;: Using # for a clear H1 heading.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Live Links&lt;/em&gt;: Providing immediate access to the hosted resume.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Visual Elements&lt;/em&gt;: Using emojis (🚀, 🛠️, 📖) to make the documentation modern and readable.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Technical Milestones&lt;/em&gt;: A numbered list summarizing the core achievements of the project.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Command Reference&lt;/em&gt;: Using backticks (`) for code blocks, creating a "cheat sheet" for anyone who forks the repository.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 3: The Version Control Lifecycle (Stage &amp;amp; Commit)&lt;/strong&gt;&lt;br&gt;
In this step, we move our new documentation through the Git lifecycle. It’s not enough to just create the file, we have to tell &lt;code&gt;Git&lt;/code&gt; to track it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git status&lt;/strong&gt; (The Pulse Check): Before doing anything, I ran &lt;code&gt;git status&lt;/code&gt;. You can see &lt;code&gt;README.md&lt;/code&gt; highlighted in &lt;strong&gt;red&lt;/strong&gt; under &lt;strong&gt;Untracked files&lt;/strong&gt;. This confirms that &lt;code&gt;Git&lt;/code&gt; sees a new file but isn't yet managing it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git add README.md (Staging)&lt;/strong&gt;: This command moves the file into the staging area. The terminal warning about &lt;em&gt;LF will be replaced by CRLF&lt;/em&gt; is a common occurrence in Git Bash on Windows, it’s just Git managing how line endings are handled between different operating systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git commit (The Snapshot)&lt;/strong&gt;: By running &lt;code&gt;git commit -m "add README with project overview and commands"&lt;/code&gt;, we officially record the change. &lt;em&gt;The output "1 file changed, 30 insertions" serves as a receipt, confirming that our 30 lines of professional documentation are now part of the project's history&lt;/em&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 4: The Final Push (Syncing to the Cloud)&lt;/strong&gt;&lt;br&gt;
This is the bridge between our local work and our public profile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git push origin master&lt;/strong&gt;: This command tells &lt;code&gt;Git&lt;/code&gt; to take the committed changes &lt;strong&gt;(the new README)&lt;/strong&gt; and upload them to the &lt;strong&gt;origin (GitHub)&lt;/strong&gt; on the master branch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Enumerating objects: 4, done"&lt;/strong&gt;: Git is gathering the files you changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Writing objects... 1.19 KiB"&lt;/strong&gt;: This confirms the actual data transfer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Confirmation: The line bb98894..e6d1410 master -&amp;gt; master is the technical "all clear."&lt;/strong&gt; It shows your local branch is now perfectly synced with GitHub.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 5: Configuring the Global Gateway (GitHub Pages)&lt;/strong&gt;&lt;br&gt;
Once the code is safely in the cloud, you have to tell GitHub how to serve it to the public.&lt;/p&gt;

&lt;p&gt;Navigating to the &lt;strong&gt;Settings &amp;gt; Pages&lt;/strong&gt; tab is where the hosting magic happens.&lt;/p&gt;

&lt;p&gt;I set the source to &lt;strong&gt;Deploy from a branch&lt;/strong&gt; and selected the master branch and / (root) folder. This tells the &lt;code&gt;GitHub&lt;/code&gt; server to look for our &lt;code&gt;index.html&lt;/code&gt; file exactly where we saved it.&lt;/p&gt;

&lt;p&gt;Once saved, GitHub generates a custom URL (e.g., &lt;a href="https://rahimahisah17.github.io/Git-Basics101/" rel="noopener noreferrer"&gt;https://rahimahisah17.github.io/Git-Basics101/&lt;/a&gt;). &lt;br&gt;
Seeing that "Your site is live" message is the ultimate green light for a developer!&lt;/p&gt;

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

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

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

&lt;p&gt;Documentation is the bridge between writing code and building a career. A project without a &lt;strong&gt;README&lt;/strong&gt; is just a folder, a project with a &lt;strong&gt;README&lt;/strong&gt; is a story of your technical journey.&lt;/p&gt;

</description>
      <category>github</category>
      <category>devops</category>
      <category>git</category>
      <category>documentation</category>
    </item>
    <item>
      <title>Kubernetes Building Blocks(1)</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Fri, 24 Apr 2026 16:01:47 +0000</pubDate>
      <link>https://forem.com/rahimah_dev/kubernetes-building-blocks1-815</link>
      <guid>https://forem.com/rahimah_dev/kubernetes-building-blocks1-815</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;If you liken Kubernetes to an ocean, those individual drops that make up the ocean are the core building blocks: &lt;code&gt;Namespaces&lt;/code&gt;, &lt;code&gt;Pods&lt;/code&gt;, &lt;code&gt;ReplicaSets&lt;/code&gt;, &lt;code&gt;Deployments&lt;/code&gt;, &lt;code&gt;Labels&lt;/code&gt;, etc.&lt;br&gt;
Our focus here will be on the first two mentioned.&lt;br&gt;
As a professional working across Data Analytics and Cloud Engineering, I’ve found that the best way to master these concepts isn't just by reading documentation, but by using the &lt;em&gt;Build, See, Destroy&lt;/em&gt; methodology. This approach allows you to experiment fearlessly, visualize the cluster's internal logic, and clean up after yourself.&lt;/p&gt;

&lt;p&gt;In this post, we are going to move from a &lt;strong&gt;blank slate&lt;/strong&gt; Minikube cluster to an orchestrated environment, exploring both the fast-paced command line and the birds-eye view of the Kubernetes Dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Scenario&lt;/strong&gt;: The Isolated Web Fleet&lt;br&gt;
Imagine you are a DevOps Engineer tasked with deploying a fleet of Nginx web servers for a new project. However, the cluster is shared with other teams, so you can't just dump your resources into the default space.&lt;br&gt;
&lt;strong&gt;Tasks&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Carve out a Virtual Sandbox: Create a dedicated &lt;code&gt;Namespace&lt;/code&gt; to keep our project isolated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deploy the Fleet: Use both Imperative (quick CLI) and Declarative (&lt;code&gt;YAML&lt;/code&gt;/&lt;code&gt;JSON&lt;/code&gt;) methods to launch five Nginx pods.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inspect &amp;amp; Troubleshoot: Go under the hood to check &lt;code&gt;IP addresses&lt;/code&gt;, &lt;code&gt;node placements&lt;/code&gt;, and handle the inevitable errors that come with cluster management.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Visualize the Result: Launch the &lt;code&gt;Minikube Dashboard&lt;/code&gt; to confirm 100% health of our fleet.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Namespaces
&lt;/h2&gt;

&lt;p&gt;If multiple users and teams use the same Kubernetes cluster we can partition the cluster into virtual sub-clusters using &lt;code&gt;Namespaces&lt;/code&gt;. The names of the resources/objects created inside a Namespace are unique, &lt;em&gt;but not across Namespaces in the cluster&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Checking if the Cluster is Ready&lt;/strong&gt;&lt;br&gt;
Before we can start building with &lt;strong&gt;Namespaces&lt;/strong&gt; and &lt;strong&gt;Pods&lt;/strong&gt;, we need to ensure our local environment is up and running. Using &lt;code&gt;Minikube&lt;/code&gt;, we can quickly verify the health of our cluster, run &lt;strong&gt;minikube status&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To list all the Namespaces, we can run the following command:&lt;br&gt;
&lt;strong&gt;$ kubectl get namespaces&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fadquiryfib94y5ao8cdr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fadquiryfib94y5ao8cdr.png" alt="namespaces" width="800" height="331"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A Namespace is to a Kubernetes cluster as a ResourceGroup is to an Azure Subscription&lt;/em&gt;. &lt;br&gt;
Generally, Kubernetes creates four Namespaces out of the box: &lt;code&gt;kube-system&lt;/code&gt;, &lt;code&gt;kube-public&lt;/code&gt;, &lt;code&gt;kube-node-lease&lt;/code&gt;, and &lt;code&gt;default&lt;/code&gt;. The &lt;code&gt;kube-system&lt;/code&gt; Namespace contains the objects created by the Kubernetes system, mostly the control plane agents. The &lt;code&gt;default&lt;/code&gt; Namespace contains the objects and resources created by administrators and developers, and objects are assigned to it by default unless another Namespace name is provided by the user. &lt;code&gt;kube-public&lt;/code&gt; is a special Namespace, which is unsecured and readable by anyone, used for special purposes such as exposing public (non-sensitive) information about the cluster. &lt;br&gt;
The newest Namespace is &lt;code&gt;kube-node-lease&lt;/code&gt; which holds node lease objects used for node heartbeat data. &lt;br&gt;
&lt;em&gt;Good practice, however, is to create additional Namespaces, as desired, to virtualize the cluster and isolate users, developer teams, applications, or tiers&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2. Organizing your cluster by Creating Your Own Namespace&lt;/strong&gt;&lt;br&gt;
Think of Namespaces as virtual folders within your cluster. While Kubernetes provides a default namespace, &lt;em&gt;it’s best practice to create your own to keep your projects isolated and organized&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In this step, I move from viewing the cluster to actively managing it by running the command:&lt;br&gt;
&lt;strong&gt;$ kubectl create namespace new-namespace-name&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl create namespace rahimah&lt;/strong&gt; &lt;br&gt;
This is an imperative command. I'm telling the Kubernetes API directly to make this right now. The confirmation &lt;code&gt;namespace/rahimah created&lt;/code&gt; is the cluster acknowledging the new logical boundary.&lt;/p&gt;

&lt;p&gt;Namespaces are one of the most desired features of Kubernetes, securing its lead against competitors, as it provides a solution to the &lt;strong&gt;multi-tenancy&lt;/strong&gt; requirement of today's enterprise development teams.&lt;/p&gt;

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

&lt;p&gt;Run &lt;strong&gt;$ kubectl get namespaces&lt;/strong&gt; to Verifying our work is key. You can see the new namespace rahimah is now &lt;code&gt;Active&lt;/code&gt; alongside the system-generated ones. It’s now a ready-to-use &lt;code&gt;sandbox&lt;/code&gt; where we can deploy our pods without cluttering the rest of the cluster.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Namespaces are great for multi-tenancy. If you are working in a team, giving each developer or project their own namespace prevents naming collisions, meaning you can have a pod named web-server in Namespace A and another web-server in Namespace B without any conflict!&lt;/em&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Pods
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;Pod&lt;/code&gt; is the &lt;strong&gt;smallest&lt;/strong&gt; Kubernetes workload object. It is the unit of deployment in Kubernetes, which represents a single instance of the application. A Pod is a &lt;strong&gt;logical collection&lt;/strong&gt; of one or more containers, enclosing and isolating them to ensure that they:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are scheduled together on the same host with the Pod.&lt;/li&gt;
&lt;li&gt;Share the same network namespace, meaning that they share a single IP address originally assigned to the Pod.&lt;/li&gt;
&lt;li&gt;Have access to mount the same external storage (volumes) and other common dependencies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below is an example of a stand-alone Pod object's definition manifest in &lt;code&gt;YAML&lt;/code&gt; format, without an operator. This represents the declarative method to define an object, and can serve as a template for a much more complex Pod definition manifest if desired:&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 1: Moving to Declarative by Defining Your First Pod&lt;/strong&gt;&lt;br&gt;
While &lt;code&gt;kubectl run&lt;/code&gt; is great for quick tests, real-world Kubernetes relies on Manifests. These YAML files act as the &lt;em&gt;source of truth&lt;/em&gt; for your infrastructure, allowing you to version control and share your configurations easily.&lt;/p&gt;

&lt;p&gt;The Screenshot: Preparing the Manifest&lt;br&gt;
In this sequence, I’m setting up the workspace and defining the blueprint for our application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Setting the Scene&lt;/strong&gt;&lt;br&gt;
I created a dedicated directory &lt;code&gt;cluster&lt;/code&gt; and a new file &lt;code&gt;rahimah.yaml&lt;/code&gt; to keep the project organized.&lt;/p&gt;

&lt;p&gt;What the manifest contains:&lt;br&gt;
&lt;strong&gt;apiVersion &amp;amp; kind&lt;/strong&gt;: Tells Kubernetes we are creating a version 1 Pod.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;metadata&lt;/strong&gt;: This is where we name our resource (nginx-pod).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;spec&lt;/strong&gt;: This is the most critical part. It defines the desired state, specifically, that we want one container running the nginx:1.22.1 image on port 80.&lt;br&gt;
&lt;strong&gt;KAMS&lt;/strong&gt; stands for the parts of a manifest.&lt;/p&gt;

&lt;p&gt;Tip: YAML is extremely sensitive to indentation! If you're off by even one space, the Kubernetes API will reject your file. I always recommend using a code editor with a YAML linting extension to catch these &lt;em&gt;invisible&lt;/em&gt; errors before you hit the terminal, hence I used the &lt;code&gt;vi&lt;/code&gt; editor.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;apiVersion&lt;/code&gt; field must specify &lt;code&gt;v1&lt;/code&gt; for the Pod object definition. The second required field is &lt;code&gt;kind&lt;/code&gt; specifying the Pod object type. The third required field &lt;code&gt;metadata&lt;/code&gt;, holds the object's name and optional labels and annotations. The fourth required field &lt;code&gt;spec&lt;/code&gt; marks the beginning of the block defining the desired state of the Pod object (also named the &lt;code&gt;PodSpec&lt;/code&gt;). Our Pod creates a single container running the nginx:1.22.1 image pulled from a &lt;strong&gt;container image registry&lt;/strong&gt;, in this case from &lt;code&gt;Docker Hub&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;The above definition manifest, if stored by a &lt;code&gt;rahimah.yaml&lt;/code&gt; file, is loaded into the cluster to run the desired &lt;code&gt;Pod&lt;/code&gt; and its associated container image.&lt;/p&gt;

&lt;p&gt;Before creating the pod, I'll save the YAML file in a directory, for organization. Then &lt;code&gt;vi&lt;/code&gt; into it for verification.&lt;/p&gt;

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

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

&lt;p&gt;&lt;strong&gt;Step 3: Reviewing the Manifest&lt;/strong&gt;&lt;br&gt;
Before we send our instructions to the &lt;code&gt;Kubernetes API&lt;/code&gt;, it’s always a good habit to &lt;em&gt;peek&lt;/em&gt; inside the file one last time. This ensures that our indentation is correct and that we are deploying the exact version of the image we intended.&lt;/p&gt;

&lt;p&gt;Am inspecting the File with &lt;code&gt;cat&lt;/code&gt; command&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdg0swm14eoxe94axl1x9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdg0swm14eoxe94axl1x9.png" alt="cat" width="800" height="306"&gt;&lt;/a&gt;&lt;br&gt;
This is important because in a real-world &lt;code&gt;DevOps&lt;/code&gt; environment, you might be managing dozens of &lt;code&gt;YAML&lt;/code&gt; files. Running &lt;code&gt;cat&lt;/code&gt; allows you to verify the &lt;strong&gt;metadata&lt;/strong&gt; and &lt;strong&gt;spec&lt;/strong&gt; fields without opening a full text editor.&lt;/p&gt;

&lt;p&gt;NOTE: If you're following along, notice the &lt;code&gt;containerPort: 80&lt;/code&gt;. This doesn't actually &lt;em&gt;open&lt;/em&gt; the port to the outside world yet (you'll need a Service for that later) but it tells Kubernetes which port the application inside the container is listening on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl create -f rahimah.yaml&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl run nginx-pod --image=nginx:1.22.1 --port=80$ kubectl run nginx-pod --image=nginx:1.22.1 --port=80&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: From Blueprint to Reality&lt;/strong&gt;&lt;br&gt;
This is where we move from local files to actual running resources. In this step, I demonstrate both the &lt;code&gt;Declarative&lt;/code&gt; and &lt;code&gt;Imperative&lt;/code&gt; methods of pod creation.&lt;/p&gt;

&lt;p&gt;The screenshot shows deployment the &lt;code&gt;Nginx pods&lt;/code&gt;.&lt;br&gt;
In this image, I am populating the cluster with &lt;em&gt;three&lt;/em&gt; distinct pods using two different techniques.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl create -f rahimah.yaml&lt;/strong&gt;: This is the &lt;code&gt;Declarative&lt;/code&gt; approach. We are telling Kubernetes to &lt;em&gt;create whatever is defined in this file&lt;/em&gt;. It’s the professional standard for production environments.&lt;br&gt;
&lt;strong&gt;$ kubectl run nginx-pod --image=nginx:1.22.1 --port=80$ kubectl run nginx-pod --image=nginx:1.22.1 --port=80&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;kubectl run nginx-pod2 &amp;amp; nginx-pod3: These are &lt;code&gt;Imperative&lt;/code&gt; commands. They are fast, one-liners that are perfect for &lt;code&gt;Build, See, Destroy&lt;/code&gt; learning or quick debugging.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxlg9msrdz0c3j84o3vvj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxlg9msrdz0c3j84o3vvj.png" alt="3pods" width="800" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice the consistent feedback from the cluster: &lt;strong&gt;pod/nginx-pod created&lt;/strong&gt;. &lt;br&gt;
Whether you use a complex &lt;code&gt;JSON/YAML&lt;/code&gt; file or a simple &lt;code&gt;CLI&lt;/code&gt; command, the &lt;code&gt;Kubernetes API&lt;/code&gt; processes the request and schedules the workload onto a node.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Verifying the Workload&lt;/strong&gt;&lt;br&gt;
The most satisfying part of any Kubernetes project is seeing that &lt;strong&gt;Running&lt;/strong&gt; status. This is where we confirm that the cluster has successfully pulled the images, allocated resources, and started our containers.&lt;/p&gt;

&lt;p&gt;The Screenshot shows &lt;strong&gt;Healthy&lt;/strong&gt; Pod Fleet&lt;br&gt;
In this final view, we run the ultimate "truth" command: &lt;strong&gt;kubectl get pods&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F31qip00d8yhz1hoo0r4k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F31qip00d8yhz1hoo0r4k.png" alt="getpods" width="800" height="128"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;READY 1/1&lt;/strong&gt;: This indicates that the container inside the pod has passed its readiness check and is prepared to handle traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;STATUS Running&lt;/strong&gt;: This confirms the pod is active on a node. If you see &lt;code&gt;ContainerCreating&lt;/code&gt; or &lt;code&gt;ErrImagePull&lt;/code&gt; here, you know something went wrong during the startup process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RESTARTS 0&lt;/strong&gt;: A zero here is a sign of stability. It means your application hasn't crashed or entered a &lt;code&gt;CrashLoopBackOff&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;However, when in need of a starter definition manifest, knowing how to generate one can be a life-saver. The imperative command with additional key flags such as dry-run and the yaml output, can generate the definition template instead of running the Pod, while the template is then stored in the rahimah.yaml file. The following is a multi-line command that should be selected in its entirety for copy/paste (including the backslash character "\")&lt;/em&gt;&lt;br&gt;
$ kubectl run nginx-pod --image=nginx:1.22.1 --port=80 \&lt;br&gt;
--dry-run=client -o yaml &amp;gt; nginx-pod.yaml&lt;/p&gt;

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

&lt;p&gt;I ran the &lt;strong&gt;ls&lt;/strong&gt; command to confirm the file presence in that location,&lt;br&gt;
then I created a pod from the &lt;code&gt;YAML&lt;/code&gt; file and &lt;strong&gt;get pods&lt;/strong&gt; to list the pods present in the cluster.&lt;/p&gt;

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

&lt;p&gt;The command above generates a definition manifest in &lt;code&gt;YAML&lt;/code&gt;, but we can generate a &lt;code&gt;JSON&lt;/code&gt; definition file just as easily with:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl run nginx-pod --image=nginx:1.22.1 --port=80 \&lt;br&gt;
--dry-run=client -o json &amp;gt; nginx-pod.json&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Then &lt;code&gt;vi&lt;/code&gt; into the &lt;code&gt;json&lt;/code&gt; file that created pod4 to edit it for pod5. Then &lt;strong&gt;cat&lt;/strong&gt; again it to verify the changes were effected.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcyicwlxpycxijj199roy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcyicwlxpycxijj199roy.png" alt="newfile" width="800" height="624"&gt;&lt;/a&gt;&lt;br&gt;
I created a new pod using the &lt;code&gt;apply&lt;/code&gt; verb, then ran &lt;code&gt;get pods&lt;/code&gt;, &lt;code&gt;get pods -o wide&lt;/code&gt; commands.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;NOTE: The difference get pods and get pods -o wide&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl create -f nginx-pod.yaml&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;$ kubectl create -f nginx-pod.json&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both the &lt;code&gt;YAML&lt;/code&gt; and &lt;code&gt;JSON&lt;/code&gt; definition files can serve as templates or can be loaded into the cluster respectively as such:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Deep Dive&lt;/strong&gt;&lt;br&gt;
Sometimes, a simple &lt;strong&gt;kubectl get pods&lt;/strong&gt; isn't enough. When you need to know exactly what is happening inside a &lt;code&gt;Pod&lt;/code&gt;, like which node it's running on, its IP address, or its lifecycle events, you need to use the &lt;strong&gt;describe&lt;/strong&gt; command.&lt;/p&gt;

&lt;p&gt;The Screenshot shows the &lt;strong&gt;anatomy&lt;/strong&gt; of a Running Pod&lt;br&gt;
In this image, I’m running &lt;strong&gt;kubectl describe pods&lt;/strong&gt; and the output is a goldmine of information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Node Information&lt;/strong&gt;: You can see this pod is scheduled on the &lt;code&gt;minikube&lt;/code&gt; node at IP 192.168.49.2.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Container Details&lt;/strong&gt;: It confirms we are using the &lt;code&gt;nginx:1.22.1 image&lt;/code&gt; and that the container is officially in the &lt;strong&gt;Running&lt;/strong&gt; state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conditions&lt;/strong&gt;: Notice the &lt;strong&gt;True&lt;/strong&gt; values for &lt;em&gt;Initialized&lt;/em&gt;, &lt;em&gt;Ready&lt;/em&gt;, and &lt;strong&gt;PodScheduled&lt;/strong&gt;. This is the _checklist _Kubernetes uses to ensure the pod is healthy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IP Address&lt;/strong&gt;: Each pod gets its own unique internal IP (in this case, 10.244.0.3).&lt;/p&gt;

&lt;p&gt;NOTE: If your pod is stuck in &lt;code&gt;Pending&lt;/code&gt; or &lt;code&gt;CrashLoopBackOff&lt;/code&gt;, always scroll to the very bottom of the describe output. The Events section will tell you the exact reason, whether it’s a &lt;strong&gt;failed pull&lt;/strong&gt;, &lt;strong&gt;a lack of memory&lt;/strong&gt;, or a &lt;strong&gt;configuration error&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 7: The Apply Warning&lt;/strong&gt;&lt;br&gt;
As you saw earlier, switching between &lt;code&gt;kubectl run&lt;/code&gt; and &lt;code&gt;kubectl&lt;/code&gt; apply can trigger a warning message.&lt;/p&gt;

&lt;p&gt;Recall the Screenshot &lt;strong&gt;Missing Annotation Warning&lt;/strong&gt;&lt;br&gt;
In this image, I used &lt;code&gt;kubectl apply&lt;/code&gt; on a pod that was originally created with a simple run command.&lt;/p&gt;

&lt;p&gt;What the Warning Means: Kubernetes is saying: "I don't see the 'last-applied-configuration' note on this pod." You don't actually have to do anything, Kubernetes automatically &lt;code&gt;patches&lt;/code&gt; the pod by adding that annotation so it can track future declarative changes.&lt;/p&gt;

&lt;p&gt;Hence, once you move to a file-based workflow (using &lt;code&gt;YAML&lt;/code&gt; or &lt;code&gt;JSON&lt;/code&gt;), stick with &lt;code&gt;kubectl apply&lt;/code&gt;. It makes your deployments much more predictable and stable.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 8: Using the describe Command for Advanced Inspection&lt;/strong&gt;&lt;br&gt;
When a simple list isn't enough, we need to look closer. The &lt;code&gt;kubectl describe&lt;/code&gt; command is your magnifying glass for everything happening inside a resource.&lt;/p&gt;

&lt;p&gt;The Screenshots below show an anatomy of a Running Pod, am inspecting all the pods. The output provides critical data that isn't visible in a standard list:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Placement&lt;/strong&gt;: You can see exactly which Node (in this case, our &lt;code&gt;minikube VM&lt;/code&gt;) is hosting the pod.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Networking&lt;/strong&gt;: Each pod is assigned its own internal IP address (like 10.244.0.3).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lifecycle Conditions&lt;/strong&gt;: Notice the "True" status for &lt;code&gt;Initialized&lt;/code&gt;, &lt;code&gt;Ready&lt;/code&gt;, and &lt;code&gt;ContainersReady&lt;/code&gt;. This is the checklist Kubernetes uses to confirm the pod is healthy and capable of serving traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Events&lt;/strong&gt;: While not visible in every crop, the bottom of this output logs every action the cluster took, &lt;em&gt;from pulling the image to starting the container&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Tip: If your pod status is &lt;strong&gt;Pending&lt;/strong&gt;, use &lt;code&gt;describe&lt;/code&gt;. It will often tell you if the cluster is out of memory or if it can't find a node that fits your requirements.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1hv1slno8y72hxif89g9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1hv1slno8y72hxif89g9.png" alt="crash" width="800" height="254"&gt;&lt;/a&gt;&lt;br&gt;
Always verify cluster health before deployment to minimize downtime.&lt;br&gt;
&lt;strong&gt;Step 11: The GUI Perspective (Launching the Minikube Dashboard)&lt;/strong&gt;&lt;br&gt;
Sometimes a visual overview is exactly what you need to see the *&lt;em&gt;big picture *&lt;/em&gt; of your cluster.&lt;/p&gt;

&lt;p&gt;In the screenshot below an accessing the Dashboard by running the command &lt;code&gt;minikube dashboard&lt;/code&gt;. This automates several complex steps for you;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enabling the Addon&lt;/strong&gt;: It ensures the dashboard components are active.&lt;br&gt;
&lt;strong&gt;Launching the Proxy&lt;/strong&gt;: It creates a secure tunnel between your local machine and the cluster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opening the UI&lt;/strong&gt;: It provides a local URL that opens directly in your browser.&lt;br&gt;
The dashboard isn't just for looking, you can use it to edit &lt;code&gt;YAML&lt;/code&gt; files, scale your &lt;code&gt;deployments&lt;/code&gt;, and view real-time &lt;code&gt;logs&lt;/code&gt; without typing a single &lt;code&gt;kubectl&lt;/code&gt; command.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 9: Exploring the Kubernetes Dashboard&lt;/strong&gt;&lt;br&gt;
After spending so much time in the terminal, there is nothing quite like seeing your cluster come to life in a web browser. The &lt;code&gt;Minikube Dashboard&lt;/code&gt; provides a real-time, graphical view of your workloads, and it’s an incredible tool for both beginners and advanced users.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjbg2kb1px62odu0377c9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjbg2kb1px62odu0377c9.png" alt="dashbrdbrws" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The solid green circle shows that 100% of our desired pods are healthy and running.&lt;/p&gt;

&lt;p&gt;The Pod List shows all five of our Nginx pods (nginx-pod through nginx-pod5) lined up perfectly.&lt;/p&gt;

&lt;p&gt;The Metadata at a Glance: Without typing a single command, we can see the internal IP addresses, the image versions (nginx:1.22.1), and even how long each pod has been alive.&lt;/p&gt;

&lt;p&gt;The Sidebar: Notice the menu on the left. This is where you can explore more advanced building blocks like &lt;code&gt;ConfigMaps&lt;/code&gt;, &lt;code&gt;Secrets&lt;/code&gt;, and &lt;code&gt;Storage Classes&lt;/code&gt; as you progress in your journey.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 10: Powering Down&lt;/strong&gt;&lt;br&gt;
Once you’ve finished your lab session, it’s best practice to stop your local cluster to save your machine's battery and CPU.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu5lx60n23t8fiuwhvjez.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu5lx60n23t8fiuwhvjez.png" alt="minikube stop" width="800" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The screenshot shows the transition from an active environment to a clean stop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ minikube stop&lt;/strong&gt;: This gracefully powers down the Minikube virtual machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ minikube status&lt;/strong&gt;: Confirming the shutdown. You can see the &lt;code&gt;host&lt;/code&gt;, &lt;code&gt;kubelet&lt;/code&gt;, and &lt;code&gt;apiserver&lt;/code&gt; are all now in a Stopped state.&lt;/p&gt;

&lt;p&gt;Your work isn't lost. The next time you run minikube start, your namespaces and manifests will be right where you left them.&lt;/p&gt;

&lt;p&gt;Before advancing to more complex application deployment and management methods, become familiar with Pod operations with additional commands such as:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl apply -f nginx-pod.yaml&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;$ kubectl get pods&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;$ kubectl get pod nginx-pod -o yaml&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;$ kubectl get pod nginx-pod -o json&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;$ kubectl describe pod nginx-pod&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;$ kubectl delete pod nginx-pod&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Bridging the Gap Between Code and Infrastructure&lt;/strong&gt;&lt;br&gt;
Building this fleet of &lt;code&gt;Nginx pods&lt;/code&gt; was more than just a technical exercise, it was a demonstration of how a structured "Build, See, Destroy" approach ensures infrastructure reliability. By moving from imperative CLI commands to declarative &lt;code&gt;YAML&lt;/code&gt; and &lt;code&gt;JSON&lt;/code&gt; manifests, we create a system that is version-controlled, repeatable, and scalable—the core pillars of a modern &lt;code&gt;DevOps&lt;/code&gt; culture.&lt;/p&gt;

&lt;p&gt;For me, the real power of Kubernetes lies in its self-healing nature and resource isolation. Whether it’s troubleshooting a missing client certificate or using the Dashboard to verify cluster health, the goal remains the same: ensuring high availability and operational excellence for the end user.&lt;/p&gt;

&lt;p&gt;As the tech landscape continues to evolve, mastering these foundational building blocks is what allows us to build the resilient, sovereign digital infrastructures of tomorrow.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>minikube</category>
      <category>devops</category>
      <category>beginners</category>
    </item>
    <item>
      <title>From Code to Clouds: Hosting a Professional Resume on GitHub Pages</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Thu, 23 Apr 2026 00:38:47 +0000</pubDate>
      <link>https://forem.com/rahimah_dev/from-code-to-clouds-hosting-a-professional-resume-on-github-pages-37ch</link>
      <guid>https://forem.com/rahimah_dev/from-code-to-clouds-hosting-a-professional-resume-on-github-pages-37ch</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Imagine an employer or recruiter landing on your profile. Instead of a standard, static PDF, they are greeted with a &lt;em&gt;fast, responsive, and live-hosted website&lt;/em&gt; that showcases your professional journey with precision. It doesn’t just show them your experience, it proves you have the technical initiative to build, manage, and deploy your own digital footprint.&lt;/p&gt;

&lt;p&gt;In this article, I’ll walk you through how I took a professional Pilot’s resume from a local code editor to a &lt;strong&gt;live URL&lt;/strong&gt; using HTML, CSS, and &lt;strong&gt;GitHub Pages&lt;/strong&gt;, including specific terminal hurdles I encountered along the way.&lt;br&gt;
Learning Objectives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure my global Git identity.&lt;/li&gt;
&lt;li&gt;Initialize and manage a clean local workspace.&lt;/li&gt;
&lt;li&gt;Troubleshoot common terminal errors like &lt;em&gt;fatal: not a git repository.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Deploy a live project using GitHub Pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;** Prerequisites**&lt;br&gt;
To follow along with this tutorial, you will need to have &lt;strong&gt;Git Bash&lt;/strong&gt; installed on your Windows machine. You can download the official installer directly from the Git website:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://git-scm.com/download/win" rel="noopener noreferrer"&gt;Download Git for Windows&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Setting the Foundation&lt;/strong&gt;&lt;br&gt;
Every successful deployment starts with identity. Before &lt;code&gt;Git&lt;/code&gt; can track your progress, it needs to &lt;em&gt;know who is behind the code&lt;/em&gt;. I started by configuring my global credentials in the terminal to ensure every commit was correctly attributed to my profile.&lt;/p&gt;

&lt;p&gt;Using &lt;code&gt;git config --list&lt;/code&gt; is a quick way to verify your setup and avoid &lt;em&gt;Permission Denied&lt;/em&gt; errors later in the workflow.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;NOTE: Only two lines of output appeared because I have configured my environment before this exercise&lt;/em&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 2: Building the Workspace&lt;/strong&gt;&lt;br&gt;
Organization is &lt;strong&gt;key&lt;/strong&gt; to a smooth deployment. Instead of working out of a cluttered root directory, I used the terminal to create a dedicated space for my project. By navigating to the Desktop and using &lt;code&gt;mkdir&lt;/code&gt; and &lt;code&gt;touch&lt;/code&gt;, I established a clean environment for my source files.&lt;/p&gt;

&lt;p&gt;The Workflow:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd&lt;/code&gt;: Navigating to the right environment.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mkdir&lt;/code&gt; website: Creating a isolated container for the project.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;touch&lt;/code&gt; index.html: Generating the entry point for my live site.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 3: Bridging Local to Remote&lt;/strong&gt;&lt;br&gt;
With the local code ready, the next step was creating a &lt;strong&gt;remote repository&lt;/strong&gt; on GitHub. This is where the magic of &lt;code&gt;Hosting&lt;/code&gt; begins. By clicking that &lt;strong&gt;New&lt;/strong&gt; button, I created a central hub (Git-Basics101) that would eventually serve my resume to the world. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;NOTE: Creating a remote repository is like setting up a destination for a flight, you need a clear target before you can push your data into the clouds&lt;/em&gt;.&lt;/p&gt;

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

&lt;p&gt;Then I copied the HTTPS url, to use in the terminal.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0lx5ei63yxao0b9scdi0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0lx5ei63yxao0b9scdi0.png" alt="copyhttps" width="800" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Troubleshooting the Workflow&lt;/strong&gt;&lt;br&gt;
The Git Discovery Error occurred when trying to link my remote. &lt;em&gt;I hit the fatal: not a git repository error&lt;/em&gt;. This was a great reminder that &lt;code&gt;git init&lt;/code&gt; must be the very first step before any remote connections can be made.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 5: Mastering the Editor&lt;/strong&gt;&lt;br&gt;
To ensure the final product was polished and free of errors, I utilized the &lt;code&gt;Vim (vi)&lt;/code&gt; editor directly within the terminal. This allowed me to inspect the &lt;em&gt;index.html&lt;/em&gt; file in a raw environment.&lt;br&gt;
I used the &lt;code&gt;cat&lt;/code&gt; command to verify my code before it goes live. &lt;br&gt;
&lt;em&gt;NOTE: This resume is not real, but for demo purpose only.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 7: Staging for Deployment&lt;/strong&gt;&lt;br&gt;
Here am moving files from &lt;em&gt;untracked&lt;/em&gt; zone to the &lt;em&gt;staged&lt;/em&gt; zone. By using &lt;code&gt;git status&lt;/code&gt;, I could see exactly what Git was watching. But before that, I used the &lt;code&gt;ls&lt;/code&gt; to verify that the file is in that particular location in my local environment. Initially, my index.html was in &lt;em&gt;red&lt;/em&gt; (untracked), but with a quick &lt;code&gt;git add .&lt;/code&gt;, it turned &lt;em&gt;green&lt;/em&gt;, ready and waiting to be committed.&lt;/p&gt;

&lt;p&gt;This visual confirmation in the terminal is the developer's &lt;strong&gt;safety check&lt;/strong&gt; to ensure only the right files are being sent to the server.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 8: Sealing the Version&lt;/strong&gt;&lt;br&gt;
With the files staged, it was time to create a permanent &lt;strong&gt;snapshot&lt;/strong&gt; of my work. Running &lt;code&gt;git commit -m "create index.html"&lt;/code&gt; acted as the official seal for this &lt;strong&gt;version&lt;/strong&gt; of the project.&lt;/p&gt;

&lt;p&gt;The terminal output showing &lt;em&gt;1 file changed" and "130 insertions&lt;/em&gt; is more than just text, it’s a receipt of my progress. By providing a clear, descriptive message, I’ve ensured that any future collaborator (or even my future self) understands &lt;strong&gt;exactly what this change was for&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 9: Overcoming the "Origin" Obstacle by authentication&lt;/strong&gt;&lt;br&gt;
One of the most common hurdles for any developer is connecting a local project to a remote server. As seen in my terminal, I initially hit a &lt;em&gt;fatal: origin does not appear to be a git repository error&lt;/em&gt;. This happened because my local folder hadn't been &lt;em&gt;introduced&lt;/em&gt; to GitHub yet.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: I resolved this by explicitly adding the remote origin URL and password. It was a another reminder that Git needs a clear map of where your code is supposed to go before it can start the journey.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;In the modern Git workflow, security is paramount. GitHub requires a Personal Access Token (PAT) instead of a regular password. So I navigated to my &lt;code&gt;Developer Settings&lt;/code&gt; to generate a &lt;code&gt;Classic&lt;/code&gt; token. This token acts as a secure key, allowing my terminal to communicate safely with my GitHub account.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 10: The Successful Push&lt;/strong&gt;&lt;br&gt;
With the connection established, I ran the final command: &lt;code&gt;git push -u origin master&lt;/code&gt;. Seeing those lines of code: &lt;em&gt;Enumerating objects, Counting objects, and finally the URL to the remote repository&lt;/em&gt;—is the ultimate &lt;strong&gt;mission accomplished&lt;/strong&gt; moment for a developer.&lt;/p&gt;

&lt;p&gt;The code was no longer just on my laptop, it was officially live in the cloud.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqow588wen4i81v0s1q1o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqow588wen4i81v0s1q1o.png" alt="master" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 11: Activating GitHub Pages&lt;/strong&gt;&lt;br&gt;
With the code successfully pushed to the &lt;strong&gt;Git-Basics101 repository&lt;/strong&gt;, the final piece of the puzzle was turning on the hosting.&lt;/p&gt;

&lt;p&gt;I navigated to the &lt;strong&gt;Settings&lt;/strong&gt; tab of my repository, selected the Pages menu on the left, and set the build source to the &lt;strong&gt;master branch&lt;/strong&gt; and saved the change. Within seconds, GitHub provided a &lt;strong&gt;live link&lt;/strong&gt;. This transition from a local index.html file to a globally accessible URL is the ultimate goal of any web deployment project.&lt;/p&gt;

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

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

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

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

&lt;p&gt;Building this resume was more than just a coding exercise, it was a lesson in the modern developer's workflow. Errors aren't failures, they are the terminal's way of teaching you the correct sequence of operations.&lt;/p&gt;

&lt;p&gt;The result? A professional, responsive resume that is ready for the world to see.&lt;/p&gt;

</description>
      <category>github</category>
      <category>webdev</category>
      <category>html</category>
      <category>deployment</category>
    </item>
    <item>
      <title>Installing Local Kubernetes Clusters</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Fri, 17 Apr 2026 21:37:51 +0000</pubDate>
      <link>https://forem.com/rahimah_dev/my-kubernetes-mastery-journey-installing-local-kubernetes-clusters-176</link>
      <guid>https://forem.com/rahimah_dev/my-kubernetes-mastery-journey-installing-local-kubernetes-clusters-176</guid>
      <description>&lt;p&gt;Now that we have familiarized ourselves with the default &lt;strong&gt;minikube start&lt;/strong&gt; command, let's dive deeper into Minikube to understand some of its more advanced features.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;minikube&lt;/code&gt; start by default selects a &lt;code&gt;driver&lt;/code&gt; isolation software, such as a hypervisor or a container runtime, &lt;em&gt;if one (VitualBox) or multiple are installed on the host workstation&lt;/em&gt;. In addition it downloads the latest Kubernetes version components. With the selected driver software it provisions a single &lt;strong&gt;VM&lt;/strong&gt; named &lt;code&gt;minikube&lt;/code&gt; (with hardware profile of CPUs=2, Memory=6GB, Disk=20GB) or container (Docker) to host the default single-node all-in-one Kubernetes cluster. Once the node is provisioned, it bootstraps the Kubernetes control plane (with the default &lt;code&gt;kubeadm&lt;/code&gt; tool), and it installs the latest version of the default container runtime, Docker, that will serve as a running environment for the containerized applications we will deploy to the Kubernetes cluster. &lt;br&gt;
The &lt;strong&gt;minikube start&lt;/strong&gt; command generates a default minikube cluster with the specifications described above and it will store these specs so that we can restart the default cluster whenever desired. The object that stores the specifications of our cluster is called a &lt;code&gt;profile&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;As Minikube matures, so do its features and capabilities. With the introduction of profiles, Minikube allows users to create custom reusable clusters that can all be managed from a single command line client.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;minikube profile&lt;/strong&gt; command allows us to view the status of all our clusters in a table formatted output. &lt;br&gt;
Now, we'll start the minikube indicating the driver, which is Docker in this case.&lt;br&gt;
Wait for it to finish! You'll see a message like "Done! kubectl is now configured." Once you see that, then you can try another Kubernetes command.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foy8cklosb5qyjul1shgh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foy8cklosb5qyjul1shgh.png" alt="mini3start" width="800" height="332"&gt;&lt;/a&gt;&lt;br&gt;
Now, we'll run the &lt;code&gt;minikube status&lt;/code&gt;. Once Minikube is "Running," you have a tiny one-node Kubernetes cluster alive on your machine.&lt;/p&gt;

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

&lt;p&gt;If you see a node named minikube with a status of &lt;strong&gt;Ready&lt;/strong&gt;, you officially have a Kubernetes cluster running on your laptop! We'll check by running the &lt;strong&gt;kubectl get nodes&lt;/strong&gt; command:&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;minikube stop&lt;/strong&gt;: With the this command, we can stop Minikube. This command stops all applications running in Minikube, safely stops the cluster and the VM, preserving our work until we decide to start the Minikube cluster once again, while preserving the Minikube VM.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;minikube status&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Assuming we have created only the default &lt;code&gt;minikube&lt;/code&gt; cluster, we could list the properties that define the default profile with:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuhqleifz44l5srfyqts2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuhqleifz44l5srfyqts2.png" alt="profilelist" width="800" height="149"&gt;&lt;/a&gt;&lt;br&gt;
This table presents the columns associated with the default properties such as the profile name: &lt;strong&gt;minikube&lt;/strong&gt;, the isolation driver: &lt;strong&gt;VirtualBox&lt;/strong&gt;, the container runtime: &lt;strong&gt;Docker&lt;/strong&gt;, the Kubernetes version: &lt;strong&gt;v1.28.3&lt;/strong&gt;, the status of the cluster - &lt;strong&gt;running or stopped&lt;/strong&gt;. The table also displays the &lt;strong&gt;number of nodes&lt;/strong&gt;: 1 by default, the &lt;strong&gt;private IP address&lt;/strong&gt; of the minikube cluster's control plane VirtualBox VM, and the &lt;strong&gt;secure port&lt;/strong&gt; that exposes the API Server to cluster control plane components, agents and clients: 8443. &lt;/p&gt;

&lt;p&gt;To create a brand-new cluster with 2 nodes named &lt;code&gt;lab-cluster&lt;/code&gt;, you use the --nodes flag. However, since you already have a single-node cluster stopped (as seen in your screenshot), we need to start it back up with the multi-node configuration. We'll run the multi-node command.&lt;/p&gt;

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

&lt;p&gt;Once the cluster starts, we'll use the next three commands to see the difference: &lt;strong&gt;kubectlgetnodes&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;minikube profile list&lt;/strong&gt;: Using this command, you can check the Minikube Profiles and see both the original cluster and the new 2-node cluster side-by-side.&lt;br&gt;
The minikube profile list command shows the two separate &lt;code&gt;slots&lt;/code&gt; you have created on your machine:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lab-cluster&lt;/code&gt;: This is the active cluster. It is running on the docker driver with 2 nodes and currently has a status of &lt;strong&gt;OK&lt;/strong&gt;. The asterisk (*) in the ACTIVE_PROFILE column indicates that any &lt;code&gt;kubectl&lt;/code&gt; commands ran right now will target this cluster.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;minikube&lt;/code&gt;: This is the original &lt;code&gt;single-node&lt;/code&gt; cluster. It is currently Stopped, meaning it isn't consuming any RAM or CPU, but its configuration and any data it had is are safely saved.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpe8mbywvguxru1olhrnl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpe8mbywvguxru1olhrnl.png" alt="pl" width="800" height="112"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;kubectl get nodes -o wide&lt;/strong&gt;: This gives a detailed View: you can see which node is the &lt;code&gt;Control Plane&lt;/code&gt; (the brain) and which is the &lt;code&gt;Worker&lt;/code&gt; (the muscle).&lt;br&gt;
This command shows the details of the nodes inside your active lab-cluster profile:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lab-cluster&lt;/code&gt;(control-plane): This is the &lt;code&gt;brain&lt;/code&gt; of your cluster. It manages the state, schedules applications, and handles the API.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lab-cluster-m02&lt;/code&gt;: This is your second node. In a multi-node setup, this acts as a Worker node where your actual application containers (Pods) will run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ready Status&lt;/strong&gt;: Both nodes are Ready, meaning they are healthy and communicating with each other.&lt;br&gt;
And the &lt;strong&gt;-o wide&lt;/strong&gt; flag gives you deeper technical insights:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Internal-IP&lt;/strong&gt;: Your nodes have unique internal addresses (192.168.58.2 and 192.168.58.3) to talk to each other.&lt;br&gt;
&lt;strong&gt;OS-Image&lt;/strong&gt;: They are running Debian GNU/Linux 12 inside their Docker containers.&lt;br&gt;
&lt;strong&gt;Container-Runtime&lt;/strong&gt;: They are using Docker v1.35.1 to actually spin up the containers.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqgr1q9mm386dkzgzhrfz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqgr1q9mm386dkzgzhrfz.png" alt="getsnodewide" width="800" height="48"&gt;&lt;/a&gt;&lt;br&gt;
The role of the second cluster is labeled as &lt;code&gt;none&lt;/code&gt; because it wasn't specified during creation.&lt;br&gt;
Now we'll stop the &lt;code&gt;lab-cluster&lt;/code&gt; and start the &lt;code&gt;minikube&lt;/code&gt;.&lt;br&gt;
This is known as &lt;strong&gt;Switching Contexts&lt;/strong&gt; and should be mastered.&lt;br&gt;
If you want to go back to your first cluster, you don't need to delete anything. You just switch the &lt;code&gt;Active&lt;/code&gt; pointer:&lt;/p&gt;

&lt;p&gt;Stop current: &lt;strong&gt;minikube stop -p lab-cluster&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Switch &amp;amp; Start: &lt;strong&gt;minikube start -p minikube&lt;/strong&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Advanced Minikube features
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;minikube profile list&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;In order to set the profile to &lt;code&gt;lab-cluster&lt;/code&gt;, we' ll use the command: &lt;strong&gt;profile lab-cluster&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Then start the minikube again using &lt;strong&gt;minikube start&lt;/strong&gt;&lt;br&gt;
When it is time to run the cluster again, simply run the &lt;strong&gt;minikube start&lt;/strong&gt; command (driver option is not required), and it will restart the earlier bootstrapped Minikube cluster.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frdz7xt94m2w6m2tee0sa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frdz7xt94m2w6m2tee0sa.png" alt="mini3start" width="800" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now I want the terminal to look organized and show &lt;code&gt;worker&lt;/code&gt;, I can manually assign the role using the label command. Run this in your VS Code terminal:&lt;/p&gt;

&lt;p&gt;then change context to &lt;code&gt;lab-cluster&lt;/code&gt;(to make the target cluster &lt;code&gt;lab-cluster&lt;/code&gt;) and then run &lt;code&gt;get nodes&lt;/code&gt; command.&lt;br&gt;
 is now &lt;code&gt;worker!&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyomhgt8rwnllnd8gdwye.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyomhgt8rwnllnd8gdwye.png" alt="getnodes" width="800" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run &lt;strong&gt;minikube profile list&lt;/strong&gt; command, the profile will now be set to the &lt;code&gt;lab-cluster&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;Run &lt;strong&gt;kubectl config view&lt;/strong&gt;, it gives a detailed information about the cluster and its nodes.&lt;br&gt;
The &lt;code&gt;kubeconfig&lt;/code&gt; includes the API Server's endpoint server: ht‌t‌ps://127.0.0.1:49687 and the minikube user's client authentication key and certificate data.&lt;/p&gt;

&lt;p&gt;With the &lt;code&gt;kubectl&lt;/code&gt; is installed, we can display information about the Minikube Kubernetes cluster with the kubectl cluster-info command:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F92y5wcga9as8ko14i7cn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F92y5wcga9as8ko14i7cn.png" alt="view" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run the &lt;strong&gt;cluster info&lt;/strong&gt; command, this gives information about the IP address the cluster is running at.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0yqaitr2w2hnb7gf8nr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0yqaitr2w2hnb7gf8nr.png" alt="kubectl" width="800" height="66"&gt;&lt;/a&gt;&lt;br&gt;
&lt;code&gt;Kubernetes master&lt;/code&gt; is running at htt‌‌ps://127.0.0.1:49687&lt;br&gt;
KubeDNS is running at htt‌‌ps://127.0.0.1:49687/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy&lt;/p&gt;

&lt;h2&gt;
  
  
  The Kubernetes Dashboard
&lt;/h2&gt;

&lt;p&gt;The Kubernetes Dashboard provides a &lt;strong&gt;web-based user interface&lt;/strong&gt; for Kubernetes cluster management. &lt;code&gt;Minikube&lt;/code&gt; installs the Dashboard as an &lt;code&gt;addon&lt;/code&gt;, but it is disabled by default. Prior to using the Dashboard we are required to enable the Dashboard &lt;code&gt;addon&lt;/code&gt;, together with the &lt;code&gt;metrics-server addon&lt;/code&gt;, a helper addon designed to collect usage metrics from the Kubernetes cluster. To access the dashboard from &lt;code&gt;Minikube&lt;/code&gt;, we can use the minikube dashboard command, which opens a new tab in our web browser displaying the Kubernetes Dashboard, but only after we list, enable required addons, and verify their state:&lt;/p&gt;

&lt;p&gt;$ minikube addons list&lt;/p&gt;

&lt;p&gt;$ minikube addons enable metrics-server&lt;/p&gt;

&lt;p&gt;$ minikube addons enable dashboard&lt;/p&gt;

&lt;p&gt;$ minikube addons list&lt;/p&gt;

&lt;p&gt;$ minikube dashboard &lt;/p&gt;

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

&lt;p&gt;In order to enable metrics-server addon, run &lt;strong&gt;minikube addons enable metrics-server&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frkwsqcsz8zbdsfbjx2po.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frkwsqcsz8zbdsfbjx2po.png" alt="enableser" width="800" height="123"&gt;&lt;/a&gt;&lt;br&gt;
Verify that the metrics-server is now enabled.&lt;/p&gt;

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

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

&lt;p&gt;Verify that dashboard enabled.&lt;/p&gt;

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

&lt;p&gt;Run the &lt;strong&gt;minikube dashboard&lt;/strong&gt; command, and a url is displayed which opens a new window when clicked.&lt;br&gt;
Or you can simply run &lt;strong&gt;minikube dashboard --url&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqz115e8b4mvvcop8dqzp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqz115e8b4mvvcop8dqzp.png" alt="dashhttp" width="800" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dashboard is empty as expected.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffv336omcnq6w2wejal0i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffv336omcnq6w2wejal0i.png" alt="nothing to view" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So we'll create one pod using this command: &lt;strong&gt;kubectl run my-first-pod --image=nginx&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Verify it's now displayed on the dashboard&lt;/p&gt;

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

&lt;p&gt;Run the &lt;code&gt;logs&lt;/code&gt; command for my-first-pod&lt;/p&gt;

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

&lt;p&gt;log can also be performed on the dashboard.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;APIs with kubectl proxy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Issuing the &lt;code&gt;kubectl&lt;/code&gt; proxy command, kubectl authenticates with the API server on the control plane node and makes services available on the default proxy port 8001.&lt;/p&gt;

&lt;p&gt;First, we issue the &lt;code&gt;kubectl&lt;/code&gt; proxy command:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl proxy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Starting to serve on 127.0.0.1:8001&lt;/p&gt;

&lt;p&gt;It locks the terminal for as long as the proxy is running, unless we run it in the background (with kubectl proxy &amp;amp;).&lt;/p&gt;

&lt;p&gt;When kubectl proxy is running, we can send requests to the API over the localhost on the default proxy port 8001 (from another terminal, since the proxy locks the first terminal when running in foreground):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ curl &lt;a href="http://localhost:8001/" rel="noopener noreferrer"&gt;http://localhost:8001/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffh20r4x5weqli3wqkb4q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffh20r4x5weqli3wqkb4q.png" alt="curl failed" width="800" height="108"&gt;&lt;/a&gt;&lt;br&gt;
But it worked on the browser:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8tmp4vdyxw0rfxkfuurk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8tmp4vdyxw0rfxkfuurk.png" alt=":8001 on browser" width="800" height="662"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So we'll use another terminal because the proxy is now locked in the first terminal.&lt;/p&gt;

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

&lt;p&gt;I stopped the clusters from dashboard and verified using the command:&lt;/p&gt;

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

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

&lt;p&gt;Mastering &lt;code&gt;Minikube&lt;/code&gt; is about more than just starting a cluster, it’s about creating a reliable, reproducible environment that mirrors the complexities of the cloud. By moving beyond default settings and embracing multi-node profiles, you transition from a student of Kubernetes to an engineer capable of architecting resilient systems.&lt;/p&gt;

&lt;p&gt;As you continue building, remember that a well-organized local environment is the foundation of a successful deployment pipeline. Whether you are assigning worker roles in the CLI or monitoring pod health on the dashboard, these skills ensure that your infrastructure is as robust as the code running on it.&lt;/p&gt;

&lt;p&gt;Happy &lt;em&gt;Kube-ing!&lt;/em&gt; Post by rahimah_dev&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>minikube</category>
      <category>infrastructure</category>
      <category>cloudnative</category>
    </item>
    <item>
      <title>Mastering Azure Monitor: Deployment and Configuration</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Thu, 16 Apr 2026 19:36:28 +0000</pubDate>
      <link>https://forem.com/rahimah_dev/mastering-azure-monitor-deployment-and-configuration-45nl</link>
      <guid>https://forem.com/rahimah_dev/mastering-azure-monitor-deployment-and-configuration-45nl</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;While working on a comprehensive deployment of Azure Monitor, I hit a common but frustrating wall: the dreaded &lt;code&gt;SubscriptionIsOverQuotaForSku&lt;/code&gt; error. Instead of stopping, I pivoted, re-engineering my deployment across Korea Central and East US to maintain uptime and visibility(since we're in a learning environment).&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk you through how I deployed a hybrid environment featuring &lt;em&gt;Windows Server&lt;/em&gt; (IIS), &lt;em&gt;Linux&lt;/em&gt; (Ubuntu), and a &lt;em&gt;SQL-backed Web App&lt;/em&gt;, all while configuring the &lt;strong&gt;observability&lt;/strong&gt; layers needed to keep a modern enterprise running. &lt;/p&gt;

&lt;p&gt;Here is one of the scenarios that would urgently require one of the tasks below: An insurance firm just suffered a minor &lt;code&gt;brute-force&lt;/code&gt; attack because a junior dev left a virtual machine open to the entire internet. The CTO orders an immediate &lt;code&gt;lockdown&lt;/code&gt; of all infrastructure.&lt;/p&gt;

&lt;p&gt;My Task: I changed the &lt;strong&gt;RDP&lt;/strong&gt; Source to &lt;strong&gt;My IP&lt;/strong&gt; and manually configured Inbound Security Rules for HTTP (Port 80).&lt;/p&gt;

&lt;p&gt;The necessity: This is a critical security task. By restricting RDP access to only my specific IP address, I effectively &lt;em&gt;closed the front door&lt;/em&gt; to hackers. &lt;/p&gt;

&lt;p&gt;This exercise should take approximately &lt;strong&gt;30&lt;/strong&gt; minutes to complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prepare your bring-your-own-subscription (BYOS)
&lt;/h2&gt;

&lt;p&gt;This set of lab exercises assumes that you have global administrator permissions to an Azure subscription.&lt;/p&gt;

&lt;p&gt;1.In the Azure Portal Search Bar, enter &lt;strong&gt;Resource Groups&lt;/strong&gt; and select &lt;strong&gt;Resource groups&lt;/strong&gt; from the list of results.&lt;/p&gt;

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

&lt;p&gt;2.On the &lt;strong&gt;Resource Groups&lt;/strong&gt; page, select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;3.On the &lt;strong&gt;Create a Resource Group&lt;/strong&gt; page, select your subscription and enter the name &lt;code&gt;rg-alpha&lt;/code&gt;. Set the region to East US, choose &lt;strong&gt;Review + Create&lt;/strong&gt;, and then choose &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;

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

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

&lt;p&gt;&lt;em&gt;NOTE: This set of exercises assumes that you choose to deploy in the East US Region, but you can change this to another region if you choose. Just remember that each time you see East US mentioned in these instructions you will need to substitute the region you have chosen&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create App Log Examiners security group
&lt;/h2&gt;

&lt;p&gt;In this exercise, you create an &lt;code&gt;Entra&lt;/code&gt; ID security group.&lt;/p&gt;

&lt;p&gt;1.In the Azure Portal Search Bar, enter Azure Active Directory (or Entra ID) from the list of results.&lt;/p&gt;

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

&lt;p&gt;2.On the &lt;strong&gt;Default Directory&lt;/strong&gt; page, select, &lt;strong&gt;+ Add&lt;/strong&gt;, then &lt;strong&gt;Groups&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;3.On the &lt;strong&gt;New Group&lt;/strong&gt; page, provide the values in the following table and choose &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Group type&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Group name&lt;/td&gt;
&lt;td&gt;App Log Examiners&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Group description&lt;/td&gt;
&lt;td&gt;App Log Examiners&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;h2&gt;
  
  
  Deploy and configure WS-VM1
&lt;/h2&gt;

&lt;p&gt;In this exercise, you deploy and configure a Windows Server virtual machine.&lt;/p&gt;

&lt;p&gt;1.In the Azure Portal Search Bar, enter &lt;strong&gt;Virtual Machines&lt;/strong&gt; and select &lt;strong&gt;Virtual Machines&lt;/strong&gt; from the list of results.&lt;/p&gt;

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

&lt;p&gt;2.On the &lt;strong&gt;Virtual Machines&lt;/strong&gt; page, choose &lt;strong&gt;Create&lt;/strong&gt; and select &lt;strong&gt;Azure Virtual Machine&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;3.On the &lt;strong&gt;Basics&lt;/strong&gt; page of the Create A Virtual Machine wizard, select the following settings and then choose &lt;strong&gt;Review + Create&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Subscription&lt;/td&gt;
&lt;td&gt;Your subscription&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource Group&lt;/td&gt;
&lt;td&gt;rg-alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virtual machine name&lt;/td&gt;
&lt;td&gt;WS-VM1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;East US&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Availability options&lt;/td&gt;
&lt;td&gt;No infrastructure redundancy required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security type&lt;/td&gt;
&lt;td&gt;Standard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image&lt;/td&gt;
&lt;td&gt;Windows Server 2022 Datacenter: Azure Edition – x64 Gen2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VM architecture&lt;/td&gt;
&lt;td&gt;x64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size&lt;/td&gt;
&lt;td&gt;Standard_D4s_v3 – 4 vcpus, 16 GiB memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Administrator account&lt;/td&gt;
&lt;td&gt;prime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Password&lt;/td&gt;
&lt;td&gt;[Select a unique secure password] P@ssw0rdP@ssw0rd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound ports&lt;/td&gt;
&lt;td&gt;RDP 3389&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

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

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

&lt;p&gt;4.Review the settings and select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;5.Wait for the deployment to complete. Once deployment completes choose &lt;strong&gt;Go to resource&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;6.On the &lt;strong&gt;WS-VM1 properties&lt;/strong&gt; page, choose &lt;strong&gt;Networking&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;7.On the &lt;strong&gt;Networking&lt;/strong&gt; page, select the &lt;code&gt;RDP&lt;/code&gt; rule.&lt;/p&gt;

&lt;p&gt;8.On the RDP rule space, change the Source to My IP address and choose &lt;strong&gt;Save&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;This restricts incoming RDP connections to the IP address you’re currently using.&lt;br&gt;
9.On the &lt;strong&gt;Networking&lt;/strong&gt; page, choose &lt;strong&gt;Add inbound port rule&lt;/strong&gt;.&lt;/p&gt;

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

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

&lt;p&gt;10.On the &lt;strong&gt;Add inbound security rule&lt;/strong&gt; page, configure the following settings and choose &lt;strong&gt;Add&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Source&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source port ranges&lt;/td&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Destination&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;HTTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Action&lt;/td&gt;
&lt;td&gt;Allow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Priority&lt;/td&gt;
&lt;td&gt;310&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;AllowAnyHTTPInbound&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;11.On the &lt;strong&gt;WS-VM1&lt;/strong&gt; page, choose &lt;strong&gt;Connect&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;12.Under Native RDP, choose &lt;strong&gt;Select&lt;/strong&gt;.&lt;br&gt;
13.On the &lt;strong&gt;Native RDP&lt;/strong&gt; page, choose &lt;strong&gt;Download RDP file&lt;/strong&gt; and then open the file. Opening the RDP file opens the Remote Desktop Connection dialog box.&lt;/p&gt;

&lt;p&gt;14.On the &lt;strong&gt;Windows Security&lt;/strong&gt; dialog box, choose &lt;strong&gt;More Choices&lt;/strong&gt; and then choose Use a different account.&lt;/p&gt;

&lt;p&gt;15.Enter the username as .\prime and the password as the secure password you chose in Step 3, and choose &lt;strong&gt;OK&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fehswqzxxhm70r1rtrjob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fehswqzxxhm70r1rtrjob.png" alt="securitybox" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;16.When signed into the Windows Server virtual machine, right-click on the &lt;strong&gt;Start&lt;/strong&gt; hint and then choose &lt;strong&gt;Windows PowerShell (Admin)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;17.At the elevated command prompt, type the following command and press &lt;strong&gt;Enter&lt;/strong&gt;. Install-WindowsFeature Web-Server -IncludeAllSubFeature -IncludeManagementTools&lt;/p&gt;

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

&lt;p&gt;18.When the installation completes run the following command to change to the web server root directory. cd c:\inetpub\wwwroot\&lt;br&gt;
19.Run the following command. Wget &lt;a href="https://raw.githubusercontent.com/Azure-Samples/html-docs-hello-world/master/index.html" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/Azure-Samples/html-docs-hello-world/master/index.html&lt;/a&gt; -OutFile index.html&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Deploy and configure LX-VM2
&lt;/h2&gt;

&lt;p&gt;In this exercise you deploy and configure a Linux virtual machine.&lt;/p&gt;

&lt;p&gt;1.In the Azure Portal Search Bar, enter &lt;strong&gt;Virtual Machines&lt;/strong&gt; and select &lt;strong&gt;Virtual Machines&lt;/strong&gt; from the list of results.&lt;/p&gt;

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

&lt;p&gt;2.On the &lt;strong&gt;Virtual Machines&lt;/strong&gt; page, choose &lt;strong&gt;Create&lt;/strong&gt; and select &lt;strong&gt;Azure Virtual Machine&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8cyo2pct3bd9dct6g878.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8cyo2pct3bd9dct6g878.png" alt="vmcreate" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.On the &lt;strong&gt;Basics&lt;/strong&gt; page of the Create A Virtual Machine wizard, select the following settings and then choose &lt;strong&gt;Review + Create&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Subscription&lt;/td&gt;
&lt;td&gt;Your subscription&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource Group&lt;/td&gt;
&lt;td&gt;rg-alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virtual machine name&lt;/td&gt;
&lt;td&gt;Linux-VM2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;East US&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Availability options&lt;/td&gt;
&lt;td&gt;No infrastructure redundancy required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security type&lt;/td&gt;
&lt;td&gt;Standard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image&lt;/td&gt;
&lt;td&gt;Ubuntu Server 20.04 LTS – x64 Gen2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VM architecture&lt;/td&gt;
&lt;td&gt;x64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size&lt;/td&gt;
&lt;td&gt;Standard_D2s_v3 – 2 vcpus, 8 GiB memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication type&lt;/td&gt;
&lt;td&gt;Password&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Username&lt;/td&gt;
&lt;td&gt;Prime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Password&lt;/td&gt;
&lt;td&gt;[Select a unique secure password] P@ssw0rdP@ssw0rd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public inbound ports&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

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

&lt;p&gt;4.Review the information and choose &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;5.After the VM deploys, open the &lt;strong&gt;VM properties&lt;/strong&gt; page and choose &lt;strong&gt;Extensions + Applications **under **Settings&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;6.Choose &lt;strong&gt;Add&lt;/strong&gt; and select the &lt;strong&gt;Network Watcher Agent for Linux&lt;/strong&gt;. Choose &lt;strong&gt;Next&lt;/strong&gt; and then choose &lt;strong&gt;Review and Create&lt;/strong&gt;. Choose &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;

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

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

&lt;p&gt;&lt;em&gt;NOTE: The installation and configuration of the OmsAgentForLinux extension will be performed in Exercise 2 after the Log Analytics workspace is created&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy a web app with an SQL Database
&lt;/h2&gt;

&lt;p&gt;1.Ensure that you’re signed into the Azure Portal.&lt;br&gt;
2.In your browser, open a new browser tab and navigate to &lt;a href="https://github.com/Azure/azure-quickstart-templates/tree/master/quickstarts/microsoft.web/web-app-sql-database" rel="noopener noreferrer"&gt;https://github.com/Azure/azure-quickstart-templates/tree/master/quickstarts/microsoft.web/web-app-sql-database&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.On the GitHub page, choose &lt;strong&gt;Deploy to Azure&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2kz7z0d3p6z6zlgnqrec.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2kz7z0d3p6z6zlgnqrec.png" alt="github" width="800" height="404"&gt;&lt;/a&gt;&lt;br&gt;
4.A new tab opens. If necessary, re-sign into Azure with the account that has Global Administrator privileges.&lt;br&gt;
5.On the &lt;strong&gt;Basics&lt;/strong&gt; page, select &lt;strong&gt;Edit template&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;6.In the template editor, delete the contents of lines 158 to 174 inclusive and delete the “,” on line 157. Choose &lt;strong&gt;Save&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;7.On the &lt;strong&gt;Basics&lt;/strong&gt; page, provide the following information and choose &lt;strong&gt;Next&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Subscription&lt;/td&gt;
&lt;td&gt;Your subscription&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource Group&lt;/td&gt;
&lt;td&gt;rg-alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;East US&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sku Name&lt;/td&gt;
&lt;td&gt;F1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sku Capacity&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sql Administrator Login&lt;/td&gt;
&lt;td&gt;prime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sql Administrator Login Password&lt;/td&gt;
&lt;td&gt;[Select a unique secure password] P@ssw0rdP@ssw0rd&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxmwpolareylqbeh4wqzd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxmwpolareylqbeh4wqzd.png" alt="error" width="800" height="382"&gt;&lt;/a&gt;&lt;br&gt;
Quota limits are often region-specific. If you are hitting a zero-limit in one location, another might have availability.&lt;br&gt;
Go back to the &lt;strong&gt;Basics&lt;/strong&gt; tab and try switching the Region to a major hub like East US, West US 2, or North Europe.&lt;/p&gt;

&lt;p&gt;In my specific case, Korea Central is often a good alternative when am faced subscription roadblocks in other regions recently.&lt;br&gt;
Hence, I changed the resource group to &lt;code&gt;rg-alpha2&lt;/code&gt; and Region to &lt;code&gt;Korea Central&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;NOTE: If you absolutely need that specific region and size, you have to ask Microsoft to "unlock" it for you&lt;/em&gt;.&lt;/p&gt;

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

&lt;p&gt;8.Review the information presented and select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;9.After the deployment completes, choose &lt;strong&gt;Go to resource group&lt;/strong&gt;.&lt;/p&gt;

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

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

&lt;h2&gt;
  
  
  Deploy a Linux web app
&lt;/h2&gt;

&lt;p&gt;1.Ensure that you’re signed into the Azure Portal.&lt;br&gt;
2.In your browser, open a new browser tab and navigate to &lt;a href="https://learn.microsoft.com/en-us/samples/azure/azure-quickstart-templates/webapp-basic-linux/" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/samples/azure/azure-quickstart-templates/webapp-basic-linux/&lt;/a&gt;&lt;br&gt;
3.On the GitHub page, choose &lt;strong&gt;Deploy to Azure&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;4.On the &lt;strong&gt;Basics&lt;/strong&gt; page, provide the following information and choose &lt;strong&gt;Next&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Subscription&lt;/td&gt;
&lt;td&gt;Your subscription&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource Group&lt;/td&gt;
&lt;td&gt;rg-alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;East US&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web app Name&lt;/td&gt;
&lt;td&gt;AzureLinuxAppWXYZ (assign a random number to the final four characters of the name)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sku&lt;/td&gt;
&lt;td&gt;S1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux Fx version&lt;/td&gt;
&lt;td&gt;php                                          7.4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;5.Review the information and choose &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj51oaqqpdnxcfz9ekn01.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj51oaqqpdnxcfz9ekn01.png" alt="error" width="800" height="385"&gt;&lt;/a&gt;&lt;br&gt;
So I changed the resource group and Region again.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqe50mm8m52o9ab68rl9q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqe50mm8m52o9ab68rl9q.png" alt="create" width="800" height="497"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Deployment failed&lt;/strong&gt; because the webApp name already exists, click on &lt;strong&gt;Redeploy&lt;/strong&gt; and edit the name.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdnpqqzd1mz1fcy641sbk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdnpqqzd1mz1fcy641sbk.png" alt="failed to deploy" width="800" height="440"&gt;&lt;/a&gt;&lt;br&gt;
6.Now that Deployment is complete, &lt;strong&gt;Go To Resource&lt;/strong&gt;.&lt;/p&gt;

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

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

&lt;p&gt;&lt;strong&gt;The "Invisible Skill of Cloud Engineering&lt;/strong&gt;&lt;br&gt;
Setting up a multi-tier environment on Azure is more than a checklist of installations, it is a lesson in resiliency. This project challenged me to manage a &lt;strong&gt;hybrid&lt;/strong&gt; ecosystem—bridging Windows Server management, Linux observability, and SQL-backed web applications, all while navigating real-world infrastructure constraints like subscription quotas and regional limitations.&lt;/p&gt;

</description>
      <category>powershell</category>
      <category>devops</category>
      <category>linux</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>KUBERNETES - Deploying a Standalone Application 1</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Sun, 05 Apr 2026 16:38:43 +0000</pubDate>
      <link>https://forem.com/rahimah_dev/deploying-a-standalone-application-1-le0</link>
      <guid>https://forem.com/rahimah_dev/deploying-a-standalone-application-1-le0</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt; has a reputation for being a &lt;strong&gt;wall of YAML&lt;/strong&gt;, but it doesn't have to start that way. If you’re looking for a visual, hands-on way to understand how &lt;em&gt;Pods, Deployments, and Services&lt;/em&gt; actually interact, you’re in the right place. Today, we’re firing up the &lt;code&gt;Minikube Dashboard&lt;/code&gt; to deploy a &lt;strong&gt;standalone web server&lt;/strong&gt; with just a few clicks. By the end of this post, you won't just have an &lt;code&gt;Nginx server&lt;/code&gt; running, you'll understand the &lt;code&gt;labels&lt;/code&gt; and &lt;code&gt;selectors&lt;/code&gt; that hold the entire K8s ecosystem together.&lt;/p&gt;

&lt;p&gt;Learning Objectives&lt;/p&gt;

&lt;p&gt;By the end of this series, you should be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy an application from the dashboard.&lt;/li&gt;
&lt;li&gt;Deploy an application from a &lt;code&gt;YAML&lt;/code&gt; file using &lt;code&gt;kubectl&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Expose a service using &lt;code&gt;NodePort&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Access the application from outside the &lt;code&gt;Minikube&lt;/code&gt; cluster.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Deploying an Application Using the Dashboard (1)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's learn how to deploy an &lt;code&gt;nginx webserver&lt;/code&gt; using the nginx container image from Docker Hub.&lt;/p&gt;

&lt;p&gt;Start &lt;code&gt;Minikube&lt;/code&gt; and verify that it is running. Run this command first:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ minikube start&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Then verify &lt;strong&gt;Minikube&lt;/strong&gt; status:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ minikube status&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Start the &lt;strong&gt;Minikube&lt;/strong&gt; Dashboard. To access the Kubernetes &lt;strong&gt;Web IU&lt;/strong&gt;, we need to run the following command:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ minikube dashboard&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Running this command will open up a browser with the Kubernetes &lt;strong&gt;Web UI&lt;/strong&gt;, which we can use to manage containerized applications. By default, the dashboard is connected to the default Namespace. Therefore, all the operations will be performed inside the default Namespace.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmyk5nzsrx8crkrlc9fuu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmyk5nzsrx8crkrlc9fuu.png" alt="dashboard" width="800" height="402"&gt;&lt;/a&gt;&lt;br&gt;
Deploying an Application - Accessing the Dashboard&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; In case the browser is not opening another tab and does not display the Dashboard as expected, verify the output in your terminal as it may display a link for the Dashboard (together with some Error messages). Copy and paste that link in a new tab of your browser. Depending on your terminal's features you may be able to just click or right-click the link to open directly in the browser.&lt;/p&gt;

&lt;p&gt;The link may look similar to:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://127.0.0.1:40235/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/" rel="noopener noreferrer"&gt;http://127.0.0.1:40235/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Chances are that the only difference is the PORT number, which above is 40235. Your port number may be different.&lt;br&gt;
After a logout/login or a reboot of your workstation the expected behavior may be observed (where the minikube dashboard command directly opens a new tab in your browser displaying the Dashboard)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploying an Application Using the Dashboard (2)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Deploy a webserver using the nginx image. From the dashboard, click on the &lt;code&gt;+&lt;/code&gt; symbol at the top right corner of the Dashboard. That will open the create interface as seen below:&lt;/p&gt;

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

&lt;p&gt;From there, we can create an application using valid YAML/JSON configuration data, from a definition manifest file, or manually from the &lt;strong&gt;Create from form&lt;/strong&gt; tab. Click on the Create from form tab and provide the following application details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The application name is &lt;code&gt;web-dash&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The container image to use is &lt;code&gt;nginx&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The replica count, or the number of Pods, is 1.&lt;/li&gt;
&lt;li&gt;Service is External, Port 8080, Target port 80, Protocol TCP.
Namespace is &lt;code&gt;default&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

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

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

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

&lt;p&gt;If we click on Show &lt;strong&gt;Advanced Options&lt;/strong&gt;, we can specify options such as Labels, Namespace, Resource Requests, etc. By default, the Label is set to the application name. In our example k8s-app: web-dash Label is set to all objects created by this Deployment: &lt;code&gt;Pods&lt;/code&gt; and &lt;code&gt;Services&lt;/code&gt; (when exposed).&lt;/p&gt;

&lt;p&gt;By clicking on the Deploy button, we trigger the deployment. As expected, the Deployment web-dash will create a ReplicaSet (web-dash-74d8bd488f), which will eventually create 1 Pod replica (web-dash-74d8bd488f-dwbzz).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; Add the full URL in the Container Image field docker.io/library/nginx if any issues are encountered with the simple nginx image name (or use the k8s.gcr.io/nginx URL if it works instead).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; The resource names are unique and are provided for illustrative purposes only. The resources in your clusters and dashboards will display different names, but the naming structure follows the same convention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploying an Application Using the Dashboard (3)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once we create the web-dash Deployment, we can use the resource navigation panel from the left side of the Dashboard to display details of &lt;strong&gt;Deployments&lt;/strong&gt;, &lt;strong&gt;ReplicaSets&lt;/strong&gt;, and &lt;strong&gt;Pods&lt;/strong&gt; in the default Namespace.&lt;/p&gt;

&lt;p&gt;From the Dashboard we can display individual objects’ properties by simply clicking the object’s name. From the commands menu symbol (the vertical three-dots) at the far-right we can easily manage their state. Easily scale up the Deployment to a higher number of &lt;strong&gt;replicas&lt;/strong&gt;, and observe the additional Pods spin up, or scale it down to fewer replicas. Attempt to delete one of the individual Pods of the Deployment. What do you notice after a few seconds? We can even delete the Deployment, an action that results in all its Pod replicas being terminated. But for now, let’s keep the Deployment so we can analyze it further.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24gr1zxbm7uesquptohx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24gr1zxbm7uesquptohx.png" alt="depore" width="800" height="382"&gt;&lt;/a&gt;&lt;br&gt;
Dashboard displaying Deployments, Pods, and ReplicaSets&lt;/p&gt;

&lt;p&gt;The resources displayed by the Dashboard match one-to-one resources displayed from the &lt;code&gt;CLI&lt;/code&gt; via &lt;code&gt;kubectl&lt;/code&gt;. List the Deployments. We can list all the Deployments in the default Namespace using the &lt;code&gt;kubectl&lt;/code&gt; get deployments command:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl get deployments&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;List the ReplicaSets. We can list all the ReplicaSets in the default Namespace using the kubectl get replicasets command:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl get replicasets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;List the Pods. We can list all the Pods in the default namespace using the kubectl get pods command:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl get pods&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;List Deployment, ReplicaSet and Pod with a single command:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl get deploy,rs,po&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Exploring Labels and Selectors (1)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Earlier, we have seen that labels and selectors play an important role in logically grouping a subset of objects to perform operations. Let's take a closer look at them.&lt;/p&gt;

&lt;p&gt;Display the Pod's details. We can look at an object's details using the kubectl describe command. In the following example, you can see a Pod's description:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl describe pod web-dash-6bf994f6&lt;/strong&gt;&lt;/p&gt;

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

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

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

&lt;p&gt;&lt;strong&gt;Exploring Labels and Selectors (2)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;List the Pods, along with their attached Labels. With the &lt;code&gt;-L&lt;/code&gt; option to the kubectl get pods command, we add extra columns in the output to list Pods with their attached Label keys and their values. In the following example, we are listing Pods with the Label keys k8s-app and label2:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl get pods -L k8s-app,label2&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All of the Pods are listed, as each Pod has the Label key k8s-app with value set to web-dash. We can see that in the K8S-APP column. As none of the Pods have the &lt;strong&gt;label2&lt;/strong&gt; Label key, no values are listed under the LABEL2 column.&lt;/p&gt;

&lt;p&gt;Select the Pods with a given Label. To use a selector with the kubectl get pods command, we can use the &lt;code&gt;-l&lt;/code&gt; option. In the following example, we are selecting all the Pods that have the k8s-app Label key set to value web-dash:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl get pods -l k8s-app=web-dash&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;In the example above, we listed all the Pods we created, as all of them have the k8s-app Label key set to value web-dash.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Try using k8s-app=webserver as the Selector&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl get pods -l k8s-app=webserver&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffjjoqoqc7o9us27hndht.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffjjoqoqc7o9us27hndht.png" alt="no resources" width="800" height="437"&gt;&lt;/a&gt;&lt;br&gt;
No resources found.&lt;br&gt;
&lt;em&gt;As expected, no Pods are listed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploying an Application Using the CLI (1)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To deploy an application using the CLI, let's first delete the Deployment we created earlier.&lt;/p&gt;

&lt;p&gt;One method to delete the Deployment we created earlier is from the Dashboard, from the Deployment’s commands menu. Another method is using the kubectl delete command. Next, we are deleting the web-dash Deployment we created earlier:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl delete deployments web-dash&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Deleting a Deployment also deletes the ReplicaSet and the Pods it created:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl get replicasets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$ kubectl get pods&lt;/strong&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;In this first installment, we were able to cover the Visual Orchestration &amp;amp; Lifecycle Basics. We established a rock-solid foundation for managing containerized applications. We moved beyond simple container execution and began exploring the automated world of Kubernetes orchestration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core Competencies Achieved&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Cluster Lifecycle Management:&lt;/strong&gt;&lt;br&gt;
Initiated and verified the local Kubernetes environment using minikube start and status. This confirmed the control plane, Kubelet, and API server were operational.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GUI-Driven Deployment:&lt;/strong&gt; Leveraged the Kubernetes Dashboard to deploy a standalone Nginx application. This demonstrated the "Create from Form" workflow, which simplifies resource definition for those new to the ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resource Hierarchy Identification:&lt;/strong&gt; Observed the relationship between Deployments, ReplicaSets, and Pods. We verified how a single Deployment instruction automatically handles the creation of underlying ReplicaSets to ensure the desired state of our Pods.&lt;/p&gt;

&lt;p&gt;See you in the next part!&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>minikube</category>
      <category>cloudnative</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Master the Linux Terminal for Modern Data Analytics</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Mon, 30 Mar 2026 13:56:35 +0000</pubDate>
      <link>https://forem.com/rahimah_dev/master-the-linux-terminal-for-modern-data-analytics-him</link>
      <guid>https://forem.com/rahimah_dev/master-the-linux-terminal-for-modern-data-analytics-him</guid>
      <description>&lt;h2&gt;
  
  
  INTRODUCTION
&lt;/h2&gt;

&lt;p&gt;In the high-stakes world of Data Analytics, your tools should never be your bottleneck. Most analysts can build a dashboard, but the elite 1% know how to handle data where it actually lives, that is, the &lt;strong&gt;Command Line&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Imagine a 10GB CSV file that crashes Excel on sight. While others wait for their GUI to load, &lt;em&gt;the modern analyst uses the Linux Terminal to slice, filter, and audit millions of rows in milliseconds&lt;/em&gt;. &lt;br&gt;
As a Data Analyst, I’ve realized that the CLI isn't just an &lt;strong&gt;'extra' skill&lt;/strong&gt;, it is the engine of efficiency in 2026. While prepping raw data for Power BI, mastering these 'black screen' secrets is how you move from being a passenger to being the pilot of your data infrastructure.&lt;/p&gt;

&lt;p&gt;Welcome to the world of Linux! Think of the Linux file system as an upside-down tree. Everything grows from a single point at the very top. What is the Root Directory? The root directory is the starting point of the entire Linux file system. &lt;br&gt;
&lt;em&gt;Every single file, folder, and drive on your computer is contained within it&lt;/em&gt;.&lt;br&gt;
It is represented by a single &lt;code&gt;forward slash&lt;/code&gt;: /.&lt;br&gt;
The "Parent": It has no parent directory, it is the absolute top level.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;To get started, you have three ways to use these exact Linux commands on a Windows machine&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. WSL&lt;/strong&gt; &lt;br&gt;
WSL (Windows Subsystem for Linux) is a literal Linux system living inside your Windows computer. It’s what almost all developers use today.&lt;/p&gt;

&lt;p&gt;How to get it: Open your Windows Terminal and type &lt;code&gt;wsl --install&lt;/code&gt;.&lt;br&gt;
This runs the Result on your actual hard drive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.Git Bash&lt;/strong&gt; &lt;br&gt;
If you install Git for Windows, it comes with &lt;code&gt;Git Bash&lt;/code&gt;. It’s a small emulator that lets you use Linux commands to navigate your Windows folders.&lt;/p&gt;

&lt;p&gt;In Git Bash, your C: drive is usually mapped to /c/.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.PowerShell&lt;/strong&gt; &lt;br&gt;
PowerShell actually has "aliases" for some Linux commands to make life easier for people moving between systems. It serves as a translator.&lt;br&gt;
&lt;strong&gt;NOTE&lt;/strong&gt;: Windows and Linux speak different "languages." though there are some similarities.&lt;br&gt;
Windows uses PowerShell or Command Prompt (CMD), where the root is usually C:. Linux uses the Bash shell, where the root is /.&lt;/p&gt;

&lt;p&gt;I'll be using Git Bash is actually one of the most popular ways for developers to use Linux commands on a Windows computer,and I already have it in VS Code.&lt;/p&gt;

&lt;p&gt;When you open Git Bash in VS Code, you are essentially running a "mini Linux environment" that can see your Windows files.&lt;/p&gt;

&lt;h2&gt;
  
  
  HOW TO USE IT
&lt;/h2&gt;

&lt;p&gt;Open the Terminal: In VS Code, press &lt;code&gt;Ctrl +&lt;/code&gt;`  (the backtick key). Or &lt;strong&gt;select View, then Terminal&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Select Git Bash&lt;/strong&gt;: In the top-right corner of the terminal pane, click the dropdown arrow (usually says "powershell" or "cmd") and select &lt;code&gt;Git Bash&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;If you want to explore these right now in your terminal, here is how you can use those commands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jump to Root: Type &lt;code&gt;cd&lt;/code&gt; / to move to the very top.&lt;/li&gt;
&lt;li&gt;See Where You Are: Type &lt;code&gt;pwd&lt;/code&gt;(Print Working Directory). It should just show /.&lt;/li&gt;
&lt;li&gt;Look Around: Type &lt;code&gt;ls&lt;/code&gt; to see all the folders (like bin, etc, and home) living inside the root. &lt;em&gt;These aren't your Windows C: drive folders, they are the virtual Linux-style folders Git Bash creates to make your commands work&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;em&gt;This is the most important part for a beginner. Git Bash "mounts" your Windows drives inside the root&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;To go to your C: Drive, type: &lt;strong&gt;cd /c/&lt;/strong&gt;&lt;br&gt;
To go to your Desktop, type: &lt;strong&gt;cd /c/Users/YourUsername/Desktop&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Change directory to the desktop&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;NOTE: My computer is using the username &lt;code&gt;Admin&lt;/code&gt; inside the folders, even though your machine name is &lt;code&gt;RAHIMAH-ISAH&lt;/code&gt;. Linux is very literal about where things are stored.&lt;br&gt;
So &lt;strong&gt;cd /c/Users/Admin/Desktop&lt;/strong&gt; is the full "map" to my Desktop&lt;/p&gt;

&lt;p&gt;where:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;cd: Change Directory.&lt;/li&gt;
&lt;li&gt;/c/: This is your C: Drive.&lt;/li&gt;
&lt;li&gt;Desktop: This is your destination.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;To move from my current location into the &lt;code&gt;My_Analytics&lt;/code&gt; folder on the Desktop, I'll use the cd (change directory) command:&lt;br&gt;
&lt;strong&gt;cd My_Analytics&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Create a "test" folder&lt;/strong&gt;&lt;br&gt;
To create a new folder (directory), use the &lt;code&gt;mkdir&lt;/code&gt; (make directory) command:&lt;br&gt;
&lt;strong&gt;mkdir test&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But first, change directory to the previous: &lt;code&gt;cd ..&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;If you want to see if your new folder was actually created, type &lt;code&gt;ls&lt;/code&gt;. It will list everything in your current location, and you should see test appearing in the list.&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Out of curiosity, being a beginner it's allowed to check the Desktop&lt;/em&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Let's learn how to use these, try this "Real World" sequence in the VS Code Git Bash:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Go to your User folder&lt;/strong&gt;: &lt;strong&gt;cd ~&lt;/strong&gt; (The tilde ~ is a Linux shortcut for your home).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a project folder&lt;/strong&gt;: &lt;strong&gt;mkdir my-linux-practice2&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enter the folder&lt;/strong&gt;: &lt;strong&gt;cd my-linux-practice2&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Create a blank file&lt;/strong&gt;: &lt;strong&gt;touch notes.txt&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Verify it's there: &lt;strong&gt;ls&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;I made use of "-" instead of "_".&lt;br&gt;
Let's make the correction together.&lt;/p&gt;

&lt;p&gt;In Linux, we use the mv command (short for move) to rename files and folders.&lt;/p&gt;

&lt;p&gt;Since am currently on the Desktop, I can "move" the folder from the old name to the new name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Correction Command&lt;/strong&gt;&lt;br&gt;
Type this and press Enter:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;mv linux-practice linux_practice&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How it works&lt;/em&gt;&lt;br&gt;
The mv command follows a simple logic:&lt;br&gt;
&lt;strong&gt;mv [old_name] [new_name]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;linux-practice&lt;/em&gt;: The folder as it exists now.&lt;br&gt;
&lt;em&gt;linux_practice&lt;/em&gt;: What you want it to be named.&lt;br&gt;
I did not remember the exact folder name, so I used the &lt;strong&gt;ls&lt;/strong&gt; command.&lt;/p&gt;

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

&lt;p&gt;And then verified the name change by running &lt;strong&gt;ls&lt;/strong&gt; command.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a message&lt;/strong&gt;&lt;br&gt;
We are going to use the &lt;code&gt;echo&lt;/code&gt; command. It literally "echoes" whatever you type back to you, but we are going to use a special symbol &lt;code&gt;&amp;gt;&lt;/code&gt; to tell it to &lt;code&gt;echo&lt;/code&gt; into a file instead.&lt;/p&gt;

&lt;p&gt;Remember to enter the Directory if you aren't already there:&lt;br&gt;
&lt;strong&gt;cd /c/Users/Admin/Desktop/notes.txt&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;echo "Hello from the Linux terminal!" &amp;gt; notes.txt&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read your file&lt;/strong&gt;&lt;br&gt;
Now, let's see if the file actually contains that message.&lt;/p&gt;

&lt;p&gt;Type this and press Enter:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;cat notes.txt&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;cat (short for concatenate)&lt;/code&gt; is the standard way to quickly read the contents of a file in the terminal.&lt;/p&gt;

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

&lt;p&gt;What just happened?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;echo "text": Prepared the message.&lt;/li&gt;
&lt;li&gt;&amp;gt;: This is called a Redirect. It took the message that would normally print on the screen and "poured" it into the file.&lt;/li&gt;
&lt;li&gt;cat: Showed you the result.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since we've already used &lt;code&gt;&amp;gt;&lt;/code&gt; to create the file, let's learn how to add a second line to it without deleting the first one.&lt;/p&gt;

&lt;p&gt;Step 1:Go back into your folder (if you left it)&lt;br&gt;
cd /c/Users/Admin/Desktop/notes&lt;/p&gt;

&lt;p&gt;Step 2:Add a new line (use two symbols &amp;gt;&amp;gt;)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&amp;gt; = Overwrites the file (deletes old stuff).&lt;/li&gt;
&lt;li&gt;&amp;gt;&amp;gt; = Appends (adds to the bottom).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;echo "This is my second line!" &amp;gt;&amp;gt; notes.txt&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Step 3:Read it (check your spelling!)&lt;br&gt;
&lt;strong&gt;cat notes.txt&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Use echo with &amp;gt;&amp;gt; to add another line:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;echo "This is my third line!" &amp;gt;&amp;gt; notes.txt&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Verify the result:&lt;br&gt;
If you run &lt;code&gt;cat notes.txt&lt;/code&gt; now, you should see:&lt;/p&gt;

&lt;p&gt;Hello from me!&lt;br&gt;
This is my second line.&lt;br&gt;
This is my third line!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;:&lt;br&gt;
In Linux, &lt;em&gt;case sensitivity is everything&lt;/em&gt;. If you create a file named Notes.txt (with a capital N) and then try to read notes.txt (with a lowercase n), the terminal thinks they are two completely different files.&lt;br&gt;
When you type a command like cat and press Enter, the terminal will seem to "freeze." This is because cat without a filename waits for you to type something into it.&lt;/p&gt;

&lt;p&gt;Whenever a command gets stuck like that, press &lt;code&gt;Ctrl + C&lt;/code&gt; on your keyboard to kill the process and get your prompt back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hidden files&lt;/strong&gt;&lt;br&gt;
In Linux, you can make a file "hidden" just by starting its name with a &lt;strong&gt;period (.)&lt;/strong&gt;. These are usually used for important system settings that you don't want to see cluttering your folders.&lt;/p&gt;

&lt;p&gt;Step 1: Create a hidden file (in my folder my_linux_practice2)&lt;br&gt;
Type this and press Enter:&lt;br&gt;
&lt;strong&gt;touch .secret_note.txt&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Step 2:Try to find it with a normal ls&lt;br&gt;
Type this:&lt;br&gt;
&lt;strong&gt;ls&lt;/strong&gt;&lt;br&gt;
(Notice that it doesn't show up, even though it's there.)&lt;/p&gt;

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

&lt;p&gt;Step 3:Reveal the hidden files&lt;br&gt;
To see everything (including hidden files), you need to add a "flag" to your command.&lt;br&gt;
Type this:&lt;br&gt;
&lt;strong&gt;ls -a&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-a&lt;/code&gt;: stands for "all".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv0r1za65jrkz7aaiaaxf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv0r1za65jrkz7aaiaaxf.png" alt="toseeall" width="800" height="130"&gt;&lt;/a&gt;&lt;br&gt;
&lt;code&gt;.&lt;/code&gt;: This represents the current directory you are in.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;..&lt;/code&gt;: This represents the parent directory (one level up).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.my_secret_file.txt&lt;/code&gt;: The brand new hidden file!&lt;/p&gt;

&lt;p&gt;Being a Data Analyst and Cloud Engineer, I see these "dot files" (like .git or .env) all the time in your professional work. Knowing how to find them using ls -a is a critical skill.&lt;/p&gt;

&lt;p&gt;To delete files in Linux, we use the &lt;code&gt;rm&lt;/code&gt; command (short for remove).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be careful&lt;/strong&gt;: unlike Windows, there is no "Recycle Bin" in the Linux terminal. Once you delete a file with this command, it is gone for good!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Deletion Command&lt;/strong&gt;&lt;br&gt;
Type this and press Enter:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;rm .secret_note.txt&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Verify it is gone&lt;br&gt;
Since this was a hidden file, a normal ls wouldn't have shown it anyway. To be 100% sure it’s deleted, you need to use the "all" flag again.&lt;/p&gt;

&lt;p&gt;Type this:&lt;br&gt;
&lt;strong&gt;ls -a&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;What you should see: notes.txt, plus the system markers &lt;code&gt;.&lt;/code&gt; and &lt;code&gt;..&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What should be missing?: .secret_note.txt.&lt;/p&gt;

&lt;p&gt;While working, for example, with Azure and Power BI, you'll often have folders full of data files. If you ever need to delete an entire folder and everything inside it, you have to add a "recursive" flag:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;rm -r folder_name&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt;: Never type rm -rf /. This tells Linux to "Force Delete Everything starting from the Root," which would erase your entire operating system!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Copying is another fundamental skill&lt;/strong&gt;, especially when you want to create backups of your scripts or data reports before you make changes.&lt;/p&gt;

&lt;p&gt;In Linux, we use the &lt;code&gt;cp&lt;/code&gt; (copy) command.&lt;/p&gt;

&lt;p&gt;Step 1: Create a simple copy&lt;br&gt;
Let's take the existing &lt;code&gt;notes.txt&lt;/code&gt; and create a backup called &lt;code&gt;backup.txt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Type this and press Enter:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;cp notes.txt backup.txt&lt;/strong&gt;&lt;br&gt;
Step 2: Verify the copy&lt;br&gt;
Now, let's see if you have two separate files now.&lt;/p&gt;

&lt;p&gt;Type this:&lt;br&gt;
&lt;strong&gt;ls&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You should see both notes.txt and backup.txt listed.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Copy into a new folder&lt;/strong&gt;&lt;br&gt;
Now let's get a bit more organized. Let's create a "logs" folder and copy the file into it.&lt;/p&gt;

&lt;p&gt;Step 1:&lt;br&gt;
Create the folder:&lt;br&gt;
&lt;strong&gt;mkdir logs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Step 2:&lt;br&gt;
Copy the file into the folder:&lt;br&gt;
&lt;strong&gt;cp notes.txt logs/&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Step 3:&lt;br&gt;
Check inside the logs folder:&lt;br&gt;
&lt;strong&gt;ls logs&lt;/strong&gt;&lt;br&gt;
This tells ls to look specifically inside the logs directory without you having to &lt;code&gt;cd&lt;/code&gt; into it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4e0c9fu4ch8ghy969my6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4e0c9fu4ch8ghy969my6.png" alt="copytofolder" width="800" height="233"&gt;&lt;/a&gt;&lt;br&gt;
Now the logs folder is no longer empty, it contains the notes.txt file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "Dot" Trick&lt;/strong&gt;&lt;br&gt;
If you are already inside a folder and want to copy a file from somewhere else into your current spot, you use a &lt;strong&gt;period&lt;/strong&gt; . (which means "here").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example (Try this on your own)&lt;/strong&gt;:&lt;br&gt;
cp /c/Users/Admin/Desktop/important.txt .&lt;br&gt;
(This translates to: "Copy important.txt from the Desktop to here.")&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Copying a folder&lt;/strong&gt;&lt;br&gt;
Since we are copying a folder (the logs folder) instead of a single file, we need to use a special flag. In Linux, if you try to copy a folder without this flag, the terminal will give you an error saying "omitting directory."&lt;/p&gt;

&lt;p&gt;To copy a directory and everything inside it, we use &lt;strong&gt;-r&lt;/strong&gt; (which stands for recursive).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Copy Directory Commands&lt;/strong&gt;&lt;br&gt;
Step 1: Copy the logs folder to a new name&lt;br&gt;
Type this and press Enter:&lt;br&gt;
&lt;strong&gt;cp -r logs logs_backup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Step 2:Verify both folders exist&lt;br&gt;
Type this:&lt;br&gt;
&lt;strong&gt;ls -F&lt;/strong&gt;&lt;br&gt;
(The -F flag is a neat trick,it adds a &lt;code&gt;/&lt;/code&gt; to the end of folder names so you can easily tell them apart from files!)&lt;/p&gt;

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

&lt;p&gt;Step 3:Copy a file from one folder to another&lt;br&gt;
Let's practice moving things between folders without leaving your current spot. Let's copy the file inside logs into logs_backup but give it a new name.&lt;/p&gt;

&lt;p&gt;Type this:&lt;br&gt;
&lt;strong&gt;cp logs/notes.txt logs_backup/archive_copy.txt&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Step 4:Check the contents of the backup folder&lt;br&gt;
&lt;strong&gt;ls logs_backup&lt;/strong&gt;&lt;br&gt;
You should now see both &lt;code&gt;notes.txt&lt;/code&gt; and &lt;code&gt;archive_copy.txt&lt;/code&gt; inside that folder.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;The "Tab" Trick&lt;/strong&gt;&lt;br&gt;
To avoid typos (like lowercase vs. uppercase), try this:&lt;br&gt;
Type cd lin and then press the Tab key on your keyboard. Git Bash will automatically finish the word linux_practice for you! It’s like magic and prevents almost all errors. You can try it with the first few letters of your file and folder names.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creating Multiple folders&lt;/strong&gt;&lt;br&gt;
Creating multiple folders at once is a huge time-saver for any &lt;strong&gt;Data Analyst&lt;/strong&gt;. Instead of typing &lt;code&gt;mkdir&lt;/code&gt; five separate times, we can do it in one single line.&lt;/p&gt;

&lt;p&gt;In Linux, there are two ways to do this: the Simple List and the Brace Expansion (the "Pro" way).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 1: The Simple List&lt;/strong&gt;&lt;br&gt;
You can simply type &lt;code&gt;mkdir&lt;/code&gt; followed by all the names you want, separated by spaces.&lt;br&gt;
&lt;strong&gt;mkdir Jan Feb Mar Apr May Jun&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F502rwly07adc0ik21mli.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F502rwly07adc0ik21mli.png" alt="multiplefolders" width="800" height="319"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Result: 6 new folders appear instantly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 2: Brace Expansion {} (The Power Move)&lt;/strong&gt;&lt;br&gt;
This is how engineers create hundreds of folders in a second. It uses curly brackets to tell Linux: "Take this prefix and attach all these options to it."&lt;/p&gt;

&lt;p&gt;Try creating six months of data folders like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;mkdir month_{1..6}&lt;/strong&gt;&lt;br&gt;
Result: You will get month_1, month_2, up to month_6.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Method 3: Nested Folders (The -p Flag)&lt;/strong&gt;&lt;br&gt;
Sometimes you want to create a folder inside a folder that doesn't exist yet (like a file path). If you just try mkdir Project/Data, it will fail. You need the -p (parents) flag.&lt;/p&gt;

&lt;p&gt;Try this to build a full project structure in one go this way:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;mkdir -p Analytics_Project/{customer,date,region,price}&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;What happened?&lt;/strong&gt; &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It created the main folder Analytics_Project.&lt;/li&gt;
&lt;li&gt;Inside it, it created 4 sub-folders: customer, date, region, and price.
To see your beautiful new structure without clicking around your Desktop, use the "Recursive List" command:
&lt;strong&gt;ls -R Cloud_Project&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

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

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

&lt;p&gt;After creating multiple folders, knowing &lt;em&gt;how to clean them up&lt;/em&gt; is just as important. In Linux, there are two main ways to delete a directory, depending on whether it has files inside it or not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 1: The "Safety" Way (rmdir)&lt;/strong&gt;&lt;br&gt;
If a folder is completely empty, you use rmdir (remove directory). This is safe because Linux will refuse to run the command if there is even one tiny file inside, preventing accidental data loss.&lt;/p&gt;

&lt;p&gt;Try it on one of your empty month folders:&lt;br&gt;
&lt;strong&gt;rmdir Jan&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 2: The "Force" Way (rm -r)&lt;/strong&gt;&lt;br&gt;
If the folder has files, scripts, or other folders inside it, rmdir won't work. You must use the rm command with the -r (recursive) flag. This tells Linux to go "inside" the folder and delete everything first, then delete the folder itself.&lt;/p&gt;

&lt;p&gt;Try it on your Analytics_Project folder:&lt;br&gt;
&lt;strong&gt;rm -r Analytics_Project&lt;/strong&gt;&lt;br&gt;
A Critical Warning for Cloud Engineers and Data Analysts&lt;br&gt;
In Linux, there is no "Recycle Bin." Once you run rm -r, that data is gone forever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "Danger" Command&lt;/strong&gt;:&lt;br&gt;
You will often see &lt;code&gt;rm -rf&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-r&lt;/code&gt;: Recursive (deletes folders).&lt;br&gt;
&lt;code&gt;-f&lt;/code&gt;: Force (doesn't ask "Are you sure?").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Always double-check your current location with pwd before running a recursive delete&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "Real-life" Challenge&lt;/strong&gt;&lt;br&gt;
We are going to simulate a real-world task: Organizing a project*&lt;em&gt;.&lt;br&gt;
Step 1: Create the Workspace&lt;br&gt;
Create a main project folder and two sub-folders in one line:&lt;br&gt;
**mkdir -p My_Analytics/{raw_data,final_reports}&lt;/em&gt;*&lt;/p&gt;

&lt;p&gt;Step 2:Create a "Data" file&lt;br&gt;
Let’s create a dummy data file inside the raw_data folder:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;touch My_Analytics/raw_data/sales_2026.csv&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Step 3:Copy the file (The "Backup" Move)&lt;br&gt;
Before you edit data, you should always have a copy. Use cp (copy)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;cp My_Analytics/raw_data/sales_2026.csv My_Analytics/raw_data/sales_backup.csv&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Step 4:Move the file (The "Organization" Move)&lt;br&gt;
Now, let's pretend you finished your analysis. Move the original file to the final_reports folder using mv (move):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;mv My_Analytics/raw_data/sales_2026.csv My_Analytics/final_reports/&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Check Your Work&lt;br&gt;
Use the Tree view (or recursive list) to see your organized project:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ls -R My_Analytics&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Since you've already learned how to create, move, and delete folders, the next "superpower" for a Data Analyst is being able to see what is inside a file without needing to open a heavy application like Excel or Notepad.&lt;/p&gt;

&lt;p&gt;Imagine you just downloaded a massive dataset from an Azure storage bucket. You need to know if it's the right data before you start your analysis.&lt;/p&gt;

&lt;p&gt;Practice 1: Creating a "Data" File&lt;br&gt;
First, let's create a file with some actual content inside it so we have something to look at.&lt;/p&gt;

&lt;p&gt;Type this command:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;echo -e "ID,Name,Sales\n1,Rahimah,500\n2,Ibrahim,750\n3,Dickson,300" &amp;gt; sales_data.csv&lt;/strong&gt;&lt;br&gt;
What this does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;echo prints text.&lt;/li&gt;
&lt;li&gt;-e allows for "new lines" (\n).&lt;/li&gt;
&lt;li&gt;&amp;gt; saves that text into a new file called sales_data.csv.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Practice 2:The "Peeking" Commands&lt;br&gt;
Now, let's look at the data using three different tools.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The cat Command (Concatenate)
This dumps the entire file onto your screen.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;cat sales_data.csv&lt;/strong&gt;&lt;br&gt;
Use this when: The file is small (like a configuration file).&lt;/p&gt;

&lt;p&gt;2.The head Command&lt;br&gt;
This only shows the first few lines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;head -n 2 sales_data.csv&lt;/strong&gt;&lt;br&gt;
Use this when you have a 1-million-row CSV and just want to see the column headers.&lt;/p&gt;

&lt;p&gt;3.The tail Command&lt;br&gt;
This shows the very end of the file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tail -n 1 sales_data.csv&lt;/strong&gt;&lt;br&gt;
Use this when: You want to see the most recent entry in a log file.&lt;/p&gt;

&lt;p&gt;Practice 3:The "Search" Power (grep)&lt;br&gt;
This is the command Data Analysts use most. It searches for a specific word inside a file. Suppose you only want to see the sales for "Ibrahim".&lt;/p&gt;

&lt;p&gt;Type this:&lt;br&gt;
&lt;strong&gt;grep "Ibrahim" sales_data.csv&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;: It will ignore everything else and only show you the row for Ibrahim.&lt;/p&gt;

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

&lt;p&gt;It actually created an .csv file, amazing!&lt;/p&gt;

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

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

&lt;p&gt;&lt;strong&gt;Why this matters for you&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Analysts love finding needles in haystacks&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Imagine searching a 2GB file for a specific Transaction ID. In Excel, your computer freezes. In the CLI, grep 'TXN_9984' data.csv finds it in milliseconds. &lt;br&gt;
When you are working as a Data Analyst, you might have thousands of logs. Instead of scrolling through them, you use grep &lt;code&gt;Error&lt;/code&gt; to find exactly where something went wrong in your Azure pipeline.&lt;/p&gt;

&lt;p&gt;Final Command for today: &lt;strong&gt;history&lt;/strong&gt;&lt;br&gt;
Want to see a list of everything you've done in this session?&lt;/p&gt;

&lt;p&gt;Type this in your Git Bash:&lt;br&gt;
&lt;strong&gt;history&lt;/strong&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  CONCLUSION
&lt;/h2&gt;

&lt;p&gt;Mastering the Linux Terminal is more than just learning a list of commands; it is about adopting a mindset of efficiency and automation. In an era where data volumes are exploding and cloud infrastructure is the standard, the ability to navigate a server, audit a massive CSV, or automate a directory structure is what separates a traditional analyst from a modern data professional.&lt;/p&gt;

&lt;p&gt;As you move from the GUI to the CLI, you aren't just changing how you interact with your computer—you are expanding your capacity to handle "Big Data" that others simply cannot touch. Whether you are building pipelines in Azure, managing repositories on GitHub, or cleaning raw data for Power BI, the terminal is the bridge that connects your analytical skills to the global tech ecosystem.&lt;/p&gt;

&lt;p&gt;The Challenge&lt;br&gt;
Don't let these commands sit idle. Open your Git Bash today, navigate to your projects using only your keyboard. &lt;/p&gt;

</description>
      <category>dataanalytics</category>
      <category>linux</category>
      <category>bash</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
