So, containers have taken the world by storm over the last four, five years, but I wanted to take a little bit of a look back maybe for those of you who are only just getting into Docker or containers or Kubernetes or perhaps to provide a brief review for some of you who've been living it for a while of why this whole thing came into existence in the first place.

I think to understand why, you should cast yourself back into the world of cloud circa 2012.

The truth is that for most of us, we were managing virtual machines, and they were cluttered things, they had all sorts of different components on them.

They had SSH servers, they had monitoring, they had your application itself.

It was hard to know exactly what was going on, and the truth is that most of the time when we're managing them, we're managing them with some imperative script.

Maybe this was a Bash script, maybe it was something like Chef or Puppet, but in general, it was something that we ran on the VM.

Maybe it worked, maybe it didn't work.

It was difficult to understand if it failed, how to reapply it, and everything else like that.

In this context, there was a move to what became known as immutable infrastructure, and the first way is that immutable infrastructure came into existence was to say, let's actually just capture this whole thing into a VM image.

This way, by using a VM image, everything is immutable, it never changes and always deploys exactly the same way.

I don't worry about how did I make certain changes.

Did I login at the command prompt and type something like apt-get? I know exactly what's going on, I don't do any of this stuff.

But the VM images themselves, while they were great from an architectural perspective, they were really heavy from a developer perspective.

So, into that world came the idea of saying, hey, let's take that VM image actually and let's turn it into a container image, much lighter weight thing.

Instead of being hundreds of megabytes, maybe a good container image is 20 megabytes.

We'll separate out the app from the kernel, and there'll be this distance where I can say, you know what? When I care about my application, I think about my container image.

When I care about the operating system, I think about the kernel.

That decomposition and that separation of concerns really made the artifacts something that was worth, which made it easier for application developers to think about building and deploying the application.

But that wasn't the only reason, just being able to separate out your application from the rest of your operating system.

There was another part of what Docker supplied, which was the cloud repository.


So, in any real application, not only do you have to build and package your application, but you actually have to distribute it around the world.

So, I have a laptop here where I've actually built up my app.

But how do I get it to a data center that's connected to the network? How do I get it to the cloud somehow? How do I get it to multiple clouds all around the world? Sorry, picture of the world here, it's not working out so hot.

How do I do all of that? Well, it turns out that the container repository provided exactly that capability.

So, you're going to have a repository like the Azure Container Registry or many other container registries or the Docker container registry.

The developer can push their container image up, and they can pull that image wherever it needs to be: into their data center, into the cloud, or even around the world.

So, now, we have this immutable infrastructure, so we can get rid of all these scripts, we can have guarantees that your application's going to deploy correctly every single time, but we've also gained a way of distributing that same application all the way around the world.

Finally, the container image itself also became a way of putting multiple applications onto the same machine.

So, if you have a VM here or a physical machine as well, one of the challenges that a lot of people run into is that on average, it's something like 10 percent utilized.

That obviously means you're paying for way more than you're using.

One option is to make better applications.

That's often hard to do, specially with certain languages that may be single threaded or have other constraints, legacy applications that you don't want to re-architect.

If you package up your application as a container, it's actually relatively straightforward to put app one, app two, and app three all on the same machine, drive that utilization up to 50 or 60 percent without doing any sort of re-architecting at all.

Now, it's important to note that this boundary here is a resource boundary that's defined in the kernel.

It'll give you a good way of isolating in terms of things like memory, that's my memory chip drawing, as well as in terms of CPU usage, but it is not, and this is important to remember, it is not a security boundary.

So, it's not going to protect you against malicious code that's in app one from affecting a code that's in app two.

If you're trying to use containers as a security boundary, there's a lot of other additional technology you need to add on, something like a hypervisor or other kinds of isolation technology.

But if what you want to do is be able to drive up your utilization for a bunch of applications that you trust, the container can become a great artifact.

But to really make it something that is useful, you need to use a container orchestrator.

That's where something like Kubernetes comes in.

So, we have a whole bunch of machines.

We can use the Kubernetes API to distribute that container image or a lot of container images onto all of the various machines, but we'll talk about that later.


따라서 컨테이너는 지난 4, 5 년 동안 전 세계를 폭풍으로 몰아 넣었지만 Docker 나 컨테이너 또는 Kubernetes에 막 들어가는 분들 또는 아마도 제공하려는 분들을 위해 조금 되돌아보고 싶었습니다. 이 모든 것이 처음에 존재하게 된 이유에 대해 잠시 동안 살아온 여러분 중 일부에 대한 간략한 검토.

그 이유를 이해하기 위해 2012 년경 클라우드 세계로 돌아 가야합니다.

진실은 우리 대부분이 가상 머신을 관리하고 있었는데 그것들은 어수선하고 모든 종류의 다른 구성 요소를 가지고 있다는 것입니다.

그들은 SSH 서버를 가지고 있고, 모니터링하고, 애플리케이션 자체를 가지고있었습니다.

무슨 일이 일어나고 있는지 정확히 알기가 어려웠고, 사실은 우리가 그것들을 관리 할 때 대부분의 경우 명령형 스크립트로 관리하고 있다는 것입니다.

Bash 스크립트 일 수도 있고 Chef 또는 Puppet과 같은 것일 수도 있지만 일반적으로 VM에서 실행 한 것입니다.

효과가 있었을 수도 있고 그렇지 않았을 수도 있습니다.

실패 여부, 재 적용 방법, 그 밖의 모든 것을 이해하기 어려웠습니다.

이 맥락에서 불변 인프라로 알려진 이동이 있었고, 첫 번째 방법은 불변 인프라가 존재하게 된 것입니다. 실제로이 모든 것을 VM 이미지에 캡처 해 보겠습니다.

이렇게하면 VM 이미지를 사용하여 모든 것이 변경되지 않고 변경되지 않으며 항상 정확히 동일한 방식으로 배포됩니다.

어떤 변경을했는지에 대해서는 걱정하지 않습니다.

명령 프롬프트에서 로그인하고 apt-get과 같은 것을 입력 했습니까? 나는 무슨 일이 일어나고 있는지 정확히 알고 있습니다.

그러나 VM 이미지 자체는 아키텍처 관점에서는 훌륭했지만 개발자 관점에서는 정말 무겁습니다.

그래서 그 세계로, 가상 머신 이미지를 실제로 가져 와서 컨테이너 이미지로 바꿔 보겠습니다. 훨씬 가벼운 것입니다.

수백 메가 바이트가 아니라 좋은 컨테이너 이미지가 20 메가 바이트 일 수 있습니다.

우리는 커널에서 앱을 분리 할 것이고 제가 말할 수있는 거리가있을 것입니다. 애플리케이션에 관심이있을 때 컨테이너 이미지를 생각합니다.

운영 체제에 대해 걱정할 때 커널에 대해 생각합니다.

이러한 분해와 우려의 분리는 아티팩트를 가치있게 만들었고, 이는 애플리케이션 개발자가 애플리케이션 빌드 및 배포에 대해 더 쉽게 생각할 수 있도록했습니다.

그러나 그것이 유일한 이유는 아니었다. 단지 응용 프로그램을 나머지 운영 체제와 분리 할 수 ​​있기 때문입니다.

Docker가 제공 한 또 다른 부분은 클라우드 저장소였습니다.

따라서 실제 애플리케이션에서는 애플리케이션을 빌드하고 패키징해야 할뿐만 아니라 실제로 전 세계에 배포해야합니다.

여기에 실제로 앱을 만든 노트북이 있습니다.

하지만 네트워크에 연결된 데이터 센터로 어떻게 가져 옵니까? 어떻게 든 클라우드로 가져 오려면 어떻게해야합니까? 전 세계의 여러 클라우드에 어떻게 가져 옵니까? 죄송합니다. 여기 세상 사진이 너무 뜨겁지 않습니다.

이 모든 것을 어떻게하나요? 음, 컨테이너 저장소가 정확히 그 기능을 제공 한 것으로 나타났습니다.

따라서 Azure Container Registry 또는 기타 여러 컨테이너 레지스트리 또는 Docker 컨테이너 레지스트리와 같은 리포지토리를 갖게됩니다.

개발자는 컨테이너 이미지를 위로 올릴 수 있으며 데이터 센터, 클라우드 또는 전 세계 어디에서나 해당 이미지를 가져올 수 있습니다.

이제 우리는이 불변의 인프라를 가지고 있습니다. 그래서 우리는 이러한 모든 스크립트를 제거 할 수 있습니다. 우리는 당신의 애플리케이션이 매번 올바르게 배포 될 것이라는 것을 보장 할 수 있습니다. 그러나 우리는 또한 동일한 애플리케이션을 모두 배포하는 방법을 얻었습니다. 전 세계의 방법.

마지막으로 컨테이너 이미지 자체도 여러 애플리케이션을 동일한 시스템에 배치하는 방법이되었습니다.

따라서 여기에 VM이 있거나 물리적 시스템이있는 경우 많은 사람들이 직면하는 문제 중 하나는 평균적으로 10 % 정도 활용된다는 것입니다.

그것은 분명히 당신이 사용하는 것보다 더 많은 비용을 지불하고 있음을 의미합니다.

한 가지 옵션은 더 나은 애플리케이션을 만드는 것입니다.

특히 단일 스레드이거나 다른 제약 조건이있을 수있는 특정 언어, 다시 설계하고 싶지 않은 레거시 응용 프로그램에서는 수행하기가 어렵습니다.

애플리케이션을 컨테이너로 패키징하는 경우 실제로는 앱 1, 앱 2, 앱 3을 모두 동일한 시스템에 배치하고 전혀 재 설계하지 않고도 활용률을 최대 50 ~ 60 %까지 끌어 올리는 것이 상대적으로 간단합니다. .

이제 여기서이 경계가 커널에 정의 된 리소스 경계라는 점에 유의하는 것이 중요합니다.

그것은 메모리와 같은 것들과 CPU 사용량 측면에서 분리하는 좋은 방법을 제공 할 것입니다. 그러나 그것은 아닙니다. 그리고 이것은 기억하는 것이 중요합니다. 이것은 보안 경계가 아닙니다. .

따라서 앱 1에있는 악성 코드가 앱 2에있는 코드에 영향을주지 않도록 보호 할 수는 없습니다.

컨테이너를 보안 경계로 사용하려는 경우 하이퍼 바이저 또는 다른 종류의 격리 기술과 같이 추가해야하는 다른 많은 기술이 있습니다.

하지만 원하는 것이 신뢰할 수있는 여러 애플리케이션에 대한 활용도를 높이는 것이라면 컨테이너가 훌륭한 아티팩트가 될 수 있습니다.

하지만 실제로 유용하게 사용하려면 컨테이너 오케 스트레이터를 사용해야합니다.

이것이 Kubernetes와 같은 것이 들어오는 곳입니다.

그래서 우리는 많은 기계를 가지고 있습니다.

Kubernetes API를 사용하여 해당 컨테이너 이미지 또는 많은 컨테이너 이미지를 모든 다양한 머신에 배포 할 수 있지만 이에 대해서는 나중에 설명하겠습니다.

  • No labels
Write a comment…