Let's Talk DevOps

Real-World DevOps, Real Solutions

Category: Devops

  • How to Create a Pull Request Using GitHub Through VSCode

    Visual Studio Code (VSCode) has risen as a favorite among developers due to its extensibility and tight integration with many tools, including GitHub. In this tutorial, we’ll cover how to create a pull request (PR) on GitHub directly from VSCode. Given that our audience is highly technical, we’ll provide detailed steps along with screenshots and necessary code.

    Prerequisites:

    • VSCode Installed: If not already, download and install from VSCode’s official website.
    • GitHub Account: You’ll need a GitHub account to interact with repositories.
    • Git Installed: Ensure you have git installed on your machine.
    • GitHub Pull Requests and Issues Extension: Install it from the VSCode Marketplace.

    Steps:

    Clone Your Repository

    First, ensure you have the target repository cloned on your local machine. If not:

    git clone <repository-url>

    Open Repository in VSCode

    Navigate to the cloned directory:

    cd <repository-name>

    Launch VSCode in this directory:

    code .

    Create a New Branch

    Before making any changes, it’s best practice to create a new branch. In the bottom-left corner of VSCode, click on the current branch name (likely main or master). A top bar will appear. Click on + Create New Branch and give it a meaningful name related to your changes.

    Make Your Changes

    Once you’re on your new branch, make the necessary changes to the code or files. VSCode’s source control tab (represented by the branch icon on the sidebar) will list the changes made.

    Stage and Commit Changes

    Click on the + icon next to each changed file to stage the changes. Once all changes are staged, enter a commit message in the text box and click the checkmark at the top to commit.

    Push the Branch to GitHub

    Click on the cloud-upload icon in the bottom-left corner to push your branch to GitHub.

    Create a Pull Request

    With the GitHub Pull Requests and Issues Extension installed, you’ll see a GitHub icon in the sidebar. Clicking on this will reveal a section titled GitHub Pull Requests.

    Click on the + icon next to it. It’ll fetch the branch and present a UI to create a PR. Fill in the necessary details:

    • Title: Summarize the change in a short sentence.
    • Description: Provide a detailed description of what changes were made and why.
    • Base Repository: The repository to which you want to merge the changes.
    • Base: The branch (usually main or master) to which you want to merge the changes.
    • Head Repository: Your forked repository (if you’re working on a fork) or the original one.
    • Compare: Your feature/fix branch.

    Once filled, click Create.

    Review and Merge

    Your PR is now on GitHub. It can be reviewed, commented upon, and eventually merged by maintainers.

    Conclusion

    VSCode’s deep integration with GitHub makes it a breeze to handle Git operations, including creating PRs. By following this guide, you can streamline your Git workflow without ever leaving your favorite editor!

  • 7 things all devops practitioners need from Git

    Git is a powerful tool for version control, enabling multiple developers to work together on the same codebase without stepping on each other’s toes. It’s a complex system with many features, and getting to grips with it can be daunting. Here are seven insights that I wish I had known when I started working with Git.

    The Power of git log

    The git log command is much more powerful than it first appears. It can show you the history of changes in a variety of formats, which can be extremely helpful for understanding the evolution of a project.

    # Show the commit history in a single line per commit
    git log --oneline
    
    # Show the commit history with graph, date, and abbreviated commits
    git log --graph --date=short --pretty=format:'%h - %s (%cd)'

    Branching is Cheap

    Branching in Git is incredibly lightweight, which means you should use branches liberally. Every new feature, bug fix, or experiment should have its own branch. This keeps changes organized and isolated from the main codebase until they’re ready to be merged.

    # Create a new branch
    git branch new-feature
    
    # Switch to the new branch
    git checkout new-feature

    Or do both with:

    # Create and switch to the new branch
    git checkout -b new-feature

    git stash is Your Friend

    When you need to quickly switch context but don’t want to commit half-done work, git stash is incredibly useful. It allows you to save your current changes away and reapply them later.

    # Stash your current changes
    git stash
    
    # List all stashes
    git stash list
    
    # Apply the last stashed changes and remove it from the stash list
    git stash pop

    git rebase for a Clean History

    While merging is the standard way to bring a feature branch up to date with the main branch, rebasing can often result in a cleaner project history. It’s like saying, “I want my branch to look as if it was based on the latest state of the main branch.”

    # Rebase your current branch on top of the main branch
    git checkout feature-branch
    git rebase main

    Note: Rebasing rewrites history, which can be problematic for shared branches.

    The .gitignore File

    The .gitignore file is crucial for keeping your repository clean of unnecessary files. Any file patterns listed in .gitignore will be ignored by Git.

    # Ignore all .log files
    *.log
    
    # Ignore a specific file
    config.env
    
    # Ignore everything in a directory
    tmp/**

    git diff Shows More Than Just Differences

    git diff can be used in various scenarios, not just to show the differences between two commits. You can use it to see changes in the working directory, changes that are staged, and even differences between branches.

    # Show changes in the working directory that are not yet staged
    git diff
    
    # Show changes that are staged but not yet committed
    git diff --cached
    
    # Show differences between two branches
    git diff main..feature-branch

    The Reflog Can Save You

    The reflog is an advanced feature that records when the tips of branches and other references were updated in the local repository. It’s a lifesaver when you’ve done something wrong and need to go back to a previous state.

    # Show the reflog
    git reflog
    
    # Reset to a specific entry in the reflog
    git reset --hard HEAD@{1}

    Remember: The reflog is a local log, so it only contains actions you’ve taken in your repository.


    Understanding these seven aspects of Git can make your development workflow much more efficient and less error-prone. Git is a robust system with a steep learning curve, but with these tips in your arsenal, you’ll be better equipped to manage your projects effectively.

  • Kubernetes quickstarts – AKS, EKS, GKE

    There has been a lot of inquiries about how to get started quickly with what is commonly referred as the hyperscalers. Let’s dive in for a super quick primer!

    All of these quickstarts assume the reader has accounts in each service with the appropriate rights and in most cases the reader needs to have the client installed.

    Starting with Google Kubernetes Engine (GKE)

    export NAME="$(whoami)-$RANDOM"
    export ZONE="us-west2-a"
    gcloud container clusters create "${NAME}" --zone ${ZONE} --num-nodes=1
    glcoud container clusters get-credentials "${NAME}" --zone ${ZONE}

    Moving on to Azure Kubernetes Service (AKS)

    export NAME="$(whoami)-$RANDOM"
    export AZURE_RESOURCE_GROUP="${NAME}-group"
    az group create --name "${AZURE_RESOURCE_GROUP}" -l westus2
    az aks create --resource-group "${AZURE_RESOURCE_GROUP}" --name "${NAME}"
    az aks get-credentials --resource-group "${AZURE_RESOURCE_GROUP}" --name "${NAME}"

    For Elastic Kubernetes Service (EKS)

    export NAME="$(whoami)-$RANDOM"
    eksctl create cluster --name "${NAME}"

    As you can see setting up these clusters is very simple. Now that you have a cluster what are you going to do with it? Ensure you’ve installed the tools needed to manage the cluster. You’ll want to get the credentials from each copy into ~/{user}/.kube/config (except with eksctl as it copies the kubeconfig to the appropriate place automagically). To manipulate the cluster, install kubectl with your favorite package manager and to install applications the easiest way is via helm.

    As you can see the setup of a kubernetes cluster in one of the major hyperscalers is very easy. A few lines of code and you’re up and running. Add those lines into a shell script and standing up clusters can be a single command…just don’t forget to tear it down when you’re done!

  • Streamline Kubernetes Management through Automation

    Automation in managing Kubernetes clusters has burgeoned into an essential practice that enhances efficiency, security, and the seamless deployment of applications. With the exponential growth in containerized applications, automation has facilitated streamlined operations, reducing the room for human error while significantly saving time. Let’s delve deeper into the crucial role automation plays in managing Kubernetes clusters.

    Section 1: The Imperative of Automation in Kubernetes

    1.1 The Kubernetes Landscape

    Before delving into the nuances of automation, let’s briefly recapitulate the fundamental components of Kubernetes, encompassing pods, nodes, and clusters, and their symbiotic relationships facilitating a harmonious operational environment.

    1.2 The Need for Automation

    Automation emerges as a vanguard in managing complex environments effortlessly, fostering efficiency, reducing downtime, and ensuring the optimal utilization of resources.

    1.2.1 Efficiency and Scalability

    Automation in Kubernetes ensures that clusters can dynamically scale based on the workload, fostering efficiency, and resource optimization.

    1.2.2 Reduced Human Error

    Automating repetitive tasks curtails the scope of human error, facilitating seamless operations and mitigating security risks.

    1.2.3 Cost Optimization

    Through efficient resource management, automation aids in cost reduction by optimizing resource allocation dynamically.

    Section 2: Automation Tools and Processes

    2.1 CI/CD Pipelines

    Continuous Integration and Continuous Deployment (CI/CD) pipelines are at the helm of automation, fostering swift and efficient deployment cycles.

    pipeline:
      build:
        image: node:14
        commands:
          - npm install
          - npm test
      deploy:
        image: google/cloud-sdk
        commands:
          - gcloud container clusters get-credentials cluster-name --zone us-central1-a
          - kubectl apply -f k8s/
    

    Code snippet 1: A simple CI/CD pipeline example.

    2.2 Infrastructure as Code (IaC)

    IaC facilitates the programmable infrastructure, rendering a platform where systems and devices can be managed through code.

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
      - name: mycontainer
        image: nginx
    

    Code snippet 2: Defining a Kubernetes pod using IaC.

    2.3 Configuration Management

    Tools like Ansible and Chef aid in configuration management, ensuring system uniformity and adherence to policies.

    - hosts: kubernetes_nodes
      tasks:
        - name: Ensure Kubelet is installed
          apt: 
            name: kubelet
            state: present
    

    Code snippet 3: Using Ansible for configuration management.

    Section 3: Automation Use Cases in Kubernetes

    3.1 Auto-scaling

    Auto-scaling facilitates automatic adjustments to the system’s computational resources, optimizing performance and curtailing costs.

    3.1.1 Horizontal Pod Autoscaler

    Kubernetes’ Horizontal Pod Autoscaler automatically adjusts the number of pod replicas in a replication controller, deployment, or replica set based on observed CPU utilization.

    apiVersion: autoscaling/v2beta2
    kind: HorizontalPodAutoscaler
    metadata:
      name: myapp-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: myapp
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 50
    

    Code snippet 4: Defining a Horizontal Pod Autoscaler in Kubernetes.

    3.2 Automated Rollouts and Rollbacks

    Kubernetes aids in automated rollouts and rollbacks, ensuring application uptime and facilitating seamless updates and reversions.

    3.2.1 Deployment Strategies

    Deployment strategies such as blue-green and canary releases can be automated in Kubernetes, facilitating controlled and safe deployments.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: myapp
    spec:
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
      selector:
        matchLabels:
          app: myapp
      template:
        metadata:
          labels:
            app: myapp
        spec:
          containers:
          - name: myapp
            image: myapp:v2
    

    Code snippet 5: Configuring a rolling update strategy in a Kubernetes deployment.

    Conclusion: The Future of Kubernetes with Automation

    As Kubernetes continues to be the frontrunner in orchestrating containerized applications, the automation integral to its ecosystem fosters efficiency, security, and scalability. Through a plethora of tools and evolving best practices, automation stands central in leveraging Kubernetes to its fullest potential, orchestrating seamless operations, and steering towards an era of self-healing systems and zero-downtime deployments.

    In conclusion, the ever-evolving landscape of Kubernetes managed through automation guarantees a future where complex deployments are handled with increased efficiency and reduced manual intervention. Leveraging automation tools and practices ensures that Kubernetes clusters not only meet the current requirements but are also future-ready, paving the way for a robust, scalable, and secure operational environment.


    References:

    1. Kubernetes Official Documentation. Retrieved from https://kubernetes.io/docs/
    2. Jenkins, CI/CD, and Kubernetes: Integrating CI/CD with Kubernetes (2021). Retrieved from https://www.jenkins.io/doc/book/
    3. Infrastructure as Code (IaC) Explained (2021).
    4. Understanding Kubernetes Operators (2021).
  • DevOps and the Möbius Loop

    Harnessing the Möbius Loop for a Revolutionary DevOps Process

    In the world of DevOps, continual improvement and iteration are the name of the game. The Möbius loop, with its one-sided, one-boundary surface, can serve as a vivid metaphor and blueprint for establishing a DevOps process that is both unified and infinitely adaptable. Let’s delve into the Möbius loop concept and see how it beautifully intertwines with the principles of DevOps.

    Understanding the Möbius Loop

    The Möbius loop or Möbius strip is a remarkable mathematical concept — a surface with only one side and one boundary created through a half-twist of a strip of paper that then has its ends joined. This one-sided surface represents a continuous, never-ending cycle, illustrating an ever-continuous pathway that can epitomize the unceasing cycle of development in DevOps.

    Reference: Möbius Strip – Wikipedia

    The Möbius Loop and DevOps: A Perfect Harmony

    In the ecosystem of DevOps, the Möbius loop signifies a continuous cycle where one phase naturally transitions into the next, establishing a seamless feedback loop that fosters continuous growth and development. This philosophy lies at the heart of DevOps, promoting an environment of collaboration and iterative progress.

    Reference: DevOps and Möbius Loop — A Journey to Continuous Improvement

    Crafting a Möbius Loop-Foundation DevOps Process

    Building a DevOps process based on the Möbius loop principle means initiating a workflow where each development phase fuels the next, constituting a feedback loop that constantly evolves. Here is a step-by-step guide to create this iterative and robust system:

    1. Define Objectives

    • Business Objectives: Set clear business goals and metrics.
    • User Objectives: Align the goals with user expectations.

    2. Identify Outcomes

    • Expected Outcomes: Envision the desired outcomes for business and users.
    • Metrics: Design metrics to measure the effectiveness of strategies.

    3. Discovery and Framing

    • Research: Invest time in understanding user preferences and pain points.
    • Hypothesis: Develop hypotheses to meet business and user objectives.

    4. Develop and Deliver

    • Build: Employ agile methodologies to build solutions incrementally.
    • Deploy: Use CI/CD pipelines for continuous deployment.

    Reference: Utilizing Agile Methodologies in DevOps

    5. Operate and Observe

    • Monitor: Utilize monitoring tools to collect data on system performance.
    • Feedback Loop: Establish channels to receive user feedback.

    6. Learning and Iteration

    • Analyze: Scrutinize data and feedback from the operate and observe phase.
    • Learn: Adapt based on the insights acquired and enhance the solution.

    7. Feedback and Adjust

    • Feedback: Facilitate feedback from all stakeholders.
    • Adjust: Revise goals, metrics, or the solution based on the feedback received.

    8. Loop Back

    • Iterative Process: Reiterate the process, informed by the learning from previous cycles.
    • Continuous Improvement: Encourage a mindset of perpetual growth and improvement.

    Tools to Embark on Your Möbius Loop Journey

    Leveraging advanced tools and technologies is vital to facilitate this Möbius loop-founded DevOps process. Incorporate the following tools to set a strong foundation:

    • Version Control: Git for source code management.
    • CI/CD: Jenkins, Gitlab, or ArgoCD for automating deployment.
    • Containerization and Orchestration: Podman and Kubernetes to handle the orchestration of containers.
    • Monitoring and Logging: Tools like Prometheus for real-time monitoring.
    • Collaboration Tools: Slack or Rocket.Chat to foster communication and collaboration.

    Reference: Top Tools for DevOps

    Conclusion

    Embracing the Möbius loop in DevOps unveils a path to continuous improvement, aligning with the inherent nature of the development-operations ecosystem. It not only represents a physical manifestation of the infinite loop of innovation but also fosters a system that is robust, adaptable, and user-centric. As you craft your DevOps process rooted in the Möbius loop principle, remember that you are promoting a culture characterized by unending evolution and growth, bringing closer to your objectives with each cycle.

    Feel inspired to set your Möbius loop DevOps process in motion? Share your thoughts and experiences in the comments below!