Hey, I'm Brendan, and today, we're going to talk about how deployments in Kubernetes work, specifically how you can use deployments to do reliable zero downtime upgrades of your software running inside of a Kubernetes cluster.

Well, let's suppose you have a simple application.

It's got three replicas.

They're controlled by a deployment.

So, this is a pod.

This is a pod.

This is a pod.

You've got a deployment here and a load balancer provided by a service.

Obviously, the load balancer is bringing traffic to each of these pods.

In the deployment, you're using image v1.

You're using v1 of your container image to run that application.

So, you've got a v1 here, a v1 here, a v1 here.

Now, when you change that deployment, when you push a new image to the deployment object, it's going to trigger off a rollout.

The deployment itself is going to take responsibility for rolling out your application.

So, you might come along and you might say, you know what, I want to change this to image v2.

Now, that doesn't happen immediately.

It's not as if the instant you change the deployment from v1 to v2, all of your containers immediately are moved from one version to the next.

The reason for this is obvious.

First of all, if we did that, we would take down every replica of your service and it would be briefly unavailable.

Second of all, you might have flaws in v2.

You don't want to suddenly move from v1 to v2 if v2 is suddenly going to start crashing all the time, right? So, we need to do a gradual rollout from one version to the next while maintaining access for all of the users.

To achieve this, Kubernetes has a couple of concepts that are associated with the pod.

The first concept is this something called a liveness check, and the second is a readiness check.

Together, these things define what it means to be a healthy pod.

Liveness defines whether or not a pod should be automatically restarted.

Say, your application is deadlocked.

Readiness determines whether or not your application is ready to serve.

So, we change our version from v1 to v2.

In its most basic setting, what the deployment now will do is it will actually create a fourth replica of your application, and this one is v2.

Now, assuming that the container comes up and it passes its liveness check, the system will continue to keep that container up and running, but it hasn't yet added it into the load balancer.

Only when the readiness check, so our liveness check is checked.

Only when the readiness check passes, does now traffic be brought down from the load balancer to this new container.

Now, at this point, the deployment sees, okay, liveness check has passed, readiness check has passed, container is up and serving traffic, now, I'm going to actually delete one of my old applications.

So, I'm going to actually come along and I'm going to delete this container.

But wait, I hear you say.

I had user traffic that was being executed by that application in the instant when you tried to delete it.

How can you possibly do zero downtime upgrades if the user traffic was interrupted? Well, it turns out the pod also has something called a termination grace period.

What the termination grace period determines is how long this container stays up and running after it's started, it's been deleted, it's been requested until it is actually terminated? By default, this is 30 seconds.

So, what happens then is when the deployment makes the decision to delete this pod, it is moved into the terminating state, the connection to the load balancer is severed, but the container itself is still up and running for 30 seconds.

That means any user requests that are being processed while the container is terminating successfully are processed, but new requests no longer come down to this container because the connection to the load balancer has been severed.

After 30 seconds or accustomed termination grace period has passed, this container is actually fully deleted and is really, really gone.

At this point, the deployment moves on and it creates another pod.

The same process happens again.

Liveness check hopefully passes.

Once the readiness check passes, traffic is brought down to this new container that is a v2 container.

Again, this container is terminated first by severing the load balancer connection.

Then, after the termination grace period by actually deleting the container.

Once that has happened successfully, a third pod is created with v2.

It passes its liveness check.

It passes its readiness check.

Traffic comes down.

At this point, connection is severed and this container has been deleted.

Now, we've done an upgrade from v1 of our application to v2 of our application without any user traffic being affected by the rollout.

Now, actually, the deployment is significantly more configurable than that.

In this particular example, we moved one container at a time that is configurable if you want to do a deployment more quickly.

In this deployment, we didn't wait any period of time after the container became ready before moving on to the next pod that the length of time to wait in between containers is also configurable.

Likewise, we always added an extra container.

So, we always went from three to four instead of subtracting a container and moving from three to two.

That is likewise also configurable inside of the deployment.

But I hope this gives you an idea of how deployments work and how you can use them in your Kubernetes cluster to do zero downtime upgrades of your applications.


안녕하세요, 저는 Brendan입니다. 오늘은 Kubernetes에서 배포가 작동하는 방식, 특히 배포를 사용하여 Kubernetes 클러스터 내에서 실행되는 소프트웨어의 다운 타임없이 안정적인 업그레이드를 수행하는 방법에 대해 이야기 할 것입니다.

음, 간단한 응용 프로그램이 있다고 가정 해 보겠습니다.

3 개의 복제품이 있습니다.

배포에 의해 제어됩니다.

그래서 이것은 포드입니다.

이것은 포드입니다.

이것은 포드입니다.

여기에 배포가 있고 서비스에서 제공하는로드 밸런서가 있습니다.

분명히로드 밸런서는 이러한 각 포드로 트래픽을 가져옵니다.

배포에서는 이미지 v1을 사용하고 있습니다.

해당 애플리케이션을 실행하기 위해 컨테이너 이미지의 v1을 사용하고 있습니다.

여기에 v1, 여기에 v1, 여기에 v1이 있습니다.

이제 해당 배포를 변경할 때 배포 개체에 새 이미지를 푸시하면 롤아웃이 트리거됩니다.

배포 자체는 응용 프로그램을 롤아웃하는 데 책임이 있습니다.

그래서, 여러분이 와서 말할 수 있습니다. 여러분은 이것을 이미지 v2로 바꾸고 싶습니다.

자, 그것은 즉시 일어나지 않습니다.

배포를 v1에서 v2로 변경하는 순간 모든 컨테이너가 한 버전에서 다음 버전으로 즉시 이동되는 것과는 다릅니다.

그 이유는 분명합니다.

우선, 그렇게하면 서비스의 모든 복제본을 삭제하고 잠시 사용할 수 없게됩니다.

두 번째로 v2에 결함이있을 수 있습니다.

v2가 갑자기 항상 충돌하기 시작하면 v1에서 v2로 갑자기 이동하고 싶지는 않습니다. 따라서 모든 사용자의 액세스를 유지하면서 한 버전에서 다음 버전으로 점진적으로 롤아웃해야합니다.

이를 위해 Kubernetes에는 포드와 관련된 몇 가지 개념이 있습니다.

첫 번째 개념은 활성 확인이라고하는 것이고 두 번째 개념은 준비 상태 확인입니다.

함께, 이러한 것들은 건강한 꼬투리가되는 것이 무엇을 의미하는지 정의합니다.

Liveness는 포드를 자동으로 다시 시작할지 여부를 정의합니다.

애플리케이션이 교착 상태라고 가정 해 보겠습니다.

준비 상태는 애플리케이션을 제공 할 준비가되었는지 여부를 결정합니다.

따라서 버전을 v1에서 v2로 변경합니다.

가장 기본적인 설정에서 배포가 수행 할 작업은 실제로 애플리케이션의 네 번째 복제본을 만드는 것입니다.이 복제본은 v2입니다.

이제 컨테이너가 나타나고 활성 상태 확인을 통과했다고 가정하면 시스템은 해당 컨테이너를 계속 가동하고 실행하지만 아직로드 밸런서에 추가하지 않았습니다.

준비 상태 확인시에만 활성 상태 확인이 확인됩니다.

준비 검사를 통과 한 경우에만 이제 트래픽이로드 밸런서에서이 새 컨테이너로 내려갑니다.

이제이 시점에서 배포는 활성 확인이 통과되고 준비 확인이 통과되었으며 컨테이너가 작동 중이며 트래픽을 처리하는 것을 확인합니다. 이제 이전 애플리케이션 중 하나를 실제로 삭제하겠습니다.

그래서 저는 실제로 함께 가서이 컨테이너를 삭제하겠습니다.

하지만 잠깐, 당신이 말하는 것을 들었습니다.

삭제하려고 할 때 해당 응용 프로그램에서 실행중인 사용자 트래픽이 있습니다.

사용자 트래픽이 중단 된 경우 어떻게 제로 다운 타임 업그레이드를 수행 할 수 있습니까? 음, 포드에도 종료 유예 기간이라는 것이 있습니다.

종료 유예 기간은이 컨테이너가 시작된 후, 삭제 된 후 실제로 종료 될 때까지 요청 된 후 실행 상태를 유지하는 기간을 결정합니다. 기본적으로 30 초입니다.

따라서 배포에서이 포드를 삭제하기로 결정하면 종료 상태로 이동하고로드 밸런서에 대한 연결이 끊어 지지만 컨테이너 자체는 여전히 30 초 동안 작동 및 실행됩니다.

즉, 컨테이너가 성공적으로 종료되는 동안 처리중인 모든 사용자 요청이 처리되지만로드 밸런서에 대한 연결이 끊어 졌기 때문에 새 요청이 더 이상이 컨테이너로 내려 오지 않습니다.

30 초 또는 익숙한 종료 유예 기간이 지나면이 컨테이너는 실제로 완전히 삭제되고 실제로 사라집니다.

이 시점에서 배포가 진행되고 다른 포드가 생성됩니다.

동일한 과정이 다시 발생합니다.

활력 확인이 통과 되었으면합니다.

준비 검사를 통과하면 v2 컨테이너 인이 새 컨테이너로 트래픽이 전송됩니다.

다시 말하지만,이 컨테이너는로드 밸런서 연결을 끊으면 먼저 종료됩니다.

그런 다음 해지 유예 기간 후에 실제로 컨테이너를 삭제합니다.

성공적으로 수행되면 v2로 세 번째 포드가 생성됩니다.

활성 확인을 통과합니다.

준비 검사를 통과했습니다.

교통량이 감소합니다.

이 시점에서 연결이 끊어지고이 컨테이너가 삭제되었습니다.

이제 우리는 사용자 트래픽이 롤아웃의 영향을받지 않고 애플리케이션 v1에서 애플리케이션 v2로 업그레이드했습니다.

이제 실제로 배포는 그것보다 훨씬 더 구성 가능합니다.

이 특정 예에서는 배포를 더 빠르게 수행하려는 경우 구성 가능한 컨테이너를 한 번에 하나씩 이동했습니다.

이 배포에서는 컨테이너가 준비된 후 컨테이너 간 대기 시간도 구성 할 수있는 다음 포드로 이동하기 전에 어느 기간도 기다리지 않았습니다.

마찬가지로 우리는 항상 추가 컨테이너를 추가했습니다.

그래서 우리는 컨테이너를 빼고 3에서 2로 이동하는 대신 항상 3에서 4로갔습니다.

마찬가지로 배포 내부에서도 구성 할 수 있습니다.

하지만 이것이 배포가 작동하는 방식과 Kubernetes 클러스터에서 배포를 사용하여 애플리케이션의 다운 타임없이 업그레이드를 수행하는 방법에 대한 아이디어를 제공하기를 바랍니다.

  • No labels
Write a comment…