<?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[Multi-Tier Web App on K8s with Minikube]]></title><description><![CDATA[Multi-Tier Web App on K8s with Minikube]]></description><link>https://minikube-multitierwebapp.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 02:47:46 GMT</lastBuildDate><atom:link href="https://minikube-multitierwebapp.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Building a Multi-Tier Web App on Kubernetes with Minikube.]]></title><description><![CDATA[As I progressed in my Kubernetes journey, I realized understanding each concept individually is one thing, and being able to apply them together in a real-world scenario is completely different. To bridge this gap i decided to build a multi-tier wen ...]]></description><link>https://minikube-multitierwebapp.hashnode.dev/building-a-multi-tier-web-app-on-kubernetes-with-minikube</link><guid isPermaLink="true">https://minikube-multitierwebapp.hashnode.dev/building-a-multi-tier-web-app-on-kubernetes-with-minikube</guid><category><![CDATA[services]]></category><category><![CDATA[ingress]]></category><category><![CDATA[#clusterip]]></category><category><![CDATA[minikube]]></category><category><![CDATA[PersistentVolumes]]></category><dc:creator><![CDATA[Aakash Pradhan]]></dc:creator><pubDate>Mon, 22 Sep 2025 15:47:31 GMT</pubDate><content:encoded><![CDATA[<p>As I progressed in my Kubernetes journey, I realized understanding each concept individually is one thing, and being able to apply them together in a real-world scenario is completely different. To bridge this gap i decided to build a multi-tier wen application project on my minikube cluster.</p>
<p>This project involves 3 layers:</p>
<ol>
<li><p>Frontend: Nginx serving the web pages.</p>
</li>
<li><p>Backend: Apache HTTP serving as a backend service.</p>
</li>
<li><p>Database: MySQL storing the application data.</p>
</li>
</ol>
<p>The main idea for choosing this project is that it touches almost every fundamental concept that I have learned and documented in my previous blog.</p>
<ul>
<li><p><strong>Pods &amp; Deployments</strong> to run the containers.</p>
</li>
<li><p><strong>Services</strong> to provide stable access for the frontend, backend and database.</p>
</li>
<li><p><strong>Ingress</strong> to route traffic efficiently between frontend and backend.</p>
</li>
<li><p><strong>ConfigMaps &amp; Secrets</strong> to manage application configurations and sensitive information like database passwords.</p>
</li>
<li><p><strong>PersistentVolumes &amp; PersistentVolumeClaims</strong> to ensure MySQL data persists even if pods restart.</p>
</li>
<li><p><strong>Namespaces</strong> to organize and isolate resources for this project.</p>
</li>
</ul>
<p>So yes — that’s it!</p>
<h1 id="heading-create-a-namespace">Create a Namespace</h1>
<p>It’s always better to because it provides <strong>logical isolation</strong> of resources within a Kubernetes cluster.</p>
<pre><code class="lang-yaml"><span class="hljs-comment"># namespace.yaml</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Namespace</span>
<span class="hljs-attr">metadata:</span> 
    <span class="hljs-attr">name:</span> <span class="hljs-string">webapp</span>
</code></pre>
<p>Apply it.</p>
<pre><code class="lang-yaml"><span class="hljs-string">kubectl</span> <span class="hljs-string">apply</span> <span class="hljs-string">-f</span> <span class="hljs-string">namespace.yaml</span>
</code></pre>
<h1 id="heading-create-a-configmaps-and-secrets">Create a ConfigMaps and Secrets</h1>
<p>It’s always a good practice to store all the sensitive credentials like db password in secret and we can store application configuration files in configmaps.</p>
<h3 id="heading-creating-secrets">Creating Secrets</h3>
<pre><code class="lang-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Secret</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">mysql-secret</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">webapp</span>
<span class="hljs-attr">type:</span> <span class="hljs-string">Opaque</span>
<span class="hljs-attr">data:</span> 
  <span class="hljs-attr">mysql-root-password:</span> <span class="hljs-string">cm9vdHBhc3M=</span>   <span class="hljs-comment"># base64 for 'rootpass'</span>

<span class="hljs-comment"># convert into base64</span>
<span class="hljs-string">echo</span> <span class="hljs-string">-n</span> <span class="hljs-string">"rootpass"</span> <span class="hljs-string">|</span> <span class="hljs-string">base64</span>
</code></pre>
<h3 id="heading-creating-configmaps">Creating ConfigMaps</h3>
<pre><code class="lang-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">ConfigMaps</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">webapp-config</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">webapp</span>
<span class="hljs-attr">data:</span>
  <span class="hljs-attr">API_URL:</span> <span class="hljs-string">"http://backend-svc:8000"</span>
</code></pre>
<p>Apply both secret and configmaps.</p>
<pre><code class="lang-yaml"><span class="hljs-string">kubectl</span> <span class="hljs-string">apply</span> <span class="hljs-string">-f</span> <span class="hljs-string">mysql-secret.yaml</span>
<span class="hljs-string">kubectl</span> <span class="hljs-string">apply</span> <span class="hljs-string">-f</span> <span class="hljs-string">webapp-config.yaml</span>
</code></pre>
<p>Now, to not let my data dissolve when my pod gets recreated, I need to create PV and PVCs for MySQL.</p>
<h1 id="heading-creating-pv-pvcs-for-mysql">Creating PV + PVCs for MySQL</h1>
<pre><code class="lang-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">PersistentVolume</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">mysql-pv</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">webapp</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">capacity:</span>
    <span class="hljs-attr">storage:</span> <span class="hljs-string">1Gi</span>
  <span class="hljs-attr">accessModes:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">ReadWriteOnce</span>
  <span class="hljs-attr">hostPath:</span>
    <span class="hljs-attr">path:</span> <span class="hljs-string">/mnt/data/mysql</span>
<span class="hljs-meta">---</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">PersistentVolumeClaim</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">mysql-pvc</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">webapp</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">accessModes:</span>
    <span class="hljs-bullet">-</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">1Gi</span>
</code></pre>
<p>Apply it:</p>
<pre><code class="lang-yaml"><span class="hljs-string">kubectl</span> <span class="hljs-string">apply</span> <span class="hljs-string">-f</span> <span class="hljs-string">pv-pvc.yaml</span>
</code></pre>
<h1 id="heading-deployments-for-frontend-backend-and-database">Deployments for Frontend, Backend and Database</h1>
<h3 id="heading-for-frontend-deployment-service">For Frontend (Deployment + Service)</h3>
<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">Deployment</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">frontend</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">webapp</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">replicas:</span> <span class="hljs-number">1</span>
  <span class="hljs-attr">selector:</span>
    <span class="hljs-attr">matchLabels:</span>
      <span class="hljs-attr">app:</span> <span class="hljs-string">frontend</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">frontend</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">frontend</span>
        <span class="hljs-attr">image:</span> <span class="hljs-string">nginx:latest</span>
        <span class="hljs-attr">ports:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">containerPort:</span> <span class="hljs-number">80</span>
        <span class="hljs-attr">envFrom:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">configMapRef:</span>
            <span class="hljs-attr">name:</span> <span class="hljs-string">webapp-config</span>
<span class="hljs-meta">---</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Service</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">frontend-svc</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">webapp</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">type:</span> <span class="hljs-string">NodePort</span>
  <span class="hljs-attr">ports:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">port:</span> <span class="hljs-number">80</span>
    <span class="hljs-attr">targetPort:</span> <span class="hljs-number">80</span>
    <span class="hljs-attr">nodePort:</span> <span class="hljs-number">30080</span>
  <span class="hljs-attr">selector:</span>
    <span class="hljs-attr">app:</span> <span class="hljs-string">frontend</span>
</code></pre>
<p>Apply it.</p>
<pre><code class="lang-yaml"><span class="hljs-string">kubectl</span> <span class="hljs-string">apply</span> <span class="hljs-string">-f</span> <span class="hljs-string">frontend.yaml</span>
</code></pre>
<h3 id="heading-for-backend-deployment-service">For Backend (Deployment + Service)</h3>
<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">Deployment</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">backend</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">webapp</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">replicas:</span> <span class="hljs-number">1</span>
  <span class="hljs-attr">selector:</span>
    <span class="hljs-attr">matchLabels:</span>
      <span class="hljs-attr">app:</span> <span class="hljs-string">backend</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">backend</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">backend</span>
        <span class="hljs-attr">image:</span> <span class="hljs-string">hashicorp/http-echo</span>
        <span class="hljs-attr">args:</span>
          <span class="hljs-bullet">-</span> <span class="hljs-string">"-text=Hello from backend"</span>
          <span class="hljs-bullet">-</span> <span class="hljs-string">"-listen=:80"</span>
        <span class="hljs-attr">ports:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">containerPort:</span> <span class="hljs-number">80</span>  <span class="hljs-comment"># ← Change from 8080 to 80</span>
<span class="hljs-meta">---</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Service</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">backend-svc</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">webapp</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">type:</span> <span class="hljs-string">ClusterIP</span>
  <span class="hljs-attr">ports:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">port:</span> <span class="hljs-number">80</span>          <span class="hljs-comment"># ← Match the container port</span>
    <span class="hljs-attr">targetPort:</span> <span class="hljs-number">80</span>
  <span class="hljs-attr">selector:</span>
    <span class="hljs-attr">app:</span> <span class="hljs-string">backend</span>

<span class="hljs-comment"># i could also use https:latest image in here but have used "hashicorp/http-echo" cause my backend</span>
<span class="hljs-comment"># is not a real application yet and I wanted a simple test endpoint that responds to /api requests.</span>
</code></pre>
<p>Apply it.</p>
<pre><code class="lang-yaml"><span class="hljs-string">kubectl</span> <span class="hljs-string">apply</span> <span class="hljs-string">-f</span> <span class="hljs-string">backend.yaml</span>
</code></pre>
<h3 id="heading-for-database-deployment-service">For Database (Deployment + Service)</h3>
<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">Deployment</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">mysql</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">webapp</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">replicas:</span> <span class="hljs-number">1</span>
  <span class="hljs-attr">selector:</span>
    <span class="hljs-attr">matchLabels:</span>
      <span class="hljs-attr">app:</span> <span class="hljs-string">mysql</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">mysql</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">mysql</span>
        <span class="hljs-attr">image:</span> <span class="hljs-string">mysql:5.7</span>
        <span class="hljs-attr">env:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">MYSQL_ROOT_PASSWORD</span>
          <span class="hljs-attr">valueFrom:</span>
            <span class="hljs-attr">secretKeyRef:</span>
              <span class="hljs-attr">name:</span> <span class="hljs-string">mysql-secret</span>
              <span class="hljs-attr">key:</span> <span class="hljs-string">mysql-root-password</span>
        <span class="hljs-attr">ports:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">containerPort:</span> <span class="hljs-number">3306</span>
        <span class="hljs-attr">volumeMounts:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">mysql-storage</span>
          <span class="hljs-attr">mountPath:</span> <span class="hljs-string">/var/lib/mysql</span>
      <span class="hljs-attr">volumes:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">mysql-storage</span>
        <span class="hljs-attr">persistentVolumeClaim:</span>
          <span class="hljs-attr">claimName:</span> <span class="hljs-string">mysql-pvc</span>
<span class="hljs-meta">---</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Service</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">mysql-svc</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">webapp</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">type:</span> <span class="hljs-string">ClusterIP</span>
  <span class="hljs-attr">ports:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">port:</span> <span class="hljs-number">3306</span>
  <span class="hljs-attr">selector:</span>
    <span class="hljs-attr">app:</span> <span class="hljs-string">mysql</span>
</code></pre>
<p>Apply it.</p>
<pre><code class="lang-yaml"><span class="hljs-string">kubectl</span> <span class="hljs-string">apply</span> <span class="hljs-string">-f</span> <span class="hljs-string">database.yaml</span>
</code></pre>
<p>Now after I create deployment for frontend, backend and databases, in a specific namespace - Now I need to enable ingress in my cluster to efficiently route traffic.</p>
<pre><code class="lang-yaml"><span class="hljs-string">minikube</span> <span class="hljs-string">addons</span> <span class="hljs-string">enable</span> <span class="hljs-string">ingress</span>
</code></pre>
<p>Now, ingress rule:</p>
<pre><code class="lang-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">networking.k8s.io/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Ingress</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">webapp-ingress</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">webapp</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">rules:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">host:</span> <span class="hljs-string">webapp.local</span>
    <span class="hljs-attr">http:</span>
      <span class="hljs-attr">paths:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">path:</span> <span class="hljs-string">/</span>
        <span class="hljs-attr">pathType:</span> <span class="hljs-string">Prefix</span>
        <span class="hljs-attr">backend:</span>
          <span class="hljs-attr">service:</span>
            <span class="hljs-attr">name:</span> <span class="hljs-string">frontend-svc</span>
            <span class="hljs-attr">port:</span>
              <span class="hljs-attr">number:</span> <span class="hljs-number">80</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">path:</span> <span class="hljs-string">/api</span>
        <span class="hljs-attr">pathType:</span> <span class="hljs-string">Prefix</span>
        <span class="hljs-attr">backend:</span>
          <span class="hljs-attr">service:</span>
            <span class="hljs-attr">name:</span> <span class="hljs-string">backend-svc</span>
            <span class="hljs-attr">port:</span>
              <span class="hljs-attr">number:</span> <span class="hljs-number">80</span>
</code></pre>
<p>Apply this:</p>
<pre><code class="lang-yaml"><span class="hljs-string">kubectl</span> <span class="hljs-string">apply</span> <span class="hljs-string">-f</span> <span class="hljs-string">ingress.yaml</span>
</code></pre>
<h1 id="heading-testing">Testing</h1>
<p>If you are running Kubernetes directly on a Linux server, you can access your applications via a browser by adding the Minikube IP to your <code>/etc/hosts</code> file like this:</p>
<pre><code class="lang-yaml"><span class="hljs-string">&lt;minikube_IP&gt;</span> <span class="hljs-string">webapp.local</span>
</code></pre>
<p>Once that’s done, you can access your services using:</p>
<ul>
<li><p><a target="_blank" href="http://webapp.local/"><code>http://webapp.local/</code></a> → frontend</p>
</li>
<li><p><a target="_blank" href="http://webapp.local/api"><code>http://webapp.local/api</code></a> → backend</p>
</li>
</ul>
<p>Since I’m running Minikube through WSL, accessing these URLs via a browser isn’t straightforward, so using <code>curl</code> is the simplest way to interact with the services.  </p>
<p>Testing frontend and backend with curl.</p>
<pre><code class="lang-yaml"><span class="hljs-string">curl</span> <span class="hljs-string">http://webapp.local</span>
<span class="hljs-string">curl</span> <span class="hljs-string">http://webapp.local/api</span>
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758510148353/51b6ada4-9365-428f-927a-f90edac6487b.png" alt class="image--center mx-auto" /></p>
<p>Minikube VM is on a separate network from my Windows host. Thats why I can’t directly access URLs like <a target="_blank" href="http://webapp.local"><code>http://webapp.local</code></a> from my browser.</p>
<p>To solve this, port forwarding is a simple and effective option.</p>
<pre><code class="lang-yaml"><span class="hljs-string">kubectl</span> <span class="hljs-string">port-forward</span> <span class="hljs-string">svc/frontend-svc</span> <span class="hljs-number">8080</span><span class="hljs-string">:80</span> <span class="hljs-string">-n</span> <span class="hljs-string">webapp</span>

<span class="hljs-string">svc/frontend-svc</span> <span class="hljs-string">→</span> <span class="hljs-string">the</span> <span class="hljs-string">service</span> <span class="hljs-string">you</span> <span class="hljs-string">want</span> <span class="hljs-string">to</span> <span class="hljs-string">forward.</span>
<span class="hljs-number">8080</span> <span class="hljs-string">→</span> <span class="hljs-string">the</span> <span class="hljs-string">port</span> <span class="hljs-string">on</span> <span class="hljs-string">your</span> <span class="hljs-string">local</span> <span class="hljs-string">machine.</span>
<span class="hljs-number">80</span> <span class="hljs-string">→</span> <span class="hljs-string">the</span> <span class="hljs-string">port</span> <span class="hljs-string">the</span> <span class="hljs-string">service</span> <span class="hljs-string">is</span> <span class="hljs-string">listening</span> <span class="hljs-string">on</span> <span class="hljs-string">inside</span> <span class="hljs-string">the</span> <span class="hljs-string">cluster.</span>
<span class="hljs-string">-n</span> <span class="hljs-string">webapp</span> <span class="hljs-string">→</span> <span class="hljs-string">namespace</span> <span class="hljs-string">of</span> <span class="hljs-string">the</span> <span class="hljs-string">service.</span>
</code></pre>
<p>You can expose the backend in the same way, but exposing the backend is not generally a good practice.<br />Now in your browser visit: <a target="_blank" href="http://localhost:8080"><code>http://localhost:8080</code></a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758510922990/b542a0f1-965b-4375-9ce3-3cfa6da77aa6.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item></channel></rss>