Hi, I'm Brendan Burns from Microsoft Azure, and we're going to talk about Kubernetes and configuration management.

When you think about configuration management, it's helpful to think about the problem that we're trying to solve.

When people first defined their pod and their container image, I think they often think well you know what, configuration can just be a part of the container image that I deploy.

But I think it's useful to think of the pod in the container image just like you would think of a function in a programming language.

Just like a function has parameters, you should think about a configuration for your application providing the parameters for your container image.

The reason for this is because of you want to create images that are general purpose.

They're useful in a variety of scenarios.

You may have different configurations in Canary environment where you're testing a particular configuration.

As you deploy to a worldwide configuration, you may want to parameterize your image with different languages, different images, all sorts of different small variations that you want while still using the same build, the same continuous delivery to define the image itself.

Fortunately in Kubernetes, there's a resource to represent this, and it's known as a ConfigMap.

A ConfigMap resource is a collection of key value pairs.

Those key value pairs can be something like a language, of EN_US.

So really just string string pairs, or they might also be something like a properties file in a traditional Java application, and the configuration value is actually the value of the file itself.

Now when you think about consuming this ConfigMap after it's been created inside of the Kubernetes API server, you can mount that ConfigMap as a volume into the pod itself.

Then once you create the volume associated with the pod you can then mount it into your container at a particular directory.

Depending on whether your ConfigMap is representing a single file or a collection of files, you either map it into a directory where each file becomes a sub file within that directory or it maps to a specific file in the context of the container.

Now, that's useful for configuration that is a file.

But what about configuration that is just a simple key-value pair.

Well, in that context you can also use environment variables.

Such that, and point those environment variables at your configuration map such that in your code you can say something like get elve and gain access to the configuration that you stored it into the ConfigMap.

Now the question that you should have is well what about something like a password? It might seem like a password is a configuration value as well.

But in fact, because passwords and other kinds of secrets are well, conceptually configuration, something that you want to be very careful about the management of and possibly use different access control in different sorts of settings.

Kubernetes actually treats config and secrets as separate objects even though they look and operate largely the same.

So when you're thinking about configuring your secrets you should use a Kubernetes secret instead of a Config Map for storing certificates, database, passwords, and all that stuff.

Now, the next interesting question is, how should you think about rolling out configuration in Kubernetes? It's often been said that configuration is code and it really should be treated as such.

You can easily have an application, that it's totally healthy, provide it with a new configuration, and cause that application to crash.

So in that context you want to be able to perform a roll out of your configuration just like you would perform a roll out of your application.

Fortunately, you can do this.

So you might have your application V1 with ConfigMap, and you have this defined in a deployment.

Well, if you keep the container image the same but you change the configuration map that's mapped as a volume into your container.

So let's say we change this instead to be Config two.

Well, it turns out that actually the deployment engine is going to notice that change and actually perform the same kind of rolling update that it does if you change the container image.

So in particular, if in the template spec for your deployment, you change the configuration to point to a new configuration object and these are configuration map resources, Cfg1 and Cfg2.

You've already created, so you have two different ConfigMap resources.

If you change the ConfigMap in the specification of your application, Kubernetes will actually start doing the same kind of rolling upgrade.

Eventually, you'll get to a world assuming everything happens correctly, where you've rolled out that new configuration with proper health testing, with all of the things that you would associate with an image roll out.

So the deployment API actually makes it very easy for you to manage the deployment of new configurations just like you manage the deployment of new images.

You should absolutely run them through the same kind of continuous validation and testing that you do with an image prior to even getting to the roll-out stage in the context of Kubernetes.

The final piece that you should be thinking about is templating.

So when you think about configuration, it's great to create these ConfigMaps, but in many cases you want the configuration to be largely the same but a little bit different depending on your environment.

So you might have a high level template and two configurations East and West that extend from that template and add some extra value.

When you're thinking about templating and configuration management in that context, a tool-like helm can provide a lot of templating capabilities and you can find out more information that helm.sh.

Hope that gives you an early intro into why you might be motivated to separate your application and configuration and how you can use ConfigMaps to represent configuration information, bring them into your containers and then ultimately roll them out to your applications.


안녕하세요, 저는 Microsoft Azure의 Brendan Burns입니다. Kubernetes 및 구성 관리에 대해 이야기하겠습니다.

구성 관리에 대해 생각할 때 해결하려는 문제에 대해 생각하면 도움이됩니다.

사람들이 포드와 컨테이너 이미지를 처음 정의했을 때 구성이 내가 배포하는 컨테이너 이미지의 일부일 수 있다는 사실을 잘 알고 있다고 생각합니다.

그러나 프로그래밍 언어의 함수를 생각하는 것처럼 컨테이너 이미지의 포드를 생각하는 것이 유용하다고 생각합니다.

함수에 매개 변수가있는 것처럼 컨테이너 이미지에 매개 변수를 제공하는 애플리케이션의 구성에 대해 생각해야합니다.

그 이유는 범용 이미지를 만들고 싶기 때문입니다.

다양한 시나리오에서 유용합니다.

특정 구성을 테스트하는 Canary 환경에서 다른 구성이있을 수 있습니다.

전 세계 구성에 배포 할 때 이미지 자체를 정의하기 위해 동일한 빌드, 동일한 지속적 배포를 사용하면서 다른 언어, 다른 이미지, 원하는 모든 종류의 작은 변형으로 이미지를 매개 변수화 할 수 있습니다.

다행히 Kubernetes에는이를 나타내는 리소스가 있으며 ConfigMap이라고합니다.

ConfigMap 리소스는 키 값 쌍의 모음입니다.

이러한 키 값 쌍은 EN_US의 언어와 같은 것일 수 있습니다.

따라서 실제로는 문자열 문자열 쌍이거나 전통적인 Java 응용 프로그램의 속성 파일과 같을 수 있으며 구성 값은 실제로 파일 자체의 값입니다.

이제이 ConfigMap이 Kubernetes API 서버 내부에 생성 된 후 사용을 고려할 때 해당 ConfigMap을 볼륨으로 포드 자체에 마운트 할 수 있습니다.

그런 다음 포드와 연결된 볼륨을 생성 한 다음 특정 디렉터리의 컨테이너에 마운트 할 수 있습니다.

ConfigMap이 단일 파일 또는 파일 모음을 나타내는 지 여부에 따라 각 파일이 해당 디렉터리 내의 하위 파일이되는 디렉터리에 매핑하거나 컨테이너 컨텍스트에서 특정 파일에 매핑합니다.

이제 파일 인 구성에 유용합니다.

그러나 단순한 키-값 쌍인 구성은 어떻습니까?

그 맥락에서 환경 변수를 사용할 수도 있습니다.

그런 다음 코드에서 get elve와 같은 말을하고 ConfigMap에 저장 한 구성에 액세스 할 수 있도록 구성 맵에서 해당 환경 변수를 가리 킵니다.

이제 당신이 가져야 할 질문은 암호와 같은 것은 무엇입니까? 암호도 구성 값인 것처럼 보일 수 있습니다.

그러나 사실, 암호와 다른 종류의 비밀은 개념적으로 구성이 잘되어 있기 때문에 관리에 대해 매우주의하고 다른 종류의 설정에서 다른 액세스 제어를 사용할 수도 있습니다.

Kubernetes는 모양과 작동이 거의 동일하더라도 실제로 구성과 비밀을 별도의 객체로 취급합니다.

따라서 비밀 구성을 고려할 때 인증서, 데이터베이스, 비밀번호 및 모든 항목을 저장하기 위해 구성 맵 대신 Kubernetes 비밀을 사용해야합니다.

이제 다음 흥미로운 질문은 Kubernetes에서 구성을 롤아웃하는 것에 대해 어떻게 생각해야 하는가입니다. 구성은 코드이며 실제로는 그렇게 취급되어야한다고 종종 말합니다.

완전히 정상이고 새로운 구성을 제공하고 해당 애플리케이션이 충돌하도록 만드는 애플리케이션을 쉽게 가질 수 있습니다.

따라서 해당 컨텍스트에서 애플리케이션 롤아웃을 수행하는 것처럼 구성 롤아웃을 수행 할 수 있기를 원합니다.

다행히도 이렇게 할 수 있습니다.

따라서 ConfigMap이있는 애플리케이션 V1이있을 수 있으며이를 배포에 정의했습니다.

음, 컨테이너 이미지를 동일하게 유지하지만 볼륨으로 매핑 된 구성 맵을 컨테이너에 변경하는 경우.

따라서 이것을 Config 2로 변경한다고 가정 해 보겠습니다.

실제로 배포 엔진은 변경 사항을 감지하고 컨테이너 이미지를 변경하는 경우와 동일한 종류의 롤링 업데이트를 실제로 수행합니다.

특히 배포에 대한 템플릿 사양에서 새 구성 개체를 가리 키도록 구성을 변경하면 구성 맵 리소스 인 Cfg1 및 Cfg2가됩니다.

이미 생성 했으므로 두 개의 서로 다른 ConfigMap 리소스가 있습니다.

애플리케이션 사양에서 ConfigMap을 변경하면 Kubernetes는 실제로 동일한 종류의 롤링 업그레이드를 시작합니다.

결국 모든 것이 올바르게 발생한다고 가정하고 적절한 상태 테스트를 통해 새 구성을 롤아웃하고 이미지 롤아웃과 관련된 모든 사항을 적용 할 수 있다고 가정 할 수 있습니다.

따라서 배포 API를 사용하면 실제로 새 이미지 배포를 관리하는 것처럼 새 구성 배포를 매우 쉽게 관리 할 수 ​​있습니다.

Kubernetes의 컨텍스트에서 롤아웃 단계에 도달하기 전에 이미지로 수행하는 것과 동일한 종류의 연속 유효성 검사 및 테스트를 통해 절대적으로 실행해야합니다.

마지막으로 생각해야 할 부분은 템플릿입니다.

따라서 구성에 대해 생각할 때 이러한 ConfigMap을 만드는 것이 좋지만 대부분의 경우 구성이 거의 동일하지만 환경에 따라 조금씩 달라지기를 원합니다.

따라서 상위 수준 템플릿과 해당 템플릿에서 확장 된 두 가지 구성 인 East 및 West가있을 수 있으며 추가 가치를 더할 수 있습니다.

해당 컨텍스트에서 템플릿 및 구성 관리에 대해 생각할 때 도구와 같은 helm은 많은 템플릿 기능을 제공 할 수 있으며 helm.sh에 대한 자세한 정보를 찾을 수 있습니다.

애플리케이션과 구성을 분리하려는 이유와 ConfigMaps를 사용하여 구성 정보를 표현하고 컨테이너로 가져온 다음 궁극적으로 애플리케이션에 롤아웃하는 방법에 대한 초기 소개를 제공하기를 바랍니다.

  • No labels
Write a comment…