<?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[essare.me blog]]></title><description><![CDATA[Hey 👋, I'm Ayoub Essare, a DevOps and Cloud Enthusiast &amp; Full-stack Engineer based in Montreal Canada.]]></description><link>https://blog.essare.me</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1755485106316/d409fef7-2dac-4a52-9014-b7d313bdc9c3.png</url><title>essare.me blog</title><link>https://blog.essare.me</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 01:16:18 GMT</lastBuildDate><atom:link href="https://blog.essare.me/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[The AI Coding Assistant That Actually Saved Me 10 Hours a Week]]></title><description><![CDATA[I was skeptical. Really skeptical.
When Cursor and Copilot started showing up everywhere, I rolled my eyes hard. "Great, another tool that's going to write buggy code and make me clean up its mess," I thought.
I'd tried the early versions. They were....]]></description><link>https://blog.essare.me/ai-coding-assistant-productivity</link><guid isPermaLink="true">https://blog.essare.me/ai-coding-assistant-productivity</guid><category><![CDATA[AI]]></category><category><![CDATA[developer productivity]]></category><category><![CDATA[#Coding Assistant]]></category><category><![CDATA[General Programming]]></category><category><![CDATA[automation]]></category><category><![CDATA[cursor]]></category><category><![CDATA[claude.ai]]></category><dc:creator><![CDATA[Ayoub Essare]]></dc:creator><pubDate>Mon, 09 Feb 2026 14:45:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/KrYbarbAx5s/upload/37e7e35635067a54658e391848fd7da2.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I was skeptical. Really skeptical.</p>
<p>When Cursor and Copilot started showing up everywhere, I rolled my eyes hard. "Great, another tool that's going to write buggy code and make me clean up its mess," I thought.</p>
<p>I'd tried the early versions. They were... fine? They could write a basic function. But they also hallucinated APIs, suggested deprecated patterns, and generally made me spend more time debugging than if I'd just written the code myself.</p>
<p>But then something changed. And I don't just mean the models got better (though they definitely did). I mean I figured out how to actually use these tools in a way that didn't make me want to throw my laptop out the window.</p>
<p>Fast forward six months, and I've tracked my time religiously. The result? I'm saving 10+ hours every single week. Not by letting AI write all my code — that's a recipe for disaster — but by using it strategically for the right tasks at the right time.</p>
<p>Here's how.</p>
<h2 id="heading-the-breaking-point">The Breaking Point</h2>
<p>It was a Tuesday at 11 PM. I was still debugging a Kubernetes deployment issue that should have taken 30 minutes. I'd been at it for 4 hours. My eyes were burning. And I had a sinking feeling I was going to dream about YAML indentation.</p>
<p>The problem? I knew what I needed to do — configure a network policy, set up resource limits, and debug a failing health check. But I was stuck in documentation hell, jumping between 12 different tabs, trying to remember the exact syntax for a specific kubectl command.</p>
<p>That's when I had my moment of weakness. I opened Cursor, pasted my deployment config, and asked: "Why is this pod stuck in Pending?"</p>
<p>30 seconds later, I had my answer. The resource requests were too high for my node pool. I had a working fix. I went to bed before midnight.</p>
<p>The lesson? AI isn't replacing developers — it's replacing Stack Overflow at 2 AM when your brain has stopped working.</p>
<h2 id="heading-what-actually-changed">What Actually Changed</h2>
<p>Here's the thing nobody tells you about AI coding assistants: they're not magic. They won't architect your system for you. They won't understand your business logic. They won't know why you made that weird technical decision three years ago that now haunts your codebase.</p>
<p>But what they can do is accelerate the boring, repetitive, time-consuming parts of development that eat up your day. Here's exactly where I'm saving those 10 hours.</p>
<h3 id="heading-1-boilerplate-elimination-2-3-hours-saved">1. Boilerplate Elimination (2-3 hours saved)</h3>
<p>You know that feeling when you need to create a new API endpoint and you sigh because you know you're about to write the same CRUD code you've written 50 times before?</p>
<p>Yeah, I don't do that anymore.</p>
<p>Before:</p>
<ul>
<li><p>Create controller file</p>
</li>
<li><p>Write route handlers</p>
</li>
<li><p>Add validation logic</p>
</li>
<li><p>Set up error handling</p>
</li>
<li><p>Write tests</p>
</li>
<li><p>45 minutes gone</p>
</li>
</ul>
<p>Now:</p>
<ul>
<li><p>Describe what I need: "Create a REST endpoint for user preferences with validation."</p>
</li>
<li><p>Review and customize the generated code</p>
</li>
<li><p>10 minutes done</p>
</li>
</ul>
<p>The AI doesn't get it perfect. I still need to review, adjust, and sometimes rewrite. But starting from 80% complete instead of 0%? That's the difference between getting it done and putting it off.</p>
<h3 id="heading-2-context-switching-reduction-2-3-hours-saved">2. Context Switching Reduction (2-3 hours saved)</h3>
<p>Here's something that doesn't get talked about enough: the cognitive cost of context switching.</p>
<p>You're deep in implementing a feature. You need to look up how to do something specific. You open a browser. You search. You find a Stack Overflow answer. You get distracted by a notification. You check your email. You fall into a Reddit hole. 30 minutes later, you forgot what you were originally doing.</p>
<p>My new workflow:</p>
<ul>
<li><p>Ask the AI directly in my editor</p>
</li>
<li><p>Get an answer immediately</p>
</li>
<li><p>Never leave my coding flow</p>
</li>
<li><p>Stay focused on the actual problem</p>
</li>
</ul>
<p>The time savings here aren't just the search — it's preserving my mental state. I stay in the zone. I ship faster. I'm less exhausted at the end of the day.</p>
<h3 id="heading-3-debugging-acceleration-2-3-hours-saved">3. Debugging Acceleration (2-3 hours saved)</h3>
<p>I'm going to say something controversial: I'm a good debugger. I've been doing this for years. I know how to read stack traces, analyze logs, and trace through code.</p>
<p>But I'm also human. I miss things. I make assumptions. I get stuck in rabbit holes.</p>
<p>AI assistants are like having a second pair of eyes that never gets tired. They spot patterns I miss. They suggest causes I hadn't considered. They help me question my own biases.</p>
<p>Example from last week:</p>
<p>I had a race condition that was driving me insane. I'd been debugging for an hour. I was convinced it was a database locking issue.</p>
<p>I pasted the code into Claude and asked: "What could cause intermittent failures in this concurrent operation?"</p>
<p>It suggested three possibilities. The third one was right — a subtle closure variable capture issue I never would have caught. 5 minutes to fix. An hour I would have spent going down the wrong path.</p>
<h3 id="heading-4-documentation-amp-testing-2-3-hours-saved">4. Documentation &amp; Testing (2-3 hours saved)</h3>
<p>Raise your hand if you love writing documentation.</p>
<p>Yeah, that's what I thought.</p>
<p>I don't love writing docs. But I love having good docs. And I've learned that AI assistants are surprisingly good at generating documentation that doesn't suck.</p>
<p>My workflow now:</p>
<ul>
<li><p>Write the code</p>
</li>
<li><p>Ask AI to generate docstrings</p>
</li>
<li><p>Review and refine</p>
</li>
<li><p>Ask AI to generate test cases</p>
</li>
<li><p>Review and refine</p>
</li>
</ul>
<p>The keyword here is review. I'm not blindly accepting AI output. But starting from a solid draft instead of a blank page? That's the difference between having documentation and... not having it.</p>
<h3 id="heading-5-learning-new-apis-amp-patterns-1-2-hours-saved">5. Learning New APIs &amp; Patterns (1-2 hours saved)</h3>
<p>I work across a lot of different technologies. One day it's Kubernetes, the next it's a new JavaScript framework, then it's some cloud service I haven't used before.</p>
<p>Traditionally, learning a new API meant reading documentation, finding tutorials, trial and error, Stack Overflow deep dives, and hours of frustration.</p>
<p>Now?</p>
<ul>
<li><p>"Show me how to implement authentication with NextAuth.js"</p>
</li>
<li><p>Get working code examples</p>
</li>
<li><p>Learn by doing, not by reading</p>
</li>
<li><p>Ask follow-up questions when stuck</p>
</li>
</ul>
<p>It's like pair programming with someone who's read all the docs and remembers everything.</p>
<h2 id="heading-the-tools-i-actually-use">The Tools I Actually Use</h2>
<p>Let me be specific about what I'm using, because not all AI assistants are created equal.</p>
<h3 id="heading-for-daily-coding-cursor">For Daily Coding: Cursor</h3>
<p>Cursor has become my primary editor. The inline completions are good, but the real magic is the chat interface. I can ask questions about my entire codebase, get explanations of complex functions, and have it help me refactor.</p>
<p>Best for:</p>
<ul>
<li><p>Understanding legacy code</p>
</li>
<li><p>Refactoring large files</p>
</li>
<li><p>Generating boilerplate</p>
</li>
<li><p>Debugging tricky issues</p>
</li>
</ul>
<h3 id="heading-for-architecture-amp-complex-tasks-claude">For Architecture &amp; Complex Tasks: Claude</h3>
<p>When I need to think through a system design or solve a complex problem, Claude is my go-to. It's better at reasoning, follows instructions more carefully, and produces higher-quality output for complex tasks.</p>
<p>Best for:</p>
<ul>
<li><p>System design discussions</p>
</li>
<li><p>Writing comprehensive tests</p>
</li>
<li><p>Documentation generation</p>
</li>
<li><p>Complex debugging scenarios</p>
</li>
</ul>
<h3 id="heading-for-quick-lookups-github-copilot">For Quick Lookups: GitHub Copilot</h3>
<p>Copilot is great for those "I know what I want to write but can't remember the exact syntax" moments. It's fast, it's in my IDE, and it's surprisingly good at completing my thoughts.</p>
<p>Best for:</p>
<ul>
<li><p>Auto-completing repetitive code</p>
</li>
<li><p>Remembering syntax</p>
</li>
<li><p>Quick function generation</p>
</li>
<li><p>Boilerplate reduction</p>
</li>
</ul>
<h2 id="heading-what-i-dont-use-ai-for">What I Don't Use AI For</h2>
<p>Here's the part that matters: I'm not letting AI write my critical business logic. I'm not accepting suggestions blindly. I'm not outsourcing my thinking.</p>
<p>Things I still do myself:</p>
<ul>
<li><p>Architecture decisions — AI doesn't understand my constraints, trade-offs, or business context</p>
</li>
<li><p>Security-sensitive code — I'm not trusting AI with auth, encryption, or anything that could be exploited</p>
</li>
<li><p>Complex algorithm design — AI is good at implementation, not innovation</p>
</li>
<li><p>Code review — I still review every line, even AI-generated code</p>
</li>
<li><p>Understanding the "why" — AI can tell me how to do something, but I need to understand why</p>
</li>
</ul>
<p>The rule I live by: AI accelerates my work, but I'm still the developer. I'm responsible for the code that ships.</p>
<h2 id="heading-the-real-roi-beyond-hours-saved">The Real ROI: Beyond Hours Saved</h2>
<p>Tracking hours is useful, but it doesn't capture the full picture. Here are the benefits I didn't expect:</p>
<p><strong>Less mental fatigue.</strong> I'm not exhausted at the end of the day anymore. I'm not making as many silly mistakes. I'm not burning out as quickly.</p>
<p><strong>More time for deep work.</strong> Because I'm spending less time on boilerplate and debugging, I have more time for the interesting stuff: architecture, optimization, building features that actually matter.</p>
<p><strong>Faster learning.</strong> I'm learning new technologies faster because I have an AI tutor available 24/7. I'm more willing to try new things because the barrier to entry is lower.</p>
<p><strong>Better code quality.</strong> Counterintuitive, right? But having AI suggest test cases and catch edge cases I would have missed has actually improved my code quality.</p>
<h2 id="heading-your-action-plan">Your Action Plan</h2>
<p>If you're convinced (or at least curious), here's how to get started without drowning in tool overload:</p>
<p><strong>Week 1: Pick One Tool</strong></p>
<p>Don't try to learn everything at once. Pick one AI assistant:</p>
<ul>
<li><p>Cursor if you want an all-in-one editor experience</p>
</li>
<li><p>GitHub Copilot if you want minimal disruption</p>
</li>
<li><p>Claude if you prefer a chat interface for complex tasks</p>
</li>
</ul>
<p><strong>Week 2: Identify Your Pain Points</strong></p>
<p>Track your time for a week. Notice where you're getting stuck:</p>
<ul>
<li><p>Writing boilerplate?</p>
</li>
<li><p>Debugging?</p>
</li>
<li><p>Learning new APIs?</p>
</li>
<li><p>Writing tests?</p>
</li>
</ul>
<p>These are your opportunities.</p>
<p><strong>Week 3: Build New Habits</strong></p>
<p>Start integrating AI into your workflow:</p>
<ul>
<li><p>Ask for help when you're stuck for more than 10 minutes</p>
</li>
<li><p>Use AI to generate tests for new functions</p>
</li>
<li><p>Let AI write your first draft of documentation</p>
</li>
</ul>
<p><strong>Week 4: Review and Refine</strong></p>
<p>Look back at the AI-generated code. What worked? What didn't? Adjust your approach. Learn the patterns where AI helps and where it hinders.</p>
<h2 id="heading-common-pitfalls">Common Pitfalls</h2>
<p>I've made all these mistakes, so you don't have to:</p>
<p><strong>Blind trust.</strong> Don't accept AI suggestions without understanding them. If you can't explain what the code does, don't ship it.</p>
<p>Fix: Always review AI-generated code. Treat it like code from a junior developer — helpful, but needs supervision.</p>
<p><strong>Over-reliance.</strong> Don't let your skills atrophy. AI is a tool, not a replacement for your knowledge.</p>
<p>Fix: Periodically write code without AI assistance. Stay sharp on fundamentals.</p>
<p><strong>Security blind spots.</strong> AI can generate insecure code. It doesn't know your security requirements.</p>
<p>Fix: Never let AI handle authentication, authorization, or encryption without thorough review.</p>
<p><strong>Hallucination trust.</strong> AI makes things up. It invents APIs that don't exist. It suggests deprecated patterns.</p>
<p>Fix: Always verify API documentation. Don't assume AI knows the latest best practices.</p>
<h2 id="heading-the-bottom-line">The Bottom Line</h2>
<p>AI coding assistants aren't magic. They're not going to make you a 10x developer overnight. They're not replacing the need to understand your craft.</p>
<p>But used correctly? They're the most significant productivity boost I've experienced in my career.</p>
<p>Those 10 hours I save each week? I'm spending them on building better features, learning new technologies, and actually having a life outside of work.</p>
<p>And honestly? That's worth more than any tool.</p>
<hr />
<p>I'm curious: What's your experience with AI coding assistants? Are you using them? Skeptical? Tried and gave up?</p>
<p>Drop a comment — I read every single one, and I love hearing about other developers' real-world experiences.</p>
<p>Ready to try AI-assisted coding? Start small. Pick one task. See how it feels. You might be surprised.</p>
<hr />
<p><em>What's the most time-consuming part of your development workflow? Let me know in the comments — I might have a solution for you.</em></p>
]]></content:encoded></item><item><title><![CDATA[How I Built CommunoPlus: The Communauto Problem That Changed Everything]]></title><description><![CDATA[It was a Saturday morning in Montreal, and I was standing on a street corner, frantically refreshing the Communauto app on my phone. Again. And again. And again.
I needed to pick up some furniture from a friend across town, then drop it off at my pla...]]></description><link>https://blog.essare.me/how-i-built-communoplus-the-communauto-problem-that-changed-everything</link><guid isPermaLink="true">https://blog.essare.me/how-i-built-communoplus-the-communauto-problem-that-changed-everything</guid><category><![CDATA[communauto]]></category><category><![CDATA[Car-Sharing]]></category><category><![CDATA[Mobile Development]]></category><category><![CDATA[automation]]></category><category><![CDATA[Flutter]]></category><category><![CDATA[Cloud Computing]]></category><dc:creator><![CDATA[Ayoub Essare]]></dc:creator><pubDate>Sat, 08 Nov 2025 04:28:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1762575742512/193bf9d9-5bd0-4c30-a171-37a768898715.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It was a Saturday morning in Montreal, and I was standing on a street corner, frantically refreshing the Communauto app on my phone. Again. And again. And again.</p>
<p>I needed to pick up some furniture from a friend across town, then drop it off at my place. The metro? Sure, but good luck hauling a chair through the station. An Uber? $25 each way, so $50 total. But if I could just grab a Flex vehicle – any Flex vehicle – I could do the whole trip for under $15.</p>
<p>The app showed a Toyota Corolla two blocks away. Perfect. I tapped on it. Loading... Loading... And then:</p>
<p><strong>"Sorry, this vehicle is no longer available."</strong></p>
<p>Frustrated? Yeah, you could say that. 😤</p>
<h2 id="heading-the-refresh-game-nobody-asked-for"><strong>The Refresh Game Nobody Asked For</strong></h2>
<p>Here's the thing about using car-sharing services like Communauto Flex in a busy city: finding an available vehicle isn't just about <em>luck</em> – it's about <em>speed</em>. And not the speed of getting to the car, but the speed of your thumbs on the screen.</p>
<p>I'd see a vehicle pop up on the map, tap it as fast as I could, wait for the details to load, and by the time the booking button appeared, someone else had already grabbed it. Every. Single. Time.</p>
<p>It felt like playing a video game where the difficulty was permanently set to "impossible." 🎮</p>
<p>So what did I do? Like any reasonable person who just needed to get somewhere, I started developing a strategy:</p>
<ol>
<li><p>Open the app</p>
</li>
<li><p>Refresh</p>
</li>
<li><p>See a car</p>
</li>
<li><p>Tap it instantly</p>
</li>
<li><p>Lose it to someone faster</p>
</li>
<li><p>Repeat steps 2-5 until either:</p>
<ul>
<li><p>I miraculously won the refresh lottery</p>
</li>
<li><p>I gave up and took the metro</p>
</li>
<li><p>I was late to where I needed to be</p>
</li>
</ul>
</li>
</ol>
<p>I'm not exaggerating when I say I spent 15 minutes one morning just standing on the street, refreshing the app, watching cars appear and disappear like some kind of vehicular whack-a-mole game. 🚗💨</p>
<p><strong>Real talk:</strong> I calculated once that I was probably refreshing the app 3-4 times per minute. That's over 45 refreshes in 15 minutes. And I still didn't get a car.</p>
<h2 id="heading-the-moment-everything-changed"><strong>The Moment Everything Changed 💡</strong></h2>
<p>One particularly frustrating morning, after losing yet another vehicle to a faster refresher, I had a thought that changed everything:</p>
<p><em>"I'm a software engineer. What if I could automate this?"</em></p>
<p>What if, instead of me sitting there refreshing the app like a maniac, there was a system that could <strong>watch for available vehicles</strong> on my behalf? What if it could <strong>instantly block a car</strong> the second it became available, before anyone else even saw it?</p>
<p>What if I could just set my location, tell it "find me a Flex vehicle within 500 meters," and then go about my morning while the system did the hunting for me?</p>
<p>That's when CommunoPlus was born. Not because I had some grand plan, but because I was genuinely tired of losing the car-sharing game to people with faster fingers. I just wanted to solve my own problem.</p>
<h2 id="heading-but-wait-isnt-that-cheating"><strong>But Wait, Isn't That... Cheating? 🤔</strong></h2>
<p>I know what you're thinking. "Dude, you're basically cutting in line."</p>
<p>And yeah, I get why it might feel that way. But here's how I saw it:</p>
<p>The official Communauto app makes you manually refresh and manually search. That's just... how it works. There's no notification system. There's no "alert me when a car becomes available near me" feature. You're expected to just <em>know</em> when cars become available and be faster than everyone else.</p>
<p><strong>That's not user experience. That's a competition.</strong></p>
<p>And like any competition, the person with the better tools wins. Some people had faster phones. Some had better internet connections. Some were just naturally faster at tapping through screens.</p>
<p>I just happened to have the ability to write code that could do it for me. 🤷‍♂️</p>
<h2 id="heading-the-real-problem-i-discovered"><strong>The Real Problem I Discovered</strong></h2>
<p>As I started building what would eventually become CommunoPlus, I realized something: I wasn't alone in this frustration.</p>
<p>I started talking to other Communauto users – friends, coworkers, people on Reddit – and the stories were all the same:</p>
<ul>
<li><p><strong>Weekend planners</strong> who needed a car for errands or day trips but couldn't find one in time</p>
</li>
<li><p><strong>Parents</strong> trying to get their kids to activities across town</p>
</li>
<li><p><strong>Students</strong> missing classes because they spent 20 minutes trying to book a vehicle</p>
</li>
<li><p><strong>Remote workers</strong> who gave up on Flex entirely because it was "too unreliable"</p>
</li>
</ul>
<p>The common thread? Everyone was playing the same refresh game. Everyone was frustrated. And everyone just accepted it as "how car-sharing works."</p>
<p>But it didn't have to be that way.</p>
<h2 id="heading-the-other-problems-i-noticed"><strong>The Other Problems I Noticed 📝</strong></h2>
<p>Once I started really paying attention to my Communauto usage, I noticed other problems too:</p>
<h3 id="heading-the-31-day-booking-window-problem"><strong>The 31-Day Booking Window Problem</strong></h3>
<p>I wanted to book a car for a trip I was planning two months out. Can't do it. Communauto only lets you book 31 days in advance.</p>
<p>So I had to set a reminder for exactly 31 days before my trip, hope I remembered to check at that exact time, and hope a vehicle was available. And if I forgot? Well, I might be taking the bus on my vacation. 🙈</p>
<h3 id="heading-the-lost-amp-found-black-hole"><strong>The Lost &amp; Found Black Hole</strong></h3>
<p>Left my AirPods in a Flex vehicle once. The official lost and found process involved calling customer service, filing a report, and... waiting. And hoping. And usually never hearing back.</p>
<p>There was no way to connect with the next person who used that car. No systematic way to match "I lost something" with "I found something." Just a void where your belongings disappeared forever.</p>
<h3 id="heading-the-mystery-vehicle-experience"><strong>The Mystery Vehicle Experience</strong></h3>
<p>Ever book a car and have no idea what you're getting until you show up? No photo, no ratings, no reviews. You just see "Toyota Prius C" and hope for the best.</p>
<p>Sometimes you'd get lucky – a decent vehicle. Other times? Not so much. The AC doesn't work (those old Prius Cs...). There's a weird smell. The previous user left trash everywhere. Or worse – dog hair. Everywhere. On the seats, in the air vents, coating your jacket the moment you sit down.</p>
<p>There was no way to know if the vehicle you're about to book is pristine or... problematic. You just had to roll the dice. 🎲</p>
<h2 id="heading-why-i-decided-to-build-something"><strong>Why I Decided to Build Something</strong></h2>
<p>So there I was, a software engineer in Montreal, actively using Communauto multiple times a week, running into all these frustrations, and thinking:</p>
<p><strong>"Someone should fix this."</strong></p>
<p>And then the classic developer realization:</p>
<p><strong>"Wait... I'm someone. I can fix this."</strong> 💪</p>
<p>I wasn't planning to build a competitor to Communauto. I loved the service! I just wanted to solve the user experience problems that were making my life harder.</p>
<p>I wanted:</p>
<ul>
<li><p><strong>Automation</strong> for finding and blocking vehicles (solve the refresh game)</p>
</li>
<li><p><strong>Smart scheduling</strong> for long-term planning (solve the 31-day window)</p>
</li>
<li><p><strong>Community features</strong> for lost and found (solve the black hole)</p>
</li>
<li><p><strong>Transparency</strong> through vehicle ratings (solve the mystery vehicle)</p>
</li>
</ul>
<h2 id="heading-the-journey-begins"><strong>The Journey Begins 🚀</strong></h2>
<p>That Saturday morning frustration led to 18 months of development. Late nights after work. Weekends jumping from mobile development to backend architecture to cloud infrastructure. Learning about API integration, background job processing, and how to build a system that actually works reliably.</p>
<p>I was building CommunoPlus as a solution to <em>my</em> problem. The fact that other Communauto users found it helpful too – that hundreds of people now use it to enhance their car-sharing experience – that was the surprise.</p>
<p>And you know what? There <em>was</em> a better way. 🎯</p>
<h2 id="heading-what-happened-next"><strong>What Happened Next</strong></h2>
<p>Over the next 18 months, I built CommunoPlus from scratch. I launched it on the App Store and Google Play. I watched as real users started solving the same problems I had. I saw the Reddit posts from people sharing their success stories.</p>
<p>And you know what the coolest part was?</p>
<p>I stopped losing the refresh game. Because I wasn't playing it anymore. 🎯</p>
<p>In the coming posts, I'll walk you through how I built each feature – the technical challenges, the architecture decisions, the mistakes I made, and the lessons I learned. From Flex Radar's automated hunting system to the AI-powered Lost &amp; Found, I'll share the entire journey.</p>
<p>But for now, I want to know:</p>
<p><strong>Have you ever experienced this frustration?</strong> Are you tired of playing the refresh game? Have you missed opportunities because you couldn't find a Flex vehicle in time?</p>
<p>If so, I built CommunoPlus for you. And I'd love to hear your story.</p>
<hr />
<p><strong>Ready to stop playing the refresh game?</strong></p>
<p>📱 <strong>Download CommunoPlus:</strong></p>
<ul>
<li><p>iOS: <a target="_blank" href="https://apps.apple.com/us/app/communoplus-flex-radar/id6740716220">App Store Link</a></p>
</li>
<li><p>Android: <a target="_blank" href="https://play.google.com/store/apps/details?id=com.communoplus.flexradar">Google Play Link</a></p>
</li>
<li><p>Website: <a target="_blank" href="https://communoplus.com/en">communoplus.com</a></p>
</li>
</ul>
<p><strong>Coming up next:</strong> "Building Flex Radar - When Automation Meets Real Problems" – The technical deep dive into how I automated vehicle hunting and what I learned about building reliable background systems.</p>
<hr />
<p><em>Have a car-sharing frustration story? Drop a comment or reach out at</em> <a target="_blank" href="mailto:support@communoplus.com"><em>support@communoplus.com</em></a> <em>– I love hearing from fellow Communauto users!</em></p>
]]></content:encoded></item><item><title><![CDATA[DevOps in 2025: A Real Talk About What's Actually Changed (And What Hasn't)]]></title><description><![CDATA[I was grabbing coffee ☕ with a former colleague last week, and she asked me something that made me pause: "Is DevOps still... DevOps? Or has it become something completely different?" 🤔
It got me thinking. I've been doing this for over a decade now,...]]></description><link>https://blog.essare.me/devops-in-2025-a-real-talk-about-whats-actually-changed-and-what-hasnt</link><guid isPermaLink="true">https://blog.essare.me/devops-in-2025-a-real-talk-about-whats-actually-changed-and-what-hasnt</guid><category><![CDATA[DevOps 2025]]></category><category><![CDATA[Infrastructure Automation]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Platform Engineering ]]></category><category><![CDATA[ci-cd]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[DevSecOps]]></category><dc:creator><![CDATA[Ayoub Essare]]></dc:creator><pubDate>Sun, 17 Aug 2025 04:00:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755483516553/08438ae4-bd54-4275-abeb-306b707e7878.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I was grabbing coffee ☕ with a former colleague last week, and she asked me something that made me pause: "Is DevOps still... DevOps? Or has it become something completely different?" 🤔</p>
<p>It got me thinking. I've been doing this for over a decade now, and honestly? The landscape feels both familiar and alien at the same time.</p>
<p>If you've been in this space for a while, you probably remember when "DevOps" was this revolutionary idea that half the industry was skeptical about. Now my nephew's coding bootcamp has a whole module on it. Wild, right? 😅</p>
<p>So let me share what I've been seeing out there in 2025 — the good, the weird, and the "wait, we're still dealing with this?" parts of modern DevOps. 🚀</p>
<h2 id="heading-the-stuff-thats-actually-different-now">The Stuff That's Actually Different Now</h2>
<h3 id="heading-ai-is-everywhere-and-i-mean-everywhere">AI Is Everywhere (And I Mean Everywhere) 🤖</h3>
<p>Remember spending entire afternoons debugging YAML files? Yeah, those days are mostly behind us. I watched a junior dev on my team fix a broken pipeline last month by literally asking an AI: "Why is my deployment failing?"</p>
<p>The AI didn't just give her an answer — it suggested three different fixes and explained the trade-offs of each. I'm not gonna lie, I was a little jealous. 😂</p>
<p>What we're seeing:</p>
<ul>
<li><p>AI that actually writes decent infrastructure code (not just boilerplate)</p>
</li>
<li><p>Monitoring that tells you about problems before your users start complaining</p>
</li>
<li><p>Incident response that feels less like chaos and more like having a really smart friend walking you through it</p>
</li>
</ul>
<h3 id="heading-platform-engineering-has-saved-my-sanity">Platform Engineering Has Saved My Sanity 🙏</h3>
<p>I used to spend half my time helping developers figure out how to deploy their apps. Now? We built them a platform that just... works. They push code, it goes live, everyone's happy.</p>
<p>It's like we finally figured out that not every developer needs to be a Kubernetes expert. Revolutionary concept, I know. 💡</p>
<h3 id="heading-security-isnt-the-fun-police-anymore">Security Isn't the "Fun Police" Anymore 🔒</h3>
<p>This might be the biggest change I've seen. Security used to be this thing that happened at the end, usually involving tense meetings and delayed releases. Now it's just... part of the process.</p>
<p>My team runs security scans on every commit, and honestly, most of the time we don't even think about it. It's like wearing a seatbelt — just something you do. ✅</p>
<h3 id="heading-observability-actually-makes-sense-now">Observability Actually Makes Sense Now</h3>
<p>I used to have seventeen different dashboards, and somehow still couldn't figure out why the app was slow. Now everything talks to everything else, and when something breaks, I usually know what and why before I've finished my first cup of coffee.</p>
<h3 id="heading-the-cloud-bill-is-yikes">The Cloud Bill Is... Yikes 💸</h3>
<p>Multi-cloud isn't a strategy anymore — it's just what happens when you've been around long enough. One acquisition here, one cost optimization there, and suddenly you're running workloads on three different cloud providers.</p>
<p>Pro tip: Get really good at FinOps, or your CFO will not be happy with you. 📊</p>
<h2 id="heading-the-stuff-that-hasnt-changed-thank-god">The Stuff That Hasn't Changed (Thank God) 🙌</h2>
<h3 id="heading-its-still-about-people-not-tools">It's Still About People, Not Tools 👥</h3>
<p>I've seen teams with the fanciest AI-powered everything fall apart because they couldn't talk to each other. I've also seen teams with basic tools ship incredible products because they actually worked together.</p>
<p>The technology is just the easy part. Getting humans to collaborate well? That's still the real challenge.</p>
<h3 id="heading-cicd-is-still-the-foundation">CI/CD Is Still the Foundation</h3>
<p>Yeah, the pipelines are smarter now. Yeah, they can fix themselves sometimes. But the core idea — deploy small changes frequently, test everything, don't break production — that's exactly the same as it was five years ago.</p>
<h3 id="heading-kubernetes-still-rules-whether-we-like-it-or-not">Kubernetes Still Rules (Whether We Like It or Not) ⚓</h3>
<p>I have mixed feelings about this one. Kubernetes solved a lot of problems, but it also created new ones. The good news is that platform engineering has made it so most developers don't have to care about it anymore.</p>
<p>It's like electricity in your house — super important, but you don't think about the power grid every time you flip a light switch. 💡</p>
<h3 id="heading-finding-good-people-is-still-hard">Finding Good People Is Still Hard 🔍</h3>
<p>The tools change every six months, but finding someone who really gets infrastructure, automation, and how to work with people? That's still the holy grail. 🏆</p>
<h2 id="heading-what-i-think-comes-next">What I Think Comes Next 🔮</h2>
<p>Honestly? I think we're heading toward a world where the technical stuff becomes increasingly invisible. More AI, better platforms, fewer 2 AM phone calls about prod being down. 📞</p>
<p>But the human stuff — the collaboration, the problem-solving, the "let's figure this out together" mentality — that's going to matter more than ever. 🤝</p>
<h2 id="heading-my-take">My Take</h2>
<p>DevOps in 2025 feels like we've finally grown up. We have better tools, smarter processes, and (mostly) learned from our mistakes. But at its core, it's still about building great software with great people.</p>
<p>If you're just getting started in this field, here's my advice: learn the fundamentals, stay curious, and remember that every expert was once a beginner who couldn't figure out why their Docker container wouldn't start. 🐳</p>
<p>And if you're a veteran like me? Embrace the changes, but don't forget why we started doing this in the first place — to make building and shipping software better for everyone.</p>
<p>What's your experience been like? Has AI actually made your life easier, or are you still fighting with YAML files like the rest of us? I'd love to hear your stories — the real ones, not the LinkedIn success posts. 😉</p>
]]></content:encoded></item><item><title><![CDATA[The Cloud Security Wake-Up Call Every Startup Founder Needs to Hear]]></title><description><![CDATA[Picture this: It's 2 AM, you're finally ready to deploy your MVP after months of grinding, and then you get that email. Your AWS bill is $50,000. For the month.
Yeah, that actually happened to a founder I know. Turns out, someone found their misconfi...]]></description><link>https://blog.essare.me/the-cloud-security-wake-up-call-every-startup-founder-needs-to-hear</link><guid isPermaLink="true">https://blog.essare.me/the-cloud-security-wake-up-call-every-startup-founder-needs-to-hear</guid><category><![CDATA[startup]]></category><category><![CDATA[Security]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[Founder]]></category><category><![CDATA[infrastructure]]></category><category><![CDATA[Devops]]></category><dc:creator><![CDATA[Ayoub Essare]]></dc:creator><pubDate>Thu, 24 Oct 2024 04:00:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755483622121/ee6e4721-cd7c-45a7-8a2e-99f2ddf7a1d8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Picture this: It's 2 AM, you're finally ready to deploy your MVP after months of grinding, and then you get <em>that</em> email. Your AWS bill is <strong>$50,000</strong>. For the month.</p>
<p>Yeah, that actually happened to a founder I know. Turns out, someone found their misconfigured S3 bucket and used it to mine cryptocurrency. Ouch.</p>
<p>Look, I get it. When you're in startup mode, security feels like something you'll "figure out later." You're moving fast, breaking things, and honestly? The cloud makes everything feel so easy that it's tempting to think it's handling the security stuff for you too.</p>
<p>Spoiler alert 🚨: It's not.</p>
<p>But before you panic, here's the thing – most cloud security disasters aren't caused by some hoodie-wearing hacker with a Matrix-style setup. They're usually just... mistakes. Really preventable mistakes that happen when smart people are moving too fast.</p>
<p>So let's talk about the ones I see over and over again, and how to fix them without slowing down your momentum.</p>
<h2 id="heading-well-just-make-everything-public-for-now">"We'll Just Make Everything Public for Now"</h2>
<p>I can't tell you how many times I've heard this. Someone creates an S3 bucket, makes it public so the whole team can access it quickly, and then... forgets about it. Forever.</p>
<p>Here's what actually happens: Your bucket becomes Google-able. Yes, people literally search for exposed buckets. It's like leaving your front door open with a sign that says "free stuff inside."</p>
<p><strong>What you should do instead:</strong></p>
<ul>
<li><p>Default to private. Always. No exceptions.</p>
</li>
<li><p>Create proper IAM users for your team (I know, it takes 5 extra minutes, but trust me)</p>
</li>
<li><p>Use AWS's "Block Public Access" feature – it's literally a checkbox that prevents these disasters</p>
</li>
<li><p>Set calendar reminders to audit permissions quarterly</p>
</li>
</ul>
<p><strong>Real talk:</strong> I once helped a company that had accidentally exposed their entire customer database this way. The founder told me he aged 10 years in 10 minutes when he realized what happened.</p>
<h2 id="heading-the-we-all-share-the-god-account-problem">The "We All Share the God Account" Problem</h2>
<p>This one makes me want to pull my hair out. Using the root account (or one shared admin account) because "it's just easier right now" is like giving everyone in your office a master key to the building, your house, and your car.</p>
<p>When (not if) someone leaves your company, do you really want to change every single password and regenerate every API key?</p>
<p><strong>Here's the grown-up approach:</strong></p>
<ul>
<li><p>Create individual accounts for everyone. Yes, even your co-founder who's sitting right next to you.</p>
</li>
<li><p>Use the principle of least privilege – if someone only needs to read logs, don't give them permission to spin up new servers</p>
</li>
<li><p>Turn on MFA everywhere. Everywhere. Your future self will thank you.</p>
</li>
</ul>
<p><strong>Pro tip from someone who learned the hard way:</strong> When you inevitably forget to revoke access for that intern who left six months ago, you'll be really glad they didn't have admin privileges.</p>
<h2 id="heading-secrets-in-your-code-aka-please-hack-me">Secrets in Your Code (AKA "Please Hack Me")</h2>
<p>I've seen API keys in GitHub repos more times than I can count. Sometimes in the commit message. Sometimes in a file literally called <code>passwords.txt</code>. I wish I was making this up.</p>
<p>If your repo ever becomes public, or if someone gets access to it, you've basically handed them the keys to your entire infrastructure.</p>
<p><strong>Do this instead:</strong></p>
<ul>
<li><p>Use a proper secrets manager. AWS Secrets Manager, HashiCorp Vault, whatever – just not your source code.</p>
</li>
<li><p>Create a <code>.env.example</code> file with dummy values so your team knows what variables they need</p>
</li>
<li><p>Set up pre-commit hooks that scan for accidentally committed secrets</p>
</li>
<li><p>Rotate your keys regularly (and yes, that includes the ones you think nobody knows about)</p>
</li>
</ul>
<h2 id="heading-the-50000-surprise-monitoring-your-wallet">The $50,000 Surprise (Monitoring Your Wallet)</h2>
<p>Remember that founder I mentioned earlier? His story isn't unique. Attackers love finding misconfigured cloud resources because they can use them for free crypto mining, sending spam, or worse.</p>
<p>But here's what really gets me: this is totally preventable.</p>
<p><strong>Set up alerts for everything:</strong></p>
<ul>
<li><p>Spending alerts (seriously, set these up before you deploy anything)</p>
</li>
<li><p>Usage spikes that don't match your actual traffic</p>
</li>
<li><p>New resources being created outside business hours</p>
</li>
<li><p>Failed login attempts</p>
</li>
</ul>
<p><strong>Personal anecdote:</strong> I once got a text at 3 AM because someone was trying to brute-force one of our servers. It was annoying at the time, but that alert probably saved us thousands in compute costs and a potential data breach.</p>
<h2 id="heading-well-add-logging-later-famous-last-words">"We'll Add Logging Later" (Famous Last Words)</h2>
<p>You know what's worse than having a security incident? Having a security incident and having no idea what happened, when it happened, or how bad it is.</p>
<p>I get it – logging feels like overhead when you're trying to ship features. But it's like having security cameras in your store. You hope you'll never need them, but when something goes wrong, you'll be desperate for that footage.</p>
<p><strong>Start simple:</strong></p>
<ul>
<li><p>Turn on CloudTrail, Azure Activity Logs, or GCP Audit Logs (it's literally a toggle switch)</p>
</li>
<li><p>Forward everything to a central place where you can actually search it</p>
</li>
<li><p>Set up alerts for the obvious bad stuff: failed logins, resources being created outside business hours, API calls from weird locations</p>
</li>
</ul>
<h2 id="heading-compliance-isnt-just-for-big-companies">Compliance Isn't Just for "Big Companies"</h2>
<p>I used to think compliance was something you dealt with after you had "real customers." Then I watched a promising startup spend six months retrofitting their entire infrastructure because they needed SOC 2 to close a big deal.</p>
<p><strong>Here's the reality check:</strong> If you're collecting any user data (and you probably are), you're going to need to think about compliance eventually. Starting early is way easier than trying to bolt it on later.</p>
<p><strong>Baby steps that make a big difference:</strong></p>
<ul>
<li><p>Know what type of data you're storing (personal info, payment data, health records)</p>
</li>
<li><p>Encrypt everything (in transit and at rest)</p>
</li>
<li><p>Document your security practices as you go</p>
</li>
<li><p>Consider compliance requirements for your target market</p>
</li>
</ul>
<h2 id="heading-backups-are-like-insurance-you-need-them-before-you-need-them">Backups Are Like Insurance (You Need Them Before You Need Them)</h2>
<p>"We'll set up backups next sprint" is probably the most expensive technical debt you can accumulate. I've seen too many companies learn this lesson the hard way.</p>
<p><strong>Make it automatic:</strong></p>
<ul>
<li><p>Set up automated daily backups</p>
</li>
<li><p>Store them in a different region (or better yet, a different account)</p>
</li>
<li><p>Actually test your recovery process – don't just assume it works</p>
</li>
<li><p>Have a plan for different scenarios (accidental deletion vs. ransomware vs. natural disaster)</p>
</li>
</ul>
<h2 id="heading-the-real-talk-section">The Real Talk Section</h2>
<p>Look, security isn't sexy. It doesn't directly add features your users will notice. It's easy to deprioritize when you're trying to find product-market fit or close your next funding round.</p>
<p>But here's what I've learned after years in this space: the companies that treat security as a feature of their product – not an afterthought – are the ones that scale successfully. They're the ones that don't have to pause everything to deal with a breach. They're the ones that can confidently tell enterprise customers "yes, we take security seriously."</p>
<h2 id="heading-your-startup-security-checklist">Your Startup Security Checklist</h2>
<p>Here's what you can knock out this week (seriously, most of this takes less than a day):</p>
<p><strong>Week 1 priorities:</strong></p>
<ul>
<li><p>✅ Lock down all storage buckets (default to private)</p>
</li>
<li><p>✅ Create individual IAM accounts for everyone</p>
</li>
<li><p>✅ Enable MFA everywhere</p>
</li>
<li><p>✅ Set up basic spending alerts</p>
</li>
</ul>
<p><strong>Month 1 priorities:</strong></p>
<ul>
<li><p>✅ Move all secrets to a proper secrets manager</p>
</li>
<li><p>✅ Enable basic logging and monitoring</p>
</li>
<li><p>✅ Set up automated backups</p>
</li>
<li><p>✅ Document your current security practices</p>
</li>
</ul>
<p><strong>Quarter 1 priorities:</strong></p>
<ul>
<li><p>✅ Regular access audits</p>
</li>
<li><p>✅ Test your backup recovery</p>
</li>
<li><p>✅ Evaluate compliance requirements</p>
</li>
<li><p>✅ Security training for the team</p>
</li>
</ul>
<h2 id="heading-bottom-line">Bottom Line</h2>
<p>Every successful startup I know has had at least one "oh shit" moment with security. The difference between the ones that survive and thrive versus the ones that don't is usually just timing – did they get serious about security before or after something went wrong?</p>
<p>The cloud gives you superpowers, but like any superpower, it comes with responsibility. The good news? Most of this stuff is way easier to implement than you think, and future you will be incredibly grateful that present you took the time to do it right.</p>
<p>Your users are trusting you with their data. Your investors are trusting you with their money. And honestly, you're probably trusting your entire company's future to your cloud infrastructure.</p>
<p>That trust is worth protecting.</p>
<hr />
<p><em>What's your startup's biggest cloud security concern? Drop me a line – I love helping founders navigate this stuff, and I promise not to judge you for any shortcuts you might have taken. We've all been there.</em></p>
]]></content:encoded></item><item><title><![CDATA[Create and Manage a Kubernetes Cluster from Scratch using AWS EC2 instances]]></title><description><![CDATA[Kubernetes has become the go-to solution for container orchestration, offering robust capabilities to automate the deployment, scaling, and management of containerized applications. In this blog post, we will walk through the process of creating a Ku...]]></description><link>https://blog.essare.me/create-and-manage-a-kubernetes-cluster-from-scratch-using-amazon-ec2</link><guid isPermaLink="true">https://blog.essare.me/create-and-manage-a-kubernetes-cluster-from-scratch-using-amazon-ec2</guid><category><![CDATA[Kubernetes]]></category><category><![CDATA[#k8scluster]]></category><category><![CDATA[AWS]]></category><category><![CDATA[EC2 instance]]></category><category><![CDATA[Cloud Computing]]></category><category><![CDATA[Orchestration]]></category><dc:creator><![CDATA[Ayoub Essare]]></dc:creator><pubDate>Sat, 17 Feb 2024 21:45:17 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1708206805466/28e9c658-ef95-4b68-8152-dfdd71b2f73a.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Kubernetes has become the go-to solution for container orchestration, offering robust capabilities to automate the deployment, scaling, and management of containerized applications. In this blog post, we will walk through the process of creating a Kubernetes cluster that adheres to best practices from scratch using the <code>kubeadm</code> cluster bootstrapping utility. Even if you intend to use fully managed Kubernetes clusters, this tutorial provides you with a deeper understanding of Kubernetes clusters and helps you decide on the cluster configuration that is best for your requirements.</p>
<h3 id="heading-blog-post-objectives">Blog post Objectives</h3>
<p>Upon completion of this tutorial, you will be able to:</p>
<ul>
<li><p>Install kubeadm and its dependencies</p>
</li>
<li><p>Initialize a control-plane  node</p>
</li>
<li><p>Join a node to a cluster</p>
</li>
<li><p>Configure a network plugin</p>
</li>
</ul>
<h3 id="heading-prerequisites">Prerequisites</h3>
<p>You should be familiar with:</p>
<ul>
<li><p>Working with Kubernetes to deploy applications</p>
</li>
<li><p>Working at the command line in Linux</p>
</li>
</ul>
<p>At the end of this blog post, you will be able to create a K8S Cluster with a Master Node and two Worker Nodes</p>
<p><img src="https://cloudacademy.com/_next/hanami/image/?url=https%3A%2F%2Fassets.cloudacademy.com%2Fbakery%2Fmedia%2Fuploads%2Flaboratories%2Fenvironment_end_images%2Fafter_Bh4Lxw9.png&amp;w=3840&amp;q=75" alt="environment after" class="image--center mx-auto" /></p>
<p>This tutorial experience involves Amazon Web Services (AWS), and we'll use the AWS Management Console.</p>
<p><img src="https://assets.cloudacademy.com/bakery/media/uploads/content_engine/image-20220203152252-1-c91e8064-669f-4444-b3ba-c0c39199176a.png" alt="alt" class="image--center mx-auto" /></p>
<details><summary>The AWS Management Console is a web control panel for managing all your AWS resources, from EC2 instances to SNS topics. The console enables cloud management for all aspects of the AWS account, including managing security credentials and even setting up new IAM Users.</summary><div data-type="detailsContent"></div></details>

<h2 id="heading-creating-3-aws-ec2-instances">Creating 3 AWS EC2 Instances</h2>
<p>Start by creating 3 Ubuntu instances with the following names:</p>
<ol>
<li><p>instance-a</p>
</li>
<li><p>instance-b</p>
</li>
<li><p>instance-c</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1708198538065/ca375544-ff7c-49a1-971d-69e6d68d492e.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1708199547074/08afac0d-af3f-41e8-b795-4557cc54795e.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1708198758275/af4716e8-ad77-4628-a909-64b5e0c06399.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-connecting-to-an-ec2-instance">Connecting to an EC2 Instance</h2>
<p>We will connect to the three Amazon EC2 instances and configure them to be a Kubernetes cluster. In later steps, we'll connect to instances named <strong>instance-b</strong> and <strong>instance-c</strong>.</p>
<p>Now we have our 3 EC2 instances UP and running, let's connect to the instance named <strong>instance-a</strong> using the Amazon EC2 Instance Connect:</p>
<p>Right-click the instance named <strong>instance-a</strong>, and click <strong>Connect</strong>:</p>
<p><img src="https://assets.cloudacademy.com/bakery/media/uploads/content_engine/image-20220406121346-6-0126ad09-c02c-42d7-a329-73b67746ba72.png" alt="alt" class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1708199309616/2b7bf465-41e9-4b75-bceb-7ea5233b4d6e.png" alt class="image--center mx-auto" /></p>
<p>A browser-based shell will open in a new window and you will see a shell similar to:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1708199807449/c3aa2fca-cf35-4db5-a4be-d5f6dfe32fa1.png" alt class="image--center mx-auto" /></p>
<p>Now that we are connected to our <strong>instance-a</strong> let's see what <strong><em>kubeadm</em></strong> is:</p>
<p><code>kubeadm</code> is a tool that allows you to easily create Kubernetes clusters. It can also perform a variety of cluster lifecycle functions, such as upgrading and downgrading the version of Kubernetes on nodes in the cluster. We will use <code>kubeadm</code> to create a Kubernetes cluster from scratch. Creating clusters with <code>kubeadm</code> is the recommended way for learning Kubernetes, creating small clusters, and as a piece of more complex systems for more enterprise-ready clusters.</p>
<h2 id="heading-installing-kubeadm-and-its-dependencies">Installing Kubeadm and its Dependencies</h2>
<p>Our three EC2 instances running the Ubuntu distribution of Linux. we will configure the instance "<strong>instance-a"</strong> as a Kubernetes control-plane and the other instances as worker nodes in the cluster. In this step, we will install <code>kubeadm</code> and its dependencies, including containerd.</p>
<ol>
<li>Enter the following command to update the system's apt package manager index and update packages required to install containerd:</li>
</ol>
<pre><code class="lang-bash">
<span class="hljs-comment"># Update the package index</span>
sudo apt-get update
<span class="hljs-comment"># Update packages required for HTTPS package repository access</span>
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release
</code></pre>
<ol>
<li>Allow forwarding IPv4 by loading the br_netfilter module with the following commands:</li>
</ol>
<pre><code class="lang-bash">
<span class="hljs-comment"># Load br_netfilter module</span>
sudo modprobe overlay
sudo modprobe br_netfilter
cat &lt;&lt;EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
</code></pre>
<ol>
<li>Allow the Linux node's iptables to correctly view bridged traffic with the following commands:</li>
</ol>
<pre><code class="lang-bash">
<span class="hljs-comment"># sysctl params required by setup, params persist across reboots</span>
cat &lt;&lt;EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
<span class="hljs-comment"># Apply sysctl params without reboot</span>
sudo sysctl --system
</code></pre>
<ol>
<li>Install containerd using the DEB package distributed by Docker with the following commands:</li>
</ol>
<pre><code class="lang-bash">
<span class="hljs-comment"># Add Docker’s official GPG key</span>
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
<span class="hljs-comment"># Set up the repository</span>
<span class="hljs-built_in">echo</span> \
  <span class="hljs-string">"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  <span class="hljs-subst">$(lsb_release -cs)</span> stable"</span> | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null
<span class="hljs-comment"># Install containerd</span>
sudo apt-get update
sudo apt-get install -y containerd.io=1.6.18-1
</code></pre>
<p><em>Note</em>: This is only one way of installing containerd. Please refer <a target="_blank" href="https://github.com/containerd/containerd/blob/main/docs/getting-started.md">here</a> for the other options.</p>
<ol>
<li>Configure the systemd cgroup driver with the following commands:</li>
</ol>
<pre><code class="lang-bash">
<span class="hljs-comment"># Configure the systemd cgroup driver</span>
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i <span class="hljs-string">'s/SystemdCgroup = false/SystemdCgroup = true/'</span> /etc/containerd/config.toml
sudo systemctl restart containerd
</code></pre>
<p>This is required to mitigate the instability of having two cgroup managers. Please refer <a target="_blank" href="https://kubernetes.io/docs/setup/production-environment/container-runtimes/">here</a> for further explanation.</p>
<ol>
<li>Install <code>kubeadm</code>, <code>kubectl</code>, and <code>kubelet</code> from the official Kubernetes package repository:</li>
</ol>
<pre><code class="lang-bash">
<span class="hljs-comment"># Add the Google Cloud packages GPG key</span>
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
<span class="hljs-comment"># Add the Kubernetes release repository</span>
sudo add-apt-repository <span class="hljs-string">"deb http://apt.kubernetes.io/ kubernetes-xenial main"</span>
<span class="hljs-comment"># Update the package index to include the Kubernetes repository</span>
sudo apt-get update
<span class="hljs-comment"># Install the packages</span>
sudo apt-get install -y kubeadm=1.28.1-00 kubelet=1.28.1-00 kubectl=1.28.1-00
</code></pre>
<ol>
<li>Prevent automatic updates to the installed packages with the following command:</li>
</ol>
<pre><code class="lang-bash">
sudo apt-mark hold kubelet kubeadm kubectl
</code></pre>
<p>The version of all the packages is set to 1.28.1 for consistency in this tutorial experience, and so that we can perform a cluster upgrade in a later blog post.</p>
<ol>
<li>Display the help page for kubeadm:</li>
</ol>
<pre><code class="lang-bash">
kubeadm
</code></pre>
<p><img src="https://assets.cloudacademy.com/bakery/media/uploads/content_engine/image-20221104092617-38-80ae7227-aabb-42ef-a48f-cd110a57ee44.png" alt="alt" class="image--center mx-auto" /></p>
<p>Read through the output to get a high-level overview of how a cluster is created and the commands that are available in <code>kubeadm</code>.</p>
<p>After setting the first instance-a up we must do the same thing for instance-b and instance-c: Right-click the instance named <strong>instance-b</strong>, and click <strong>Connect</strong>:</p>
<p><img src="https://assets.cloudacademy.com/bakery/media/uploads/content_engine/image-20220406121346-6-0126ad09-c02c-42d7-a329-73b67746ba72.png" alt="alt" class="image--center mx-auto" /></p>
<p>After connecting the instance-b, enter the same commands we have executed before for the instance-b, The same steps should be done for instance-c</p>
<p>Now that <code>kubeadm</code> is configured on the 3 EC2 instances, connect back the instance-a to configure it as the master node for our k8s cluster.</p>
<p>Initializing the Kubernetes Master Node</p>
<p>We will use <code>kubeadm</code> to initialize the control-plane node. The initialization process will create a certificate authority for secure cluster communication and authentication, and start all the node components (<code>kubelet</code>), control-plane components (API server, controller manager, scheduler, etcd), and common add-ons (<code>kube-proxy</code>, DNS). You will see how easy the initialization process is with <code>kubeadm</code>.</p>
<p>The initialization uses sensible default values that adhere to best practices. However, <a target="_blank" href="https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/#options">many command options</a> are available to configure the process, including if you want to provide your own certificate authority or if you want to use an external etcd key-value store. One option that you will use is required by the pod network plugin that you will install after the control-plane is initialized. <code>kubeadm</code> does not install a default network plugin for you. You will use Calico as the pod network plugin. Calico supports Kubernetes network policies. For network policies to function properly, you must use the <code>--pod-network-cidr</code> option to specify a range of IP addresses for the pod network when initializing the control-plane node with <code>kubeadm</code>.</p>
<p>There are many network plugins besides Calico. Calico is used primarily because it is used in clusters in <a target="_blank" href="https://docs.linuxfoundation.org/tc-docs/certification/tips-cka-and-ckad">Kubernetes certification exams</a> and it supports network policies. Calico is used internally by AWS, Azure, and GCP for their managed Kubernetes offerings, so you can be certain it is production-ready. However, if all of your environments live in AWS, you may consider the <a target="_blank" href="https://github.com/aws/amazon-vpc-cni-k8s">Amazon VPC network plugin</a>.</p>
<ol>
<li>Initialize the control-plane node using the init command:</li>
</ol>
<pre><code class="lang-bash">
sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --kubernetes-version=stable-1.28
</code></pre>
<p>The pod network CIDR block (<code>192.168.0.0/16</code>) is the default used by <a target="_blank" href="https://cloudacademy.com/lab/create-manage-kubernetes-cluster-scratch/initializing-kuberenetes-master-node/?context_id=7846&amp;context_resource=lp&amp;program=b145d902-677b-49a8-ba1d-371c35e8543a#">Calico.</a> The CIDR does not overlap with the Amazon VPC network CIDR used in this tutorial. If it did, you would need to perform additional configuration of Calico later on to avoid the overlap. The output reports the steps that <code>kubeadm</code> takes to initialize the control-plane:</p>
<p><img src="https://assets.cloudacademy.com/bakery/media/uploads/blobid0-f7a28574-377b-43ff-b13c-fcbe2d8111f9.png" alt="alt" class="image--center mx-auto" /></p>
<p>Read through the output to understand what is happening. At the end of the output, useful commands for configuring <code>kubectl</code> and joining worker nodes to the cluster are given:</p>
<p><img src="https://assets.cloudacademy.com/bakery/media/uploads/content_engine/image-20221102131801-6-b248c8ed-dbd3-45e6-a7b7-d0f309654427.png" alt="alt" class="image--center mx-auto" /></p>
<ol>
<li>Copy the <code>kubeadm join</code> command at the end of the output and store it somewhere you can access later.</li>
</ol>
<p>It is simply convenient to reuse the given command, although you can regenerate it and create new tokens using the <code>kubeadm token</code> command. The join tokens expire after 24 hours by default.</p>
<ol>
<li>Initialize your user's default <code>kubectl</code> configuration using the admin kubeconfig file generated by <code>kubeadm</code>:</li>
</ol>
<pre><code class="lang-bash">
mkdir -p <span class="hljs-variable">$HOME</span>/.kube
sudo cp -i /etc/kubernetes/admin.conf <span class="hljs-variable">$HOME</span>/.kube/config
sudo chown $(id -u):$(id -g) <span class="hljs-variable">$HOME</span>/.kube/config
</code></pre>
<ol>
<li>Confirm you can use <code>kubectl</code> to get the cluster component statuses:</li>
</ol>
<pre><code class="lang-bash">
kubectl get componentstatuses
</code></pre>
<p><img src="https://assets.cloudacademy.com/bakery/media/uploads/content_engine/image-20221102131931-7-f4bc9caa-51a9-403d-8aec-58e6d5a91f77.png" alt="alt" class="image--center mx-auto" /></p>
<p>The output confirms that the <strong>scheduler</strong>, <strong>controller-manager</strong>, and <strong>etcd</strong> are all <strong>Healthy</strong>. The Kubernetes API server is also operational, or <code>kubectl</code> would have returned an error attempting to connect to the API server. Enter <code>kubeadm token --help</code> if you would like to know more about <code>kubeadm</code> tokens.</p>
<ol>
<li><p>Get the nodes in the cluster:</p>
<pre><code class="lang-bash">
 kubectl get nodes
</code></pre>
<p> <img src="https://assets.cloudacademy.com/bakery/media/uploads/content_engine/image-20221102132008-8-8067fb92-90ca-442f-ac92-3d7b5322dce7.png" alt="alt" /></p>
<p> The control-plane node is reporting a <strong>STATUS</strong> of <strong>NotReady</strong>. Notice <code>kubeadm</code> gives the node a <strong>NAME</strong> based on its IP address. The <code>--node-name</code> option can be used to override the default behavior.</p>
</li>
<li><p>Describe the node to probe deeper into its NotReady status:</p>
</li>
</ol>
<pre><code class="lang-bash">
kubectl describe nodes
</code></pre>
<p>In the <strong>Conditions</strong> section of the output, observe the <strong>Ready</strong> condition is False, and read the <strong>Message</strong>:</p>
<p><img src="https://assets.cloudacademy.com/bakery/media/uploads/content_engine/image-20221103163900-36-b8def2ac-3de4-460c-a466-2dc2ede8cd57.png" alt="alt" /></p>
<p>The kubelet is not ready because the network plugin is not ready. The <strong>cni config uninitialized</strong> refers to the <a target="_blank" href="https://github.com/containernetworking/cni">container network interface</a> (CNI) and is a related problem. Network plugins implement the CNI interface. You will resolve the issue by initializing the Calico network plugin.</p>
<ol>
<li>Enter the following commands to create the Calico network plugin for pod networking:</li>
</ol>
<pre><code class="lang-bash">
kubectl apply -f https://clouda-labs-assets.s3.us-west-2.amazonaws.com/k8s-common/1.28/scripts/calico.yaml
</code></pre>
<p><img src="https://assets.cloudacademy.com/bakery/media/uploads/content_engine/image-20230210150701-1-fc5fb563-bf3a-4c4b-9914-b1a193762131.png" alt="alt" class="image--center mx-auto" /></p>
<p>A variety of resources are created to support pod networking. A daemonset is used to run a Calico-node pod on each node in the cluster. The resources include several custom resources (customresourcedefinition) that extend the Kubernetes API, for example, to support network policies (networkpolicies.crd.projectcalico.org). Many network plugins have a similar installation procedure.</p>
<ol>
<li>Watch the status of the nodes in the cluster:</li>
</ol>
<pre><code class="lang-bash">
watch kubectl get nodes
</code></pre>
<p><img src="https://assets.cloudacademy.com/bakery/media/uploads/content_engine/image-20221102223750-13-f98f69e4-b3d5-426b-8600-3160ec52082e.png" alt="alt" /></p>
<p>With the network plugin initialized, the control-plane node is now <strong>Ready</strong>. <em>Note</em>: It may take a minute to reach the <strong>Ready</strong> state.</p>
<p>Press <em>ctrl+c</em> to stop watching the nodes.</p>
<h2 id="heading-joining-a-worker-node-to-the-kubernetes-cluster">Joining a Worker Node to the Kubernetes Cluster</h2>
<p>The process of adding a worker node with <code>kubeadm</code> is even simpler than initializing a control-plane node. You will join a worker node to the cluster using the command that <code>kubeadm init</code></p>
<ol>
<li>Open a second terminal connected to <strong>instance-b</strong> that is listed in the EC2 Console.</li>
</ol>
<p>Refer back to the earlier steps on connecting to instance-a using EC2 Instance Connect, if required.</p>
<ol>
<li>Enter <code>sudo</code> followed by the <code>kubeadm join</code> command that you stored from the output of <code>kubeadm init</code>. It resembles:</li>
</ol>
<pre><code class="lang-bash">
sudo kubeadm join 10.0.0.100:6443 --token ... --discovery-token-ca-cert-hash sha256:...
</code></pre>
<p><img src="https://assets.cloudacademy.com/bakery/media/uploads/content_engine/image-20221103102138-28-d881d942-12be-4b6e-b4c0-df46b189707b.png" alt="alt" class="image--center mx-auto" /></p>
<p>Read through the output to understand the operations <code>kubeadm</code> performed.</p>
<ol>
<li>In the control-plane node's SSH shell, confirm the worker node is part of the cluster:</li>
</ol>
<pre><code class="lang-bash">
kubectl get nodes
</code></pre>
<p><img src="https://assets.cloudacademy.com/bakery/media/uploads/content_engine/image-20221103095310-15-7c1a6850-f4a7-4c03-84c1-50cf81df6b63.png" alt="alt" /></p>
<p>The worker node appears with a role of <strong>&lt;none&gt;</strong>.</p>
<p><em>Note</em>: It may take a minute for the worker node to become <strong>Ready</strong>.</p>
<p>Confirm that all the pods in the cluster are running:</p>
<pre><code class="lang-bash">
kubectl get pods --all-namespaces
</code></pre>
<p><img src="https://assets.cloudacademy.com/bakery/media/uploads/content_engine/image-20230210150817-3-44e252f3-6007-4536-97a2-1458a16f3544.png" alt="alt" /></p>
<p>All of the pods are <strong>Running</strong>, and the two-node cluster is operational. Notice that there are two Calico pods that support pod networking on each node.</p>
<h3 id="heading-summary">Summary</h3>
<p>In this blog post, we have transformed 3 EC2 simple instances into a Kubernetes Cluster having one Master Node and 2 Worker Nodes, we have also configured Calico as a pod network plugin.</p>
]]></content:encoded></item></channel></rss>