Използване на Helm и Kubernetes

1. Общ преглед

Helm е мениджър на пакети за Kubernetes приложения . В този урок ще разберем основите на Helm и как те формират мощен инструмент за работа с ресурси на Kubernetes.

През последните години Kubernetes нарасна неимоверно, както и екосистемата, която го поддържа. Наскоро Helm е обявен за инкубационен проект от Cloud Native Computing Foundation (CNCF), който показва нарастващата му популярност сред потребителите на Kubernetes.

2. Предистория

Въпреки че тези термини са доста често срещани в наши дни, особено сред работещите с облачни технологии, нека ги разгледаме бързо за тези, които не знаят:

  1. Контейнер: Контейнерът се отнася до виртуализация на ниво операционна система . Множество контейнери се изпълняват в рамките на операционна система в изолирани потребителски пространства. Програмите, изпълнявани в контейнер, имат достъп само до ресурси, присвоени на контейнера.
  2. Docker: Docker е популярна програма за създаване и стартиране на контейнери . Той идва с Docker Daemon, който е основната програма за управление на контейнери. Docker Daemon предлага достъп до своите функции чрез API на Docker Engine, който се използва от интерфейса на командния ред на Docker (CLI). Моля, обърнете се към тази статия за по-подробно описание на Docker.
  3. Kubernetes: Kubernetes е популярна програма за оркестрация на контейнери . Въпреки че е проектиран да работи с различни контейнери, Docker се използва най-често. Той предлага богат избор от функции, включително автоматизация на внедряване, мащабиране и операции в клъстер хостове. В тази статия има отлично покритие на Kubernetes за допълнителна справка.

3. Хелм архитектура

Helm има доста проста архитектура, която се състои от клиент и сървър в клъстера:

  • Tiller Server: Helm управлява приложението Kubernetes чрез компонент, наречен Tiller Server, инсталиран в клъстер Kubernates. Tiller взаимодейства със Kubernetes API сървъра, за да инсталира, надгражда, заявява и премахва ресурси на Kubernetes.
  • Helm Client: Helm предоставя интерфейс на командния ред за потребителите да работят с Helm Charts . Helm Client е отговорен за взаимодействието със сървъра на Tiller за извършване на различни операции като диаграми за инсталиране, надграждане и връщане назад

4. Хелм класации

Helm управлява Kubernetes ресурсни пакети чрез диаграми .

Ще видим повече за диаграмите, докато ги създаваме скоро, но засега диаграмата не е нищо друго освен набор от информация, необходима за създаване на приложение Kubernetes, като се има предвид клъстер Kubernetes:

  • А графиката е колекция от файлове , организирани в структура, определена директория
  • Информацията за конфигурацията, свързана с диаграма, се управлява в конфигурацията
  • И накрая, работещ екземпляр на диаграма с конкретна конфигурация се нарича освобождаване

5. Настройка

Ще ни трябват няколко неща, които да бъдат настроени предварително, за да разработим нашата първа Helm Chart.

Първо, за да започнем да работим с Helm, се нуждаем от клъстер Kubernetes. За този урок ще използваме Minikube, който предлага отличен начин за локална работа с клъстер Kubernetes с един възел . В Windows вече е възможно да използвате Hyper-V като естествен Hypervisor за стартиране на Minikube. Вижте тази статия, за да разберете по-подробно настройването на Minikube.

И ще ни трябва основно приложение за управление в рамките на клъстера Kubernetes. За този урок ще използваме просто приложение Spring Boot, опаковано като контейнер на Docker. За по-подробно описание на това как да опаковате такова приложение като контейнер на Docker, вижте тази статия.

6. Инсталиране на Helm

Има няколко начина за инсталиране на Helm, които са добре описани на официалната страница за инсталиране на Helm. Най-бързият начин за инсталиране на кормилото на Windows е използването на Chocolaty , мениджър на пакети за платформи на Windows.

Използвайки Chocolaty, това е проста команда от един ред за инсталиране на Helm:

choco install kubernetes-helm

Това инсталира Helm Client локално.

Сега трябва да инициализираме Helm CLI, който ефективно също инсталира Tiller Server върху клъстер Kubernetes, както е идентифициран чрез конфигурацията Kubernetes. Моля, уверете се, че клъстерът Kubernetes работи и е достъпен чрез kubectl, преди да инициализирате Helm :

kubectl cluster-info

И тогава можем да инициализираме Helm чрез самия CLI на Helm:

helm init

7. Разработване на нашата първа диаграма

Сега сме готови да разработим нашата първа Helm Chart с шаблони и ценности.

7.1. Създаване на диаграма

Helm CLI, which we installed earlier, is quite handy in creating a chart:

helm create hello-world

Please note that the name of the chart provided here will be the name of the directory where the chart is created and stored.

Let's quickly see the directory structure created for us:

hello-world / Chart.yaml values.yaml templates / charts / .helmignore

Let's understand the relevance of these files and folders created for us:

  • Chart.yaml: This is the main file that contains the description of our chart
  • values.yaml: this is the file that contains the default values for our chart
  • templates: This is the directory where Kubernetes resources are defined as templates
  • charts: This is an optional directory that may contain sub-charts
  • .helmignore: This is where we can define patterns to ignore when packaging (similar in concept to .gitignore)

7.2. Creating Template

If we see inside the template directory, we'll notice that few templates for common Kubernetes resources have already been created for us:

hello-world / templates / deployment.yaml service.yaml ingress.yaml ......

We may need some of these and possibly other resources in our application, which we'll have to create ourselves as templates.

For this tutorial, we'll create deployment and a service to expose that deployment. Please note the emphasis here is not to understand Kubernetes in detail. Hence we'll keep these resources as simple as possible.

Let's edit the file deployment.yaml inside the templates directory to look like:

apiVersion: apps/v1 kind: Deployment metadata: name: {{ include "hello-world.fullname" . }} labels: app.kubernetes.io/name: {{ include "hello-world.name" . }} helm.sh/chart: {{ include "hello-world.chart" . }} app.kubernetes.io/instance: {{ .Release.Name }} app.kubernetes.io/managed-by: {{ .Release.Service }} spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app.kubernetes.io/name: {{ include "hello-world.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} template: metadata: labels: app.kubernetes.io/name: {{ include "hello-world.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} spec: containers: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - name: http containerPort: 8080 protocol: TCP

Similarly, let's edit the file service.yaml to look like:

apiVersion: v1 kind: Service metadata: name: {{ include "hello-world.fullname" . }} labels: app.kubernetes.io/name: {{ include "hello-world.name" . }} helm.sh/chart: {{ include "hello-world.chart" . }} app.kubernetes.io/instance: {{ .Release.Name }} app.kubernetes.io/managed-by: {{ .Release.Service }} spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} targetPort: http protocol: TCP name: http selector: app.kubernetes.io/name: {{ include "hello-world.name" . }} app.kubernetes.io/instance: {{ .Release.Name }}

Now, with our knowledge of Kubernetes, these template files look quite familiar except for some oddities. Note the liberal usage of text within double parentheses {{}}. This is what is called a template directive.

Helm makes use of the Go template language and extends that to something called Helm template language. During the evaluation, every file inside the template directory is submitted to the template rendering engine. This is where the template directive injects actual values in the templates.

7.3. Providing Values

In the previous sub-section, we saw how to use the template directive in our templates. Now, let's understand how we can pass values to the template rendering engine. We typically pass values through Built-in Objects in Helm.

There are many such objects available in Helm, like Release, Values, Chart, and Files.

We can use the file values.yaml in our chart to pass values to the template rendering engine through the Built-in Object Values. Let's modify the values.yaml to look like:

replicaCount: 1 image: repository: "hello-world" tag: "1.0" pullPolicy: IfNotPresent service: type: NodePort port: 80

However, note how these values have been accessed within templates using dots separating namespaces. We have used the image repository and tag as “hello-world” and “1.0”, this must match the docker image tag we created for our Spring Boot application.

8. Understanding Helm Commands

With everything done so far, we're now ready to play with our chart. Let's see what are the different commands available in Helm CLI to make this fun!

8.1. Helm Lint

Firstly, this is a simple command that takes the path to a chart and runs a battery of tests to ensure that the chart is well-formed:

helm lint ./hello-world ==> Linting ./hello-world 1 chart(s) linted, no failures

8.2 Helm Template

Also, we have this command to render the template locally, without a Tiller Server, for quick feedback:

helm template ./hello-world --- # Source: hello-world/templates/service.yaml apiVersion: v1 kind: Service metadata: name: release-name-hello-world labels: app.kubernetes.io/name: hello-world helm.sh/chart: hello-world-0.1.0 app.kubernetes.io/instance: release-name app.kubernetes.io/managed-by: Tiller spec: type: NodePort ports: - port: 80 targetPort: http protocol: TCP name: http selector: app.kubernetes.io/name: hello-world app.kubernetes.io/instance: release-name --- # Source: hello-world/templates/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: release-name-hello-world labels: app.kubernetes.io/name: hello-world helm.sh/chart: hello-world-0.1.0 app.kubernetes.io/instance: release-name app.kubernetes.io/managed-by: Tiller spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: hello-world app.kubernetes.io/instance: release-name template: metadata: labels: app.kubernetes.io/name: hello-world app.kubernetes.io/instance: release-name spec: containers: - name: hello-world image: "hello-world:1.0" imagePullPolicy: IfNotPresent ports: - name: http containerPort: 8080 protocol: TCP

8.3. Helm Install

Once we've verified the chart to be fine, finally, we can run this command to install the chart into the Kubernetes cluster:

helm install --name hello-world ./hello-world NAME: hello-world LAST DEPLOYED: Mon Feb 25 15:29:59 2019 NAMESPACE: default STATUS: DEPLOYED RESOURCES: ==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-world NodePort 10.110.63.169  80:30439/TCP 1s ==> v1/Deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-world 1 0 0 0 1s ==> v1/Pod(related) NAME READY STATUS RESTARTS AGE hello-world-7758b9cdf8-cs798 0/1 Pending 0 0s

Finally, note that we have named the release of this chart with the flag –name. The command responds with the summary of Kubernetes resources created in the process.

8.4. Helm Get

Now, we would like to see which charts are installed as what release. This command lets us query the named releases:

helm ls --all NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE hello-world 1 Mon Feb 25 15:29:59 2019 DEPLOYED hello-world-0.1.0 1.0 default

8.5. Helm Upgrade

What if we have modified our chart and need to install the updated version? This command helps us to upgrade a release to a specified or current version of the chart or configuration:

helm upgrade hello-world ./hello-world Release "hello-world" has been upgraded. Happy Helming! LAST DEPLOYED: Mon Feb 25 15:36:04 2019 NAMESPACE: default STATUS: DEPLOYED RESOURCES: ==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-world NodePort 10.110.63.169  80:30439/TCP 6m5s ==> v1/Deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-world 1 1 1 1 6m5s ==> v1/Pod(related) NAME READY STATUS RESTARTS AGE hello-world-7758b9cdf8-cs798 1/1 Running 0 6m4s

8.6. Helm Rollback

It can always happen that a release went wrong and needs to be taken back. This is the command to rollback a release to the previous version:

helm rollback hello-world 1 Rollback was a success! Happy Helming!

8.7. Helm Delete

Although less likely, we may want to delete a release completely. We can use this command to delete a release from Kubernetes:

helm delete --purge hello-world release "hello-world" deleted

These are only some of the commands available to work with charts and releases in Helm.

9. Distributing Charts

While templating is a powerful tool that Helm brings to the world of managing Kubernetes resources, it's not the only benefit of using Helm. As we saw in the previous section, Helm acts as a package manager for the Kubernetes application and makes installing, querying, upgrading, and deleting releases pretty seamless.

In addition to this, Helm comes with commands as part of its CLI to package, publish, and fetch Kubernetes applications as charts:

9.1. Helm Package

Firstly, we need to package the charts we have created to be able to distribute them. This is the command to create versioned archive files of the chart:

helm package ./hello-world Successfully packaged chart and saved it to: \hello-world\hello-world-0.1.0.tgz

Note that it produces an archive on your machine that can be distributed manually or through public or private chart repositories.

9.2. Helm Repo

Finally, we need a mechanism to work with shared repositories to collaborate. Repo bundles a bunch of commands that we can use to add, remove, list, or index chart repositories. Let's see how we can use them.

We can create a git repository and use that to function as our chart repository. The only requirement is that it should have an index.yaml file.

We can create index.yaml for our chart repo:

helm repo index my-repo/ --url //.github.io/my-repo

This generates the index.yaml file, which we should push to the repository along with the chart archives.

After successfully creating the chart repository, subsequently, we can remotely add this repo:

helm repo add my-repo //my-pages.github.io/my-repo

Now, we should be able to install the charts from our repo directly:

helm install my-repo/hello-world --name=hello-world

There are quite some utility commands available to work with chart repositories.

10. Заключение

За да обобщим, в този урок обсъдихме основните компоненти на Helm, мениджър на пакети за приложения Kubernetes. Разбрахме опциите за инсталиране на Helm. Освен това преминахме през създаването на примерна диаграма и шаблони със стойности.

След това преминахме през множество команди, налични като част от Helm CLI, за да управляваме приложението Kubernetes като пакет Helm.

Накрая обсъдихме възможностите за разпространение на Helm пакети чрез хранилища.