<?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>DEV Community: Ileriayo Adebiyi</title>
    <description>The latest articles on DEV Community by Ileriayo Adebiyi (@ileriayo).</description>
    <link>https://dev.to/ileriayo</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%2F329462%2F238a18de-faf1-47d1-bfe1-fa75ebda855a.JPG</url>
      <title>DEV Community: Ileriayo Adebiyi</title>
      <link>https://dev.to/ileriayo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ileriayo"/>
    <language>en</language>
    <item>
      <title>Debugging an AWS CodeBuild Failure</title>
      <dc:creator>Ileriayo Adebiyi</dc:creator>
      <pubDate>Wed, 27 Aug 2025 12:53:25 +0000</pubDate>
      <link>https://dev.to/ileriayo/debugging-an-aws-codebuild-failure-3kn5</link>
      <guid>https://dev.to/ileriayo/debugging-an-aws-codebuild-failure-3kn5</guid>
      <description>&lt;p&gt;My introduction to AWS CodeBuild was an error log sent to me by a software engineer. I saw in the logs a NestJS application, as indicated by the &lt;code&gt;nest start&lt;/code&gt; command in it.&lt;/p&gt;

&lt;p&gt;I immediately recognized from the name of the AWS service (CodeBuild) and from the logs that this had to be a build system, similar to what you could achieve in GitHub Actions.&lt;/p&gt;

&lt;p&gt;Well, a &lt;code&gt;nest build&lt;/code&gt; command was failing; however, it seemed to run successfully on the engineer's computer.&lt;/p&gt;

&lt;p&gt;I needed to understand how CodeBuild was being triggered, and like most build systems, there ought to be a build config. I didn't find anything useful while browsing the AWS Console, so I looked at the root of the repo and found a &lt;code&gt;buildspec.yml&lt;/code&gt;. This had to be it.&lt;/p&gt;

&lt;p&gt;Looking in the file, I found something that made sense:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: 0.2

phases:
  install:
    commands:
      - npm install
      - npm install typescript
  pre_build:
    commands:
      ...
  build:
    commands:
      ...
  post_build:
    commands:
      ...
artifacts:
  files:
    - '**/*'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There must be some way to run this locally in a container, I thought, and true to that, I found that I could.&lt;/p&gt;

&lt;p&gt;First, I pulled the Amazon Linux 2 image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker pull public.ecr.aws/codebuild/amazonlinux-x86_64-standard:4.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, I pulled the agent (x86_64 version)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker pull public.ecr.aws/codebuild/local-builds:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Afterwards, I downloaded a bash script into the root of the repository and made it executable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ curl -O  https://raw.githubusercontent.com/aws/aws-codebuild-docker-images/master/local_builds/codebuild_build.sh

$ chmod +x codebuild_build.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, I ran the script with the&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./codebuild_build.sh -i public.ecr.aws/codebuild/amazonlinux-x86_64-standard:4.0 -a &amp;lt;output directory&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then the logs came out just like I saw on the AWS Console.&lt;/p&gt;

&lt;p&gt;After examing the logs and the application code, it was the typescript version that needed a change.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: 0.2

phases:
  install:
    commands:
      - npm install
      - npm install typescript@5.5.4
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running the script one more time with this new buildspec.yml, there was no failure.&lt;/p&gt;

&lt;p&gt;I made a PR, and that problem was fixed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros of Debugging locally:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cost: AWS charges you for every build on AWS CodeBuild. Rerunning the CodeBuild with costs low.&lt;/li&gt;
&lt;li&gt;Velocity: You can make changes locally and test all within an IDE, skipping the need for commits, PR reviews, etc.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Cons of Debuigging locally:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Amazon Linux Image may be large and might pose a challenge in a low internet environment.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>devops</category>
      <category>cloudnative</category>
    </item>
    <item>
      <title>Something You Didn't Know About AWS Availability Zones</title>
      <dc:creator>Ileriayo Adebiyi</dc:creator>
      <pubDate>Wed, 15 Jan 2025 13:57:06 +0000</pubDate>
      <link>https://dev.to/ileriayo/something-you-didnt-know-about-aws-availability-zones-20fn</link>
      <guid>https://dev.to/ileriayo/something-you-didnt-know-about-aws-availability-zones-20fn</guid>
      <description>&lt;h2&gt;
  
  
  DataCenters
&lt;/h2&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%2Fvvtoj9qgae9tbahomfje.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%2Fvvtoj9qgae9tbahomfje.png" alt="An AWS Datacenter" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An AWS region e.g. &lt;strong&gt;us-east-1&lt;/strong&gt; has physical data centers where the actual infrastructure lives, e.g. us-east-1a, us-east-1b, etc.&lt;/p&gt;

&lt;p&gt;But there's something you may not have known:&lt;/p&gt;

&lt;p&gt;Availability Zones (AZs) in an AWS account may not always refer to the same data center(s) in a different AWS account.&lt;/p&gt;

&lt;p&gt;In other words, for a region us-east-1, the AZ us-east-1a in one person's account (Account A) may not be in the same data center as the AZ us-east-1a in another person's account (Account B).&lt;/p&gt;

&lt;p&gt;To ensure that resources provisioned in different AWS Accounts are placed in the same physical location, using the AZ name is not a reliable option.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Should You Care?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Latency&lt;/strong&gt;: In a multi-account environment, where you have different AWS accounts for different purposes, you may require a service in one account to connect with another service in a different account. By placing those services in the same physical data center, the number of hops is reduced.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compliance&lt;/strong&gt;: In other to comply with company or national policies, some services may be required to stay in a particular location. Placing those services in the same region is a great way to ensure compliance, and you can go further to ensure that they are in the same physical data center.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you care, then there is a solution -- Zone IDs!&lt;/p&gt;

&lt;h2&gt;
  
  
  Availability Zone ID
&lt;/h2&gt;

&lt;p&gt;An Availability Zone ID is an ID that is consistent across all AWS accounts. An AZ Zone ID in Account A is the same physical data center for the same Zone ID in Account B.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AZ Zone Name is not necessarily the same physical location in different AWS Accounts&lt;/li&gt;
&lt;li&gt;AZ Zone ID is the same physical location in different AWS Accounts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get the availability zone ID, you can use the following command:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;aws ec2 describe-availability-zones --region us-east-1&lt;/code&gt;&lt;br&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%2Fppazk201dvndatvcmdm1.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%2Fppazk201dvndatvcmdm1.png" alt="Availability Zone ID" width="800" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can now proceed to use the Zone ID reliably.&lt;/p&gt;

&lt;p&gt;Cheers!&lt;/p&gt;

&lt;p&gt;If you liked this, let me know by reacting to this post or leaving a comment.&lt;/p&gt;

&lt;p&gt;You can also Follow me on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;X/Twitter: &lt;a href="https://x.com/ileriayooo" rel="noopener noreferrer"&gt;https://x.com/ileriayooo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn: &lt;a href="https://linkedin.com/in/ileriayoadebiyi" rel="noopener noreferrer"&gt;https://linkedin.com/in/ileriayoadebiyi&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>Learning GCP, Pragmatic GKE</title>
      <dc:creator>Ileriayo Adebiyi</dc:creator>
      <pubDate>Sat, 19 Aug 2023 08:54:40 +0000</pubDate>
      <link>https://dev.to/ileriayo/learning-gcp-pragmatic-gke-f82</link>
      <guid>https://dev.to/ileriayo/learning-gcp-pragmatic-gke-f82</guid>
      <description>&lt;p&gt;I'm currently working on a project in GCP, even though I started with very little (stale) knowledge, I think I'm progressing well.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's working for me:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Concept/Fundamentals
&lt;/h3&gt;

&lt;p&gt;Before getting on the project, I did some Udemy videos to get familiar with the terminology, especially for IAM. I often had the videos on 1.5x or 2x, as the concepts were similar to other public clouds that I was familiar with.&lt;/p&gt;

&lt;p&gt;My reason for videos was to have a picture of things. The GCP Console, where to find things, etc.&lt;/p&gt;

&lt;p&gt;No depth at this point.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Drill Into
&lt;/h3&gt;

&lt;p&gt;I already knew I was going to be working primarily with Google Kubernetes Engine, and by the time I got on the project, I needed specifics.&lt;/p&gt;

&lt;p&gt;I was on the GKE Docs MOST of the time, learning how things fit together. &lt;/p&gt;

&lt;p&gt;Now, I already had some good knowledge of Kubernetes which I had gotten from previous experiences and also from being certified.&lt;/p&gt;

&lt;p&gt;My task was pretty simple though: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy and expose a K8s Operator&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Meanwhile, check out this thread on why I think you should take the Kubernetes Certification(s). &lt;a href="https://twitter.com/Ileriayooo/status/1610323839992430593" rel="noopener noreferrer"&gt;https://twitter.com/Ileriayooo/status/1610323839992430593&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As simple as that may sound, it took about 3 days of reading the Docs to understand things properly.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Practice
&lt;/h3&gt;

&lt;p&gt;All this would not make sense without getting hands-on. You learn by doing.&lt;/p&gt;

&lt;p&gt;Deploying the operator was the simplest part. A helm release in Terraform with the appropriate attributes and then a "terraform apply" gets the job done.&lt;/p&gt;

&lt;p&gt;Exposing the operator was the sweetest!&lt;/p&gt;

&lt;p&gt;Ingress, off course!! But that was just the beginning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(a) Performance&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This deployment needed to use Container Native Load Balancing. What does this mean?&lt;/p&gt;

&lt;p&gt;Typically, Load Balancers are not "container aware", i.e., rather than route traffic to containers, traffic is routed to the k8s nodes (or VMs) that host the pods(containers).&lt;/p&gt;

&lt;p&gt;After routing to the nodes, Iptable rules ensure that the traffic gets to the right pod. This pod may be on a different node, which means that the traffic has to leave that initial node in order to get to the destined pod.&lt;/p&gt;

&lt;p&gt;With CNLB, the LoadBalancer is aware of the pods and can route traffic directly, skipping the extra hops. &lt;/p&gt;

&lt;p&gt;This performance gain could not be overlooked!&lt;/p&gt;

&lt;p&gt;Further into the docs, I discovered that by default, CNLB is enabled on GKE clusters if they are:&lt;/p&gt;

&lt;p&gt;i) GKE clusters 1.17.6-gke.7 and up&lt;/p&gt;

&lt;p&gt;ii) using VPC-native clusters&lt;/p&gt;

&lt;p&gt;iii) not using a Shared VPC&lt;/p&gt;

&lt;p&gt;iv) not using GKE Network Policy&lt;/p&gt;

&lt;p&gt;Otherwise, in order to enable that feature, one will have to explicitly annotate the K8s Service object with the following:&lt;/p&gt;

&lt;p&gt;cloud.google.com/neg: '{"ingress": true}'&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(b) Security&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Exposing this publicly was not the intention. Only a few private networks and IPs were to be able to access this web service.&lt;/p&gt;

&lt;p&gt;With Cloud Armor, a Security Policy was configured to allow only specific actors. This is also a good way to prevent Distributed Denial of Service (DDoS) attacks from the internet.&lt;/p&gt;

&lt;p&gt;And of course, TLS!!&lt;/p&gt;

&lt;p&gt;Google Managed Certificates are easy to get. This also means setting up Google Cloud DNS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges faced:
&lt;/h2&gt;

&lt;p&gt;Andela made us realize that Technology is usually the easiest to learn - Docs, Udemy, etc.&lt;/p&gt;

&lt;p&gt;Working solo, things look like a breeze!&lt;/p&gt;

&lt;p&gt;However, you'd soon realize that you need a different set of skills to work in a distributed team:&lt;/p&gt;

&lt;p&gt;a) Collaboration/Communication: &lt;/p&gt;

&lt;p&gt;Every attempt to run a "terraform apply" kept failing. Terraform Statefiles were centralized and stored in a different GCP Project.&lt;/p&gt;

&lt;p&gt;There is always the temptation to go try things out in a different environment.&lt;/p&gt;

&lt;p&gt;But, time is not on my side! &lt;/p&gt;

&lt;p&gt;To whom do I go?&lt;/p&gt;

&lt;p&gt;i) After several days, Slack messages, and email requests, I now have just the right amount of privilege to administer the cloud resources.&lt;/p&gt;

&lt;p&gt;ii) Git - rebase, merge, conflicts, PRs, approvals, etc. I need not say more about this.&lt;/p&gt;

&lt;p&gt;iii) TODO: insert others&lt;/p&gt;

&lt;p&gt;TLDR - Summary&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Get familiar with the fundamentals - take a beginner course&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move from the generic, go on to the specific, and drill down. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Practice - you learn by doing, not just knowing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There will always be challenges - how else will you measure progress?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Follow me on &lt;a href="https://www.linkedin.com/in/ileriayoadebiyi/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://twitter.com/Ileriayooo" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; where I talk about Cloud &amp;amp; DevOps.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>100% Off On The Kubernetes Certifications - CKAD, CKA &amp; CKS</title>
      <dc:creator>Ileriayo Adebiyi</dc:creator>
      <pubDate>Sun, 30 Jul 2023 06:06:16 +0000</pubDate>
      <link>https://dev.to/ileriayo/100-off-on-the-kubernetes-certifications-ckad-cka-cks-ggc</link>
      <guid>https://dev.to/ileriayo/100-off-on-the-kubernetes-certifications-ckad-cka-cks-ggc</guid>
      <description>&lt;p&gt;Free Kubernetes Certifications!!!&lt;/p&gt;

&lt;p&gt;Combined, the Kubernetes certifications will cost you about $1400. What if I told you that you can take the exams for free? 100%! (and no, it's not Black Friday)&lt;/p&gt;

&lt;p&gt;I'll show you 3 ways 🧵&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Linux Foundation Scholarship&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I found out in 2021 after bagging the Cloud Captain Scholarship, that scholarship recipients get access to both a training course and a certification.&lt;/p&gt;

&lt;p&gt;The LiFT Scholarship, also called The Shubhra Kar Scholarship has awarded over 2,100 scholarships for millions of dollars worth of specialized, technical training to those who may not have the ability to afford this opportunity otherwise.&lt;/p&gt;

&lt;p&gt;Getting the scholarship means getting one of the Kubernetes certifications for free.&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%2Fpun9uu95jze3youqyifo.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%2Fpun9uu95jze3youqyifo.png" alt="Lift-Scholarship" width="800" height="714"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The CNCF Ambassador Program&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I decided to join the Ambassador program this year, helping the CNCF on its mission to make Cloud Native ubiquitous. &lt;/p&gt;

&lt;p&gt;One of the numerous benefits of becoming an Ambassador is the waived cost of certification and training. &lt;/p&gt;

&lt;p&gt;This is huge, get on it!&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%2F0x336rkrzfa37wk336el.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%2F0x336rkrzfa37wk336el.png" alt="CNCF Ambassador Program" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Convince your boss&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Linux Foundation has a nifty tool that generates a letter and a quote that you can use to convince your manager.&lt;/p&gt;

&lt;p&gt;Check it out here &lt;a href="https://training.linuxfoundation.org/training/convince-your-boss/" rel="noopener noreferrer"&gt;https://training.linuxfoundation.org/training/convince-your-boss/&lt;/a&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%2F1l5zzn6v1tw5pweiejxq.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%2F1l5zzn6v1tw5pweiejxq.png" alt="Convince-your-boss" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If this post was great, like, share, and follow.&lt;/p&gt;

&lt;p&gt;This post was first shared on Twitter. Follow me there to get latest opportunities in Cloud Engineering &amp;amp; DevOps, as I usually tweet them first --&amp;gt; &lt;a href="https://twitter.com/Ileriayooo" rel="noopener noreferrer"&gt;@Ileriayooo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Unsure whthere to take the Kubernetes Certifications? Check this thread &lt;a href="https://twitter.com/Ileriayooo/status/1610323839992430593" rel="noopener noreferrer"&gt;https://twitter.com/Ileriayooo/status/1610323839992430593&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>cncf</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Up and Running with AWS Elastic Container Service (ECS) - Part 1</title>
      <dc:creator>Ileriayo Adebiyi</dc:creator>
      <pubDate>Fri, 14 Jul 2023 00:37:20 +0000</pubDate>
      <link>https://dev.to/ileriayo/up-and-running-with-aws-elastic-container-service-ecs-part-1-447j</link>
      <guid>https://dev.to/ileriayo/up-and-running-with-aws-elastic-container-service-ecs-part-1-447j</guid>
      <description>&lt;p&gt;&lt;em&gt;This post assumes at least a familiarity with building and running containers using Docker&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What is ECS
&lt;/h1&gt;

&lt;p&gt;Containerization is a computing model that allows you to package your application and it's dependencies into a runnable Image. This image can be put on any environment that has what is called a Container Runtime. Simply put, Container Runtimes allow you to run your containerized applications.&lt;/p&gt;

&lt;p&gt;Docker has become the defacto CR in the industry, and with it, you can package your application into an image, and run it as a container(s).&lt;/p&gt;

&lt;p&gt;On the Amazon Cloud (AWS), the Elastic Container Service (ECS) provides a runtime for your Image. You can deploy, manage and scale containerized applications on AWS using ECS.&lt;/p&gt;

&lt;h1&gt;
  
  
  Basics of ECS ?
&lt;/h1&gt;

&lt;p&gt;Under the hood, the infrastructure where your ECS container runs can be any of the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EC2 Instances&lt;/li&gt;
&lt;li&gt;Serverless (AWS Fargate)&lt;/li&gt;
&lt;li&gt;On-premises virtual machines (VM) or servers
This infrastructure is otherwise known as &lt;strong&gt;Capacity&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you have built a (Docker) Image, and stored it in an Image registry such as AWS Elastic Container Registry (ECR) or DockerHub, you can use ECS.&lt;/p&gt;

&lt;p&gt;First, ECS needs to know what image you want to run, the operating system of the underlying infrastructure (remember Capacity?), which ports to open for your application and what volumes to use. You must define this so that ECS knows the task that it must do. AWS calls this a Task Definition. &lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;Task Definition&lt;/strong&gt; can be created directly from the AWS Console, but in reality, it is a text file in JSON format containing the parameters mentioned above. With this task definition in place, ECS can now execute the "task".&lt;/p&gt;

&lt;p&gt;Thus, we can say that a &lt;strong&gt;Task&lt;/strong&gt; is a Task Definition that has been executed, or better put, it is an instance of a Task Definition.&lt;/p&gt;

&lt;p&gt;If you're familiar with (Docker) containers, you will know that they are (ought to be) ephemeral. Ephemeral here implies that the container can be stopped and destroyed for whatever reason. If this happens, then the Task that you created will be destroyed, and you have to recreate it manually. In order to automate the creation of tasks, we can use something called a "Service".&lt;/p&gt;

&lt;p&gt;An ECS &lt;strong&gt;Service&lt;/strong&gt; can automatically restart your Task, for instance, if a health check fails. It can also be used to run and maintain your desired number of Tasks simultaneously (or call this scaling your application) based on your Task Definition.&lt;/p&gt;

&lt;p&gt;All of this comes together under a &lt;strong&gt;Cluster&lt;/strong&gt;. A cluster is a logical grouping of Tasks or Services that runs on the Capacity infrastructure that is registered to that cluster.&lt;/p&gt;

&lt;p&gt;Lastly, in each container instance found on ECS, there is a &lt;strong&gt;Container Agent&lt;/strong&gt; that sends information about the current running tasks and resource utilization of your containers to Amazon ECS. This agent is responsible for starting and stoping tasks whenever it receives a request from Amazon ECS.&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Capacity: The underlying infrastructure for ECS e.g., EC2 servers or Serverless (fargate).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Task Definition: container information about a task such as the image to run.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Task: A running instance of the task definition.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Service: A collection of tasks, that automates things like restarting a container task.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cluster: Everything is in a cluster, this is a logical grouping of tasks and serivices. For example, you can have a cluster for a Banking app, and another for the HR app.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Container Agent: Responsible for starting and stopping container tasks, and sending resource utilization to ECS&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>aws</category>
      <category>containers</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Adding Free SSL/TLS on Kubernetes (using CertManager and LetsEncrypt)</title>
      <dc:creator>Ileriayo Adebiyi</dc:creator>
      <pubDate>Wed, 14 Jun 2023 11:37:34 +0000</pubDate>
      <link>https://dev.to/ileriayo/adding-free-ssltls-on-kubernetes-using-certmanager-and-letsencrypt-a1l</link>
      <guid>https://dev.to/ileriayo/adding-free-ssltls-on-kubernetes-using-certmanager-and-letsencrypt-a1l</guid>
      <description>&lt;p&gt;You have a shiny new Kubernetes cluster. You deploy your hello-world app and can now reach it via a NodePort service at http://:30000.&lt;/p&gt;

&lt;p&gt;As the workload begins to increase, you decide to use a Loadbalancer Service instead. But then it occurs to you - using a Loadbalancer service for each workload can become so expensive.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ingress to the rescue!
&lt;/h3&gt;

&lt;p&gt;You write a simple ingress manifest and kubectl apply! Boom 💥&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ingress&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hello-world&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example.com&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example.com&lt;/span&gt;
    &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hello-world&lt;/span&gt;
            &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt;
        &lt;span class="na"&gt;pathType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Prefix&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But without an ingress controller, your ingress resource has zero effect. You remember that some guy on YouTube had mentioned one Ingress-Nginx controller and you think let's check that out.&lt;/p&gt;

&lt;p&gt;Dang! After 2 hours, you find on StackOverflow that your k3s cluster came bundled with the Traefik Ingress Controller 😡 &lt;/p&gt;

&lt;p&gt;You create an A record to configure your domain to point to the public IP Address of the (single) node in your cluster. With a big smile, you open a new tab on your browser, head to the URL bar and navigate to your domain (example.com). You get a response, "your connection is not secure".&lt;/p&gt;

&lt;p&gt;What do you do now?&lt;/p&gt;

&lt;p&gt;In the following secion, I'll show you how to add TLS to your Kubernetes cluster using cert-manager to automate certificate management operations such as issuance and renewal.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cert-manager + LetsEncrypt
&lt;/h1&gt;

&lt;p&gt;Cert-manager is a native Kubernetes certificate management controller. It can help with issuing certificates from a variety of sources, such as Let's Encrypt, HashiCorp Vault, Venafi, a simple signing key pair, or self signed.&lt;/p&gt;

&lt;p&gt;Let's Encrypt is a nonprofit Certificate Authority that provides TLS certificates to 300 million websites.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install Cert-manager onto your cluster&lt;/li&gt;
&lt;li&gt;Add LetsEncrypt as an Issuer (or ClusterIssuer)&lt;/li&gt;
&lt;li&gt;Update ingress to use certificate&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Install Cert-manager
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; https://github.com/cert-manager/cert-manager/releases/download/v1.1.1/cert-manager.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify installation of cert-manager by checking the &lt;code&gt;cert-manager&lt;/code&gt; namespace for running pods&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get pods &lt;span class="nt"&gt;--namespace&lt;/span&gt; cert-manager

NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-5c6866597-zw7kh               1/1     Running   0          2m
cert-manager-cainjector-577f6d9fd7-tr77l   1/1     Running   0          2m
cert-manager-webhook-787858fcdb-nlzsq      1/1     Running   0          2m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All good! Proceed&lt;/p&gt;

&lt;h3&gt;
  
  
  Issuer (or ClusterIssuer) - Let's Enncrypt
&lt;/h3&gt;

&lt;p&gt;a. Create either a &lt;code&gt;clusterissuer.yaml&lt;/code&gt; manifest&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cert-manager.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ClusterIssuer&lt;/span&gt; &lt;span class="c1"&gt;# I'm using ClusterIssuer here&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;letsencrypt-prod&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;acme&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://acme-v02.api.letsencrypt.org/directory&lt;/span&gt;
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;your-email-address&amp;gt;&lt;/span&gt;
    &lt;span class="na"&gt;privateKeySecretRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;letsencrypt-prod&lt;/span&gt;
    &lt;span class="na"&gt;solvers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;http01&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;ingress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;traefik&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;b. Apply the manifest&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; clusterissuer.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create (or Update) Ingress
&lt;/h2&gt;

&lt;p&gt;The following manifest is an example ingress resource:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ingress&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hello-world&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;namespace&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;# if non-default namespace&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;cert-manager.io/cluster-issuer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;letsencrypt-prod&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example.com&lt;/span&gt; &lt;span class="c1"&gt;# your domain&lt;/span&gt;
    &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;your-service&amp;gt;&lt;/span&gt;
            &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt; &lt;span class="c1"&gt;# use appropriate port&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt;
        &lt;span class="na"&gt;pathType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Prefix&lt;/span&gt;
  &lt;span class="na"&gt;tls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;example.com&lt;/span&gt; &lt;span class="c1"&gt;# your domain &lt;/span&gt;
    &lt;span class="na"&gt;secretName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;letsencrypt-prod&lt;/span&gt; &lt;span class="c1"&gt;# secret name, same as the privateKeySecretRef in the (Cluster)Issuer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply the manifest!&lt;/p&gt;

&lt;p&gt;You can verify that a certificate has been issued&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; &amp;lt;namespace&amp;gt; describe certificate letsencrypt-prod
Spec:
  Dns Names:
    example.com
  Issuer Ref:
    Group:      cert-manager.io
    Kind:       ClusterIssuer
    Name:       letsencrypt-prod
  Secret Name:  letsencrypt-prod
  Usages:
    digital signature
    key encipherment
Status:
  Conditions:
    Last Transition Time:  2023-06-14T03:24:49Z
    Message:               Certificate is up to &lt;span class="nb"&gt;date &lt;/span&gt;and has not expired
    Observed Generation:   1
    Reason:                Ready
    Status:                True
    Type:                  Ready
  Not After:               2023-09-12T02:10:00Z
  Not Before:              2023-06-14T02:10:01Z
  Renewal Time:            2023-08-13T02:10:00Z
Events:                    &amp;lt;none&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should now have TLS configured!&lt;/p&gt;

&lt;p&gt;Leave your feedback, comments and questions below, and I'll be happy to res you.&lt;/p&gt;

&lt;p&gt;If you liked this, you can follow me on &lt;a href="https://twitter.com/Ileriayooo" rel="noopener noreferrer"&gt;Twitter (@ileriayooo)&lt;/a&gt; where I share lot's of info on Kubernetes, Cloud Native and DevOps.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>security</category>
      <category>cloud</category>
      <category>devops</category>
    </item>
    <item>
      <title>Be Kubectl Kompatible (1)</title>
      <dc:creator>Ileriayo Adebiyi</dc:creator>
      <pubDate>Mon, 12 Jun 2023 16:51:24 +0000</pubDate>
      <link>https://dev.to/ileriayo/be-kubectl-kompatible-1-1kje</link>
      <guid>https://dev.to/ileriayo/be-kubectl-kompatible-1-1kje</guid>
      <description>&lt;p&gt;Did you know that “You must use a kubectl version that is within one minor version difference of your cluster”?&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%2F49hnv55c8rpbmn3phdns.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%2F49hnv55c8rpbmn3phdns.png" alt="Image description" width="800" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What does this mean?&lt;/p&gt;

&lt;p&gt;Kubernetes uses &lt;a href="https://semver.org" rel="noopener noreferrer"&gt;Semantic Versioning&lt;/a&gt;, expressed as vX.Y.Z&lt;br&gt;
X = major version&lt;br&gt;
Y = minor version&lt;br&gt;
Z = patch version&lt;/p&gt;

&lt;p&gt;Hence, it means that for a cluster of &lt;strong&gt;v1.26&lt;/strong&gt; (major version = 1, minor version = 26), the valid versions of kubectl that you should use while interacting with the cluster should be between &lt;strong&gt;v1.25&lt;/strong&gt; and &lt;strong&gt;v1.27&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can check the version of kubectl using the command:&lt;br&gt;
&lt;code&gt;kubectl version&lt;/code&gt;.&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%2Fh1dqa35dpszf4oymz4j2.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%2Fh1dqa35dpszf4oymz4j2.png" alt="Image description" width="800" height="737"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the output of that command, you can tell whether you’re compatible or not. I have used the &lt;code&gt;--output=yaml&lt;/code&gt; flag to present the information a lot nicer.&lt;/p&gt;

&lt;p&gt;Under the &lt;code&gt;clientVersion&lt;/code&gt;, you can see the version of the kubectl client installed, while the version of the Kubernetes cluster is found under &lt;code&gt;serverVersion&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you’re not compatible, you can simply downgrade or upgrade kubectl, or better still, you can stay tuned for the part two of this series to learn an easier and better way to handle this.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>versioning</category>
      <category>cloudnative</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Becoming a Cloud Engineer in 2023 (A Roadmap)</title>
      <dc:creator>Ileriayo Adebiyi</dc:creator>
      <pubDate>Mon, 16 Jan 2023 13:38:44 +0000</pubDate>
      <link>https://dev.to/ileriayo/becoming-a-cloud-engineer-in-2023-a-roadmap-1f6k</link>
      <guid>https://dev.to/ileriayo/becoming-a-cloud-engineer-in-2023-a-roadmap-1f6k</guid>
      <description>&lt;p&gt;Here is Simon Holdorf’s recommendation for becoming a Cloud Engineer in 2023.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: The Role&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On a high level, a cloud engineer is responsible for designing, building, and maintaining an organization's cloud computing infrastructure and systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: The Fundamentals&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't skip the Fundamentals!&lt;/p&gt;

&lt;p&gt;Learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;General Cloud Computing&lt;/li&gt;
&lt;li&gt;Networking&lt;/li&gt;
&lt;li&gt;Operating systems&lt;/li&gt;
&lt;li&gt;Virtualization&lt;/li&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Selecting a Cloud Provider&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is beneficial to have experience with multiple cloud providers as a cloud engineer.&lt;/p&gt;

&lt;p&gt;If you are starting, I would highly recommend concentrating on one cloud provider first: AWS, Azure, or GCP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Acquiring programming knowledge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As a cloud engineer, it is important to understand at least one programming or scripting language, especially for automating tasks and provision resources in the cloud.&lt;/p&gt;

&lt;p&gt;Know your way around Git and a product like GitHub or Gitlab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Learning DevOps principles &amp;amp; tools&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DevOps is a set of practices that aims to improve collaboration between development and operations teams and increase software delivery speed and reliability.&lt;/p&gt;

&lt;p&gt;Know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI/CD&lt;/li&gt;
&lt;li&gt;IaC&lt;/li&gt;
&lt;li&gt;Monitoring &amp;amp; Logging&lt;/li&gt;
&lt;li&gt;Collaboration &amp;amp; Communication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Gaining Hands-On experience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Seeking opportunities to gain practical, hands-on experience with cloud technologies is essential to becoming a successful cloud engineer.&lt;/p&gt;

&lt;p&gt;The first step is to create an account with one of the big cloud providers, AWS, Azure, or GCP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step: 7 Earning Certifications&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Obtaining a certification can be beneficial for several reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validation of skills&lt;/li&gt;
&lt;li&gt;Improved job prospects&lt;/li&gt;
&lt;li&gt;Professional development&lt;/li&gt;
&lt;li&gt;Increased earning potential&lt;/li&gt;
&lt;li&gt;Fun challenge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To become a successful Cloud Engineer, you need to have a mindset focused on delivering scalable, reliable, and secure solutions.&lt;/p&gt;

&lt;p&gt;Check out Simon's video &lt;a href="https://www.youtube.com/watch?v=6Yi3c259RE0" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=6Yi3c259RE0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow Ileriayo Adebiyi on LinkedIn &amp;amp; Twitter for more on Cloud &amp;amp; DevOps.&lt;br&gt;
LinkedIn: &lt;a href="https://www.linkedin.com/in/ileriayoadebiyi" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/ileriayoadebiyi&lt;/a&gt;&lt;br&gt;
Twitter: &lt;a href="https://twitter.com/ileriayooo" rel="noopener noreferrer"&gt;https://twitter.com/ileriayooo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>aws</category>
      <category>devops</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Managing Multiple Environments With Terraform</title>
      <dc:creator>Ileriayo Adebiyi</dc:creator>
      <pubDate>Mon, 16 Jan 2023 13:14:12 +0000</pubDate>
      <link>https://dev.to/ileriayo/managing-multiple-environments-with-terraform-4chi</link>
      <guid>https://dev.to/ileriayo/managing-multiple-environments-with-terraform-4chi</guid>
      <description>&lt;p&gt;Managing Multiple Environments With Terraform&lt;/p&gt;

&lt;p&gt;If you want to manage multiple environments with Terraform e.g., Dev, Stage, and Prod, you can use either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;workspaces or&lt;/li&gt;
&lt;li&gt;git branches (dev, stage, prod)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But there's a third. Just before that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Workspaces seem good at first:&lt;/li&gt;
&lt;li&gt;native to terraform, no new tool to learn; simply create and switch workspaces on the same terraform config codebase:
&amp;gt; terraform workspace new 
&amp;gt; terraform workspace list
&amp;gt; terraform workspace select &lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;this means code maintenance is a breeze, with no code duplication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, when it comes to using a remote backend. It might be a mess. With older versions of terraform, you could only use a single backend for all workspaces. Not exactly sure if this is the case for the latest terraform version.&lt;/p&gt;

&lt;p&gt;Also, code (terraform module) versioning could pose a challenge. How do you promote module versions from dev to staging to prod workspace without breaking prod (since it's just one codebase right?). Variables you may say, unfortunately, variables cannot be used everywhere. Scary!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Using git branches solves the problem of versioning, since you can have a version in the dev branch, another in the staging branch, and another in the prod (main) branch.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However, as the codebase grows, maintenance becomes a nightmare. Too error-prone and bug-welcoming&lt;/p&gt;

&lt;p&gt;The third option is Terragrunt, which captures the best of both worlds and adds a bonus of concurrency: terraform apply on multiple environments at the same time.&lt;/p&gt;

&lt;p&gt;This lovely blog post series from Yevgeniy Brikman was a delightful and thought-provoking one for me. &lt;a href="https://blog.gruntwork.io/how-to-manage-multiple-environments-with-terraform-32c7bc5d692" rel="noopener noreferrer"&gt;https://blog.gruntwork.io/how-to-manage-multiple-environments-with-terraform-32c7bc5d692&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you worked with Terraform environments before? What are your thoughts?&lt;/p&gt;

&lt;p&gt;Read the thoughts of others on the original LinkedIn and Twitter posts:&lt;/p&gt;

&lt;p&gt;LinkedIn: &lt;a href="https://www.linkedin.com/posts/ileriayoadebiyi_how-to-manage-multiple-environments-with-activity-7019665054975287296-4ORD" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/ileriayoadebiyi_how-to-manage-multiple-environments-with-activity-7019665054975287296-4ORD&lt;/a&gt;&lt;br&gt;
Twitter: &lt;a href="https://twitter.com/Ileriayooo/status/1613901213744914432" rel="noopener noreferrer"&gt;https://twitter.com/Ileriayooo/status/1613901213744914432&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cheers!&lt;/p&gt;

</description>
      <category>career</category>
      <category>learning</category>
      <category>productivity</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>SOME THOUGHTS ON TRAINING (An ingredient for effectiveness)</title>
      <dc:creator>Ileriayo Adebiyi</dc:creator>
      <pubDate>Mon, 31 Oct 2022 09:48:27 +0000</pubDate>
      <link>https://dev.to/ileriayo/some-thoughts-on-trainingan-ingredient-for-effectiveness-19pl</link>
      <guid>https://dev.to/ileriayo/some-thoughts-on-trainingan-ingredient-for-effectiveness-19pl</guid>
      <description>&lt;p&gt;During a warming visit at my Pastor's, I volunteered to install the baby hanger. We laughed off the inexpertise - I had no prior experience sufficient to guide me through the task, and thus my first thought was: "a manual should suffice".&lt;/p&gt;

&lt;p&gt;The manual would be a guide, its purpose would be to show the how-to. As I stared at the different screw sizes, plastic clips, and metallic rods - and with no manual in sight, I thought to myself: "intuitive, this should fit into this, and that should fit into that".&lt;/p&gt;

&lt;p&gt;As I gave some more thought to it, I figured that I needed more than a cursory glance. I didn't know what the hanger should look like at the end. "What would success look like, what is the big picture?".&lt;/p&gt;

&lt;p&gt;Back in the university, someone asked why computer scientists are so bothered about algorithms, and the visiting US lecturer at the symposium mentioned that algorithms are the essence of computer science. An algorithm is a step by step process to solving a problem. One of the things computer science teaches is how to solve problems.&lt;/p&gt;

&lt;p&gt;Trying to figure out the end goal, my computer science background (together with other experiences developing software to solve problems) kicked in and so I took to Google and YouTube, researching until I found the exact type of hanger and how to go about installing it. Not long after, I found the big picture, I knew exactly what needed to be done. I knew how to define success.&lt;/p&gt;

&lt;p&gt;When there is a vision, when you see the big picture, then there ought to be training.&lt;/p&gt;

&lt;p&gt;Training is the distance between where you are and where you want (need) to be.&lt;/p&gt;

&lt;p&gt;"Where am I?"&lt;br&gt;
"Where do I want to be?"&lt;br&gt;
"What do I need to do to get to where I want to be?"&lt;/p&gt;

&lt;p&gt;These are some questions I ask myself in life and in ministry.&lt;/p&gt;

&lt;p&gt;In very recent times, I have been learning to see the importance of training. My Pastor (Martins Awe) often says that "a person's training is the greatest prophecy of what they will become". For example, we will say that a person will become a doctor if they are being trained in a medical school, or they will become Pilots because of their training at the aviation school.&lt;/p&gt;

&lt;p&gt;Like a soldier being trained for battle, training is not necessarily joyous - yet it ought to be regular (space) and consistent (time) in order for mastery to be formed.&lt;/p&gt;

&lt;p&gt;The hanger was set, and I enjoyed the chocolate, drinks, and basmati.&lt;/p&gt;

&lt;p&gt;Cheers for now,&lt;br&gt;
Ileri 😀&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/ileriayooo" rel="noopener noreferrer"&gt;Follow @ileriayooo on Twitter&lt;/a&gt;, where he tweets tech, growth, cloud and computer science.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Free Cloud &amp; DevOps Courses In 2022</title>
      <dc:creator>Ileriayo Adebiyi</dc:creator>
      <pubDate>Fri, 28 Oct 2022 08:27:59 +0000</pubDate>
      <link>https://dev.to/ileriayo/free-cloud-devops-courses-in-2022-3fel</link>
      <guid>https://dev.to/ileriayo/free-cloud-devops-courses-in-2022-3fel</guid>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Introduction to Cloud Computing &lt;br&gt;
&lt;a href="https://www.coursera.org/learn/introduction-to-cloud" rel="noopener noreferrer"&gt;https://www.coursera.org/learn/introduction-to-cloud&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Intro to DevOps&lt;br&gt;
&lt;a href="https://www.udacity.com/course/intro-to-devops--ud611" rel="noopener noreferrer"&gt;https://www.udacity.com/course/intro-to-devops--ud611&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cloud Native Fundamentals&lt;br&gt;
&lt;a href="https://www.udacity.com/course/cloud-native-fundamentals--ud064" rel="noopener noreferrer"&gt;https://www.udacity.com/course/cloud-native-fundamentals--ud064&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DevOps Culture and Mindset&lt;br&gt;
&lt;a href="https://www.coursera.org/learn/devops-culture-and-mindset" rel="noopener noreferrer"&gt;https://www.coursera.org/learn/devops-culture-and-mindset&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Introduction to DevSecOps&lt;br&gt;
&lt;a href="https://www.coursera.org/learn/introduction-to-devsecops" rel="noopener noreferrer"&gt;https://www.coursera.org/learn/introduction-to-devsecops&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Developing Cloud Native Applications&lt;br&gt;
&lt;a href="https://www.edx.org/course/developing-cloud-native-applications" rel="noopener noreferrer"&gt;https://www.edx.org/course/developing-cloud-native-applications&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Continuous Delivery &amp;amp; DevOps&lt;br&gt;
&lt;a href="https://www.coursera.org/learn/uva-darden-continous-delivery-devops" rel="noopener noreferrer"&gt;https://www.coursera.org/learn/uva-darden-continous-delivery-devops&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Introduction to DevOps and Site Reliability Engineering&lt;br&gt;
&lt;a href="https://www.edx.org/course/introduction-to-devops-and-site-reliability-engineering" rel="noopener noreferrer"&gt;https://www.edx.org/course/introduction-to-devops-and-site-reliability-engineering&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Developing Cloud Application with Node.js and React&lt;br&gt;
&lt;a href="https://www.edx.org/course/developing-cloud-applications-with-nodejs-and-react" rel="noopener noreferrer"&gt;https://www.edx.org/course/developing-cloud-applications-with-nodejs-and-react&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Continuous Integration&lt;br&gt;
&lt;a href="https://www.coursera.org/learn/continuous-integration" rel="noopener noreferrer"&gt;https://www.coursera.org/learn/continuous-integration&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Docker for Beginners&lt;br&gt;
&lt;a href="https://www.eduonix.com/courses/Software-Development/docker-for-beginners" rel="noopener noreferrer"&gt;https://www.eduonix.com/courses/Software-Development/docker-for-beginners&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Introduction to Kubernetes&lt;br&gt;
&lt;a href="https://www.edx.org/course/introduction-to-kubernetes" rel="noopener noreferrer"&gt;https://www.edx.org/course/introduction-to-kubernetes&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Introduction to Cloud Infrastructure Technologies&lt;br&gt;
&lt;a href="https://www.edx.org/course/introduction-to-cloud-infrastructure-technologies" rel="noopener noreferrer"&gt;https://www.edx.org/course/introduction-to-cloud-infrastructure-technologies&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DevOps basics for everyone&lt;br&gt;
&lt;a href="https://www.edx.org/course/devops-basics-for-everyone" rel="noopener noreferrer"&gt;https://www.edx.org/course/devops-basics-for-everyone&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Continuous Integration and Continuous Delivery (CI/CD)&lt;br&gt;
&lt;a href="https://www.coursera.org/learn/continuous-integration-and-continuous-delivery-ci-cd" rel="noopener noreferrer"&gt;https://www.coursera.org/learn/continuous-integration-and-continuous-delivery-ci-cd&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://twitter.com/ileriayooo" rel="noopener noreferrer"&gt;Follow @ileriayooo&lt;/a&gt; on Twitter for more on Cloud and DevOps&lt;/p&gt;

</description>
    </item>
    <item>
      <title>My First Introduction To The Cloud</title>
      <dc:creator>Ileriayo Adebiyi</dc:creator>
      <pubDate>Mon, 13 Jun 2022 08:50:36 +0000</pubDate>
      <link>https://dev.to/ileriayo/my-first-introduction-to-the-cloud-279g</link>
      <guid>https://dev.to/ileriayo/my-first-introduction-to-the-cloud-279g</guid>
      <description>&lt;p&gt;While reading the book “Cloud Native Infrastructure”, and on getting to page 34-35, I read the words “In July of 2014 an open source tool that embraced the idea of a higher level abstraction for infrastructure as code was released. The tool, called Terraform, has been fantastically successful. It was released at the perfect time, when configuration management was well established and public cloud adoption was on the rise. Users began to see the limitations of the tools for the new environment, and Terraform was ready to address their needs.”&lt;/p&gt;

&lt;p&gt;This made me pause to think, when did I first hear about the cloud? In retrospect, I was surprised to recall that sometime in 2013/14 there was a talk around Microsoft Azure back in FUNAAB.&lt;/p&gt;

&lt;p&gt;I can’t accurately remember the hall we used for the event, but oh, I remember there were Azure stickers.&lt;/p&gt;

&lt;p&gt;(Somebody spoke about building a news app by consuming APIs. This must have been a tech conference, no idea)&lt;/p&gt;

&lt;p&gt;There was this thing about free Azure credits for students, however, the cloud was vague for a lot of us at the time. Folks just wanted to learn to write code and build apps. There was no immediate benefits for these young undergrads who at the time were more in need of internet data to download C++ and PHP tutorials. To us, the cloud was way ahead of it’s time.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>azure</category>
    </item>
  </channel>
</rss>
