Hi, I'm Brendan.
Today we're going to talk about Pods and Pod lifecycle.
So just as a quick refresher, in Kubernetes, a pod is the atomic unit of scheduling.
It can contain one or more containers.
It might be something like a web server and a side car.
We're not really going to talk too much more about the containers themselves, but what we are going to talk about is what happens when you create that pod.
How does the lifecycle of it work within Kubernetes? Well, the very first thing that happens when you create that pod is it goes into a state called pending.
Now, what pending means is that the Kubernetes API has accepted your pod.
It's ready to go, but it hasn't actually been scheduled onto a machine.
You may have a number of different VMs that are running, that could have that pod.
There's the scheduler, which is responsible for looking at the various resources, maybe one CPU and two gigs of memory and finding a home for that pod on a particular machine.
So once that's happened, once the scheduler has said, hey, this pod is running on say that this is node 3.
Once it says the pod is running on node 3, it transitions out of the pending state and into the creating state.
Now, what's going on with the creating state? Well, the first thing that's happening is obviously the image needs to be pulled.
Now, the image is in some Cloud-based repository.
Maybe it's in the Azure Container Registry.
So what's happening is the node itself is going out to the Azure Container Registry and pulling the image down to the node.
Now, actually Kubernetes has a preference for scheduling containers onto nodes where the image is already present.
So it's possible that if the image is already present on this node, this pull step will be skipped because it obviously doesn't need to happen if the image is already there.
All right, so once the container image has been pulled, the container transitions into the running state.
Once the container is in the running state, your program is up and running, everything is operating happily.
But of course, bad things can happen and your container could crash.
So we have a process running inside this container.
If it happens to crash, Kubernetes is going to restart it.
So when it restarts, if it restarts too many times, your pod can go into a state that's called CrashLoopBackOff.
What this effectively means is, hey, I've seen your container crash too many times, rather than fruitlessly restarting it over and over and over again, which takes a bunch of resources and takes CPU for the Kubelet could be using for maintaining other pods.
It's actually going to back off.
It's going to actually say, "Hey, I used to try and restart it immediately, now maybe I'm going to wait 10 seconds.
If that fails, maybe I'll wait 20 seconds," and so on and so forth.
So you'll see all of these things when you say kube control get pods.
You'll see this state pending running CrashLoopBackOff.
If you see CrashLoopBackOff, that means something very bad is wrong.
Generally speaking, you'll want to look at the logs or other things to figure out why your container is crashing.
You may actually need to fix things in order to get back to a running state.
Now, sometimes this happens because the database isn't available and it's a transient problem and eventually you get back to healed.
But usually, it means there's something that you need to get involved with.
Now, there's a few other kinds of error conditions that can happen.
Sometimes you'll see things gets stuck in pending.
If it gets stuck in pending, that usually means there's no resources.
All of these VMs are full.
There are no resources available for your pod to run.
The only way to fix that is either to delete some other pods from your cluster or to actually scale up the size of your cluster.
So if you see things staying in pending for a really long time, you're going to need to resize your cluster, or turn on auto-scaling, or delete workload, or simply wait and maybe something will stop running if it's a batch job or something like that.
Now, another thing that can happen is you could actually give a bad image.
So when the VM goes to pull, it can say, "Hey, I don't know there's a 404 with pulling the image.
I don't know what that image is." When that happens, you're going to get stuck in the creating state and you're never going to transition to running.
Again, if you do a kube control, get pods you may not see this, but if you do a kube control describe, you'll get all of the events associated.
So you'll see the events that are associated with this particular pod.
In there, you'll see something like tried to pull image, failed to pull image.
Sometimes this happens if you're not authorized.
Sometimes it happens if you have a typo in the image name.
Kubernetes itself doesn't check with the repository ahead of time before it schedules the container to make sure that the image is available.
So if you see things that are stuck in creating, it's usually because there's some degree of problem with the image itself.
There's also some more advanced parts of the pod lifecycle.
In particular, the most common thing that people do is you can start hanging health events.
So you can say, health or ready lifecycle events off the pod.
When you attach these URLs to the pod, what happens is the Kubelet is going to actually use these URLs to test to see if your pod is healthy.
If it's not healthy, if it returns something that's not a 200, it's going to restart your pod, just like it crashed, and it can cause CrashLoopBackOff if it happens too many times.
If it checks the readiness, it's going to determine whether it is added to a load balance or not.
There's also a couple of lifecycle hooks that the pod itself calls to help you integrate with other things.
The first one is post start.
That's a webhook that you can register.
That webhook is called immediately after your containers starts.
Then there is pre-stop, which is called immediately before your container terminates.
So if you want to take some action after you started running, you can register a post start hook.
If you want to take some action just before your container is terminated, you can register a pre-stop hook.
The other piece of integration with lifecycle is you can actually in your pod define an init container.
This is a separate container image.
What its job is to do is to provide some degree of initialization before the rest of the containers in your pod startup.
So if you specify an init container, that container will run to completion first.
It returns as 0, for example.
Then all of the other containers inside of your pod will get started up.
This is a good way to do things like a schema migration or any other kind of downloading files out of some storage account, any other kind of initialization that you need to do prior to the starting of your pod.
I hope that gives you an illustration of the general pod lifecycle and how you can integrate your container with Kubernetes and pods.
Thanks.
안녕하세요, 저는 Brendan입니다.
오늘은 포드 및 포드 수명주기에 대해 이야기하겠습니다.
따라서 빠르게 복습하는 것처럼 Kubernetes에서 포드는 예약의 원자 단위입니다.
하나 이상의 컨테이너를 포함 할 수 있습니다.
웹 서버와 사이드 카와 같은 것일 수 있습니다.
우리는 컨테이너 자체에 대해 너무 많이 이야기하지는 않겠지 만, 우리가 이야기 할 것은 포드를 만들 때 일어나는 일입니다.
Kubernetes 내에서 수명주기는 어떻게 작동합니까? 그 포드를 만들 때 가장 먼저 발생하는 것은 보류 중이라는 상태가되는 것입니다.
이제 보류 중이 란 Kubernetes API가 포드를 수락했다는 의미입니다.
사용할 준비가되었지만 실제로 머신에 예약되지 않았습니다.
해당 포드를 포함 할 수있는 실행중인 여러 VM이있을 수 있습니다.
스케줄러는 다양한 리소스 (아마도 1 개의 CPU와 2 기가 바이트의 메모리)를 살펴보고 특정 머신에서 해당 포드의 홈을 찾는 역할을합니다.
일단 그런 일이 발생하면 스케줄러가 이렇게 말하면이 포드가 노드 3에서 실행 중이라고 말합니다.
포드가 노드 3에서 실행 중이라고 표시되면 보류 상태에서 생성 중 상태로 전환됩니다.
이제 생성 상태는 어떻게됩니까? 음, 가장 먼저 일어나는 일은 분명히 이미지를 가져와야한다는 것입니다.
이제 이미지는 일부 클라우드 기반 저장소에 있습니다.
Azure Container Registry에있을 수 있습니다.
따라서 일어나는 일은 노드 자체가 Azure Container Registry로 이동하고 이미지를 노드로 가져 오는 것입니다.
이제 실제로 Kubernetes에는 이미지가 이미있는 노드에 컨테이너를 예약하는 것이 선호됩니다.
따라서 이미지가 이미이 노드에있는 경우 이미지가 이미있는 경우 분명히 발생할 필요가 없기 때문에이 풀 단계를 건너 뛸 수 있습니다.
좋습니다. 컨테이너 이미지를 가져 오면 컨테이너가 실행 상태로 전환됩니다.
컨테이너가 실행 중 상태가되면 프로그램이 실행되고 모든 것이 정상적으로 작동합니다.
그러나 물론 나쁜 일이 발생할 수 있고 컨테이너가 충돌 할 수 있습니다.
그래서 우리는이 컨테이너 내부에서 실행되는 프로세스를 가지고 있습니다.
충돌이 발생하면 Kubernetes가 다시 시작합니다.
따라서 다시 시작할 때 너무 많이 다시 시작하면 포드가 CrashLoopBackOff라는 상태가 될 수 있습니다.
이것이 효과적으로 의미하는 바는, 당신의 컨테이너가 계속해서 다시 시작되는 것보다 너무 많은 시간 동안 컨테이너가 충돌하는 것을 보았습니다. 이는 많은 리소스를 사용하고 다른 포드를 유지하는 데 사용할 수있는 CPU를 사용합니다. .
실제로 물러날 것입니다.
실제로 이렇게 말할 것입니다. "예전에는 즉시 다시 시작했습니다. 이제 10 초 동안 기다리겠습니다.
실패하면 20 초 정도 기다리겠습니다. "
따라서 kube control get pods라고 말하면 이러한 모든 것을 볼 수 있습니다.
이 상태는 CrashLoopBackOff 실행 보류 중입니다.
CrashLoopBackOff가 표시되면 매우 나쁜 것이 잘못되었음을 의미합니다.
일반적으로 컨테이너가 충돌하는 이유를 파악하기 위해 로그 또는 기타 사항을 살펴 보는 것이 좋습니다.
실행 상태로 돌아가려면 실제로 문제를 해결해야 할 수도 있습니다.
이제 때때로 이것은 데이터베이스를 사용할 수없고 일시적인 문제이고 결국에는 다시 치유되기 때문에 발생합니다.
그러나 일반적으로 참여해야 할 것이 있음을 의미합니다.
이제 발생할 수있는 몇 가지 다른 종류의 오류 조건이 있습니다.
때로는 상황이 보류중인 것을 볼 수 있습니다.
보류 상태에 빠지면 일반적으로 리소스가 없음을 의미합니다.
이러한 VM이 모두 꽉 찼습니다.
포드를 실행할 수있는 리소스가 없습니다.
이를 해결하는 유일한 방법은 클러스터에서 다른 포드를 삭제하거나 실제로 클러스터의 크기를 확장하는 것입니다.
따라서 정말 오랜 시간 동안 보류 상태로 유지되는 경우 클러스터의 크기를 조정하거나 자동 확장을 설정하거나 워크로드를 삭제해야합니다. 또는 단순히 기다리면 배치 작업 인 경우 실행이 중지 될 수 있습니다. 또는 그런 것.
이제 일어날 수있는 또 다른 일은 실제로 나쁜 이미지를 줄 수 있다는 것입니다.
따라서 VM이 가져 오려고 할 때 "이봐, 이미지를 가져 오는 404가 있는지 모르겠습니다.
그 이미지가 무엇인지 모르겠습니다. "그렇게되면 생성 상태에 갇히게되며 실행 상태로 전환되지 않습니다.
다시 말하지만, kube 제어를 수행하는 경우 pod를 가져 오면 이것을 볼 수 없지만 kube 제어 설명을 수행하면 연관된 모든 이벤트를 얻을 수 있습니다.
따라서이 특정 포드와 관련된 이벤트를 볼 수 있습니다.
거기에는 이미지 가져 오기 시도, 이미지 가져 오기 실패와 같은 내용이 표시됩니다.
권한이없는 경우 때때로 이런 일이 발생합니다.
때때로 이미지 이름에 오타가있는 경우 발생합니다.
Kubernetes 자체는 이미지를 사용할 수 있는지 확인하기 위해 컨테이너를 예약하기 전에 미리 저장소를 확인하지 않습니다.
따라서 제작에 갇힌 것을 본다면 일반적으로 이미지 자체에 어느 정도 문제가 있기 때문입니다.
포드 수명주기의 일부 고급 부분도 있습니다.
특히 사람들이하는 가장 일반적인 일은 건강 이벤트를 걸기 시작할 수 있다는 것입니다.
따라서 포드 외부의 상태 또는 준비된 수명주기 이벤트를 말할 수 있습니다.
이러한 URL을 포드에 연결하면 Kubelet은 실제로 이러한 URL을 사용하여 포드가 정상인지 테스트합니다.
정상이 아닌 경우 200이 아닌 것을 반환하면 팟 (Pod)이 충돌 한 것처럼 다시 시작되며 너무 많이 발생하면 CrashLoopBackOff가 발생할 수 있습니다.
준비 상태를 확인하면로드 밸런스에 추가할지 여부를 결정합니다.
또한 포드 자체가 다른 항목과 통합하는 데 도움이되는 몇 가지 수명주기 후크가 있습니다.
첫 번째는 시작 후입니다.
등록 할 수있는 웹훅입니다.
해당 웹훅은 컨테이너가 시작된 직후에 호출됩니다.
그런 다음 컨테이너가 종료되기 직전에 호출되는 사전 중지가 있습니다.
따라서 실행을 시작한 후 몇 가지 조치를 취하려면 시작 후 후크를 등록 할 수 있습니다.
컨테이너가 종료되기 직전에 조치를 취하려면 사전 중지 후크를 등록 할 수 있습니다.
라이프 사이클과의 다른 통합은 실제로 포드에서 초기화 컨테이너를 정의 할 수 있다는 것입니다.
이것은 별도의 컨테이너 이미지입니다.
그 역할은 포드 시작의 나머지 컨테이너 전에 어느 정도 초기화를 제공하는 것입니다.
따라서 init 컨테이너를 지정하면 해당 컨테이너가 먼저 완료 될 때까지 실행됩니다.
예를 들어 0으로 반환됩니다.
그러면 포드 내부의 다른 모든 컨테이너가 시작됩니다.
이는 스키마 마이그레이션 또는 일부 저장소 계정에서 파일을 다운로드하는 다른 종류, 포드를 시작하기 전에 수행해야하는 다른 종류의 초기화와 같은 작업을 수행하는 좋은 방법입니다.
일반적인 포드 수명주기와 컨테이너를 Kubernetes 및 포드와 통합하는 방법에 대한 설명이 제공되기를 바랍니다.
감사.
Add Comment