Category Archives: kubernetes

How to Copy Files from and to Kubernetes Pods: A Comprehensive Guide for Windows and Linux

Introduction

Azure Kubernetes Service (AKS) is a powerful platform for deploying and managing containerized applications. However, managing files within pods can sometimes be challenging. This article will guide you through the process of Copy File From Pod to Local and upload file from local to pod, covering both Windows and Linux environments. We’ll explore practical examples using kubectl exec and kubectl cp commands, empowering you to effectively manage your AKS deployments. In this article we will have more dig how to Copy Files from and to Kubernetes Pods using windows and Linux pods.

Prerequisites Copy Files from and to Kubernetes

  • Before proceeding, ensure you have the following:
  • Access to an AKS cluster.
  • The kubectl command-line tool installed and configured to interact with your cluster.
  • Basic knowledge of Kubernetes and pod management.

Copying Files to and from Windows Pods

Step 1: Copying Files from a Windows Pod to Local

To copy a file from a Windows pod to your local system, use the kubectl cp command. For instance:

#Syntax :
kubectl cp <pod-name>:<container-path> <local-file-path>

Replace <pod-name> and <container-path> as described above.
Replace <local-file-path> with the desired destination path on your local machine.

#Example: 
kubectl cp sitecore-bg/cdnewbooking-upgrade-8875f7d95-pg4xq:/inetpub/wwwroot/web.config web.config

In this example:

sitecore-bg/cdnewbooking-upgrade-8875f7d95-pg4xq is the pod name.
/inetpub/wwwroot/web.config is the file path inside the pod.
web.config is the destination file on your local system.

Step 2: Copy File From Local to Window Pod

To copy a file from a Windows pod to your local system, use the kubectl cp command. For instance:

#Syntax : 
kubectl cp <local-file-path> <pod-name>:<container-path>

Replace <local-file-path> with the path to the file on your local machine.
Replace <pod-name> with the name of the pod.
Replace <container-path> with the desired destination path within the pod’s container.

#Example: 
kubectl cp web.config sitecore-bg/cdnewbooking-upgrade-8875f7d95-pg4xq:/inetpub/wwwroot/web.config

This command uploads the web.config file to the specified path inside the pod.

web.config is the source file on your local system.
sitecore-bg/cdnewbooking-upgrade-8875f7d95-pg4xq is the pod name.
/inetpub/wwwroot/web.config is the file path inside the pod.

Copy Files from and to AKS Pods

Step 3: Entering & Verify in Windows Pod

To interact directly with a Windows pod, use the kubectl exec command. For example:

Utilize the kubectl exec command to access the PowerShell shell within your Windows pod:

#Syntax : 
kubectl exec -n <namespace> <pod-name> -it -- powershell

Replace <namespace> with the actual namespace of your pod.
Replace <pod-name> with the unique name of the pod.

#Example : 
kubectl exec -n sitecore cd202404232-657b6c6d87-lj7xp -it -- powershell


Copy Files to and From Linux Pods

Step 1: Copying Files from a Linux Pod to local

Use the kubectl cp command to copy files from the pod to your local machine:

#Syntax :
kubectl cp <pod-name>:<container-path> <local-file-path>

To copy a directory from a Linux pod to your local system, use the following command:

#Example: 
kubectl cp solr/solr-leader-202312186-78b759dc5b-8pkrl:/var/solr/data ./solr_data

Here:

solr/solr-leader-202312186-78b759dc5b-8pkrl is the pod name.
/var/solr/data is the directory path inside the pod.
./solr_data is the destination directory on your local machine.

Step 2: Copying Files to a Linux Pod

Use the kubectl cp command to copy files from your local machine to the pod:

#Syntax :
kubectl cp <local-file-path> <pod-name>:<container-path>

To upload files or directories to a Linux pod, use:

#Example: 
kubectl cp solr/solr-leader-202312186-78b759dc5b-8pkrl:/var/solr/data ./solr_data

This command copies the solr_data directory from the specified Linux pod to your current local directory.

Step 3: Entering & Verify in a Linux Pod

Utilize the kubectl exec command to access the bash shell within your Linux pod:

#Syntax : Replace <namespace> and <pod-name> as described above.
kubectl exec -it <pod-name> -n <namespace> -- bash

For Linux-based pods, start a bash session using: This opens a bash shell inside the Linux pod.

#Example: 
kubectl exec -it solr-leader-202312186-78b759dc5b-8pkrl -n solr -- bash

FAQ

1. How do I find the name of a pod in my cluster?

Run kubectl get pods -n <namespace>. This will list all pods in the specified namespace along with their statuses.

2. Can I copy entire directories between my system and a pod?

Yes, the kubectl cp command supports copying directories. Use the directory path in the source and destination arguments.

3. Why do I get a “permission denied” error when copying files?

This typically happens due to insufficient permissions in the pod’s file system. Verify the access rights of the target directory or file.

4. What happens if I specify an incorrect file path inside the pod?

The kubectl cp command will fail and display an error stating that the specified path does not exist.

5. Can I use kubectl cp with compressed files?

Yes, you can use kubectl cp to transfer compressed files. However, you may need to extract or compress them manually before or after the transfer.

6. Is it possible to copy files between two pods directly?

No, kubectl cp does not support direct pod-to-pod file transfers. Copy the files to your local system first and then upload them to the target pod.

7. How do I check if a file was successfully copied?

After copying, use kubectl exec to enter the pod and verify the file’s existence in the target directory.

8. Does kubectl cp work with all storage classes?

Yes, kubectl cp works regardless of the underlying storage class since it operates at the pod file system level.

Conclusion

Copying files to and from AKS pods is a vital skill for efficiently managing your Kubernetes environment. By following the examples provided for both Windows and Linux pods, you can streamline your workflow and tackle common tasks with ease. Bookmark this guide for future reference and elevate your Kubernetes management expertise.

With AKS becoming a preferred choice for enterprises in the United States, mastering these commands ensures you’re equipped to handle file operations effortlessly. Have questions or additional tips? Share them in the comments below!

 

How to Use scripts inside configMap in Windows-Based Kubernetes Deployments: A Step-by-Step Guide

If you’re running Windows-based applications on Kubernetes, using ConfigMaps to manage startup scripts ensures consistency, scalability, and easier configuration management. This guide walks you through the process of creating a ConfigMap for a startup script and executing it in a Windows container,

What is a ConfigMap?

A ConfigMap is a Kubernetes object used to store non-confidential configuration data in key-value pairs. It decouples configuration artifacts from container images, making applications portable and easier to manage. ConfigMaps can store:

  • Configuration files (e.g., JSON, XML, YAML).
  • Environment variables.
  • Scripts (e.g., startup scripts).

Use Cases for ConfigMaps

ConfigMaps are ideal for:

  • Storing Application Configuration: Manage settings like database URLs, API endpoints, or feature flags.
  • Injecting Environment Variables: Pass runtime configurations to containers.
  • Managing Startup Scripts: Execute initialization logic during container startup.
  • Sharing Configuration Across Pods: Reuse the same configuration for multiple deployments.

When and Where to Use ConfigMaps

Use ConfigMaps when:

  • You need to externalize configuration from your container images.
  • You want to avoid hardcoding sensitive or environment-specific data.
  • You need to execute scripts during container initialization.
  • You want to centralize configuration for multiple pods or services.
  • ConfigMaps are particularly useful in Windows-based Kubernetes deployments where PowerShell scripts are commonly used for setup and initialization.

Step 1: Create the Startup Script

Start by writing a PowerShell script (startup.ps1) for your Windows container. For example:

Write-Host "Starting application setup..."
# Your setup commands here
Start-Sleep -Seconds 5
Write-Host "Application is ready!"

Step 2: Create a ConfigMap from the Script

Next, create a ConfigMap from your startup script file. Use the kubectl create configmap command to generate a ConfigMap that includes your PowerShell script.

This command reads the startup.ps1 file and creates a ConfigMap named win-startup-script.

kubectl create configmap [configmap_name] --from-file [path/to/yaml/file]

kubectl create configmap win-startup-script --from-file=startup.ps1

To verify the config map is correctly created with script, you can use the command kubectl describe configmap win-startup-script to retrieve detailed information about a specific ConfigMap named win-startup-script in your Kubernetes cluster. This command is particularly useful for debugging, verifying configurations, or understanding how a ConfigMap is structured.

kubectl describe configmap <configmap-name>

kubectl describe configmap win-startup-script

Step 3: Mount the ConfigMap in Your Deployment

Create a deployment manifest for your Windows container. In your YAML file, reference the ConfigMap so that the startup script is available to your container.

Modify your Kubernetes deployment YAML to:

  1. Mount the ConfigMap as a volume.
  2. Execute the script on container startup.

Example deployment.yaml:

apiVersion: apps/v1  
kind: Deployment  
metadata:  
  name: windows-app  
spec:  
  replicas: 1  
  selector:  
    matchLabels:  
      app: windows-app  
  template:  
    metadata:  
      labels:  
        app: windows-app  
    spec:  
      containers:  
      - name: windows-container  
        image: mcr.microsoft.com/windows/servercore:ltsc2019  
        command: ["powershell", "-Command", "C:\\scripts\\startup.ps1"]  
        volumeMounts:  
        - name: startup-script-volume  
          mountPath: "C:\\scripts"  
          readOnly: true  
      volumes:  
      - name: startup-script-volume  
        configMap:  
          name: win-startup-script  
      nodeSelector:  
        kubernetes.io/os: windows

How It Works

ConfigMap as a Volume:

  • The ConfigMap win-startup-script contains a key-value pair where the key is startup.ps1 and the value is the script content.
  • When the pod is created, the ConfigMap is mounted as a volume at C:\scripts inside the container.
  • The script startup.ps1 becomes accessible at C:\scripts\startup.ps1

Script Execution:

  • The command field in the container specification runs the PowerShell script at startup.
  • The script executes the commands defined in startup.ps1, such as printing messages or performing setup tasks.
  • The use of C:\\scripts (Windows-style path) and the mcr.microsoft.com/windows/servercore:ltsc2019 image ensures compatibility with Windows containers.

Step 4: Apply the Deployment

Deploy your application:

kubectl apply -f deployment.yaml

Step 5: Verify Execution

Check if the script ran successfully:

kubectl logs <pod-name>

kubectl logs windows-app-75b64f6568-gzcmv

Output:

[su_note note_color=”#d2f2fa” text_color=”#333333″ radius=”3″]Starting application setup…

Application is ready![/su_note]

Conclusion

Using ConfigMaps to manage startup scripts in Windows-based Kubernetes deployments is a powerful and efficient way to externalize configuration and ensure consistency across your applications. By following the steps outlined in this guide, you can:

  • Decouple Configuration from Code: Store scripts and configuration data outside your container images, making your applications more portable and easier to manage.
  • Automate Startup Tasks: Execute PowerShell scripts during container initialization to set up environments, configure settings, or perform other necessary tasks.
  • Leverage Kubernetes Features: Use ConfigMaps as volumes to inject scripts into your containers, ensuring they are available at the correct location.
  • Storing Application Configuration: Manage settings like database URLs, API endpoints, or feature flags.
  • Injecting Environment Variables: Pass runtime configurations to containers without hardcoding them.
  • Sharing Configuration Across Pods: Reuse the same configuration for multiple deployments, reducing duplication.
  • Managing Configuration Files: Store and mount configuration files (e.g., JSON, XML, YAML) for applications that rely on external configs.

This approach not only simplifies configuration management but also enhances scalability and maintainability. Whether you’re running a single instance or scaling across multiple pods, ConfigMaps provide a centralized and reusable solution for managing startup scripts.

Question & Answer

Below are six frequently asked questions with concise answers based on the article:

  1. What is a ConfigMap and why is it useful?
    A ConfigMap is a Kubernetes object that stores non-confidential configuration data as key-value pairs. It decouples configuration from container images, making applications more portable, easier to manage, and adaptable to different environments.

  2. What are the common use cases for ConfigMaps?
    ConfigMaps are ideal for storing application configurations (e.g., database URLs, API endpoints, feature flags), injecting environment variables at runtime, managing startup or initialization scripts, and sharing configurations across multiple pods.

  3. How do you create a startup script for a Windows container?
    You create a PowerShell script (e.g., startup.ps1) that contains the necessary initialization commands—such as logging messages or executing setup routines—which the Windows container will execute upon startup.

  4. How do you generate a ConfigMap from a startup script?
    Use the kubectl create configmap command with the --from-file option. For example:
    kubectl create configmap win-startup-script --from-file=startup.ps1
    This command reads the script file and stores its content in a ConfigMap.

  5. How do you mount a ConfigMap in your Windows container deployment?
    In your deployment YAML, define a volume that references the ConfigMap and mount it to a directory (e.g., C:\scripts) in your container. Then, specify the container’s command to execute the script from that location using PowerShell.

  6. How can you verify that the ConfigMap and startup script are working correctly?
    After deploying your application, you can verify the ConfigMap with:
    kubectl describe configmap win-startup-script
    And check the container logs with:
    kubectl logs <pod-name>
    The logs should show output confirming that the startup script executed successfully (e.g., “Starting application setup…” and “Application is ready!”).

How to Collect Kubernetes Events Logs

However, the teams that manage these clusters need to know what’s happening to the state of objects in the cluster, and this in turn introduces a requirement to gather real-time information about cluster statuses and changes. This is enabled by Kubernetes events, which give you a detailed view of the cluster and allow for effective alerting and monitoring.

In this guide, you’ll learn how Kubernetes events work, what generates them, and where they’re stored. You’ll also learn to integrate Grafana with your Kubernetes environment to effectively use the information supplied by those events to support your observability strategy.

What are Kubernetes events?

Kubernetes events provide a rich source of information. These objects can be used to monitor your application and cluster state, respond to failures, and perform diagnostics. The events are generated when the cluster’s resources — such as pods, deployments, or nodes — change state.

Whenever something happens inside your cluster, it produces an events object that provides visibility into your cluster. However, Kubernetes events don’t persist throughout your cluster life cycle, as there’s no mechanism for retention. They’re short-lived, only available for one hour after the event is generated.

Some of the reason for events generation:

  • Kubernetes events are automatically generated when certain actions are taken on objects in a cluster, e.g., when a pod is created, a corresponding event is created. Other examples are changes in pod status to pending, successful, or failed. This includes reasons such as pod eviction or cluster failure.
  • Events are also generated when there’s a configuration change. Configuration changes for nodes can include scaling horizontally by adding replicas, or scaling vertically by upgrading memory, disk input/output capacity, or your processor cores.
  • Scheduling or failed scheduling scenarios also generate events. Failures can occur due to invalid container image repository access, insufficient resources, or if the container fails a liveness or readiness probe.

Why Kubernetes Events are Useful

Kubernetes events are a key diagnostic tool because they:

  1. Help detect issues with deployments, services, and pods.
  2. Provide insights into scheduling failures, container crashes, and resource limits.
  3. Track changes and status updates of various objects.
  4. Assist in debugging networking and storage issues.
  5. Support performance monitoring by identifying anomalies.

Types of Kubernetes Events

Kubernetes Events can broadly be categorized into two types:

Normal Events: These events signify expected and routine operations in the cluster, like a Pod being scheduled or an image being successfully pulled.
Warning Events: Warning events indicate issues that users need to address. These might include failed Pod scheduling, errors pulling an image, or problems with resource limits.

How to Collect Kubernetes Events

Kubectl is a powerful Kubernetes utility that helps you manage your Kubernetes objects and resources. The simplest way to view your event objects is to use kubectl get events.

When working with Kubernetes Events, the volume of data can be overwhelming, especially in large clusters. Efficiently filtering and sorting these events is key to extracting meaningful insights. Here are some practical tips to help you manage this:

To view all Kubernetes events in a cluster:

Add the -A flag to see events from all namespaces.

kubectl get events --all-namespaces

kubectl get events -A

To view events for a specific namespace:

Replace <NAMESPACE_NAME> with the actual namespace. This command filters events to show only those occurring in a specified namespace.

kubectl get events -n <namespace>

Get a detailed view of events

Add the -o wide flag to get a comprehensive view of each event, including additional details not visible in the standard output.

kubectl get events -o wide 

Stream live events

Add the -w command to stream events in real-time. This is particularly useful for monitoring ongoing activities or troubleshooting live issues, as it updates continuously as new events occur. Use Ctrl+C to terminate the stream.

kubectl get events -w

Use field selectors for precise filtering

Add the –field-selector flag to filter events based on specific field values. Replace with the event type you want to filter by. For example, kubectl get events –field-selector type=Warning will only show events of type Warning. This is particularly useful for isolating events related to errors or critical issues.

kubectl get events --field-selector type=<EVENT_TYPE>

#command will return all events of type Warning in the current namespace.
kubectl get events --field-selector type=Warning

Sort events by timestamp

kubectl get event -n default --sort-by=.metadata.creationTimestamp

Add the –sort-by flag to sort events chronologically. This is useful for tracking the sequence of events and understanding their progression over time.

Use JSON or YAML output for complex queries

For complex filtering that can’t be achieved with kubectl flags, you can output the events in a structured format like JSON or YAML by adding the -o json and -o yaml flags, respectively. You can then use tools like jq (for JSON) to perform advanced queries and analyses.

kubectl get events -o yaml

kubectl get events -o json

kubectl get events --field-selector type=Warning -o yaml

Summary: How to Collect Kubernetes Events Logs

Kubernetes events are short-lived records (retained for 1 hour) that track state changes in cluster resources like pods, nodes, or deployments. They provide critical insights for monitoring, debugging, and alerting but require proactive collection due to their transient nature. This guide outlines their utility, types, and methods to collect them effectively.

Key Concepts:

Why Events Matter:

  • Detect issues (e.g., failed deployments, resource limits).
  • Track scheduling failures, crashes, or configuration changes.
  • Support diagnostics and performance monitoring.

Event Types:

  • Normal: Routine operations (e.g., pod scheduling, image pulled).
  • Warning: Critical issues (e.g., pod eviction, image pull errors).

Collection Methods Using kubectl:

You can filter logs using multiple ways like View All Events, Namespace-Specific Filtering, Detailed Output, Live Streaming, Precise Filtering, Chronological Sorting, Structured Outputs (JSON/YAML):

How to Restart Pod in Kubernetes with rollout: A Detailed Guide

Kubernetes provides a robust mechanism for managing application deployments, ensuring high availability and smooth rollouts. The kubectl rollout status command is essential for monitoring deployment progress, while various methods exist for refreshing pods to apply updates or troubleshoot issues. In this blog, we’ll explore how to check the rollout status of a deployment, why rollouts are required, when kubectl rollout restart is necessary, and different ways to refresh pods in a Kubernetes cluster. In this article, we will discuss on how to Restart Pod in Kubernetes in detail.

Introduction:

In this blog post, we’ll explore three different methods to restart a Pod in Kubernetes. It’s important to note that in Kubernetes, “restarting a pod” doesn’t happen in the traditional sense, like restarting a service or a server. When we say a Pod is “restarted,” it usually means a Pod is deleted, and a new one is created to replace it. The new Pod runs the same container(s) as the one that was deleted.

When to Use kubectl rollout restart

The kubectl rollout restart command is particularly useful in the following cases:

  • After a ConfigMap or Secret Update: If a pod depends on a ConfigMap or Secret and the values change, the pods won’t restart automatically. Running a rollout restart ensures they pick up the new configuration.
  • When a Deployment Becomes Unstable: If a deployment is experiencing intermittent failures or connectivity issues, restarting can help resolve problems.
  • To Clear Stale Connections: When applications hold persistent connections to databases or APIs, a restart can help clear old connections and establish new ones.
  • For Application Performance Issues: If the application is behaving unexpectedly or consuming excessive resources, restarting the pods can help reset its state.

During Planned Maintenance or Upgrades: Ensuring all pods restart as part of a routine update helps maintain consistency across the deployment.

Sample Deployment created for testing:

The spec field of the Pod template contains the configuration for the containers running inside the Pod. The restartPolicy field is one of the configuration options available in the spec field. It allows you to control how the Pods hosting the containers are restarted in case of failure. Here’s an example of a Deployment configuration file with a restartPolicy field added to the Pod spec:

You can set the restartPolicy field to one of the following three values:

  • Always: Always restart the Pod when it terminates.
  • OnFailure: Restart the Pod only when it terminates with failure.
  • Never: Never restart the Pod after it terminates.

If you don’t explicitly specify the restartPolicy field in a Deployment configuration file (as shown in below YAML), Kubernetes sets the restartPolicy to Always by default.

In this file, we have defined a Deployment named demo-deployment that manages a single Pod. The Pod has one container running the alpine:3.15 image.

apiVersion: apps/v1
kind: Deployment
metadata:
 name: demo-deployment
spec:
 replicas: 1
 selector:
   matchLabels:
     app: alpine-demo
 template:
   metadata:
     labels:
       app: alpine-demo
   spec:
     restartPolicy: Always
     containers:
     - name: alpine-container
       image: alpine:3.15
       command: ["/bin/sh","-c"]
       args: ["echo Hello World! && sleep infinity"]

Look for the Pod with a name starting with demo-deployment and ensure that it’s in the Running state. Note that Kubernetes creates unique Pod names by adding unique characters to the Deployment name. Hence, your Pod name will be different from as shown below.

Restart Kubernetes Pod

In this section, we’ll explore three methods you can use to restart a Kubernetes Pod.

Method 1: Deleting the Pod

One of the easiest methods to restart a running Pod is to simply delete it. Run the following command to see the Pod restart in action:

#Syntax
kubectl delete pod <POD-NAME>

#Example Delete pod
kubectl delete pod demo-deployment-67789cc7db-dw6xz -n default

#To get the status of the deletion
kubectl get pod -n default

After running the command above, you will receive a confirmation that the Pod has been deleted, as shown in the output below: The job of a Deployment is to ensure that the specified Pod replicas is running at all times. Therefore, after deleting the Pod, Kubernetes will automatically create a new Pod to replace the deleted one.

Method 2: Using the “kubectl rollout restart” command

You can restart a Pod using the kubectl rollout restart command without making any modifications to the Deployment configuration. To see the Pod restart in action, run the following command:

#Syntax
kubectl rollout restart deployment/<Deployment-Name>

#Example
kubectl rollout restart deployment/demo-deployment

After running the command, you’ll receive an output similar to the following:

As you can see, the Deployment has been restarted. Next, let’s list the Pods in our system by running the kubectl get pod command:

As you can see in the output above, the Pod rollout process is in progress. If you run the kubectl get pods command again, you’ll see only the new Pod in a Running state, as shown above:

Any Downtime during Restart Kubernetes Pod?

The Deployment resource in Kubernetes has a default rolling update strategy, which allows for restarting Pods without causing downtime. Here’s how it works: Kubernetes gradually replaces the old Pods with the new version, minimizing the impact on users and ensuring the system remains available throughout the update process.

To restart a Pod without downtime, you can choose between two methods which discussed above using a Deployment  or using the kubectl rollout restart command. Note that manually deleting a Pod (Method 1) to restart it won’t work effectively because there might be a brief period of downtime. When you manually delete a Pod in a Deployment, the old Pod is immediately removed, but the new Pod takes some time to start up.

Rolling update strategy

You can confirm that Kubernetes uses a rolling update strategy by fetching the Deployment details using the following command:

#Syntax
kubectl describe deployment/<Deployment-Name>

#Example
kubectl describe deployment/demo-deployment

After running the command above, you’ll see like below snap

Notice the highlighted section in the output above. The RollingUpdateStrategy field has a default value of 25% max unavailable, 25% max surge. 25% max unavailable means that during a rolling update, 25% of the total number of Pods can be unavailable. And 25% max surge means that the total number of Pods can temporarily exceed the desired count by up to 25% to ensure that the application is available as old Pods are brought down. This can be adjust based on our requirement of the application traffic.

Conclusion

Kubernetes provides multiple methods to restart Pods, ensuring seamless application updates and issue resolution. The best approach depends on the use case:

  1. For minimal disruption and rolling updates, kubectl rollout restart deployment/<Deployment-Name> is the recommended method. It triggers a controlled restart of Pods without causing downtime.
  2. For troubleshooting individual Pods, manually deleting a Pod (kubectl delete pod <POD-NAME>) allows Kubernetes to recreate it automatically. However, this approach may introduce brief downtime.
  3. For configuration updates, restarting Pods after modifying a ConfigMap or Secret ensures that new configurations take effect without redeploying the entire application.

Ultimately, using the rolling update strategy provided by Kubernetes ensures high availability, reducing service disruptions while refreshing Pods efficiently.

Configure autoscaling in Azure Kubernetes Service with CPU & Memory

Introduction:

Azure Kubernetes Service (AKS) empowers you to dynamically scale your applications to meet fluctuating demands. By leveraging CPU and memory-based autoscaling, you can optimize resource allocation, minimize costs, and ensure your applications consistently deliver peak performance. This guide will walk you through the process of configuring and implementing effective autoscaling in Azure Kubernetes Service deployment.

By default, the Horizontal Pod Autoscaler (HPA) in Kubernetes primarily uses CPU utilization as a metric for scaling. However, it is also possible to configure HPA to use memory utilization or custom metrics. Here’s how you can set up HPA to consider memory usage in addition to CPU usage.

What is HPA?

Horizontal Pod Auto scaler (HPA) automatically scales the number of pods in a Kubernetes deployment based on observed metrics such as CPU and memory usage. It ensures your application can handle increased load and conserves resources when demand is low.

“AKS Autoscaling automatically adjusts the number of pods in your deployments, ensuring your applications can seamlessly handle fluctuating workloads.”

Why we monitor Memory and CPU Utilization?

In many applications, both memory and CPU usage are critical metrics to monitor. Memory-intensive applications require additional resources to maintain performance, so scaling based on memory ensures pods are added when usage increases, preventing performance degradation due to memory pressure. Similarly, CPU utilization is essential because high CPU demand can quickly lead to processing bottlenecks. By monitoring and autoscaling based on both memory and CPU, you achieve a more holistic and balanced approach that ensures your applications have the necessary resources to operate optimally under varying workloads.

Step-by-Step Guide to Configure AKS autoscaling

Prerequisites

Before we begin, ensure you have the following:

  1. Azure CLI installed and configured on your machine.
  2. kubectl installed and configured to interact with your AKS cluster.
  3. An AKS cluster up and running.

Step 1: Create a Deployment

First, Create a simple deployment using kubectl apply. Let’s create a simple NGINX deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2
          ports:
            - containerPort: 80

Save this YAML file as nginx-deployment.yaml and apply it using kubectl:

kubectl apply -f nginx-deployment.yaml

This will create a deployment named nginx-deployment with one replica of the NGINX container.

Step 2: Create  the HPA with Memory Utilization 

To create an HPA that uses both CPU and memory metrics, you need to define the metrics in the HPA configuration (Define an HPA that considers both CPU and memory utilization). Save the following YAML as hpa-nginx.yaml:

To associate the Horizontal Pod Autoscaler (HPA) with the specific deployment created in Step 1 (nginx-deployment), the autoscaling YAML must specify the kind: Deployment and name: nginx-deployment within the scaleTargetRef section, as shown in the example below.

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

Apply the HPA configuration:

kubectl apply -f hpa-nginx.yaml

Step 3: Verify the HPA

Check the status of the HPA to ensure it includes both CPU and memory metrics: Use kubectl get hpa to confirm the HPA is configured correctly and includes both CPU and memory targets.

kubectl get hpa nginx-hpa

The output should display both CPU and memory utilization targets:

Step 4: Modify the HPA Configuration:

If you need to adjust the scaling parameters (e.g., minReplicas, maxReplicas, CPU/memory utilization targets), edit the hpa-nginx.yaml file accordingly as shown below and update the new value and save. For example, to increase the maximum number of replicas:

Key Considerations:

  • Monitor HPA Behavior: Regularly monitor the HPA’s behavior using kubectl describe hpa nginx-hpa. This will provide insights into the scaling activities, current pod count, and the reasons for scaling up or down.
  • Fine-tune Metrics: Experiment with different CPU and memory utilization targets to find the optimal values for your application’s workload.
  • Consider Custom Metrics: For more complex scenarios, explore using custom metrics for autoscaling (e.g., request latency, error rates).

Conclusion:

By following these steps, you can effectively update your HPA configuration in AKS to ensure your deployments scale efficiently and effectively based on both CPU and memory utilization. By incorporating memory utilization into your AKS autoscaling strategy, you optimize resource allocation, minimize costs, and enhance application performance. This proactive approach ensures your applications seamlessly handle varying workloads while maintaining high availability and delivering an exceptional user experience. Regularly monitor your HPA metrics and adjust scaling parameters as needed to fine-tune performance and achieve optimal resource utilization.

 

How To Connect Azure Kubernetes Cluster Using Kubectl

Introduction

Azure Kubernetes Service (AKS) simplifies the deployment, management, and scaling of containerized applications using Kubernetes. To interact with an AKS cluster, you need to establish a connection using kubectl, the Kubernetes command-line tool. This guide provides a step-by-step process to explain How To Connect Azure Kubernetes Cluster Using Kubectl

Why Kubectl needed?

Connecting to an AKS cluster is an essential step for managing workloads, monitoring performance, and deploying applications. This process is especially critical for:

  • Monitoring Cluster Health: Using kubectl commands to retrieve performance metrics and check node status.
  • Application Deployment: Deploying and managing containerized applications in the AKS cluster.
  • Cluster Administration: Performing administrative tasks like scaling, updating, or debugging resources within the cluster.

Whether you’re a developer or administrator, establishing this connection ensures you can effectively manage your Kubernetes environment.

To connect to an Azure Kubernetes Service (AKS) cluster using kubectl, you will need to perform the following steps:

Prerequisites ( install both Azure CLI and Kubectl)

STEP: 1 Install the Azure CLI

If you haven’t installed the Azure CLI on your local machine, you can download and install it from the official Microsoft documentation here.

STEP: 2 Install Kubectl

Install the Kubernetes command-line (click here) tool “Kubectl” , if you haven’t installed it already.

Steps to connect Azure account:

STEP: 3 Authenticate with Azure

Open command prompt, run az login command to authenticate your CLI with your Azure account. Once you run this command, you will be prompted to enter your Azure account credentials.

az login

Steps to connect Azure AKS Cluster:

Go to Azure Portal -> Kubernetes Services -> Select the required Cluster -> Overview -> Connect -> to find the entire command for the specific cluster itself or follow the below commands one by one by replacing with subscription Id, cluster name and resource group name.

STEP: 4 Set the subscription

To set subscription, run

az account set --subscriptiond 95fe7-8d2c-4297-ad8b-a8eb08322955

STEP: 5 Generate kubeconfig file

Open command prompt, run the below command and run az aks get-credentials command to connect to your AKS cluster. The get-credentials command downloads credentials and configures the Kubernetes CLI to use them.

#Syntax: 
az aks get-credentials --resource-group <resource-group-name> --name <cluster-name>

Replace <resource-group-name> with the name of the resource group that contains your AKS cluster, and <cluster-name> with the name of your AKS cluster.

az aks get-credentials --resource-group rg-dgtl-pprd-we-01 --name aks-dgtl-pprd-we-01

Above command will create the kubeconfig file in the user root directory. To get kubeconfig file in the specific location

Connect Azure Kubernetes Cluster Using Kubectl

STEP: 6 Verify the connection

To verify that Kubectl is connected to your AKS cluster, run the Kubectl get nodes command. This command should display a list of the nodes in your AKS cluster. If the command returns the list of nodes, then you have successfully connected to your AKS cluster using Kubectl.

kubectl get nodes

Points to Remember

  • Go to Azure Portal -> Kubernetes Services -> Select the required Cluster -> Overview -> Connect -> to find the entire command for the specific cluster itself or follow the below commands one by one by replacing with subscription Id, cluster name and resource group name.
  • First we need to login to the Azure account by configuring Azure subscription and login details. And then we need to connect to Kubernetes Cluster only then we can able to run Kubectl commands.

Conclusion

Connecting to an AKS cluster using kubectl is a fundamental skill for managing Kubernetes workloads in Azure. By following this guide, you can authenticate, configure, and verify your connection to the AKS cluster seamlessly. This enables you to monitor cluster performance, deploy applications, and manage resources effectively.

As Kubernetes continues to be a vital platform for container orchestration, mastering tools like kubectl and Azure CLI is essential for efficient cluster management.