Hey.

I'm Brendan and we're going to talk about Admission Controllers, how they interact with Kubernetes, and what they can do for you.

Well, I wanted to start by just diagramming out what a request looks like when it comes into Kubernetes.

There's basically three parts.

There's obviously the person or potentially automation that is making the API call, that goes to the API server, and that eventually goes to the etcd database.

That's the basic flow of all API requests.

Now, inside of the API server itself, there is code that does RBAC for authorization, and it also does authentication.

So that allows you to say hey, this user can or can't do certain things within the cluster, but there's a lot of stuff that you might want to do that involves either modifying or validating an API object that looks within the API object itself in order to make decisions or even make modifications, and that's where admission controllers come in.

So an admission controller is something that happens after a authn and authz, after a user has been authorized, an admission controller is called and those are usually web hooks so that you can dynamically register admission controllers.

There are two basic classes of admission controllers.

There are validating emission controllers, and there are mutating emission controllers.

As you might guess from the name of validating admission controller looks at the contents of an API object and make sure that it's valid API object.

We'll talk a little bit about some use cases for that.

A mutating admission controller looks at the API object and actually changes it.

So it actually may add things, it may remove things, it actually modifies the API object on the way in, and we'll talk about the use cases for that as well.

Let's take a look at validating admission controllers first.

With validating admission controller, the goal is to ensure some property for an object is maintained.

Generally when we think about this, we think about this in terms of something like policy.

As a concrete example, the gatekeeper open-source project that's maintained by Azure and others to build policy for Kubernetes uses a validating admission controller to integrate itself into Kubernetes.

Using a policy engine like RegO from the open policy agent folks, you can actually say things like I want every replica set must have at least three replicas.

That's something that you can't express with authorization or authentication, but it is something that you can express with policy.

Obviously this is because you want to make sure that someone is doing a good job replicating their application for reliability.

You could also say something like every object in my Kubernetes cluster has to have an annotation that is the e-mail of the owner of that resource.

This becomes really valuable when you're building automation to for example reminds someone that they may have a resource that needs to be deleted or a resource that is having a problem.

Having this standardized metadata in your system makes it much easier to build automation, and really the only way to make sure that people do that is through policy so that if they don't and they don't include that in the request over here, that request is rejected.

So obviously building an admission controller can be a complicated thing to do.

So the great thing about projects like gatekeepers, they integrate with admission control automatically for you, you just need to install them in your cluster.

But eventually over time, you may choose to build your own validating admission controller as well.

Let's talk a little bit about mutating and mission controllers.

The goals behind a mutating emission control are actually a little bit different, they're to actually change the API object to enable some defaulting or to add capabilities.

So a classic example of a mutating admission controller would be to say, "Hey, we're going to add default CPU limits." When someone creates a pod, they don't supply a set of resources in terms of CPU and memory that that pod needs, we're going to actually set some defaults for them.

Maybe we'll set the default request at one core and two gigs of memory, and that's just to ensure that the user has a good time.

Because if you create a pod and you don't specify resource limits, generally speaking Kubernetes will totally overpack and overload the cluster, things will start crashing, applications won't work properly.

So with a mutating admission controller, we help a user find the happy path instead of leading themselves down a place where they're going to actually do damage to their application and to their users.

Another popular example of a mutating admission controller is a service mesh.

Now, service mesh usually involves a some sidecar container that lives next to your app container, and the easiest way to get that sidecar injected is to use a mutating admission controller that modifies the pod that a user creates to add that sidecar.

That way, you don't have to educate the application developer and you don't have to change any configurations of the applications themselves in order to get the sidecar applied to all of the pods that they create.

Likewise, if you need to go from Version 1 to Version 2 of a particular container, if you centralize it and standardize it with a mutating admission controller, you can be sure that you can change the version that everybody is using without requiring everyone to go in and change their YAML files.

I hope that gives you a perspective about how admission controller is integrated with the basic API flow in Kubernetes, the differences between a validating admission controller for things like policy, and a mutating admission controller for defaulting or adding new sidecars to your applications, and I hope you see how they can empower you to do even more cool things with the containers that you deploy it to Kubernetes on Azure or elsewhere.


야.

저는 Brendan입니다. Admission Controllers, Kubernetes와 상호 작용하는 방법 및 그들이 당신을 위해 할 수있는 일에 대해 이야기 할 것입니다.

글쎄요, 저는 쿠 버네 티스에 대한 요청이 어떻게 보이는지 다이어그램으로 시작하고 싶었습니다.

기본적으로 세 부분이 있습니다.

API 호출을하는 사람 또는 잠재적으로 자동화가 API 서버로 이동하고 결국 etcd 데이터베이스로 이동합니다.

이것이 모든 API 요청의 기본 흐름입니다.

이제 API 서버 자체 내부에는 권한 부여를 위해 RBAC를 수행하는 코드가 있으며 인증도 수행합니다.

따라서이 사용자는 클러스터 내에서 특정 작업을 수행 할 수 있거나 수행 할 수 없다고 말할 수 있습니다.하지만 API 객체 자체 내에서 보이는 API 객체를 수정하거나 유효성을 검사하는 것과 관련된 작업이 많이 있습니다. 결정을 내리거나 심지어 수정하기 위해, 그것이 바로 승인 컨트롤러가 들어오는 곳입니다.

따라서 승인 컨트롤러는 authn 및 authz 이후에 발생하는 것입니다. 사용자가 승인 된 후 승인 컨트롤러가 호출되고 일반적으로 웹 후크이므로 승인 컨트롤러를 동적으로 등록 할 수 있습니다.

입학 컨트롤러에는 두 가지 기본 클래스가 있습니다.

검증 방출 제어기가 있고 돌연변이 방출 제어기가 있습니다.

승인 컨트롤러의 이름에서 짐작할 수 있듯이 API 개체의 내용을보고 유효한 API 개체인지 확인합니다.

이에 대한 몇 가지 사용 사례에 대해 조금 이야기하겠습니다.

변경 승인 컨트롤러는 API 객체를보고 실제로 변경합니다.

그래서 실제로는 물건을 추가하고, 제거 할 수도 있고, 실제로 들어가는 도중에 API 객체를 수정하고, 그 사용 사례에 대해서도 이야기 할 것입니다.

먼저 승인 컨트롤러 유효성 검사를 살펴 보겠습니다.

승인 컨트롤러를 확인하는 경우 목표는 개체의 일부 속성이 유지되도록하는 것입니다.

일반적으로 우리는 이것을 생각할 때 정책과 같은 관점에서 생각합니다.

구체적인 예로, Kubernetes에 대한 정책을 구축하기 위해 Azure 및 다른 사람들이 유지 관리하는 게이트 키퍼 오픈 소스 프로젝트는 유효성 검사 승인 컨트롤러를 사용하여 Kubernetes에 통합됩니다.

개방형 정책 에이전트 직원의 RegO와 같은 정책 엔진을 사용하여 실제로 모든 복제 세트에 최소 3 개의 복제가 있어야한다고 말할 수 있습니다.

이는 권한 부여 나 인증으로 표현할 수없는 것이지만 정책으로 표현할 수있는 것입니다.

분명히 이것은 누군가가 신뢰성을 위해 자신의 애플리케이션을 복제하고 있는지 확인하기를 원하기 때문입니다.

또한 내 Kubernetes 클러스터의 모든 객체에 해당 리소스 소유자의 이메일 인 주석이 있어야한다고 말할 수도 있습니다.

예를 들어 삭제해야 할 리소스 또는 문제가있는 리소스가있을 수 있음을 누군가에게 상기시키기 위해 자동화를 구축 할 때 이것은 정말 가치가 있습니다.

이 표준화 된 메타 데이터를 시스템에 포함하면 자동화를 훨씬 쉽게 구축 할 수 있습니다. 실제로 사람들이 그렇게 할 수 있도록하는 유일한 방법은 정책을 통해서만 가능하며 여기에있는 요청에 포함하지 않으면 해당 요청은 거부됩니다.

따라서 분명히 승인 컨트롤러를 구축하는 것은 복잡한 일이 될 수 있습니다.

따라서 게이트 키퍼와 같은 프로젝트의 장점은 승인 제어와 자동으로 통합되므로 클러스터에 설치하기 만하면됩니다.

그러나 결국 시간이 지남에 따라 자체 검증 승인 컨트롤러를 구축 할 수도 있습니다.

뮤 테이 팅과 미션 컨트롤러에 대해 조금 이야기 해 봅시다.

돌연변이 방출 제어의 목표는 실제로 약간 다릅니다. 실제로 API 객체를 변경하여 일부 기본값을 활성화하거나 기능을 추가하는 것입니다.

따라서 변경 승인 컨트롤러의 고전적인 예는 "이봐, 우리는 기본 CPU 제한을 추가 할 것"이라고 말하는 것입니다. 누군가 포드를 생성 할 때 포드에 필요한 CPU 및 메모리 측면에서 리소스 집합을 제공하지 않고 실제로 일부 기본값을 설정합니다.

아마도 우리는 기본 요청을 하나의 코어와 2GB의 메모리로 설정할 것입니다. 이는 사용자가 즐거운 시간을 보낼 수 있도록하기위한 것입니다.

포드를 생성하고 리소스 제한을 지정하지 않으면 일반적으로 Kubernetes가 클러스터를 완전히 오버 패킹하고 과부하를 일으키고 충돌이 시작되고 애플리케이션이 제대로 작동하지 않기 때문입니다.

따라서 변경 승인 컨트롤러를 사용하면 사용자가 자신의 애플리케이션과 사용자에게 실제로 피해를 입힐 수있는 곳으로 이동하는 대신 사용자가 행복한 길을 찾도록 도와줍니다.

변경 승인 컨트롤러의 또 다른 인기있는 예는 서비스 메시입니다.

이제 서비스 메시에는 일반적으로 앱 컨테이너 옆에있는 일부 사이드카 컨테이너가 포함되며 해당 사이드카를 삽입하는 가장 쉬운 방법은 사용자가 해당 사이드카를 추가하기 위해 생성하는 포드를 수정하는 변경 승인 컨트롤러를 사용하는 것입니다.

이렇게하면 애플리케이션 개발자를 교육 할 필요가 없으며 이들이 생성하는 모든 포드에 사이드카를 적용하기 위해 애플리케이션 자체의 구성을 변경할 필요가 없습니다.

마찬가지로 특정 컨테이너의 버전 1에서 버전 2로 이동해야하는 경우 중앙 집중화하고 mutating 허용 컨트롤러로 표준화하면 모든 사람이 사용하지 않아도 모든 사람이 사용하는 버전을 변경할 수 있습니다. YAML 파일에서 변경하십시오.

이 정보가 Kubernetes의 기본 API 흐름과 승인 컨트롤러가 통합되는 방식, 정책과 같은 항목에 대한 승인 승인 컨트롤러의 차이점, 애플리케이션에 새 사이드카를 기본값으로 설정하거나 추가하기위한 변경 승인 컨트롤러의 차이점에 대한 관점을 제공하기를 바랍니다. Azure 또는 다른 곳에서 Kubernetes에 배포하는 컨테이너를 사용하여 더 멋진 작업을 수행 할 수있는 방법을 확인하시기 바랍니다.



  • No labels
Write a comment…