<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Rohan Purekar | Site Reliability Engineer]]></title><description><![CDATA[I am a passionate Site Reliability Engineer, and I write about the stuff that I do. If Linux, Networking, Automation, etc., arouse your curiosity, I am hoping t]]></description><link>https://rohanthe.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1635697213088/PDztVWkyk.png</url><title>Rohan Purekar | Site Reliability Engineer</title><link>https://rohanthe.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Apr 2026 22:21:47 GMT</lastBuildDate><atom:link href="https://rohanthe.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How do you decide when something is ready for production?]]></title><description><![CDATA[When an SRE team is taking service to production, they take over the responsibility of managing the service and would like to clarify all operational aspects to ease the journey. In my opinion, different organizations might choose to involve the SRE ...]]></description><link>https://rohanthe.dev/how-do-you-decide-when-something-is-ready-for-production</link><guid isPermaLink="true">https://rohanthe.dev/how-do-you-decide-when-something-is-ready-for-production</guid><category><![CDATA[Site Reliability Engineering]]></category><category><![CDATA[SRE]]></category><dc:creator><![CDATA[Rohan Purekar]]></dc:creator><pubDate>Mon, 11 Apr 2022 11:53:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/aWslrFhs1w4/upload/9a9074b1f45dccd0de3a226ea00ac2a8.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When an SRE team is taking service to production, they take over the responsibility of managing the service and would like to clarify all operational aspects to ease the journey. In my opinion, different organizations might choose to involve the SRE team might be at the earlier stage of development or a later stage. Still, ideally, it’s better to involve them early on to reduce the friction during go-live. Regardless of when the SREs are involved, here are a few things to consider before taking a service live (or into production):</p>
<ol>
<li><p>Reliability: You need to have a discussion with the various stakeholders of the service: Developers, Product Managers, Sales, etc., about the expected uptime to define SLAs and about the expected performance may be to define SLOs.</p>
</li>
<li><p>Visibility: Discussion around the logs, metrics, and monitoring is imperative as they enable the measurements around the service.</p>
</li>
<li><p>Performance: It is necessary that a baseline of expectations is set and met while taking a service into production so the room for improvement can be defined early on in this journey. It also helps while setting up alerts if the performance tanks.</p>
</li>
<li><p>Capacity Planning: How much capacity would be required to meet the performance expectations or traffic estimates? Can we refer to any other service to decide the capacity for this one? Is it within our budget? These questions simplify a lot of discussion around capacity.</p>
</li>
<li><p>Emergency Response: Through books and experience, I learned the cardinal rule of being an SRE - no matter what, something might go wrong, and your service will fail. So it is best to define the firefighters. A couple of developers and SREs on-call with good training and documentation make the emergency response process much more manageable. And without the emergency response plan, you should not consider taking a service to production.</p>
</li>
<li><p>Change Management: This directly impacts your SLA, so you need to define how frequently new changes would be pushed and how to handle the service during the changes. There are various approaches to change management that you should look up.</p>
</li>
<li><p>Security: Based on the type of business or service, some security standards might need to be met. So, ensure that everything is clear in that dimension.</p>
</li>
</ol>
<p>This is not an exhaustive checklist of everything that you should do while taking a service live, but it is a good baseline that I was able to chalk out through this <a target="_blank" href="https://sre.google/sre-book/evolving-sre-engagement-model/">article</a> and my personal experience.</p>
]]></content:encoded></item><item><title><![CDATA[What happens when you type www.google.com? (considering nothing is cached)]]></title><description><![CDATA[Ever wondered how the browser fetches a website from the internet? With over 40 years of development, there are so many things happening in the backdrop that it might totally sound overwhelming. But here's a step-by-step description of the phases tha...]]></description><link>https://rohanthe.dev/what-happens-when-you-type-wwwgooglecom-considering-nothing-is-cached</link><guid isPermaLink="true">https://rohanthe.dev/what-happens-when-you-type-wwwgooglecom-considering-nothing-is-cached</guid><category><![CDATA[Site Reliability Engineering]]></category><category><![CDATA[networking]]></category><category><![CDATA[internet]]></category><dc:creator><![CDATA[Rohan Purekar]]></dc:creator><pubDate>Tue, 08 Feb 2022 13:23:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/QgldjOQbp7k/upload/9b050977a25483a33de2d8d1f343416d.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ever wondered how the browser fetches a website from the internet? With over 40 years of development, there are so many things happening in the backdrop that it might totally sound overwhelming. But here's a step-by-step description of the phases that your request goes through.</p>
<ul>
<li><p><strong>HSTS Lookup</strong></p>
</li>
<li><ul>
<li><p>The HSTS list consists of sites that require HTTPS only to access them. Google maintains such a list remotely, and a copy of the list remains on the browser that is updated frequently.</p>
<p>    * When the request is made from the browser, it first checks if the host is present in the HSTS list. If the host is found, then the request is made using port 443; otherwise, the request is made using port 80.</p>
<p>    * HSTS can also be configured as a header on the server or the application. The use of HSTS is to protect against SSL Stripping Attacks, which is a form of a man-in-the-middle attack.</p>
</li>
</ul>
</li>
<li><p><strong>DNS Lookup</strong></p>
</li>
<li><ul>
<li>In the DNS lookup, the browser first checks the local cache. If it is not found in the local cache, it checks for any entries in the local hosts file of the operating system.</li>
</ul>
</li>
<li><p><strong>ARP Lookup</strong></p>
</li>
<li><ul>
<li><p>If the entry for the host is not found in the local hosts file, the browser needs to check outside and get the IP of the server hosting the website. To do this the computer sends an ARP request.</p>
<p>    * First, the ARP cache is checked for the IP address of the router and its MAC address, if it is not there, then an ARP request is broadcast to the network.</p>
<p>    * First, the computer sends an ARP request to the router to get its MAC address. The router responds with the MAC address. This MAC address, along with the IPv4 of the router, is then used to create an ethernet frame to send the IP packet to the router.</p>
<p>    * The router then uses its routing table to forward the packet to the gateway server. In this step, the browser just needs the IP of the gateway or the DNS server. Once it gets the IP of the DNS server, it opens a UDP connection on port 53 with a source port greater than 1023 (basically from the ephemeral port range) to get the IP of the target server.</p>
</li>
</ul>
</li>
<li><p><strong>DNS Resolution</strong></p>
</li>
<li><ul>
<li><p>First, the browser makes a query to the local resolver or the gateway to check for the host entry in their cache.</p>
<p>    * If the gateway server doesn’t have it, then it makes a DNS query to the root servers that have the entries of the TLDs. (There are 13 root servers).</p>
<p>    * These TLDs then further point down the tree to the authoritative or the recursive nameservers. Once the query reaches the authoritative nameservers, the SOA is reached, and the A record returns the IP address of the target server.</p>
</li>
</ul>
</li>
<li><p><strong>TCP Handshake</strong></p>
</li>
<li><ul>
<li><p>Once the browser receives the IP address of the target server, it takes the port number from the URL based on the HSTS result and starts the process of creating a TCP socket stream.</p>
<p>    * First, the request is sent to the Transport layer, where the TCP segment is crafted, and the destination port, source port, etc., is added to the header.</p>
<p>    * Then the segment is sent to the Network layer, which wraps an IP header. The IP address of the destination server as well as the sender.</p>
<p>    * Then the segment is sent to the Data Link layer, where the MAC addresses of the NIC and the gateway are added, and the packet is now ready to be sent.</p>
<p>    * Once the packet reaches the local subnet, from there, it travels through Autonomous Systems border routers using Border Gateway Protocol. In BGP, the routers figure out the smallest path to reach the destination server, and communication between the AS routers is based on trust.</p>
<p>    * So once the packet reaches the destination server, the TCP handshake starts. One important feature is the TTL field which is decreased by one every time a packet reaches a router. If the TTL field reaches 0, the packet is dropped.</p>
<p>    * The handshake happens as:</p>
<p>    * * The client chooses an Initial Sequence Number and sends SYN to the server to indicate its intent to connect.</p>
<p>    * The server then chooses its own ISN and indicates it wants to connect by sending an SYN-ACK packet. Meanwhile, it increases the client’s sequence number by 1.</p>
<p>    * The client acknowledges the packet, increases the ISN by 1, and sends the ACK packet.</p>
</li>
</ul>
</li>
<li><p><strong>TLS Connection</strong></p>
</li>
<li><ul>
<li><p>After a TCP connection is established between the client and the server, the client initiates the TLS connection by sending a ClientHello message to the server along with acceptable cipher suites and the TLS version. (this happens only if HTTPS is requested)</p>
<p>    * The server replies with a ServerHello message and also sends the cipher suites, TLS version, compression methods, Certificate, etc. The certificate contains the public key.</p>
<p>    * The client verifies the certificate against some trusted CAs. If trust is established, it generates some random bytes, encrypts them using the public key, and sends them to the server.</p>
<p>    * The server decrypts the random numbers using the private key and generates a symmertic key using the random bytes sent by the client.</p>
<p>    * The client and the server exchange the change_cipher_specs if there are any to agree on a cipher suite.</p>
<p>    * Finally they exchange the finished message and from here on forward, the data exchanged is encrypted using the symmetric key.</p>
</li>
</ul>
</li>
<li><p><strong>HTTP Protocol</strong></p>
</li>
<li><ul>
<li><p>Now to access the webpage, the browser starts HTTP to fetch the webpage.</p>
<p>    * The browser sends the HTTP request which contains the Port, URL, Headers, and HTTP version to the server.</p>
<p>    * The request reaches the external most point of the target network and is usually handled by a load balancer. The load balancer then forwards the request to the internal application server.</p>
<p>    * Once the request reaches the server, it breaks down the request components into</p>
<p>    * * Request Method</p>
<p>    * Request Path</p>
<p>    * Request Headers</p>
<p>    * IP, etc.</p>
<p>    * The server, which can usually be something like Nginx or Apache serving maybe a PHP or a Python application, talks to the application through FPM or WSGI. These components help retrieve the webpage and send the response to the server, which in turn sends the response back to the client.</p>
<p>    * In the response, the server includes Headers, HTTP Status Code, HTTP Version, etc.</p>
</li>
</ul>
</li>
<li><p><strong>Web Page Construction</strong></p>
</li>
<li><ul>
<li>The browser collects the CSS, JS, or HTML files and builds the DOM that eventually builds the webpage in the browser.</li>
</ul>
</li>
</ul>
<p>Do check out - <a target="_blank" href="https://github.com/alex/what-happens-when">https://github.com/alex/what-happens-when</a></p>
]]></content:encoded></item><item><title><![CDATA[What is BGP?]]></title><description><![CDATA[BGP (Border Gateway Protocol) is a routing protocol that is used to exchange routing information between different networks on the internet. When a user tries to access a website in a browser, the request first goes to the user's local network, which...]]></description><link>https://rohanthe.dev/what-is-bgp</link><guid isPermaLink="true">https://rohanthe.dev/what-is-bgp</guid><category><![CDATA[Site Reliability Engineering]]></category><category><![CDATA[networking]]></category><dc:creator><![CDATA[Rohan Purekar]]></dc:creator><pubDate>Mon, 03 May 2021 10:34:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/1lfI7wkGWZ4/upload/28f339dd724cdf2d5b4f6e9769c71a33.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>BGP (Border Gateway Protocol) is a routing protocol that is used to exchange routing information between different networks on the internet. When a user tries to access a website in a browser, the request first goes to the user's local network, which then forwards it to the network's or ISP's border router. From there, BGP is used by the routers to determine the best path for the request to travel through different networks to reach the destination network where the website is hosted.</p>
<p>On the internet, various networks are called Autonomous Systems (AS). These ASes belong to various ISPs or Network Providers or Companies like Verizon, Xfinity, Google, Facebook, etc. Their interconnection makes up the internet around the world. These ASes have numerous routers at the borders of their network, which spans the globe.</p>
<p>The border router of the ISP sends the request to another border router of an AS, and it goes forward and reaches the destination using the smallest path. What happens is that each router uses BGP to figure out the smallest path to the destination and sends the request accordingly to the next router.</p>
<p>Eventually, the request reaches the network that is hosting the website, and BGP is used to route the request to the specific server that is hosting the website. BGP is also used to route the response back to the user's browser, following the same path in reverse.</p>
<p>In summary, BGP plays a critical role in determining the best path for network traffic to travel between different networks on the internet, including when a user tries to access a website in a browser.</p>
]]></content:encoded></item><item><title><![CDATA[What is a StatefulSet?]]></title><description><![CDATA[A stateful set is a Kubernetes object that manages a set of pods that need to maintain persistent storage. The StatefulSet ensures that each pod in the set has a unique identity and that the pods are always started in the same order.

A StatefulSet i...]]></description><link>https://rohanthe.dev/what-is-a-statefulset</link><guid isPermaLink="true">https://rohanthe.dev/what-is-a-statefulset</guid><category><![CDATA[Kubernetes]]></category><category><![CDATA[Site Reliability Engineering]]></category><dc:creator><![CDATA[Rohan Purekar]]></dc:creator><pubDate>Thu, 15 Apr 2021 10:23:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/Esq0ovRY-Zs/upload/49b29ef45feae0510321bb5e86bb4adc.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>A stateful set is a Kubernetes object that manages a set of pods that need to maintain persistent storage. The StatefulSet ensures that each pod in the set has a unique identity and that the pods are always started in the same order.</p>
</blockquote>
<p>A StatefulSet is a Kubernetes object used to manage stateful applications. It is designed to manage stateful applications by creating and managing a set of replica Pods, each of which has a unique network identity and persistent storage. Each Pod in a StatefulSet is created sequentially, and each Pod is assigned a unique hostname that is based on its position in the StatefulSet.</p>
<p>StatefulSets are useful for running stateful applications such as databases, key-value stores, and message brokers, where each instance has a unique identity and requires persistent storage. StatefulSets can provide stable network identities and persistent storage for these applications.</p>
<p><em>Here is an example scenario where a StatefulSet can be used:</em></p>
<p>Let's say you have a stateful application like a database that requires a specific amount of storage and a specific network identity. You want to run this application on Kubernetes to take advantage of its container orchestration capabilities, but you also need to ensure that the application's data is stored persistently and that each instance of the application has a unique identity.</p>
<p>In this scenario, you can use a StatefulSet to manage the database instances. The StatefulSet will create and manage a set of replica Pods, each of which has a unique network identity and persistent storage. Each instance of the database will be created sequentially and will have a unique hostname based on its position in the StatefulSet.</p>
<p><em>An example of a StatefulSet configuration file is as follows:</em></p>
<pre><code class="lang-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">apps/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">StatefulSet</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">database</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">serviceName:</span> <span class="hljs-string">database</span>
  <span class="hljs-attr">replicas:</span> <span class="hljs-number">3</span>
  <span class="hljs-attr">selector:</span>
    <span class="hljs-attr">matchLabels:</span>
      <span class="hljs-attr">app:</span> <span class="hljs-string">database</span>
  <span class="hljs-attr">template:</span>
    <span class="hljs-attr">metadata:</span>
      <span class="hljs-attr">labels:</span>
        <span class="hljs-attr">app:</span> <span class="hljs-string">database</span>
    <span class="hljs-attr">spec:</span>
      <span class="hljs-attr">containers:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">database</span>
        <span class="hljs-attr">image:</span> <span class="hljs-string">your-database-image:latest</span>
        <span class="hljs-attr">ports:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">containerPort:</span> <span class="hljs-number">5432</span>
        <span class="hljs-attr">volumeMounts:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">database-storage</span>
          <span class="hljs-attr">mountPath:</span> <span class="hljs-string">/var/lib/postgresql/data</span>
  <span class="hljs-attr">volumeClaimTemplates:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">metadata:</span>
      <span class="hljs-attr">name:</span> <span class="hljs-string">database-storage</span>
    <span class="hljs-attr">spec:</span>
      <span class="hljs-attr">accessModes:</span> [ <span class="hljs-string">"ReadWriteOnce"</span> ]
      <span class="hljs-attr">resources:</span>
        <span class="hljs-attr">requests:</span>
          <span class="hljs-attr">storage:</span> <span class="hljs-string">10Gi</span>
</code></pre>
]]></content:encoded></item><item><title><![CDATA[How do you ensure that a pod runs on each node?]]></title><description><![CDATA[In Kubernetes, a Daemonset is a type of controller that ensures that a specific pod is running on all (or a subset of) nodes in a cluster. Daemonsets are typically used for running system-level services like logging agents, monitoring agents, or othe...]]></description><link>https://rohanthe.dev/how-do-you-ensure-that-a-pod-runs-on-each-node</link><guid isPermaLink="true">https://rohanthe.dev/how-do-you-ensure-that-a-pod-runs-on-each-node</guid><category><![CDATA[Kubernetes]]></category><category><![CDATA[Site Reliability Engineering]]></category><dc:creator><![CDATA[Rohan Purekar]]></dc:creator><pubDate>Thu, 08 Apr 2021 12:02:23 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/1cqIcrWFQBI/upload/0e3a30ffa3c0c22ba088f96a17e788b0.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In Kubernetes, a Daemonset is a type of controller that ensures that a specific pod is running on all (or a subset of) nodes in a cluster. Daemonsets are typically used for running system-level services like logging agents, monitoring agents, or other types of infrastructure that need to run on every node in the cluster.</p>
<p>A daemonset creates one pod on each node and ensures that it stays running as long as the node is available. When a new node is added to the cluster, the daemonset controller creates a new pod on that node. When a node is removed from the cluster, the daemonset controller automatically removes the pod from that node.</p>
<p>DaemonSets are a powerful tool that can be used to ensure that essential services are running on every node in a cluster. They are also useful for running applications that need to be installed on every node, such as logging and monitoring daemons.</p>
<pre><code class="lang-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">apps/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">DaemonSet</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">fluentd</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">kube-system</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">selector:</span> <span class="hljs-comment">#Should only manage pods with labels app: fluentd</span>
    <span class="hljs-attr">matchLabels:</span>
      <span class="hljs-attr">app:</span> <span class="hljs-string">fluentd</span>
  <span class="hljs-attr">template:</span> <span class="hljs-comment">#Specifies the configurations of the pods</span>
    <span class="hljs-attr">metadata:</span>
      <span class="hljs-attr">labels:</span>
        <span class="hljs-attr">app:</span> <span class="hljs-string">fluentd</span>
    <span class="hljs-attr">spec:</span>
      <span class="hljs-attr">containers:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">fluentd</span>
          <span class="hljs-attr">image:</span> <span class="hljs-string">fluent/fluentd:v1.3</span>
          <span class="hljs-attr">volumeMounts:</span>
            <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">varlog</span>
              <span class="hljs-attr">mountPath:</span> <span class="hljs-string">/var/log</span>
          <span class="hljs-attr">resources:</span>
            <span class="hljs-attr">limits:</span>
              <span class="hljs-attr">memory:</span> <span class="hljs-string">200Mi</span>
            <span class="hljs-attr">requests:</span>
              <span class="hljs-attr">cpu:</span> <span class="hljs-string">100m</span>
              <span class="hljs-attr">memory:</span> <span class="hljs-string">100Mi</span>
      <span class="hljs-attr">volumes:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">varlog</span>
          <span class="hljs-attr">hostPath:</span>
            <span class="hljs-attr">path:</span> <span class="hljs-string">/var/log</span>
</code></pre>
<p>In this example, we're using a daemonset to run Fluentd, a popular logging agent, on every node in the cluster. The <strong>selector</strong> field specifies that the daemonset should only manage pods with the <strong>app: fluentd</strong> label, and the <strong>template</strong> field specifies the configuration of the pods.</p>
<p>In the <strong>containers</strong> section, we define a single container that runs the <strong>fluent/fluentd:v1.3</strong> image. We also mount the host's <strong>/var/log</strong> directory into the container so that Fluentd can collect logs from the node. Finally, we specify resource limits to ensure that Fluentd doesn't consume too much CPU or memory on each node.</p>
<p>With this configuration, Kubernetes will automatically create a Fluentd pod on each node in the cluster and ensure that it stays running as long as the node is available. If a node is added or removed from the cluster, the daemonset controller will automatically adjust the number of pods to match the desired state.</p>
]]></content:encoded></item><item><title><![CDATA[Why is deployment better than a replication controller?]]></title><description><![CDATA[Here's why...

Control

Deployments give you more control over the deployment process. You can specify how the pods are updated, and you can roll back to a previous version if necessary.

Scalability

Deployments are more scalable than replication co...]]></description><link>https://rohanthe.dev/why-is-deployment-better-than-a-replication-controller</link><guid isPermaLink="true">https://rohanthe.dev/why-is-deployment-better-than-a-replication-controller</guid><category><![CDATA[Site Reliability Engineering]]></category><category><![CDATA[Kubernetes]]></category><dc:creator><![CDATA[Rohan Purekar]]></dc:creator><pubDate>Tue, 30 Mar 2021 11:55:40 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/9cCeS9Sg6nU/upload/ec91bb77f66549f418f2822b8d1e91a9.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Here's why...</em></p>
<ul>
<li><strong>Control</strong></li>
</ul>
<p>Deployments give you more control over the deployment process. You can specify how the pods are updated, and you can roll back to a previous version if necessary.</p>
<ul>
<li><strong>Scalability</strong></li>
</ul>
<p>Deployments are more scalable than replication controllers. They can be used to deploy large applications with multiple replicas.</p>
<ul>
<li><strong>Features</strong></li>
</ul>
<p>Deployments have more features than replication controllers. They support rolling updates, blue-green deployments, and canary deployments.</p>
<p><em>Here’s what a deployment can do that a replication controller cannot</em></p>
<ul>
<li><p><strong>Rollout updates</strong>. A deployment can be used to roll out updates to a running application in a controlled manner. This can be done using a rolling update, blue-green deployment, or canary deployment.</p>
</li>
<li><p><strong>Rollback updates</strong>. If an update to an application fails, a deployment can be used to roll back to the previous version of the application.</p>
</li>
<li><p><strong>Monitor the health of the application</strong>. A deployment can be used to monitor the health of the application and to automatically restart pods that are not healthy.</p>
</li>
<li><p><strong>Scale the application</strong>. A deployment can be used to scale the application up or down based on demand.</p>
</li>
<li><p><strong>Configure the application's environment</strong>. A deployment can be used to configure the application's environment, such as the amount of memory and CPU that is available to the application.</p>
</li>
<li><p><strong>Deploy the application to multiple clusters</strong>. A deployment can be used to deploy the application to multiple clusters.</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[How do CDN edge locations serve you based on proximity?]]></title><description><![CDATA[When a browser makes a DNS request for a site that is served by a CDN, the server handling the DNS request looks at the request to determine the best server to handle the request. It does a geographical lookup based on the IP of the client and respon...]]></description><link>https://rohanthe.dev/how-does-cdn-work</link><guid isPermaLink="true">https://rohanthe.dev/how-does-cdn-work</guid><category><![CDATA[networking]]></category><category><![CDATA[Site Reliability Engineering]]></category><dc:creator><![CDATA[Rohan Purekar]]></dc:creator><pubDate>Sat, 13 Mar 2021 13:13:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/Q1p7bh3SHj8/upload/c09c4f703a9da6593f7f9ed24bc8cc4f.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When a browser makes a DNS request for a site that is served by a CDN, the server handling the DNS request looks at the request to determine the best server to handle the request. It does a geographical lookup based on the IP of the client and responds with a server that is closest to the client.</p>
<p>Companies can optimize this selection by considering various factors such as server load, price, region restriction, quality of content, packet loss, etc. So after considering these factors, the DNS server of the CDN refers to the edge location closest to the user, and that's how the request is served from the closest edge location.</p>
<p><a target="_blank" href="https://humanwhocodes.com/blog/2011/11/29/how-content-delivery-networks-cdns-work/">To know more..</a></p>
]]></content:encoded></item><item><title><![CDATA[What is an Autonomous System and an Autonomous System Number?]]></title><description><![CDATA[The Internet exists because of Autonomous Systems (ASes), and each Autonomous System is identified by an Autonomous System Number (ASN). An autonomous system is a collection of connected Internet Protocol (IP) routing prefixes (or routers) under the ...]]></description><link>https://rohanthe.dev/what-is-an-autonomous-system-and-an-autonomous-system-number</link><guid isPermaLink="true">https://rohanthe.dev/what-is-an-autonomous-system-and-an-autonomous-system-number</guid><category><![CDATA[networking]]></category><category><![CDATA[Site Reliability Engineering]]></category><dc:creator><![CDATA[Rohan Purekar]]></dc:creator><pubDate>Wed, 10 Mar 2021 13:03:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/SwVkmowt7qA/upload/ed02cc6c0d69ce76a0f3149a8cb59410.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The Internet exists because of Autonomous Systems (ASes), and each Autonomous System is identified by an Autonomous System Number (ASN). An autonomous system is a collection of connected Internet Protocol (IP) routing prefixes (or routers) under the control of one or more network operators on behalf of a single administrative entity, such as a university, government agency, or enterprise, that presents a <strong>common and clearly defined routing</strong> policy to the Internet.</p>
<p>Autonomous System Numbers are assigned to Local Internet Registries (LIRs) and end-user organizations by their respective Regional Internet Registries (RIRs), which in turn receive blocks of ASNs for reassignment from the Internet Assigned Numbers Authority (IANA).</p>
<p>The purpose of autonomous systems is to allow for the efficient routing of traffic on the Internet. By grouping networks together into ASes, network operators can control how traffic is routed within their ASes and to other ASes. This helps to ensure that traffic is routed in the most efficient way possible and that congestion is avoided.</p>
<p>The ASN is a 16-bit or 32-bit integer that is assigned to the AS by a Regional Internet Registry (RIR) or the Internet Assigned Numbers Authority (IANA). ASNs are used in Border Gateway Protocol (BGP) routing, which is the protocol used to exchange routing information between different Autonomous Systems on the Internet.</p>
<p>ASNs are important in network engineering and internet infrastructure management, as they help to identify and manage routing policies and interconnections between different Autonomous Systems. By exchanging routing information via BGP, Autonomous Systems can route traffic between each other and ensure efficient and reliable communication on the Internet.</p>
<p>Here are some examples of autonomous systems:</p>
<ul>
<li><p>Google's AS is 15169.</p>
</li>
<li><p>Facebook's AS is 15189.</p>
</li>
<li><p>Microsoft's AS is 16384.</p>
</li>
<li><p>Amazon's AS is 16509.</p>
</li>
<li><p>AT&amp;T's AS is 701.</p>
</li>
<li><p>Verizon's AS is 702.</p>
</li>
</ul>
<blockquote>
<p>Fun Fact: BGP is facilitated by the routers of these ASes. So imagine you have a Verizon FIOS and accessing Facebook. Your request when it reaches at the "Border" of the Verizon's AS, the last router runs BGP to find the shortest path to the AS of Facebook. So this shortest path can mean it will pass through the AS of XFinity, or Google or University of Maryland, etc. But after hopping from the border routers of these ASes, the request will reach facebook.</p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[What is HSTS, and what is the HSTS list?]]></title><description><![CDATA[HSTS stands for HTTP Strict Transport Security. When the browser finds the HSTS header in the server response, the HSTS  basically asks the browser to access the website using HTTPS on port 443. And any future attempts to access the website should be...]]></description><link>https://rohanthe.dev/what-is-the-hsts-list</link><guid isPermaLink="true">https://rohanthe.dev/what-is-the-hsts-list</guid><category><![CDATA[networking]]></category><category><![CDATA[Site Reliability Engineering]]></category><dc:creator><![CDATA[Rohan Purekar]]></dc:creator><pubDate>Wed, 03 Feb 2021 12:48:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/vcF5y2Edm6A/upload/258001cbc278399277a9708be089fbdd.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>HSTS stands for HTTP Strict Transport Security. When the browser finds the HSTS header in the server response, the HSTS  basically asks the browser to access the website using HTTPS on port 443. And any future attempts to access the website should be made via HTTPS.</p>
<p>The HSTS Preload list is a centralized list maintained by Google, of which every browser usually maintains a local copy that is regularly updated. The websites need to submit to Google to get added to the HSTS preload list. The recommended max-age is two years if the preload directive is also being used.</p>
<p>HSTS is particularly important as it forces HTTPS. It also helps save clients from MITM attacks. There are still scenarios when HSTS fails to protect from MITM, but to avoid that, don't connect to WIFIs you don't know or trust.</p>
]]></content:encoded></item><item><title><![CDATA[What are SLIs, SLOs, and SLAs?]]></title><description><![CDATA[SLIs, SLOs, and SLAs are all important terms in the world of service-level management for Site Reliability Engineers and Business teams alike. They are all interrelated, but they each have a different purpose.

SLI stands for Service Level Indicator ...]]></description><link>https://rohanthe.dev/what-are-slis-slos-and-slas</link><guid isPermaLink="true">https://rohanthe.dev/what-are-slis-slos-and-slas</guid><category><![CDATA[Site Reliability Engineering]]></category><category><![CDATA[Concepts]]></category><dc:creator><![CDATA[Rohan Purekar]]></dc:creator><pubDate>Fri, 15 Jan 2021 14:27:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/GJao3ZTX9gU/upload/f03a025046c0b99576647c5bc235e4fc.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>SLIs, SLOs, and SLAs are all important terms in the world of service-level management for Site Reliability Engineers and Business teams alike. They are all interrelated, but they each have a different purpose.</p>
<ul>
<li><p><strong>SLI</strong> stands for Service Level Indicator (basically metrics). These are the metrics that are used to measure the performance of a service. For example, an SLI might be latency, RPS, etc.</p>
</li>
<li><p><strong>SLO</strong> stands for Service Level Objective. It is a target value for an SLI (basically, what are the limits for my metrics). For example, an SLO might be that the website should be able to process 100 requests per second.</p>
</li>
<li><p><strong>SLA</strong> stands for Service Level Agreement. It is a contract between a service provider and a customer that specifies the level of service that the customer can expect to receive. The SLA will typically include the SLOs that the service provider is committed to meeting. So when AWS says that S3 has an SLA of 99.999999999% for durability, it means that for a period of a year, S3 is making a commitment to you that of all the data that you store in S3, 99.99...% of the objects will be available, and AWS takes the responsibility of ensuring that it meets the agreement.</p>
<blockquote>
<p>\&gt;&gt; AWS also mentions the penalty it is liable to if the SLAs are not met</p>
</blockquote>
</li>
</ul>
<p>The SLI, SLO, and SLA are all important parts of service-level management. The SLI is used to measure the performance of the service, the SLO is used to set targets for the performance, and the SLA is used to communicate the level of service to the customer.</p>
<p>Here is an example of how SLIs, SLOs, and SLAs might be used in a real-world scenario. A company might have an SLA with its customers that guarantee 99.9% uptime. The company might then set an SLO of 99.95% uptime. To measure uptime, the company might use an SLI that measures the number of minutes that the website is unavailable each day. If the website is unavailable for more than 0.05% of the day, the company will be in breach of its SLA and will have to pay penalties to its customers.</p>
<p>SLIs, SLOs, and SLAs are all important tools for managing the performance of services. By understanding these terms and how they are used, you can help to ensure that your services are meeting the needs of your customers.</p>
]]></content:encoded></item></channel></rss>