<?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: Ashish Kumar</title>
    <description>The latest articles on Forem by Ashish Kumar (@ashish_kumar_4dc2a7ee7693).</description>
    <link>https://forem.com/ashish_kumar_4dc2a7ee7693</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%2F1666038%2F6dc31773-5c0b-4ab6-b94a-ae9ad22ebc31.jpeg</url>
      <title>Forem: Ashish Kumar</title>
      <link>https://forem.com/ashish_kumar_4dc2a7ee7693</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ashish_kumar_4dc2a7ee7693"/>
    <language>en</language>
    <item>
      <title>LRU Cache explained</title>
      <dc:creator>Ashish Kumar</dc:creator>
      <pubDate>Sun, 07 Dec 2025 20:22:32 +0000</pubDate>
      <link>https://forem.com/ashish_kumar_4dc2a7ee7693/lru-cache-explained-30ml</link>
      <guid>https://forem.com/ashish_kumar_4dc2a7ee7693/lru-cache-explained-30ml</guid>
      <description>&lt;p&gt;I made a video on LRU cache.&lt;br&gt;
&lt;a href="https://youtu.be/VLdtHsCX2yA" rel="noopener noreferrer"&gt;LINK&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Open for feedback, let me know if you have any doubts.&lt;br&gt;
and do tell if you like this way of making videos, made this using &lt;br&gt;
manim, but if you prefer a more face to face explanation of topics then lmk.&lt;/p&gt;

&lt;p&gt;here's the link for the actual code&lt;br&gt;
&lt;a href="https://github.com/ashish111333/Ds-Algos/blob/main/src/python/cache/cache.py" rel="noopener noreferrer"&gt;code&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Static site in Minutes using Pulumi and Hugo</title>
      <dc:creator>Ashish Kumar</dc:creator>
      <pubDate>Mon, 07 Apr 2025 03:19:32 +0000</pubDate>
      <link>https://forem.com/ashish_kumar_4dc2a7ee7693/static-site-in-minutes-using-pulumi-and-hugo-2300</link>
      <guid>https://forem.com/ashish_kumar_4dc2a7ee7693/static-site-in-minutes-using-pulumi-and-hugo-2300</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/pulumi"&gt;Pulumi Deploy and Document Challenge&lt;/a&gt;: Fast Static Website Deployment&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;pulumi): Fast Static Website Deployment*&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I made my little portfolio website using Pulumi and hugo.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Live Demo Link
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://bucket-c4479fb.s3-website.ap-south-1.amazonaws.com" rel="noopener noreferrer"&gt;portfolio website&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Repo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/ashish111333/Portfolio" rel="noopener noreferrer"&gt;github repo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Journey
&lt;/h2&gt;

&lt;p&gt;I was thinking about having a personal portfolio website for months but was just feeling lazy. I also wanted to explore Pulumi for past few weeks and came across this Dev challenge and decided to give it a go. &lt;/p&gt;

&lt;h3&gt;
  
  
  some prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hugo cli&lt;/strong&gt;: you will be needing this to build  your static site, it's fast comes with various themes to get you started quickly.It automatically creates the site structure for you so make sure to install it. &lt;a href="https://gohugo.io/getting-started/quick-start/" rel="noopener noreferrer"&gt;Hugo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pulumi cli&lt;/strong&gt;: you will be using this to configure and deploy the infrastructure needed for our static site on aws. &lt;a href="https://www.pulumi.com/docs/iac/cli/" rel="noopener noreferrer"&gt;pulumi-cli&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;aws cli&lt;/strong&gt;: you also need aws cli. because  pulumi uses aws sdk to configure aws infrastructure for you and this needs your aws credentials like access key id and secret access key. &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html" rel="noopener noreferrer"&gt;aws-cli&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  getting started
&lt;/h3&gt;

&lt;p&gt;Now we can proceed.&lt;br&gt;
Run &lt;code&gt;pulumi login --local&lt;/code&gt; we will be using our local machine as the backend for pulumi stacks.&lt;/p&gt;

&lt;p&gt;Now Create a new directory (name of your choice)  and Run &lt;code&gt;pulumi new&lt;/code&gt; it will ask for your project name,description,config passphrase and your new stack name and will prompt you to select a template make sure to select the "static-website-aws-go" template.&lt;br&gt;
you should see main.go in your directory after this.&lt;/p&gt;

&lt;p&gt;after setting up pulumi in this directory we will create our site in the same directory.&lt;br&gt;
from the same directory run below command to setup a hugo site&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hugo new site "your site name"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;now in this site (let's say your site name is Mysite hugo will create a Mysite directory ) go to content directory and add main page add main page by running &lt;code&gt;touch _index.md&lt;/code&gt; write something in it and  and run &lt;code&gt;hugo server&lt;/code&gt; this will start hugo server and you will see your changes live on localhost::some_port link will be shown in terminal. &lt;/p&gt;

&lt;p&gt;This will be your final root directory structure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├── go.mod
├── go.sum
├── main.go
├── Mysite
├── Pulumi.localStack.yaml
├── Pulumi.yaml
└── readme.md

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will be Mysite Directory:-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── archetypes
├── assets
├── content
├── data
├── hugo.toml
├── i18n
├── layouts
├── public
├── static
└── themes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;this is how your local Stack config file should look like. Psite is the name I gave it when running &lt;code&gt;pulumi new&lt;/code&gt; yours would be different. region is the aws region your stack will create resource in. It would be  a bit different because it would be pointing to the www directory pulumi created for us but we will change it to point to our hugo static files directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;config:
  Psite:errorDocument: 404.html
  Psite:indexDocument: index.html
  Psite:path: ./Mysite/public
  aws:region: ap-south-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next step now build your site by running &lt;code&gt;hugo&lt;/code&gt; from the site directory and it will build all your static files in public directory.&lt;/p&gt;

&lt;p&gt;now finally...Trust me it's the last step. go to your pulumi.localStack.yaml(present in root directory ) configure it to point to your build directory that is "./Mysite/public/".&lt;br&gt;
after doing this run &lt;code&gt;pulumi up&lt;/code&gt; and you will see URL  to your static site. To destroy all the aws resources created use &lt;code&gt;pulumi destroy&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How we used pulumi ?
&lt;/h2&gt;

&lt;p&gt;we used pulumi to configure these two aws resources for our static site aws s3 and cloudfront. the main.go in our root dir does all this stuff it creates and configures an s3 bucket and stores these static files from public dir from your site and then creates a cloudfront resource.&lt;/p&gt;

&lt;h2&gt;
  
  
  okie...but how does pulumi work ??
&lt;/h2&gt;

&lt;p&gt;pulumi use stacks to store the state of your infrastructure whenever you do &lt;code&gt;pulumi up&lt;/code&gt; it deploys that particular stack state. it compares the current state of your stack with modified state and based on that it creates or destroys infrastructure resources for you.&lt;/p&gt;

&lt;p&gt;Hope this helped now go ahead and make your own static site using pulumi and hugo. &lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>pulumichallenge</category>
      <category>webdev</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Cloud Native gaming with kruiseGame</title>
      <dc:creator>Ashish Kumar</dc:creator>
      <pubDate>Mon, 02 Sep 2024 06:54:50 +0000</pubDate>
      <link>https://forem.com/ashish_kumar_4dc2a7ee7693/cloud-native-gaming-with-kruisegame-49kh</link>
      <guid>https://forem.com/ashish_kumar_4dc2a7ee7693/cloud-native-gaming-with-kruisegame-49kh</guid>
      <description>&lt;h2&gt;
  
  
  What is kruise-game ?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/openkruise/kruise-game" rel="noopener noreferrer"&gt;kruise-game&lt;/a&gt; is an opensource project under openkruise that aims  to bring cloud native transformation for gaming workloads aka game servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;but what are game servers really ?&lt;/strong&gt;&lt;br&gt;
games servers are basically virtual machines or containers that handle the core functionalities in the backend of PVP multiplayer online game&lt;br&gt;&lt;br&gt;
&lt;em&gt;below I have shown basic game server architecure used by modern PvP online games&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%2Frd0dxfzyajeukb5drfpw.jpg" 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%2Frd0dxfzyajeukb5drfpw.jpg" alt=" " width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;why do we really  need kruise-game. aren't default k8s resources enough for gaming workloads ?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;modern PvP games are getting increasingly complex they require multiple game servers to handle different kind of services for example.&lt;br&gt;
your modern PvP game like valorant need game servers for lobbying ,matchmaking,and the one that runs actualy game logic and manages game state.Handling so many game servers is big task and cant be done manually. So what now ?&lt;/p&gt;

&lt;p&gt;well we have got kubernetes to rescue.K8s with it's automated operation and mangement&lt;br&gt;
capabilities can handle this burden for Us,just deploy your game server image and we are done right ?. Not really&lt;/p&gt;

&lt;p&gt;I wish it was this easy.The problem is your not deploying your usual stateless web app here.Game servers are different and their requirements are different.k8s default resources are good for stateless apps but gameservers have a more complex lifecycle and they are stateful also their network requirements are different.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;first of all game servers need direct lossless connection to clients(udp connection),for this we need fixed Ip addresses of pods,k8s pods IP is changed during deletion,scaling.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;also there is lack of control you have over pods if  use them for game servers ,there is a thing called rolling update where you update some instances of game servers to test the update and gradually roll out to other instances to prevent downtime,K8s scheduler doesn't know you are working with game servers it will update pods in random manner,basically you have no control over the update strategy of your game servers.SO you have little to no flexibility over game server updates.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;To mitigate these issues kruise-game defines two custom Resource designed specifically for game server workloads &lt;strong&gt;gameServer&lt;/strong&gt; and &lt;strong&gt;gameserverSet&lt;/strong&gt;&lt;/em&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;gameServer&lt;/em&gt;&lt;/strong&gt;:Refers to the abstraction of O&amp;amp;M and management operations on a specified game server. It is mainly used for O&amp;amp;M and management operations such as update sequence control, state control of the game server, and network changes of the game server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;gameServerSet&lt;/em&gt;&lt;/strong&gt;:Refers to the abstraction of lifecycle management for a group of game servers. It is mainly used for lifecycle control such as replica number management and game server launch.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;features that kruise-game provides for management of game servers:-&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Hot update based on images and hot reload of configurations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update, deletion, and isolation of specified game servers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multiple built-in network models (fixed IP address and port, lossless direct connection, and global acceleration)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Auto scaling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automated O&amp;amp;M (service quality)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Independent of cloud service providers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Complex game server orchestration&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Below image shows kruise-game deploymment architecture on k8s&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%2Fxgbl4z344r3r8jauerck.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%2Fxgbl4z344r3r8jauerck.png" alt=" " width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;getting started with kruise-game :0&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;em&gt;getting a k8s cluster and helm&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;you would need a k8s cluster for kruise-game,easiest way to get k8s cluster is to get minikube in your machine,also make sure you have helm installed in your machine.&lt;/p&gt;

&lt;p&gt;2.&lt;em&gt;start minikube&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minikube start 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3.&lt;em&gt;use helm to install kruise-game&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#kruise-game relies on openkruise so you need to install openkruise first
# Firstly add openkruise charts repository if you haven't do this.
$ helm repo add openkruise https://openkruise.github.io/charts/
# [Optional]
$ helm repo update
# Install the latest version.
$ helm install kruise openkruise/kruise --version 1.6.3
#now instakk kruise-game
$ helm install kruise-game openkruise/kruise-game --version 0.8.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4.&lt;em&gt;go to your minikube dashboard&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minikube dashboard 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5.&lt;em&gt;you should kruise-game-system namespace, congrats you installed kruise-game&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%2F6s1d168ldf9l6qr0b9et.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%2F6s1d168ldf9l6qr0b9et.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;for more info and details about kruise-game refer to kruise-game &lt;a href="https://openkruise.io/kruisegame/introduction" rel="noopener noreferrer"&gt;docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks for reading,hope you enjoyed this :).&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>cloud</category>
      <category>go</category>
    </item>
    <item>
      <title>simplifying Kubernetes with cyclops Templates</title>
      <dc:creator>Ashish Kumar</dc:creator>
      <pubDate>Tue, 06 Aug 2024 11:11:04 +0000</pubDate>
      <link>https://forem.com/ashish_kumar_4dc2a7ee7693/simplifying-kubernetes-with-cyclops-templates-3cpa</link>
      <guid>https://forem.com/ashish_kumar_4dc2a7ee7693/simplifying-kubernetes-with-cyclops-templates-3cpa</guid>
      <description>&lt;h1&gt;
  
  
  what is cyclops?
&lt;/h1&gt;

&lt;p&gt;cyclops is a tool that simplifies Kubernetes for developers,IT teams and newcomers with no experience in Kubernetes. Cyclops has a easy to  UI interface which translates  to yaml manifests files abstracting away the complexity from developers. &lt;/p&gt;

&lt;h1&gt;
  
  
  let's start
&lt;/h1&gt;

&lt;p&gt;to work with cyclops you first need a kubernetes cluster ,welcome minikube easiest way to get a working local cluster.&lt;br&gt;
I got mine ready make sure to install it in your machine first&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;start your cluster&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minikube start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;go to your dashboard&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minikube dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you would see something like this&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%2F2d2tdlep5ppsxmjqfhvo.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%2F2d2tdlep5ppsxmjqfhvo.png" alt=" " width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;now let's install cyclops in our cluster&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;below command will add cyclops-ctrl and cyclops-ui to our cluster make sure you have cyctl installed checkout cyclops &lt;a href="https://cyclops-ui.com/docs/installation/install/manifest/" rel="noopener noreferrer"&gt;docs&lt;/a&gt; otherwise you can use kubectl&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cyctl init 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;now to access the UI service you need to expose it outside our cluster,run the below command&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cyctl serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you would see the cyclops-ctrl and cyclops-ui pods running in your 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%2Fsxqon3fgl6hv7fpy38r3.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%2Fsxqon3fgl6hv7fpy38r3.png" alt=" " width="800" height="117"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  let's create our own template from scratch.
&lt;/h2&gt;

&lt;p&gt;In this blog I will be creating a dragonflyDb(a fasy memory datastore) template and then we will deploy it using cyclops. &lt;/p&gt;

&lt;p&gt;1.create a new folder&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dragonfly
│   Chart.yaml
│   values.schema.json
│   values.yaml
│
└───templates
        deployment.yaml
        statefulset.yaml
        service.yaml
        _helpers.tpl
        _pod.tpl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;let's write some code now :0&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chart.yaml&lt;/strong&gt;
chart.yaml has contains basic info and data about dragonfly helm chart.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v2
name: dragonfly
description: "a modern superfast in-memory datastore, fully compatible with Redis and Memcached APIs"
version: 0.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;values.yaml&lt;/strong&gt;
this file specifies  default  configuration for dragonflDB that will be used by helm
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# default configuration for dragonfly

# no of dragonfly replicas to deploy
replicaCount: 1

image:
  repository: docker.dragonflydb.io/dragonflydb/dragonfly



# default resource requirements, you can change it according to your needs.
resources: 
  requests:
    # min cpu millisecs
    cpu:  100m
    # min memory for dragonfly deployment
    memory: 128Mi

  limits:
    #max cpu millisecs for dragonfly deployment
    cpu: 1000m
    # max memory limit for dragonfly deployment 
    memory: 512Mi



service:

  type: ClusterIP
  # Load balancer static ip to use when service type is set to LoadBalancer
  loadBalancerIP: ""
  # Dragonfly default service port
  port: 6379

  metrics:
  # name for the metrics port
    portName: metrics
  # serviceType for the metrics service
    serviceType: ClusterIP


serviceAccount:
  # Specifies whether a service account should be created
  create: true
  # Annotations to add to the service account
  annotations: {}
  # The name of the service account to use.
  # If not set and create is true, a name is generated using the fullname template
  name: ""



storage:
  # you can set this to true for production use cases,if you want dragonfly to persist data.
  enabled: false 

  storageClassName: ""
  #  Volume size to request for the PVC,default set to 128Mb
  requests: 128Mi



# extra  arguments to pass to dragonfly binary
extraArgs:[]



securityContexts:
  capabilities:
    drop:
      - ALL
  # sets file system permission as read-only for dragonfly container
  readOnlyRootFilesystem: true
  # sets the dragon container to run as non-root 
  runAsNonRoot: true
  # run dragonfly container with user-Id as 1000
  runAsUser: 1000



# the below fields serviceMonitor and promtheiumsRule requires you have prometheus operator running in your cluster.

serviceMonitor:
  # If true, a ServiceMonitor CRD is created for a prometheus operator
  enabled: false
  # namespace in which to deploy the ServiceMonitor CR. defaults to the application namespace
  namespace: ""
  # additional labels to apply to the metrics
  labels: {}
  # additional annotations to apply to the metrics
  annotations: {}
  # scrape interval
  interval: 10s
  # scrape timeout
  scrapeTimeout: 10s

prometheusRule:
  # Deploy a PrometheusRule
  enabled: false
  # PrometheusRule.Spec
  # https://awesome-prometheus-alerts.grep.to/rules
  spec: []


tls:
  # -enable TLS
  enabled: false
  # use cert-manager to automatically create the certificate
  createCerts: false
  # duration or ttl of the validity of the created certificate
  duration: 87600h0m0s
  issuer:
    # - cert-manager issuer kind. Usually Issuer or ClusterIssuer
    kind: ClusterIssuer
    # -name of the referenced issuer
    name: selfsigned
    # - group of the referenced issuer
    # if you are using an external issuer, change this to that issuer group.
    group: cert-manager.io
  # - use TLS certificates from existing secret
  existing_secret: ""
  # - TLS certificate
  cert: ""
  # cert: |
  #   -----BEGIN CERTIFICATE-----
  #   MIIDazCCAlOgAwIBAgIUfV3ygaaVW3+yzK5Dq6Aw6TsZ494wDQYJKoZIhvcNAQEL
  #   ...
  #   BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
  #   zJAL4hNw4Tr6E52fqdmX
  #   -----END CERTIFICATE-----
  # -- TLS private key
  key: ""




passwordFromSecret:
  enable: false
  existingSecret:
    name: ""
    key: ""



# for more fields check dragon fly helm chart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;deployment.yaml&lt;/strong&gt;
this file generates the deployment resource for dragonflDB
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{- if not .Values.storage.enabled }}
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "dragonfly.fullname" .}}
  namespace: {{ .Release.Namespace }}
  labels:
    {{- include "dragonfly.labels" . | nindent 4 }}


spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      {{- include "dragonfly.selectorLabels" . | nindent 6 }}

  template:
    metadata:
      annotations:
        {{- if and (.Values.tls.enabled) (not .Values.tls.existing_secret) }}
        checksum/tls-secret: {{ include (print $.Template.BasePath "/tls-secret.yaml") . | sha256sum }}
        {{- end }}
        {{- with .Values.podAnnotations }}
        {{- toYaml . | nindent 8 }}
        {{- end }}
      labels:
        {{- include "dragonfly.selectorLabels" . | nindent 8 }}
    spec:
      {{- include "dragonfly.pod" . | trim | nindent 6 }}
{{- end }}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;service.yaml&lt;/strong&gt;
This file creates a resource of kind service for dragonflyDB.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  name: {{ include "dragonfly.fullname" . }}
  namespace: {{ .Release.Namespace }}
  {{- with .Values.service.annotations }}
  annotations:
    {{- toYaml . | nindent 4 }}
  {{- end }}
  labels:
    {{- with .Values.service.labels }}
    {{- toYaml . | nindent 4 }}
    {{- end }}
    {{- include "dragonfly.labels" . | nindent 4 }}
spec:
  type: {{ .Values.service.type }}
  {{- if and (eq .Values.service.type "LoadBalancer") (ne .Values.service.loadBalancerIP "") }}
  loadBalancerIP: {{ .Values.service.loadBalancerIP }}
  {{- end }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: dragonfly
      protocol: TCP
      name: dragonfly
  selector:
    {{- include "dragonfly.selectorLabels" . | nindent 4 }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;_helpers.tpl&lt;/strong&gt;
this file define template vaiables to be used by helm to generate yaml manifests.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{/*
Expand the name of the chart.
*/}}
{{- define "dragonfly.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}

{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "dragonfly.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}

{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "dragonfly.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}

{{/*
Common labels
*/}}
{{- define "dragonfly.labels" -}}
helm.sh/chart: {{ include "dragonfly.chart" . }}
{{ include "dragonfly.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}

{{/*
Selector labels
*/}}
{{- define "dragonfly.selectorLabels" -}}
app.kubernetes.io/name: {{ include "dragonfly.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}

{{/*
Create the name of the service account to use
*/}}
{{- define "dragonfly.serviceAccountName" -}}
{{- if .Values.serviceAccount.create }}
{{- default (include "dragonfly.fullname" .) .Values.serviceAccount.name }}
{{- else }}
{{- default "default" .Values.serviceAccount.name }}
{{- end }}
{{- end }}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;_pod.tpl&lt;/strong&gt;
this files defines template variables for pvc resource and are used when storage and tls are enabled for dragonfly.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{- define "dragonfly.volumemounts" -}}
{{- if or (.Values.storage.enabled) (.Values.extraVolumeMounts) (.Values.tls.enabled) }}
volumeMounts:
  {{- if .Values.storage.enabled }}
  - mountPath: /data
    name: "{{ .Release.Name }}-data"
  {{- end }}
  {{- if and .Values.tls .Values.tls.enabled }}
  - mountPath: /etc/dragonfly/tls
    name: tls
  {{- end }}
  {{- with .Values.extraVolumeMounts }}
    {{- toYaml . | trim | nindent 2 }}
  {{- end }}
{{- end }}
{{- end }}

{{- define "dragonfly.pod" -}}
{{- if ne .Values.priorityClassName "" }}
priorityClassName: {{ .Values.priorityClassName }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
  {{- toYaml . | trim | nindent 2 -}}
{{- end }}
{{- with .Values.nodeSelector }}
nodeSelector:
  {{- toYaml . | trim | nindent 2 -}}
{{- end }}
{{- with .Values.affinity }}
affinity:
  {{- toYaml . | trim | nindent 2 -}}
{{- end }}
serviceAccountName: {{ include "dragonfly.serviceAccountName" . }}
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
  {{- toYaml . | trim | nindent 2 }}
{{- end }}
{{- with .Values.podSecurityContext }}
securityContext:
  {{- toYaml . | trim | nindent 2 }}
{{- end }}
{{- with .Values.initContainers }}
initContainers:
  {{- if eq (typeOf .) "string" }}
  {{- tpl . $ | trim | nindent 2 }}
  {{- else }}
  {{- toYaml . | trim | nindent 2 }}
  {{- end }}
{{- end }}
containers:
  {{- with .Values.extraContainers }}
  {{- if eq (typeOf .) "string" -}}
  {{- tpl . $ | trim | nindent 2 }}
  {{- else }}
  {{- toYaml . | trim | nindent 2 }}
  {{- end }}
  {{- end }}
  - name: {{ .Chart.Name }}
    {{- with .Values.securityContext }}
    securityContext:
      {{- toYaml . | trim | nindent 6 }}
    {{- end }}
    image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
    imagePullPolicy: {{ .Values.image.pullPolicy }}
    ports:
      - name: dragonfly
        containerPort: 6379
        protocol: TCP
    {{- with .Values.probes }}
    {{- toYaml . | trim | nindent 4 }}
    {{- end }}
    {{- with .Values.command }}
    command:
      {{- toYaml . | trim | nindent 6 }}
    {{- end }}
    args:
      - "--alsologtostderr"
    {{- with .Values.extraArgs }}
      {{- toYaml . | trim | nindent 6 }}
    {{- end }}
    {{- if .Values.tls.enabled }}
      - "--tls"
      - "--tls_cert_file=/etc/dragonfly/tls/tls.crt"
      - "--tls_key_file=/etc/dragonfly/tls/tls.key"
    {{- end }}
    {{- with .Values.resources }}
    resources:
      {{- toYaml . | trim | nindent 6 }}
    {{- end }}
    {{- include "dragonfly.volumemounts" . | trim | nindent 4 }}
    {{- if .Values.passwordFromSecret.enable }}
    {{- $appVersion := .Chart.AppVersion | trimPrefix "v" }}
    {{- $imageTag := .Values.image.tag | trimPrefix "v" }}
    {{- $effectiveVersion := $appVersion }}
    {{- if and $imageTag (ne $imageTag "") }}
      {{- $effectiveVersion = $imageTag }}
    {{- end }}
    env:
    {{- if semverCompare "&amp;gt;=1.14.0" $effectiveVersion }}
      - name: DFLY_requirepass
    {{- else }}
      - name: DFLY_PASSWORD
    {{- end }}
        valueFrom:
          secretKeyRef:
            name: {{ .Values.passwordFromSecret.existingSecret.name }}
            key: {{ .Values.passwordFromSecret.existingSecret.key }}
    {{- end }}

{{- if or (.Values.tls.enabled) (.Values.extraVolumes) }}
volumes:
{{- if and .Values.tls .Values.tls.enabled }}
  {{- if .Values.tls.existing_secret }}
  - name: tls
    secret:
      secretName: {{ .Values.tls.existing_secret }}
  {{- else if .Values.tls.createCerts }}
  - name: tls
    secret:
      secretName: '{{ include "dragonfly.fullname" . }}-server-tls'
  {{- else }}
  - name: tls
    secret:
      secretName: {{ include "dragonfly.fullname" . }}-tls
  {{- end }}
{{- end }}
{{- with .Values.extraVolumes }}
  {{- toYaml . | trim | nindent 2 }}
{{- end }}
{{- end }}
{{- end }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;statefulset.yaml&lt;/strong&gt;
If we want dragonflyDB to persist data kubernetes will create a statefulset using statefulset.yaml.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{- if .Values.storage.enabled }}
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: {{ include "dragonfly.fullname" . }}
  namespace: {{ .Release.Namespace }}
  labels:
    {{- include "dragonfly.labels" . | nindent 4 }}
spec:
  serviceName: {{ .Release.Name }}
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      {{- include "dragonfly.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      annotations:
        {{- if and (.Values.tls.enabled) (not .Values.tls.existing_secret) }}
        checksum/tls-secret: {{ include (print $.Template.BasePath "/tls-secret.yaml") . | sha256sum }}
        {{- end }}
        {{- with .Values.podAnnotations }}
        {{- toYaml . | nindent 8 }}
        {{- end }}
      labels:
        {{- include "dragonfly.selectorLabels" . | nindent 8 }}
    spec:
      {{- include "dragonfly.pod" . | trim | nindent 6 }}
  volumeClaimTemplates:
    - metadata:
        name: "{{ .Release.Name }}-data"
      spec:
        accessModes: [ "ReadWriteOnce" ]
        storageClassName: {{ .Values.storage.storageClassName }}
        resources:
          requests:
            storage: {{ .Values.storage.requests }}
{{- end }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;schema.values.json&lt;/strong&gt;
this is the file needed to render the ui in cyclops,it defines which fields will be shown to user in UI,values are edited for values.yaml,this file is super necessary for cyclops UI.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{

    "properties": {
        "replicaCount":{
            "description": "number of replicas of dragonflyDb",
            "type":"integer"
        },
        "storage":{

            "description": "storage for dragonflydb,default is 128Mi",
            "type":"object",
            "properties": {
                "enabled":{
                    "description": "enables storage if set to true ,default is false",
                    "type":"boolean"

                },
                "requests":{
                    "description":"requests storage,default 128Mi",
                    "type":"string"
            }
            }

        },
        "serviceMonitor":{
            "description": "enables service monitor ,requires kube-promtheus installed in your cluster",
            "type":"boolean"

        },
        "resources":{

            "description": "allocate cpu and ram for dragonfly",
            "title": "resources",
            "type":"object",
            "properties": {

                "requests":{

                    "title": "Request resoures",
                    "type":"object",
                    "properties": {


                        "cpu":{

                            "description":"request to allocates  cpu resource,default is 100m",
                            "type":"string"

                    },
                        "memory":{

                            "description":"requests memory for dragonfly, default 128Mi(Megabyte)",
                            "type":"string"
                    }
                    }
                },
                "limits":{

                    "title":"resource limits",
                    "description": "sets upper limits for resources",
                    "type":"object",
                    "properties": {

                        "cpu":{
                            "description":"cpu resource limit,deafult is 1000m",
                            "type":"string"
                        },
                        "memory":{
                            "description": "memory limit for dragonfly,default 512Mi",
                            "type":"string"
                        }
                    }


                }

            }

        }


    },
    "order":[

        "replicaCount",
        "storage",
        "resources",
        "serviceMonitor"

    ],
    "required": [
        "replicaCount",
        "storage",
        "resources",
        "serviceMonitor"
    ]



}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I know this might be hard to digest if you are new to helm.&lt;br&gt;
&lt;strong&gt;let me explain you the big picture :-&lt;/strong&gt;&lt;br&gt;
our root contains three files &lt;code&gt;values.yaml&lt;/code&gt;&lt;br&gt;
&lt;code&gt;values.schema.json&lt;/code&gt; &lt;code&gt;Chart.yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;let's deal with these three first&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Chart.yaml:&lt;/code&gt; this ones very basic it just contains info about our helm chart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;values.yaml :&lt;/code&gt;now this one is important,it is from this file helm generates yaml manifests,this file contains default value of fields like resources,service etc.it is basically this file your editing using Cyclops UI then helm uses these values to create your applications, if you dont pass any values in cyclops UI the default values of fields inside&lt;code&gt;values.yaml&lt;/code&gt; will be used to generate manifests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;values.schema.json :&lt;/code&gt; cyclops needs this file to render UI,this doesn't come with your helm chart you need to create it for cyclops so that it can render UI for your template,in this file you can specify which fields from &lt;code&gt;values.yaml&lt;/code&gt;you want to expose through UI,the user will be able to edit these fields in cyclops UI which in turn will pass updated &lt;code&gt;values.yaml&lt;/code&gt; to helm and then  helm will create your application.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope it's a bit clear now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;underneath cyclops uses helm chart under to to render UI refer to &lt;a href="https://github.com/dragonflydb/dragonfly/tree/main/contrib/charts/dragonfly" rel="noopener noreferrer"&gt;dragonflyDb Helm Chart&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Now lets deploy dragon fly using our cyclops template that we just created,first we need to add our templates to cyclops:
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;add template to cyclops,go to templates in cyclopes ui.&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%2Flm0bxs50t8qgt14yuyfm.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%2Flm0bxs50t8qgt14yuyfm.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.click on add template,enter name,repo and path for your template and click ok.&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%2Fasuhy0dqghc1ggrujpic.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%2Fasuhy0dqghc1ggrujpic.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.now lets  deploy dragonflyDB from our template.&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%2F0n175m3o6fu2c9qhlniu.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%2F0n175m3o6fu2c9qhlniu.png" alt=" " width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.enjoy :)&lt;/p&gt;

&lt;h1&gt;
  
  
  contributing to cyclops
&lt;/h1&gt;

&lt;p&gt;I learned a lot while contributing to cyclops in this quira quest,I got to know the basics of kubernetes and managed to solve two issues in cyclops repo,This was my first contribution to a major opensource project the maintainers are very welcoming to newcomers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quira cyclops quest feats&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;-solved the update command issue &lt;a href="https://github.com/cyclops-ui/cyclops/pull/475" rel="noopener noreferrer"&gt;PR&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;-solved printer-column issue &lt;a href="https://github.com/cyclops-ui/cyclops/pull/492" rel="noopener noreferrer"&gt;PR&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;-added dragonflyDB template to cyclops/templates repo &lt;a href="https://github.com/cyclops-ui/templates/pull/11" rel="noopener noreferrer"&gt;PR&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HUNGRY TO CONTRIBUTE MORE&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>developers</category>
      <category>cyclops</category>
    </item>
  </channel>
</rss>
