Oops! Something went wrong while submitting the form.
We use cookies to improve your browsing experience on our website, to show you personalised content and to analize our website traffic. By browsing our website, you consent to our use of cookies. Read privacy policy.
A couple of weeks back, we started working with the Kubernetes Python client to carry out basic operations on its components/ resources, and that’s when we realized how few resources there were (guides, docs) on the internet. So, we experimented and decided to share our findings with the community.
This article is targeted towards an audience that is familiar with Kubernetes, its usage, and its architecture. This is not a simple Kubernetes guide; it’s about Kubernetes using Python, so as we move further, we may shed light on a few things that are required, but a few will be left for self exploration.
Kubernetes Overview
Kubernetes is an open-source container orchestration tool, largely used to simplify the process of deployment, maintenance, etc. in application development. Kubernetes is built to offer highly available, scalable, and reliable applications.
Generally, kubectl commands are used to create, list, and delete the Kubernetes resources, but for this article, we put on a developer's hat and use the Python way of doing things. In this article, we learn how to create, manage, and interact with Kubernetes resources using the Kubernetes' Python library.
But why, you may ask?
Well, having an option of doing things programmatically creates potential of endless exciting innovations for developers. Using Python, we can:
Create and manage Kubernetes resources dynamically
Apply algorithms that change the state, amount of resources in our cluster
Build a more robust application with solid alerting and monitoring features
So, let us begin:
Kubernetes achieves what it does with the help of its resources. These resources are the building blocks for developing a scalable, reliable application.
Let's briefly explore these resources to understand what they are and how exactly they work together in Kubernetes:
Node: Simple server, a physical/virtual machine.
Pod: Smallest unit of Kubernetes, provides abstraction over a container. Creates a running env/layer on top of the container. Usually runs only one application container but can run multiple as well.
Service: Static IP address for the pod. Remains the same even after the pod dies. Also doubles as a load-balancer for multiple pods: a) External services are used to make the app accessible through external sources. b) Internal services are used when accessibility is to be restricted.
Ingress: Additional layer of security and address translation for services. All the requests first go to ingress then forwarded to the service.
ConfigMap: External configuration of your app like urls of database or other services.
Secret: To store secret/sensitive data like db-credentials, etc., encoded in base_64 format.
Volumes: Kubernetes does not manage any data persistence on its own. Volumes are used to persist data generated by pods. It attaches a physical storage to the pod that can be both local or remote like cloud or on-premise servers.
Deployment: Defines blueprint of the pods and its replication factor. A layer of abstraction over pods makes the configuration convenient.
StatefulSet: Applications that are stateful are created using these to avoid data inconsistency. Same as deployment.
These are a few of the basic Kubernetes resources. If you want to explore the rest of these resources, you can click here.
Apart from these resources, there are also namespaces in Kubernetes. You will come across them quite a few times in this article, so here are some noteworthy points for Kubernetes namespaces:
Kubernetes namespaces: Used to group/organize resources in the cluster. It is like a virtual cluster inside a cluster. Namespaces are used to:
Structure resources
Avoid conflicts between teams
Share services between different environments
Access restrictions
Limiting resources.
Setting up the system
The Kubernetes library comes to our aid with quite a few modules, the ones featured in this article are client and config modules from the package; we will be using these two heavily. So, let’s install the Kubernetes Python Client:
To install the Kubernetes Python client, we make use of Python’s standard package installer pip:
Creating Resources: The usual way to create resources in Kubernetes is to use a kubectl create command with required parameters (defaults if not specified) or to use kubectl apply command, which takes a YAML/JSON format configuration file as input. This file contains all the specifications and metadata for the component to be created. For example:
So, basically, we just need two things: a string type namespace in which we want our resource to be in and a body.
This body is the same as the config.yaml file that we saw earlier. But, how exactly do we create or use that in our code? We utilize the component specific classes that this library offers us for this.
Let us take an example, to create a pod we use V1Pod class from the Kubernetes.client.
An instance of this V1Pod contains all the params like kind, metadata, spec, etc., so all we need to pass them and then we are good. And while we are at it, let’s create metadata and spec as well using a couple more classes.
1. V1ObjectMeta: This takes all the fields that can be part of metadata as parameters, e.g.
2. V1Container: If you recall the brief definition of Kubernetes pods given earlier, we realize that pods are just layers above containers, which means we will have to provide the container(s) that the pods abstracts over. The V1Container class from Kubernetes client does just what we need.
These containers run the specified image, with their name taken as a parameter by the object. Containers also have several other parameters like volume_mounts, ports that can also be passed while instantiation or could be set later using object reference.
And there you have it, that's how you create a pod.
Similarly, we can create other resources, although not all resources take the same set of parameters, for example PersistentVolume (PV in short) does not come under namespaces, it is a cluster wide resource, so naturally it won’t be expecting a namespace parameter.
Fetching Logs:
When it comes to monitoring and debugging Kubernetes’ resources, logs play a major role. Using the Kubernetes Python client, we can fetch logs for resources. For example, to fetch logs for a pod:
There are quite a lot of ways this article could have been written, but as we conclude, it’s quite evident that we have barely scratched the surface. There are many more interesting, advanced things that we can do with this library, but those are beyond the scope of this article.
We can do almost all the operations with the Python client that we usually do with kubectl on Kubernetes resources. We hope that we managed to keep the content both interesting and informative.
If you’re looking for a comprehensive guide on Kubernetes or something interesting to do with it, don't worry, we’ve got you covered. You can refer to a few of our other articles and might find just what you need:
A couple of weeks back, we started working with the Kubernetes Python client to carry out basic operations on its components/ resources, and that’s when we realized how few resources there were (guides, docs) on the internet. So, we experimented and decided to share our findings with the community.
This article is targeted towards an audience that is familiar with Kubernetes, its usage, and its architecture. This is not a simple Kubernetes guide; it’s about Kubernetes using Python, so as we move further, we may shed light on a few things that are required, but a few will be left for self exploration.
Kubernetes Overview
Kubernetes is an open-source container orchestration tool, largely used to simplify the process of deployment, maintenance, etc. in application development. Kubernetes is built to offer highly available, scalable, and reliable applications.
Generally, kubectl commands are used to create, list, and delete the Kubernetes resources, but for this article, we put on a developer's hat and use the Python way of doing things. In this article, we learn how to create, manage, and interact with Kubernetes resources using the Kubernetes' Python library.
But why, you may ask?
Well, having an option of doing things programmatically creates potential of endless exciting innovations for developers. Using Python, we can:
Create and manage Kubernetes resources dynamically
Apply algorithms that change the state, amount of resources in our cluster
Build a more robust application with solid alerting and monitoring features
So, let us begin:
Kubernetes achieves what it does with the help of its resources. These resources are the building blocks for developing a scalable, reliable application.
Let's briefly explore these resources to understand what they are and how exactly they work together in Kubernetes:
Node: Simple server, a physical/virtual machine.
Pod: Smallest unit of Kubernetes, provides abstraction over a container. Creates a running env/layer on top of the container. Usually runs only one application container but can run multiple as well.
Service: Static IP address for the pod. Remains the same even after the pod dies. Also doubles as a load-balancer for multiple pods: a) External services are used to make the app accessible through external sources. b) Internal services are used when accessibility is to be restricted.
Ingress: Additional layer of security and address translation for services. All the requests first go to ingress then forwarded to the service.
ConfigMap: External configuration of your app like urls of database or other services.
Secret: To store secret/sensitive data like db-credentials, etc., encoded in base_64 format.
Volumes: Kubernetes does not manage any data persistence on its own. Volumes are used to persist data generated by pods. It attaches a physical storage to the pod that can be both local or remote like cloud or on-premise servers.
Deployment: Defines blueprint of the pods and its replication factor. A layer of abstraction over pods makes the configuration convenient.
StatefulSet: Applications that are stateful are created using these to avoid data inconsistency. Same as deployment.
These are a few of the basic Kubernetes resources. If you want to explore the rest of these resources, you can click here.
Apart from these resources, there are also namespaces in Kubernetes. You will come across them quite a few times in this article, so here are some noteworthy points for Kubernetes namespaces:
Kubernetes namespaces: Used to group/organize resources in the cluster. It is like a virtual cluster inside a cluster. Namespaces are used to:
Structure resources
Avoid conflicts between teams
Share services between different environments
Access restrictions
Limiting resources.
Setting up the system
The Kubernetes library comes to our aid with quite a few modules, the ones featured in this article are client and config modules from the package; we will be using these two heavily. So, let’s install the Kubernetes Python Client:
To install the Kubernetes Python client, we make use of Python’s standard package installer pip:
Creating Resources: The usual way to create resources in Kubernetes is to use a kubectl create command with required parameters (defaults if not specified) or to use kubectl apply command, which takes a YAML/JSON format configuration file as input. This file contains all the specifications and metadata for the component to be created. For example:
So, basically, we just need two things: a string type namespace in which we want our resource to be in and a body.
This body is the same as the config.yaml file that we saw earlier. But, how exactly do we create or use that in our code? We utilize the component specific classes that this library offers us for this.
Let us take an example, to create a pod we use V1Pod class from the Kubernetes.client.
An instance of this V1Pod contains all the params like kind, metadata, spec, etc., so all we need to pass them and then we are good. And while we are at it, let’s create metadata and spec as well using a couple more classes.
1. V1ObjectMeta: This takes all the fields that can be part of metadata as parameters, e.g.
2. V1Container: If you recall the brief definition of Kubernetes pods given earlier, we realize that pods are just layers above containers, which means we will have to provide the container(s) that the pods abstracts over. The V1Container class from Kubernetes client does just what we need.
These containers run the specified image, with their name taken as a parameter by the object. Containers also have several other parameters like volume_mounts, ports that can also be passed while instantiation or could be set later using object reference.
And there you have it, that's how you create a pod.
Similarly, we can create other resources, although not all resources take the same set of parameters, for example PersistentVolume (PV in short) does not come under namespaces, it is a cluster wide resource, so naturally it won’t be expecting a namespace parameter.
Fetching Logs:
When it comes to monitoring and debugging Kubernetes’ resources, logs play a major role. Using the Kubernetes Python client, we can fetch logs for resources. For example, to fetch logs for a pod:
There are quite a lot of ways this article could have been written, but as we conclude, it’s quite evident that we have barely scratched the surface. There are many more interesting, advanced things that we can do with this library, but those are beyond the scope of this article.
We can do almost all the operations with the Python client that we usually do with kubectl on Kubernetes resources. We hope that we managed to keep the content both interesting and informative.
If you’re looking for a comprehensive guide on Kubernetes or something interesting to do with it, don't worry, we’ve got you covered. You can refer to a few of our other articles and might find just what you need:
Velotio Technologies is an outsourced software product development partner for top technology startups and enterprises. We partner with companies to design, develop, and scale their products. Our work has been featured on TechCrunch, Product Hunt and more.
We have partnered with our customers to built 90+ transformational products in areas of edge computing, customer data platforms, exascale storage, cloud-native platforms, chatbots, clinical trials, healthcare and investment banking.
Since our founding in 2016, our team has completed more than 90 projects with 220+ employees across the following areas:
Building web/mobile applications
Architecting Cloud infrastructure and Data analytics platforms