Pods, ReplicaSets, and Deployments- Kubernetes Fundamental - Ep. 4
45K views
Nov 1, 2023
Join this live session with Rodrigo Díaz Concha for the next episode of Kubernetes Fundamentals on January 11, Wednesday at 7:30 AM Pacific Time (US). After attending this session, you will feel confident about “Pods, ReplicaSets, and Deployments” C# Corner - Community of Software and Data Developers https://www.c-sharpcorner.com #CSharpCorner #CSharpTV #Kubernetes
View Video Transcript
0:30
20 years ago, a seed was planted and cared for
0:38
We painstakingly nurtured it and weathered it against adversity until one day it blossomed and the fruits of our labor began to show
0:46
Today, millions have learned, shared, and been inspired by what our community has produced
0:51
We proudly serve 21 million users from 204 countries in 2019. For our 85,000 technical articles, code samples, and videos, our 450,000 forum questions, and our highly anticipated conferences and events featuring keynote panels, live streams, and industry experts and influencers, we recognize and reward members for their dedication to the community
1:14
Through content contributions and mentorships, we ranked number 2,620 in the world with the reach of millions across our social media channels
1:22
Thanks to you, our global community of software and data developers grows stronger each day
1:27
For more information, visit us at csharpcorner.com. Good morning, everyone. Welcome to the Kubernetes Fundamental Series
1:38
This is session four. My name is Rodrigo. And today I will be talking about pods replica sets in deployments
1:49
So let's get started, shall we? So before we describe what replica sets are and deployments
1:59
let's do a short and quick recap about the things that we've seen up to this point
2:06
As you might remember, we were talking about the fundamental resources that we can deploy in a Kubernetes cluster
2:13
Of course, we want to run our container applications, right? So we have our containers
2:20
and those containers will be deployed into a pod. The pod is the smallest object
2:31
that we can deploy in a Kubernetes cluster, okay? That's where your containers are
2:36
You can have one container, or you can have more than one container
2:43
if you're, I don't know, implementing the sidecar design pattern or other design patterns that use more than one container
2:55
And those pods, it's quite strange if you deploy them directly. That's actually, I don't think that's something
3:05
quite real world. actually you don't deploy your pods directly. What you use is a replica set
3:14
And the replica set is this object that allows you to replicate the pods
3:19
And actually it has the configuration about how many pods you want
3:24
in your Kubernetes cluster at a given time. And then you use the deployment
3:32
Actually the deployment, I think that's more common. you create a deployment.jml file
3:39
and you deploy that.jml file to create the deployment itself. And the deployment has inside a replica set
3:48
which in turn has the definition of the pod that you want
3:52
and how many replicas of that pod you want. Okay. So as I mentioned before
3:59
you can have more than one container and there are others. there are other objects that we can deploy
4:07
in a Kubernetes cluster. I'm gonna talk about that maybe today, maybe in the next session, such as the service object
4:15
Anyways, then we explain the imperative versus the declarative approach of defining things
4:25
I mentioned before that the imperative way is when you type the commands
4:32
And those commands will execute and change the things that you're specifying in those specific lines
4:44
One of the things about the imperative way is that you're explicitly telling Kubernetes what to do
4:52
Instead, we use the declarative way. I think that's more real world
4:59
Actually, if you're looking for the CKA or CKAD certifications, you're going to be presented with a lot of JAML files
5:13
because that's the way that we use for this declarative approach. You can use JAML, you can use JSON
5:21
So the difference is that with this kind of text files, you are describing what you want
5:29
And Kubernetes is going to accomplish what you're trying to implement. Okay
5:37
Because Kubernetes is based on this desired state thing. So you're declaring the desired state of things and Kubernetes is going to fulfill that desire for you
5:56
Okay. So, and then we talked about that declarative is the preferred way, as I mentioned before
6:05
And we can also use a hybrid approach, which is just execute your imperative commands and obtain the JML or JSON structure
6:16
And then use that for creating your declarative manifest files. So here's an example of creating a pod by using kubectl run
6:28
kubectl run is the command that we use to create a pod. In this case, it's creating a my nginx
6:37
that's the name of the pod and it's using the nginx image
6:42
If you don't specify a fully qualified name, it's going to use the Docker Hub registry
6:51
which is the default, okay? And here's another example of creating a namespace
6:57
I'm going to talk about namespaces in the following sessions. So as you can see, I'm using kubectl again
7:04
This time it's using the create command for creating this namespace. Here's another example of the declarative approach
7:14
Actually, we created a manifest file from scratch by using Visual Studio Code
7:22
and some of its plugins for creating this YAML files In this case as you can see we have four main elements such as API version kind
7:35
metadata, and spec. So API version is the API version that you want to use
7:42
It's related to the Kubernetes version that you're using. Kind is the kind of object
7:47
that you want to deploy. Metadata is the group of all the metadata elements
7:53
that you want to specify for this particular object. And finally, spec is the place where you specify
8:02
the traits of that particular pod. In this case, it's just specifying
8:08
that the name will be NGINX and it's based on the NGINX image
8:15
So with the hybrid approach, as I mentioned before, we can use this command to output the Jamel content
8:25
and then create a Jamel file. So you can use it directly, maybe not
8:30
maybe just use the structure for, as a baseline, right? And well, actually I think that's pretty handy
8:42
Other commands, kubectl delete for deleting objects, kubectl edit for editing objects
8:48
And finally, kubectl replace for replacing the properties of a specific object inside the cluster
8:59
I mentioned the difference between kubectl create and kubectl apply. The difference is that kubectl apply
9:06
if the object doesn't exist, it will be created. And kubectl create, if the object doesn't exist
9:13
is going to return an error. That's the difference, okay? So I mentioned the manifest files
9:20
Those are the files that we create by using. Actually, you can do that from scratch if you're willing to do it
9:28
However, there are a lot of applications and templates that we can use
9:33
such as the ones that we can find in Visual Studio Code
9:37
So for instance, let me open here the terminal and let's create session four
9:45
session four right and let's open up visual studio code and here i just want to create a demo.jamml
9:56
file and here i'm gonna use pod and as you can see i have this intellisense thing so i can press
10:05
tab and i have this nice placeholders that i want that i can use for specifying some of the
10:14
elements in some of the values of those elements in this file
10:21
such as, I don't know, my awesome pod or something, and then the image, I don't know, NGINX again
10:28
and the port will be 80 or something, right? So I have already a manifest files for creating a pod
10:37
This is great. Of course, you can do that or you just can first type API version, then kind, right
10:46
And then metadata and finally spec. And then you create all those different elements
10:52
However, you need to know the different properties and the structure of that particular object that you want to create
11:03
I don't remember if I mentioned that before. However, we have the kubectl explain
11:10
man, I think I didn't mention this. kubectl explain is awesome because it allows you to obtain the help
11:20
for a particular element in a manifest file. For instance, let's, I don't know
11:25
I want to know more about metadata.name. So you execute this command
11:34
and this will return the help for this particular element. Of course, this is gonna return an error
11:43
because I don't have a cluster yet. Let's do that. Let's run the terminal as an administrator
11:51
And here, I'm gonna do the following. Remember that we're using MiniQube
11:57
as the technology for deploying the cluster. So I can run MiniQube, delete
12:03
So this is gonna delete all the different virtual machines that were before
12:08
And let me show you that I'm gonna open up Hyper-V Manager
12:14
And this is deleting those virtual machines, right? So this is stopping the virtual machines
12:27
deleting the virtual machines, and then I can create a new cluster
12:32
So let's wait for this. And again, Minikube, start, and then the driver will be Hyper-V, Hyper-V
12:43
and then the nodes will be, let's say three. And this is gonna deploy a cluster with three nodes, okay
12:52
So let's wait for that. In the meantime, let's go ahead and continue with this recap
13:00
I mentioned API version, which is the version of the API that you want to use, right
13:05
We can use the API versions command to obtain all the different compatible API versions
13:12
that your cluster supports. The kind is the kind of object that you want to deploy
13:18
Metadata here is the place where you specify all the different traits about that particular object
13:26
and metadata, such as name, namespace, labels, and annotations, and some other things
13:31
and finally spec which is the specification of that object per se okay so when you create
13:43
those objects in your cluster each object has an auto-generated UID actually you don't
13:51
manage those ideas directly or reference those ideas directly however is something that you
14:00
you should know each object has its own identity. Then I talked about pods
14:06
which is the primitive object for running an application. This is the place where you deploy your containers
14:14
Okay, this is the smallest object that we can create in a Kubernetes cluster
14:19
And generally speaking, there's a one-on-one mapping between a pod and a container
14:26
And of course you can deploy more than one container in a single pod for some scenarios
14:32
such as any containers, the ambassador pattern, the adapter pattern, or the sidecar pattern
14:39
that is used by DAPR, which is some fantastic framework for creating distributed applications and microservices
14:49
Actually DAPR is based on this sidecar design pattern. So actually what you use is the pod for deploying your containers However you don scale an application by just adding more containers to a pod okay You don have
15:05
What you use is a replica set. And that's what I'm going to explain today
15:13
Cool. I mentioned the lifecycle of pods and some of the commands that we can use to manage pods
15:20
So let's wait for this cluster to be created. As you can see, those three virtual machines
15:29
are already deployed. And it looks like it's going to finish sometime soon or not
15:39
Okay, let's wait for this. Anyways, there are other container, I'm sorry
15:45
there are states for containers as well. We have the life cycle states for the pods
15:53
and we also have container states. So you can know if a container is running or it's not
16:01
Cool. So let's talk about replica sets. So this object, it allows you to specify a number of pods
16:11
that you want to execute at any point. So this is based on the promise theory
16:23
that Kubernetes implements. So that promise theory is related to the desired state of things
16:31
So you define this desired state and Kubernetes is gonna fulfill that desired state
16:38
for you automatically. You don't have to do anything about that. That's actually one of the objectives
16:49
and goals of Kubernetes, okay? So you can use this replica set object independently
16:58
However, usually we define it inside a deployment. A deployment in itself has a replica set
17:06
That's an inherent replica set, okay? Back in the day, some years ago
17:13
we have the replication controller. And actually that's the original form of replication in Kubernetes
17:22
Then ReplicaSit was created. I think this is the way to go nowadays
17:28
But of course, if you, I don't know, if you open a book about Kubernetes, an old one
17:35
or a video or blog post about Kubernetes, And if it's, I don't know, if it's, I don't know
17:43
maybe three years from now, or it's older than that, then you can see the replication controller being mentioned
17:52
However, replica set is the way to go, okay? So cool, how can we create the replica set objects
18:01
So let's go back here to the terminal, kubectl get nodes, let me execute this
18:10
to know if everything is running correctly. Config get nodes, is that it
18:17
Config, I'm sorry, get nodes, I'm sorry. And the other one is config, I can remember the other command
18:27
for obtaining the information about the cluster. Anyways, this is running. Okay, I have three nodes
18:35
and I want to execute the other command that I was telling you about
18:42
which is explain pod metadata dot name. In this case, as you can see
18:50
it's telling me the description about that particular element inside the pod object
18:57
So I'm obtaining this help, this command, contextual help about that here in the terminal
19:06
which is great. I think this is a great way to learn
19:10
about the Kubernetes objects. Another example could be, I don't know, specs
19:16
This is spec and then containers. Is that the name? Yes, containers
19:23
So as you can see, for instance, this containers element has art command
19:30
and from image, liveness pro names, the name ports and so on and so on and so on
19:40
I'm telling you this because this is a great way to understand the structure of objects in Kubernetes
19:47
Let's go back here and let's open up Visual Studio Code again
19:53
I'm going to open up this demo.jamo file again. But this time I'm going to use the repli word
20:05
and then I'm gonna press top. As you can see, I'm creating a replication controller
20:11
This is the one that I was telling you about that this is the old object
20:17
And of course, this is not going to work. Of course it's going to work
20:22
but I don't want to deploy this kind of object, okay? I need something to tell me the structure of the replica set
20:32
I want to create a replica set. I believe this plugin that has the replication controller
20:39
template doesn't have the replica set template. However, let's search for this
20:47
in the Kubernetes documentation replica set, Kubernetes schema or something, right? And here's the replica set
20:58
And here's an explanation about replica sets. And I'm gonna copy this. Okay
21:06
And I think that's enough. Okay. So let's do this. I'm gonna create this replica set
21:16
I think the difference is in the match labels. element I'm not sure I mean the difference between replica set and replication controller
21:27
anyways as you can see the API version is different this is one of the differences
21:34
because because replica replication controller uses the v1 API version in replica set is using
21:43
apps slash v1. So we have API version, kind, metadata, just the regular stuff that I told you about
21:53
Of course, I'm going to explain labels and some other things such as match labels
21:58
and annotations later in this series, okay? However, here, as you can see
22:07
inside this spec element, we have the replicas element. With this value, you're telling Kubernetes
22:17
how many replicas you want for this specific pod. So in other words, you don't need to specify
22:24
a replica set inside the spec You just specify your pod and then with the replicas element
22:36
you're telling how many replicas you want. In this case, it's going to create this PHP Redis container
22:49
Actually, let's do this. My nginx and then again, and this is because this is the image
22:57
that I've been using since day one. So I think this is great
23:01
nginx, this is a type of nginx. My nginx, okay. So this is the structure of a replica set object
23:14
Actually is very similar to the pod specification. Actually, this is the pod specification. Okay
23:23
So let's do this, my pod.jml. Let's create a pod just to see the differences side by side
23:33
So this is the pod. Okay. And this is the replica set
23:40
And if we compare the spec, actually it's almost the same. Actually, you know what
23:46
This is the pod. This spec that is inside this other spec
23:51
this is the spec for the replica set. And this is the spec for the pod
23:56
Okay. So this is the comparison. This one against this other one
24:05
So inside the spec of the replica set is the replica settlement
24:10
that you use for specifying how many replicas you want. And you have other things such as selectors
24:16
match labels and so on. And here's the pot. Okay. So as you can see, this is like a copy of the pot spec
24:26
Actually, if you copy this and then you paste this inside the spec
24:32
it should work. This should totally work. Okay. In theory, this should work
24:41
Actually, you know what? Let's do this. So I just want to get rid of the resources element because I don't want to talk about resources today
24:51
And my Nginx, my Nginx, Nginx, and then the image should be Nginx
25:03
And this should work. Okay. This is actually what we had before I deleted the entire element
25:09
And so actually I'm going to just undo the changes because I don't want to mess with the names
25:24
This is the thing that the code that I pasted, let me show you one thing
25:29
because this is not going to work if I continue with this, okay
25:33
So let's close this. And again, I have API version kind metadata
25:40
the meta and the spec, this is the spec for the replica set
25:46
the spec for the pod. Why in the world, this is not going to work
25:52
if I deleted this other elements? Well, actually I wasn't deleting this
25:59
I was just changing the name of the image. The thing is, I don't want to confuse you today
26:05
The thing is that those labels are quite important. Those labels are the way that the replica set uses
26:13
for detecting what are the pods that this replica set object is going to manage
26:20
Okay, that's the reason why I'm explaining and I'm mentioning this. Anyways, bear with me friends, okay
26:31
We're going to see labels later in this series. Okay, so my Nginx
26:40
Nginx. This is safe to change. This is nothing wrong, okay? This is just using the front-end labels, which is fine
26:53
Those pods will have the front-end labels and that's great, okay. So let's try to deploy this
27:02
Let's go back to the terminal and I have those couple of files
27:08
and then kubectl apply and then the file and then the demo.jml file
27:17
So as you can see, the Replica set object was created successfully
27:22
At least this is the status that the apply command is telling me
27:27
And how can we know if those pods were created and the replica set was created
27:35
So remember that we have the get command and you specify the name of the object
27:41
that you want to query. In this case, I'm gonna use pods
27:46
I could be using pod as well. Pod or pods is the same
27:51
So as you can see, this is creating those pods. And actually those three pods
27:57
are running correctly. So let's go back here to Visual Studio Code
28:04
and let's change the replicas to 10 instead of three. And let's run again, the apply command, okay
28:16
I'm changing the replica set object. And now if I execute the get pods command again
28:24
you can see that now I have 10 replicas instead of three. Okay
28:30
So Kubernetes is fulfilling this desired state for me. I'm not creating each of those pods manually, right
28:41
I'm just specifying, hey, you know what, Kubernetes? I want 10 replicas of this pod
28:48
And the specification of the pod is this, okay? This is great
28:55
This is great because actually this is one of the main traits of Kubernetes
29:02
fulfilling the desired state of things. So let's verify this. What happens if I delete this pod
29:13
which in this case, it has the frontend-47 blah, blah, blah name, okay
29:22
What's that name? Remember that when we created the pod manually, I had the chance to name the pod
29:30
with whatever name I wanted, right? In this case, it's using the name of the replica set
29:39
which is frontend, okay? And then a hash name, okay? So it's making sure that those pods have different names
29:51
and of course different IDs. So what happens if I delete the frontend dash 47.5
29:59
and blah, blah, blah. Let's do this, okay? kubectl delete pod and then the name, okay
30:07
And then I execute again, get pods. So I was fast enough and quick enough
30:16
to execute the get pods command again to see that the 96 pod
30:24
this one is being created, right? So if I execute again, this is running
30:30
So there's no old, the old pod was deleted. However, because of the desired state of things
30:41
Kubernetes is fulfilling that and is creating an additional pod for me
30:47
because I want to have 10 instead of nine, right? Make sense
30:54
So this is actually the heart of Kubernetes, fulfilling the desired state of things
31:04
So I have three, four, five, six, seven, eight, nine, 10. And I can identify this newly created pod
31:11
because of the H, right? Cool. And I can also query for those replica set objects
31:23
So actually you can execute kubectl get and then replica set, okay
31:29
Or another alias is rs. So as you can see, I have this front end replica set
31:39
And it's telling me some important and interesting things, such as the desired number of pods and how many pods are currently running. cool so
31:56
I can also use kubectl describe and the name of this replica set
32:05
so as you can see if I execute the describe command against the front end
32:12
replica set I'm obtaining all the details about that replica set so it's telling me that
32:20
So those pods were created, right? And there was this last pod that was created after the fact
32:30
Cool. And what happens if you delete the replica set? So let's do this, kubectl
32:44
delete replica set, and then the name, which is frontend. And of course those pods will be deleted
32:55
The pods will be deleted automatically if you delete the replica set that was controlling
33:02
and grouping all those pods. Okay. Make sense? That's why the match labels and labels
33:10
and some of those things are I'm gonna describe that and explain that
33:18
maybe in a couple of sessions. However, we can see that if you delete the replica set
33:25
all the pods will be deleted as well. Cool, so now let's talk about deployments
33:34
The deployment is the object that we actually use most of the time, generally speaking
33:42
when deploying applications in the Kubernetes cluster. Okay. Actually, it's almost similar to the replica set
33:52
It's almost the same. However, the deployment has a trait, a different trait, which is controlling the rollbacks
34:01
and rollouts of those applications in a safely way. So the deployment object enables you to deploy
34:10
and manage updates for pods in a cluster. Yeah I guess you can use replica sets in real world applications However you use deployments most of the time because the deployment uses a replica set inside
34:33
And it manages the life cycle of pods because if you create a pod manually
34:40
that pod is not going to be relaunched if it fails or something
34:44
That actually is the responsibility of the replica set. And of course, there's a replica set inside of deployment
34:56
The thing is that if you changed a replica set, it wouldn't take an effect on existing pods
35:05
So for instance, if you want to, I don't know, Let's change the, I don't know
35:12
the resource limits or even the image name, okay? If you change the image name
35:20
and some specific properties about the replica set, such as the spec element
35:30
the replica set will not do anything special, okay? This is important
35:37
That's why the deployment is better in this case. And actually that's the object that we use most of the time. Okay
35:45
And this is why this is telling me that it's a higher abstraction. Okay
35:51
It wraps one or more replica sets and it provides control rollouts
35:57
And of course you can roll back those rollouts as well. So yeah, the best practice is to use a deployment
36:06
Let's create our deployment and let's see what happens. Okay, so let's go back here
36:13
and let's create my deployment.jml. And here I'm gonna write deployment
36:22
gonna press tab. And again, this is the deployment object, which is inside the apps forward slash V1 API version
36:34
version very similar to the replica set okay and actually i think this is uh basically the same okay
36:45
let's change those values for instance the name of the application say my deployment okay and the
36:55
and the image name will be NGINX, and the container port will be 80, okay
37:02
I just want to get rid of that resources element, okay? It's okay, it's okay if I have this yellow squiggly line
37:14
it doesn't matter right now, okay? So let's compare those two files
37:22
As you can see, of course, kind is different, right? Metadata, of course, the deployment has the name
37:32
and the replica set has labels as well. So I guess it's almost similar, right
37:44
So let's change the number of replicas inside the deployment. where will be the place where we can implement
37:53
this replicas element? So this is inside this spec, replicas. Let's do this
38:04
Let's go back to the terminal. Let me see if I don't have any kind of replica set
38:11
Okay, I deleted all the pods by deleting the replica set. Okay, let's execute kubectl apply
38:19
and then the name of the file, which is my deployment.jml. So the deployment is created successfully
38:28
And now let's see kubectl get pods. So as you can see, again, I have 10 pods
38:39
However this time the name of each pod has the name of the deployment dash and then the name of the replica set dash
38:51
And the hash, instead of just using the replica set prefix. And another thing is that the name of the replica set
39:04
was created randomly. This is another hash string. And let's see what happens if I execute kubectl
39:18
kubectl, kubectl, kubectl, get replica set. And the name of this replica set is my deployment dash
39:31
that randomly created name. The desired state is 10, 10 pods are running
39:38
in this moment. And now I can get all the different deployments
39:47
Okay, get deployment or get deployments, those two are alias, okay. And I have my deployment object that I just created
39:58
It says ready 10 over 10. This is, I wanted 10 pots and 10 pots are ready
40:05
pods are running. This is the summary of that line and some other things such as up to date
40:14
and available in DH. Let's see what happens if I execute OY
40:22
As you can see, this is telling me some other things such as the containers, images and the selector
40:31
which is a topic that I'm going to explain when I explain the labels and annotations, okay
40:40
Cool. So this is telling me that everything is running correctly. I have 10 pods inside a replica set
40:49
that is inside a deployment, okay? So everything is running correctly. What happens if I changed one of the elements
41:01
inside the deployment object. In other words, what happens if I go back to Visual Studio
41:10
and edit the, I don't know, maybe the spec of the container
41:16
Let's do this. However, let's go here to hub docker com and search for NGINX because I need other tag
41:28
I don't know, maybe 1.22, okay? 1.22, I want to use this other image name
41:41
Of course, that's a different image name, right? So what happens if I apply this
41:52
jaml file again? kubectl apply, my deployment, Okay, it's telling me that it was configured
42:02
and now let's execute pods, get pods again. So this is interesting because those pods
42:13
all the pods were terminated gracefully and then it's starting and creating other pods
42:24
Right now, new 10 pods are running right now. However, I have 10 pods that were using the NGINX image name
42:38
and then I changed the image name to use the 1.22 tag
42:46
And then Kubernetes detected that and gracefully terminated all the previous pods
42:55
and created new ones, okay? Without me doing anything Again this is the desired state of things This is the promise theory that Kubernetes offers right
43:15
Let's do that again. Let's change this image name to other thing
43:21
I don't know. You know what? Let's use Redis or MySQL or something
43:30
It doesn't matter. I just want to change the image name and I want to download another
43:38
completely different image name. So I can have enough time to show you the things
43:45
that are happening in that particular moment. Okay, so I'm changing the image name to Redis
43:51
and let's apply this deployment again. Let's execute get pods. And as you can see, those new pods are being created
44:02
One, two, three, four, five. Okay. Some others were running at that moment
44:08
And now all 10 pods are running again. And I guess this is because I had the Redis previously
44:18
So it wasn't what I expected. I expected to, you know, to download everything from scratch
44:26
So anyways, I have a lot of different image names right now
44:32
Anyways, it doesn't matter. Okay, it doesn't matter. This is being controlled and managed by the deployment object
44:41
Just make sure that you identify that those pods are being created again
44:48
And the previous pods are being terminated gracefully. Okay, so I think this is what I had for today
45:04
So kubectl get deployment and these the pods are being changed by the fact that I'm changing the manifest file
45:20
That's one of the traits about deployments. And yeah, so in the next session
45:28
I'm going to talk about services because those pods are running, right
45:35
However, it's not that you're going to query those pods directly. And let me show you why
45:47
Let's see what's going on here. As you can see, each pod has its own IP address, okay
45:58
However, pods could be terminated and could be created again. So the IP address and the name of
46:06
of course, the name of the pod is quite volatile, right? And the IP address as well
46:13
So it's not that you're going to query those pods directly. You're not going to execute nothing
46:20
against those pods in a direct way. You need something in the middle
46:25
and that's the service object that we're going to deploy in the next session
46:33
And I'm going to talk about more things about the deployment objects
46:38
such as rollbacks and rollouts and the history of the rollouts and those things
46:46
And yeah, thank you very much for your time. And let's see if we have some questions
47:03
Okay. So the stream will end after I end the show. Okay
47:10
So thank you very much for your time, friends, and see you on the next session about this Kubernetes series
#Distributed & Cloud Computing