Разница между нажатием образа docker и установкой образа helm

#docker #dockerfile #kubernetes-helm

Вопрос:

Мне нужно изучить конвейер CI, в котором есть шаг для создания и отправки изображения с использованием файла Dockerfile и еще один шаг для создания изображения диаграммы helm, в котором есть определение образа, созданного файлом docker. После этого есть конвейер CD, в котором выполняется установка того, что было создано только с помощью диаграммы helm.

В чем разница между изображением, созданным непосредственно файлом Dockerfile, и тем, которое создается диаграммой helm? Почему недостаточно образа Docker?

Комментарии:

1. Не уверен, что я понимаю вопрос. Helm — это менеджер пакетов, он использует образы Docker как часть диаграмм.

2. Диаграммы Helm имеют конфигурации для Kubernetes и используют образы Docker, которые создаются из Dockerfile.

3. @Maroun но в конечном итоге вы используете образ docker, так что же дает вам диаграмма helm, без которой нет самого файла docker и изображения?

4. Вы не можете «развернуть» образ непосредственно в Kubernetes. Вам необходимо использовать ресурсы Kubernetes (наборы реплик, службы …) Для этого и нужен Helm, для управления (версия, установка, обновление, удаление, …) Приложения Kubernetes.

5. @YonatanNir Рассмотрим в качестве примера установку агентов DataDog в ваш кластер K8s. Если вы хотите управлять самостоятельно, вам нужно вручную создать и настроить множество ресурсов: наборы демонов, serviceaccount, clusterrole, clusterrolebinding, секреты и, возможно, больше ресурсов. Использование менеджера пакетов, такого как Helm, делает все за вас. Но в конечном итоге для запуска контейнера потребуются некоторые ресурсы — вы предоставляете изображение на диаграмме.

Ответ №1:

Сумма усилий

Для развертывания службы в Kubernetes с использованием образа docker вам необходимо вручную создать различные файлы конфигурации, такие как deployment.yaml . Таких файлов продолжает увеличиваться по мере того, как в вашу среду добавляется все больше и больше сервисов.

На диаграмме Helm мы можем предоставить список всех служб, которые мы хотим развернуть в requirements.yaml файле, и Helm гарантирует, что все эти службы будут развернуты в целевой среде с использованием deployment.yaml , service.yaml amp; values.yaml files .

Конфигурации для поддержания

Кроме того, добавление конфигурации, такой как маршрутизация, карты конфигурации, секреты и т.д., выполняется вручную и требует настройки поверх развертывания вашей службы.

Например, если вы хотите добавить прокси-сервер Nginx в свою среду, вам необходимо отдельно развернуть его, используя образ Nginx и все конфигурации прокси-сервера для ваших функциональных служб.

Но с диаграммами Helm этого можно достичь, настроив только файл ingress.yaml в вашей диаграмме Helm.

Гибкость

Используя образы docker, нам нужно предоставить конфигурации для каждой среды, в которой мы хотим развернуть наши службы.

Но, используя диаграмму Helm, мы можем просто переопределить свойства существующей диаграммы helm, используя values.yaml файл, зависящий от среды. Это становится еще проще с помощью таких инструментов, как ArgoCD .

Фрагмент кода:

Ниже приведен один пример deployment.yaml файла, который нам нужно создать, если мы хотим развернуть одну службу с помощью docker-image.

Встроенный, я также описал, как вы могли бы альтернативно заполнить общий deployment.yaml шаблон в репозитории Helm, используя разные файлы, такие как requirements.yaml и Values.yaml

развертывание.yaml для одной службы

 crazy-project/charts/accounts/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: accounts
spec:
  replicas: 1
  selector:
     matchLabels:
       app.kubernetes.io/name: accounts
       app.kubernetes.io/instance: crazy-project
  template:
     metadata:
       labels:
         app.kubernetes.io/name: accounts
         app.kubernetes.io/instance: crazy-project
     spec:
       serviceAccountName: default
       automountServiceAccountToken: true
       imagePullSecrets:
         - name: regcred
       containers:
       - image: "image.registry.host/.../accounts:1.2144.0"   <-- This version can be fetched from 'requirements.yaml'
         name: accounts
         env:      <-- All the environment variables can be fetched from 'Values.yaml'
         - name: CLUSTERNAME
           value: "com.company.cloud"
         - name: DB_URI
           value: "mongodb://connection-stringamp;replicaSet=rs1"
         imagePullPolicy: IfNotPresent
         volumeMounts:
         - name: secretfiles
           mountPath: "/etc/secretFromfiles"
           readOnly: true
         - name: secret-files
           mountPath: "/etc/secretFromfiles"
           readOnly: true
         ports:
         - name: HTTP
           containerPort: 9586
           protocol: TCP
         resources:
           requests:
             memory: 450Mi
             cpu: 250m
           limits:
             memory: 800Mi
             cpu: 1
       volumes:
       - name: secretFromfiles
         secret:
           secretName: secret-from-files
       - name: secretFromValue
         secret:
           secretName: secret-data-vault
           optional: true
           items:...
 

Ваша deployment.yaml диаграмма в Helm может быть общим шаблоном (фрагмент кода ниже), где детали заполняются с помощью values.yaml file.

 env:
{{- range $key, $value := .Values.global.envVariable.common }}
    - name: {{ $key }}
      value: {{ $value  | quote }}
    {{- end }}
 

Ваш Values.yaml будет выглядеть так:

 accounts:
  imagePullSecrets:
    - name: regcred
  envVariable:
    service:
      vars:
        spring_data_mongodb_database: accounts_db
        spring_product_name: crazy-project
        ...
 

Ваш requirements.yaml будет таким, как показано ниже. «зависимости» — это службы, которые вы хотите развернуть.

 dependencies:
  - name: accounts
    repository: "<your repo>"
    version: "= 1.2144.0"
  - name: rollover
    repository: "<your repo>"
    version: "= 1.2140.0"
 

Следующая диаграмма поможет вам визуализировать то, что я упомянул выше:

Docker image v / S Helm диаграмма

Комментарии:

1. Итак, вы говорите, что для настройки образа docker без диаграммы helm вам нужно настроить те же файлы, что и в шаблонах диаграммы, только диаграмма упрощает ее с помощью файла значений и возможности генерировать его с помощью встроенного кода, но в конечном итоге будут иметь те же файлыс тем же содержимым после его создания?

2. Да, это правильно. Эти ссылки должны помочь вам понять развертывание с использованием образов Docker: развертывание в Kubernetes и создание и развертывание образа Docker в кластере Kubernetes . И эта ссылка должна помочь вам понять развертывание с использованием диаграмм Helm: Диаграммы Helm: упрощение упаковки и развертывания обычных приложений на Kubernetes