English

Imagine stepping into a bustling metropolis where every building, road, and utility works in harmonious synchronization to keep the city thriving. This city never sleeps, efficiently managing its resources, adapting to changes, and ensuring every citizen enjoys seamless services. Welcome to Kubernetes, the dynamic cityscape of container orchestration that powers modern applications with precision and scalability.

In this exploration, we'll journey through the vibrant components of Kubernetes, demystifying its architecture and showcasing how each part plays a pivotal role in maintaining the pulse of this digital metropolis. Whether you're a seasoned DevOps engineer or a curious newcomer, this guide offers an engaging and comprehensive tour of Kubernetes' inner workings.

Table of Contents

  1. Welcome to Kubernetes City
  2. The Heart of the City: Control Plane
  3. Districts of Kubernetes: Nodes
  4. Citizens of the City: Kubernetes Objects
  5. Infrastructure Essentials: Networking and Storage
  6. Lifecycle Management: Scaling and Updates
  7. Security and Governance: Keeping the City Safe
  8. Observability: Monitoring the City's Health
  9. Common Pitfalls and How to Navigate Them
  10. Conclusion: Embracing the Kubernetes Metropolis

Welcome to Kubernetes City

Welcome to Kubernetes City—a sprawling, meticulously organized metropolis where applications (citizens) thrive under the vigilant management of its infrastructure (city systems). Kubernetes orchestrates this city, ensuring that every component—from the tiniest pod to the vastest storage facility—operates in harmony. Let's embark on a tour to understand the anatomy of this city and how each part contributes to its seamless functionality.

The Heart of the City: Control Plane

At the core of Kubernetes City lies the Control Plane—the city's central command hub responsible for maintaining the desired state of the cluster. It orchestrates activities, manages resources, and ensures that applications run smoothly.

API Server: The City Hall

Role: The API Server is the main entry point for all administrative tasks in Kubernetes. It serves as the city's administrative office where all requests and configurations are processed.

Key Functions:

  • Handling Requests: Processes RESTful API calls from users, kubectl, and other components.
  • Authentication and Authorization: Validates incoming requests to ensure they have the necessary permissions.
  • Configuration Management: Maintains the desired state of the cluster by interacting with etcd.

Common Issues & Solutions:

  • Connection Refused: Ensure the API Server is running and accessible. Check firewall settings and network configurations.
  • Authentication Errors: Verify kubeconfig files and user credentials.

Scheduler: The Traffic Controller

Role: Just as a traffic controller directs vehicles to prevent congestion, the Scheduler assigns pods to appropriate nodes based on resource availability and constraints.

Key Functions:

  • Resource Allocation: Determines which node a pod should run on by evaluating resource requests and node capacities.
  • Constraint Handling: Considers policies like affinity, anti-affinity, and taints/tolerations to make placement decisions.

Common Issues & Solutions:

  • Pods Stuck in Pending: Check if there are sufficient resources on nodes and verify scheduling constraints.
  • Misconfigured Affinity Rules: Review pod specifications for correct affinity and anti-affinity configurations.

Controller Manager: The Operations Bureau

Role: The Controller Manager oversees various controllers that handle routine tasks, ensuring the cluster's desired state matches its actual state.

Key Controllers:

  • Deployment Controller: Manages deployments, ensuring the specified number of pod replicas are running.
  • ReplicaSet Controller: Maintains the number of pod replicas as defined.
  • DaemonSet Controller: Ensures that a copy of a pod runs on all (or selected) nodes.
  • StatefulSet Controller: Manages stateful applications with unique identities and stable storage.

Common Issues & Solutions:

  • Unexpected Pod Termination: Check Deployment or ReplicaSet configurations for scaling or update strategies.
  • StatefulSet Issues: Ensure persistent storage is correctly configured and available.

etcd: The City Archive

Role: etcd is the distributed key-value store that acts as the city's archival system, storing all cluster data and configurations.

Key Functions:

  • State Storage: Maintains the complete state of the cluster, including node information, pod statuses, and configurations.
  • Data Consistency: Ensures data is consistently replicated across all etcd instances for reliability.

Common Issues & Solutions:

  • etcd Data Corruption: Regularly back up etcd data and monitor its health. Use etcd’s built-in backup and restore mechanisms.
  • Performance Bottlenecks: Optimize etcd performance by ensuring sufficient resources and network latency.

Districts of Kubernetes: Nodes

Surrounding the Control Plane are the Nodes—the individual districts that host the applications. Each node is a worker machine, whether virtual or physical, running the necessary components to execute and manage pods.

Kubelet: The District Manager

Role: The Kubelet is the agent that runs on each node, acting as the district manager that ensures pods are running as intended.

Key Functions:

  • Pod Lifecycle Management: Ensures that containers within pods are started, stopped, and maintained according to specifications.
  • Node Health Reporting: Monitors node status and communicates it to the Control Plane.
  • Resource Monitoring: Manages resource allocation for containers, ensuring they don't exceed specified limits.

Common Issues & Solutions:

  • Kubelet Not Running: Check kubelet service status and logs. Ensure it has access to necessary certificates and configurations.
  • Pod Failing to Start: Inspect pod specifications and node resource availability.

Kube-Proxy: The Road Network

Role: The Kube-Proxy manages network routing and load balancing within the cluster, acting as the city's road network that directs traffic to the correct destinations.

Key Functions:

  • Service Discovery: Maintains network rules to enable communication between services and pods.
  • Load Balancing: Distributes network traffic evenly across pod replicas to ensure reliability and performance.

Common Issues & Solutions:

  • Service Access Problems: Verify Kube-Proxy configurations and ensure network policies allow required traffic.
  • DNS Resolution Failures: Check Kube-Proxy’s interaction with CoreDNS and other networking components.

Container Runtime: The Utilities

Role: The Container Runtime is the underlying utility that runs containerized applications, much like the utilities that power buildings in a city.

Key Functions:

  • Container Execution: Launches and manages container lifecycles.
  • Image Management: Pulls container images from registries and handles storage.

Common Issues & Solutions:

  • Container Runtime Crashes: Inspect container runtime logs (e.g., Docker, containerd) and ensure compatibility with Kubernetes.
  • Image Pull Failures: Verify image repository access and credentials.

Citizens of the City: Kubernetes Objects

Kubernetes Objects are the inhabitants of Kubernetes City—each with distinct roles and responsibilities that contribute to the cluster's functionality.

Pods: The Buildings

Role: Pods are the smallest deployable units in Kubernetes, representing individual buildings where containers (residents) live.

Key Features:

  • Shared Resources: Containers within a pod share the same network namespace and storage volumes.
  • Single Responsibility: Each pod is designed to run a single instance of an application or service.

Use Cases:

  • Microservices: Deploying separate pods for different microservices to ensure isolation and scalability.
  • Sidecar Containers: Running auxiliary containers alongside main application containers for logging, monitoring, or proxying.

Deployments: The Construction Planners

Role: Deployments act as construction planners, managing the lifecycle of pods by defining the desired state and ensuring the actual state aligns with it.

Key Features:

  • Declarative Updates: Specify the desired state of applications, and Kubernetes handles the transitions.
  • Scaling: Easily scale applications up or down by adjusting replica counts.
  • Rolling Updates: Update applications without downtime by incrementally replacing pods.

Use Cases:

  • Version Updates: Rolling out new versions of applications seamlessly.
  • Resilience: Automatically replacing failed pods to maintain application availability.

Services: The Service Providers

Role: Services are the service providers that enable communication between different components of the cluster, acting as stable endpoints within the dynamic environment of pods.

Key Features:

  • Stable IPs and DNS: Provide consistent access points for applications, regardless of pod lifecycle.
  • Load Balancing: Distribute traffic across multiple pod replicas to ensure reliability and performance.
  • Service Types: Various types like ClusterIP, NodePort, LoadBalancer, and ExternalName cater to different networking needs.

Use Cases:

  • Internal Communication: Facilitating communication between microservices within the cluster.
  • External Access: Exposing applications to the outside world through LoadBalancer or NodePort services.

ConfigMaps and Secrets: The Utilities and Security

ConfigMaps:

Role: ConfigMaps store non-confidential configuration data, acting as the utilities that supply applications with necessary settings.

Key Features:

  • Key-Value Pairs: Hold configuration data in a flexible format.
  • Decoupling Configuration: Separate configuration from application code for easier management and updates.

Use Cases:

  • Environment Variables: Injecting configuration parameters into pods.
  • Configuration Files: Mounting configuration files into containers.

Secrets:

Role: Secrets manage sensitive information like passwords, tokens, and keys, ensuring secure operations within the cluster.

Key Features:

  • Base64 Encoding: Encode sensitive data to prevent accidental exposure.
  • Access Control: Restrict access to secrets using RBAC policies.

Use Cases:

  • Authentication: Storing database credentials securely.
  • TLS Certificates: Managing SSL/TLS certificates for secure communications.

Volumes: The Storage Facilities

Role: Volumes provide persistent storage for pods, akin to storage facilities that ensure data persistence beyond pod lifecycles.

Key Features:

  • Persistent Storage: Retain data even if pods are restarted or rescheduled.
  • Variety of Backends: Support for different storage solutions like AWS EBS, Google Persistent Disks, NFS, and more.

Use Cases:

  • Database Storage: Ensuring data persistence for stateful applications like databases.
  • Shared Storage: Enabling multiple pods to access the same data concurrently.

Ingress: The Gateways

Role: Ingress manages external access to services within the cluster, acting as the city’s gateways that control traffic flow into the metropolis.

Key Features:

  • Routing Rules: Define how HTTP and HTTPS traffic should be directed to services.
  • TLS Termination: Handle SSL/TLS termination for secure communications.
  • Load Balancing: Distribute incoming traffic across multiple services or pods.

Use Cases:

  • Web Applications: Managing access to frontend and backend services.
  • API Gateways: Routing API requests to appropriate microservices.

Infrastructure Essentials: Networking and Storage

Understanding the backbone of Kubernetes—networking and storage—is crucial for building a resilient and scalable cluster.

Networking: The Communication Network

Kubernetes Networking ensures seamless communication between pods, services, and external entities, much like a city’s communication infrastructure.

Key Concepts:

  • Flat Network: Every pod can communicate with every other pod without Network Address Translation (NAT).
  • Service Discovery: Automatically assigns DNS names and IPs to services for easy access.
  • Network Policies: Define rules for pod-to-pod and pod-to-service communication, enhancing security.

Components:

  • Container Network Interface (CNI): Standard for configuring network interfaces in containers, enabling interoperability with various network plugins like Calico, Weave Net, and Flannel.
  • CoreDNS: Provides DNS services within the cluster, facilitating service discovery and name resolution.

Common Issues & Solutions:

  • Network Plugin Misconfigurations: Ensure the correct CNI plugin is installed and properly configured.
  • DNS Resolution Failures: Verify CoreDNS is running and correctly configured. Check for conflicting DNS settings.

Storage: The Data Centers

Kubernetes Storage abstracts the complexities of data management, offering scalable and persistent storage solutions akin to the data centers that power a city’s digital infrastructure.

Key Concepts:

  • PersistentVolumes (PVs): Represent actual storage resources in the cluster, managed by administrators.
  • PersistentVolumeClaims (PVCs): Requests for storage by users, binding to available PVs based on criteria.
  • StorageClasses: Define different tiers or types of storage, enabling dynamic provisioning based on workload needs.

Components:

  • Dynamic Provisioning: Automatically provisions storage when PVCs are created, eliminating manual PV management.
  • Volume Plugins: Support various storage backends like cloud storage (AWS EBS, GCP PD), network storage (NFS), and local storage.

Common Issues & Solutions:

  • Provisioning Failures: Ensure StorageClasses are correctly configured and storage backends are accessible.
  • Data Persistence Problems: Verify that PVs and PVCs are correctly bound and that storage policies are properly applied.

Lifecycle Management: Scaling and Updates

Managing the lifecycle of applications ensures that Kubernetes City can adapt to changing demands and evolve without disruption.

Scaling: Expanding the City

Role: Scaling adjusts the number of pod replicas to handle varying loads, ensuring applications remain responsive and available.

Types of Scaling:

  • Manual Scaling: Directly increase or decrease the number of replicas using kubectl.
    kubectl scale deployment [DEPLOYMENT_NAME] --replicas=[NUMBER]
    
  • Horizontal Pod Autoscaling (HPA): Automatically scales pods based on CPU utilization or other custom metrics.
    kubectl autoscale deployment [DEPLOYMENT_NAME] --min=[MIN_REPLICAS] --max=[MAX_REPLICAS] --cpu-percent=[TARGET_CPU]
    

Best Practices:

  • Set Appropriate Resource Requests and Limits: Ensure that HPA has accurate metrics to make scaling decisions.
  • Monitor Scaling Events: Use monitoring tools to observe scaling behavior and adjust policies as needed.

Rolling Updates: Renovating Buildings

Role: Rolling updates allow for seamless application updates without downtime, similar to renovating buildings while residents continue to live and work.

Process:

  1. Update Deployment Configuration:
    kubectl set image deployment/[DEPLOYMENT_NAME] [CONTAINER_NAME]=[NEW_IMAGE]
    
  2. Monitor Rollout Status:
    kubectl rollout status deployment/[DEPLOYMENT_NAME]
    
  3. Verify New Pods:
    kubectl get pods -l app=[APP_LABEL]
    

Benefits:

  • Zero Downtime: Ensures continuous availability during updates.
  • Controlled Rollout: Gradually replaces old pods with new ones, minimizing risk.

Best Practices:

  • Use Readiness Probes: Ensure new pods are ready before terminating old ones.
  • Set Maximum Surge and Unavailable Parameters: Control the pace and impact of updates.

Rollbacks: Reverting Changes

Role: Rollbacks enable reverting to a previous stable state if an update introduces issues, akin to undoing a faulty renovation.

Process:

  1. Initiate Rollback:
    kubectl rollout undo deployment/[DEPLOYMENT_NAME]
    
  2. Monitor Rollback Status:
    kubectl rollout status deployment/[DEPLOYMENT_NAME]
    
  3. Verify Application Stability:
    kubectl get pods -l app=[APP_LABEL]
    

Benefits:

  • Quick Recovery: Rapidly restores application functionality in case of failures.
  • Safety Net: Provides confidence to perform updates, knowing that issues can be mitigated.

Best Practices:

  • Maintain Deployment History: Kubernetes retains a history of deployments for easy rollbacks.
  • Test Rollbacks Regularly: Ensure that rollback procedures work as expected.

Security and Governance: Keeping the City Safe

Ensuring the security and governance of Kubernetes City is paramount to protect applications and data from threats and unauthorized access.

RBAC: The Police Force

Role: Role-Based Access Control (RBAC) acts as the police force, regulating who can perform what actions within the cluster.

Key Features:

  • Roles and ClusterRoles: Define sets of permissions for resources.
  • RoleBindings and ClusterRoleBindings: Assign roles to users, groups, or service accounts.

Common Issues & Solutions:

  • Overly Permissive Roles: Apply the principle of least privilege by granting only necessary permissions.
  • Access Denied Errors: Verify that users have the correct RoleBindings or ClusterRoleBindings.

Best Practices:

  • Use Namespaces for Isolation: Assign roles within specific namespaces to limit scope.
  • Regularly Audit RBAC Policies: Ensure that access controls align with organizational policies.

Network Policies: The City Ordinances

Role: Network Policies function as city ordinances, defining rules for how pods communicate within the cluster, enhancing security and traffic management.

Key Features:

  • Ingress and Egress Rules: Control incoming and outgoing traffic for pods.
  • Selectors: Use labels to target specific pods for policy application.

Common Issues & Solutions:

  • Unexpected Traffic Blocks: Review and adjust network policies to allow necessary communications.
  • Misconfigured Selectors: Ensure that labels used in policies accurately match target pods.

Best Practices:

  • Start with Default Deny: Implement restrictive policies first and then allow specific traffic as needed.
  • Use Namespace Isolation: Define network policies at the namespace level for better control.

Admission Controllers: The City Inspectors

Role: Admission Controllers serve as the city's inspectors, enforcing policies and validating requests before they are committed to the cluster.

Key Features:

  • Mutating Admission Controllers: Modify incoming requests, such as injecting sidecar containers.
  • Validating Admission Controllers: Reject requests that do not comply with policies.

Common Issues & Solutions:

  • Policy Violations: Ensure that admission controllers are correctly configured to enforce desired policies.
  • Resource Rejections: Adjust admission controller rules to align with application requirements.

Best Practices:

  • Use Webhooks for Custom Policies: Implement custom admission controllers using webhooks to enforce specialized rules.
  • Monitor Admission Controller Logs: Regularly review logs to identify and address policy enforcement issues.

Observability: Monitoring the City's Health

Maintaining the health of Kubernetes City requires robust observability tools that provide insights into cluster performance, application behavior, and potential issues.

Logging: The City Records

Role: Logging acts as the city's records department, capturing detailed logs of events and activities for analysis and troubleshooting.

Key Components:

  • Node-Level Logging: Collects logs from the operating system and Kubernetes components.
  • Application Logging: Captures logs generated by applications running within pods.
  • Centralized Logging Systems: Aggregates logs for easier access and analysis, using tools like Elasticsearch, Fluentd, and Kibana (EFK stack) or Loki.

Common Issues & Solutions:

  • Log Volume Overload: Implement log rotation and retention policies to manage storage.
  • Incomplete Logs: Ensure that all necessary log sources are being captured and forwarded to the centralized system.

Best Practices:

  • Use Structured Logging: Facilitate easier searching and parsing of logs.
  • Secure Log Storage: Protect logs from unauthorized access to maintain confidentiality and integrity.

Monitoring: The Health Department

Role: Monitoring serves as the city's health department, continuously tracking the performance and health of cluster resources and applications.

Key Components:

  • Metrics Collection: Gathers metrics like CPU usage, memory consumption, and network traffic using tools like Prometheus.
  • Visualization Dashboards: Displays metrics in an accessible format using Grafana or similar tools.
  • Alerting Systems: Notifies administrators of critical issues based on predefined thresholds.

Common Issues & Solutions:

  • Metric Gaps: Ensure that all necessary exporters are installed and configured correctly.
  • High Resource Usage: Identify and optimize applications or nodes consuming excessive resources.

Best Practices:

  • Define Clear Metrics: Focus on key performance indicators (KPIs) that reflect cluster and application health.
  • Implement Multi-Level Alerts: Set up alerts for different severity levels to prioritize responses effectively.

Tracing: The Investigative Unit

Role: Tracing functions as the city's investigative unit, providing detailed insights into request flows and application performance, enabling root cause analysis of complex issues.

Key Components:

  • Distributed Tracing Tools: Utilize tools like Jaeger or Zipkin to trace requests across microservices.
  • Integration with Applications: Embed tracing instrumentation within application code to capture trace data.

Common Issues & Solutions:

  • Incomplete Traces: Ensure that all services are properly instrumented for tracing.
  • High Overhead: Optimize tracing configurations to balance detail with performance.

Best Practices:

  • Use Sampling Strategies: Implement sampling to manage the volume of trace data.
  • Correlate Traces with Logs and Metrics: Enhance observability by linking traces with corresponding logs and metrics for comprehensive analysis.

Common Pitfalls and How to Navigate Them

Despite its robust architecture, setting up and managing Kubernetes can present several challenges. Below, we delve into some of the most common pitfalls and provide actionable solutions to overcome them.

Misconfigured Network Plugins

Issue: Incorrect installation or configuration of the network plugin can disrupt pod communication and service discovery.

Symptoms:

  • Pods stuck in Pending state.
  • Inability to access services via DNS.
  • Inter-pod communication failures.

Debugging Steps:

  1. Check Network Plugin Pods:
    kubectl get pods -n kube-system
    
    Ensure that all network plugin pods (e.g., Calico, Weave) are running without issues.
  2. Inspect Network Plugin Logs:
    kubectl logs [NETWORK_POD_NAME] -n kube-system
    
  3. Verify Network Plugin Configuration: Ensure that the pod network CIDR matches the one specified during kubeadm init.

Solutions:

  • Reinstall or Update the Network Plugin:
    kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
    
  • Correct Configuration Files: Ensure the network plugin’s YAML manifests are correctly configured.
  • Check Compatibility: Verify that the network plugin is compatible with your Kubernetes version.

Preventive Measures:

  • Follow the network plugin’s official installation guide meticulously.
  • Plan your network architecture and ensure CIDR ranges do not conflict with existing networks.

Insufficient Resource Allocation

Issue: Nodes lack sufficient CPU, memory, or storage resources to accommodate pods, leading to scheduling failures and performance degradation.

Symptoms:

  • Pods stuck in Pending state due to resource constraints.
  • Nodes exhibiting high resource utilization.
  • Applications experiencing latency or crashes.

Debugging Steps:

  1. Check Node Resource Utilization:
    kubectl top nodes
    
  2. Inspect Pod Resource Requests and Limits:
    kubectl describe pod [POD_NAME]
    
  3. Identify Resource-Hungry Pods:
    kubectl top pods --all-namespaces
    

Solutions:

  • Scale Up the Cluster: Add more nodes to provide additional resources.
  • Optimize Resource Requests and Limits: Adjust pod specifications to align with actual usage.
  • Implement Resource Quotas: Prevent individual namespaces from consuming excessive resources.

Preventive Measures:

  • Use Horizontal Pod Autoscaling to dynamically adjust pod counts based on resource usage.
  • Regularly monitor resource utilization and adjust allocations as needed.

Improper RBAC Settings

Issue: Incorrect Role-Based Access Control (RBAC) configurations can either expose the cluster to security risks or hinder legitimate operations.

Symptoms:

  • Unauthorized access errors.
  • Users unable to perform necessary actions.
  • Excessive permissions leading to potential security breaches.

Debugging Steps:

  1. Review Current Roles and Bindings:
    kubectl get roles,rolebindings --all-namespaces
    
  2. Describe Specific Roles or Bindings:
    kubectl describe role [ROLE_NAME] -n [NAMESPACE]
    kubectl describe rolebinding [ROLEBINDING_NAME] -n [NAMESPACE]
    
  3. Check User Permissions:
    kubectl auth can-i [VERB] [RESOURCE] --as [USER]
    

Solutions:

  • Apply the Principle of Least Privilege: Grant only necessary permissions to users and service accounts.
  • Use ClusterRoles and ClusterRoleBindings Judiciously: Limit their use to roles that require cluster-wide access.
  • Audit and Revise RBAC Policies Regularly: Ensure that roles and bindings remain aligned with current operational needs.

Preventive Measures:

  • Implement role-based access policies tailored to specific teams and roles.
  • Use tools like RBAC Manager to automate and manage RBAC configurations.

Unmanaged Secrets

Issue: Mishandling secrets—storing them in plain text, improper access controls, or lack of rotation—can lead to security vulnerabilities.

Symptoms:

  • Exposure of sensitive information in repositories.
  • Unauthorized access to secret data.
  • Inability to update or rotate secrets seamlessly.

Debugging Steps:

  1. Identify Secrets Stored as Plain Text:
    kubectl get secrets --all-namespaces -o yaml
    
  2. Check Access Controls on Secrets:
    kubectl describe secret [SECRET_NAME] -n [NAMESPACE]
    
  3. Review Secret Usage in Applications: Ensure that applications correctly reference secrets without exposing them.

Solutions:

  • Use Kubernetes Secrets: Store sensitive data using Kubernetes Secrets instead of ConfigMaps or plain text files.
    kubectl create secret generic [SECRET_NAME] --from-literal=key1=value1
    
  • Implement Secret Management Tools: Integrate tools like HashiCorp Vault or Sealed Secrets for enhanced security and secret rotation.
  • Restrict Access to Secrets: Use RBAC to control which users and service accounts can access specific secrets.

Preventive Measures:

  • Encrypt secrets at rest using Kubernetes encryption providers.
  • Regularly rotate secrets and update applications to use the latest credentials.

Conclusion: Embracing the Kubernetes Metropolis

Building and maintaining Kubernetes City is akin to managing a thriving metropolis—requiring meticulous planning, vigilant monitoring, and swift troubleshooting. By understanding the intricate components of Kubernetes, from the Control Plane to the myriad objects that populate the cluster, you can orchestrate a robust, scalable, and secure environment that meets the demands of modern applications.

This guide has traversed the essential facets of Kubernetes, highlighting common pitfalls and providing actionable solutions to navigate the complexities of cluster setup and management. Embrace these insights to elevate your Kubernetes proficiency, ensuring that your applications run seamlessly and your infrastructure remains resilient against challenges.

As Kubernetes continues to evolve, staying informed and adaptable will empower you to harness its full potential, driving innovation and operational excellence in your organization. Welcome to the dynamic world of Kubernetes—where your applications flourish, and your infrastructure stands as a testament to modern orchestration mastery.


Embark on your Kubernetes journey with confidence, armed with the knowledge to build and sustain a metropolis where applications thrive and operations run flawlessly.

Priyansh Khodiyar's profile

Written by Priyansh Khodiyar

Priyansh is the founder of UnYAML and a software engineer with a passion for writing. He has good experience with writing and working around DevOps tools and technologies, APMs, Kubernetes APIs, etc and loves to share his knowledge with others.