Nirmata Internship Experience

Nirmata is a cloud-native policy and governance company that created Kyverno - A kubernetes-native policy engine. They also have a SaaS offering on which I was primarily working as a backend/platform engineer. This blog is about my internship experience @ Nirmata.

How I got the internship:

I had applied for LFX Mentorship under Kyverno but got rejected. Seeking feedback I sent messages to the mentors. One of them was Jim Bugwadia, the CEO of Nirmata, (I was unaware of this fact back then). Everyone gave good feedback, but Jim also told me about the opening for interns @ Nirmata. So I sent him my resume after which interviews were scheduled and I was hired.

Overall Experience:

Ever since I learned about cloud-native I was sure that I would be building my career in this space. So I started studying operating systems (concurrency specifically), distributed systems, kubernetes, etc. Nirmata was the place where I could apply all my learnings. This was my first experience working in a production environment so I really had to be responsible and work with teams whose workflows were dependent on each other. Experiencing such environment was really motivating. The internship period greatly entertained the hacker in me as I was using shell scripting to automate stuff wherever possible 😁. Writing code and optimizing it to implement the features gave me a holistic experience of software engineering. The part where I had to think a lot before writing code was the best. Here's a meme in this reference:

Key Learnings:

It is very difficult to remember my key learnings. I think I should have maintained a journal 😹. But I'm going to give this a shot, trying not to miss anything. I won't mention any tech related stuff as growth in one's tech knowledge is pretty obvious. So here it goes:

  • Professionalism in Software Engineering: This was my first professional software engineering experience so learning how sprints are planned, writing and discussing design docs, entire flow of new code from local to prod, devtesting, etc. was really great.

  • Communication and other work ethics: Learnings include stuff like early heads up to my manager about the possible postpone in the due date due to some blockers, explaining the approach to solve a problem effectively, collaborating whenever possible (example: a quick UI mock up review), etc.

  • Setting ETAs effectively: Although I missed my ETAs frequently, they taught me how to set them better. 😛

  • Listening and Respecting more: While working on blockers together, my naïve thinking made me question the approach of my senior co-worker. However in the end, I found that I was wrong. This happened once, and it taught me a very good lesson.

  • Team player attitude is the key: While working at Nirmata, I understood that taking initiatives, helping co-workers, etc. Not only benefits your workplace but it improves one's overall outlook as well.

Works I did:

Initial days during the internship were kinda overwhelming as I was trying to cover up the steep learning curve as fast as possible and it was funny because at the same time I had to explain what I was doing in the standup meeting not being fully sure 😂. My mentor Parikshit helped me like anything answering all my stupid questions and explaining the system, how it linked with the code and how all the different components fitted together. He also used to explain what I am supposed to do very clearly that made it a lot easier for me to get in pace. Under his mentorship I migrated the microservices to use the new Kafka based workflow engine.

Next, I worked on a customer's feature request where they wanted to use helm and kustomize together so that they could dynamically make changes to the yaml generated by helm. This feature was implemented in Nirmata's DevSecOps platform. During this work I had to work hard getting the artifact out of a microservice and process it in another microservice. Mrutyunjaya helped me a lot during in this task.

Next, I worked to improve the Jenkins automation test suite by making the build parameterized so that the test suite could be run in different environments. In the existing system the tester would have to manually change the environment in all the build tasks. My task was to make the builds parameterized. To implement this I would have to make changes to the various config.xml files for the Jenkins jobs, I automated this by writing shell scripts that would make appropriate changes to all the config.xml files to achieve the final result. The changes in config.xml files would reflect in the Jenkins UI.

Next, I was assigned the task of migrating from Zookeeper to Fabric8 Kubernetes Client for microservice leader election. Initial implementation was easy but complexities started arising as I progressed. I had to spend a lot of time trying to understand the internal implementation of the Kubernetes Client to get this task to completion. This was mostly due to the lack of proper documentation in Fabric8 Kubernetes Client project. This task taught me a lot about concurrency and parallel programming. I got a lot of help from Yun while working on this.

I also worked on upgrading the Kyverno version in their microservices.

In between all these tasks, I mistakenly took down the testing server twice. Once by mistakely deleting the Kubeconfig file and the second time when I deleted all pods across all the namespaces when I was just tyring to kubectl get them. To fix the kubeconfig issue someone had to ssh into the EC2/EKS instance and manually put in the kubeconfig file. (unable to recall this properly 😅)

The second issue was a bit complex where the pods failed to come up after all of them were deleted because this caused some issue in the Kyverno webhook configurations. To fix this issue we had to delete the webhook configurations and restart Kyverno.

Conclusion:

I should probably stop writing now 😂 otherwise it will become too long for anyone to read. If you are still here, drop a comment so I know that you did 😁.

A small note to Atul, who was my mentor and manager and indeed a great teacher, who gave me a lot of advices and teachings about a LOT OF THINGS. He always gave great feedback which helped me a lot. Thank you so much, for everything.

If I could redo this internship I would do this by taking a bit more ownership in my tasks, try to get tasks to completion faster, and I would maintain a proper journal of my learnings. That's it, that's the story. Thanks for reading ❤️.