#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"
Следующая диаграмма поможет вам визуализировать то, что я упомянул выше:
Комментарии:
1. Итак, вы говорите, что для настройки образа docker без диаграммы helm вам нужно настроить те же файлы, что и в шаблонах диаграммы, только диаграмма упрощает ее с помощью файла значений и возможности генерировать его с помощью встроенного кода, но в конечном итоге будут иметь те же файлыс тем же содержимым после его создания?
2. Да, это правильно. Эти ссылки должны помочь вам понять развертывание с использованием образов Docker: развертывание в Kubernetes и создание и развертывание образа Docker в кластере Kubernetes . И эта ссылка должна помочь вам понять развертывание с использованием диаграмм Helm: Диаграммы Helm: упрощение упаковки и развертывания обычных приложений на Kubernetes