Практический курс K8S+DevOps Architect | Использование Helm3 для управления развертыванием сложных приложений

Источник видео: Station B «Учебник Docker&k8s Tutorial Ceiling. Абсолютно лучший из всех, которым обучала Station B. Этот набор обучающих материалов k8s для получения всех основных знаний о Docker уже здесь»

Упорядочивайте содержание курса учителя и заметки к тестам во время учебы и делитесь ими со всеми. Любое нарушение будет удалено. Спасибо за вашу поддержку!

Прикрепите итоговую публикацию: Практический курс K8S+DevOps Architect | Резюме


Познакомьтесь с Хелмом

  1. Зачем здесь руль?
  2. Что такое Хелм?

Менеджер пакетов kubernetes: «Helm можно рассматривать как apt-get/yum в системе Linux».

  • Издатели приложений могут использовать Helm для упаковки приложений, управления зависимостями приложений, управления версиями приложений и публикации приложений в хранилищах программного обеспечения.
  • Пользователям после использования Helm не нужно понимать синтаксис Yaml Kubernetes и писать файлы развертывания приложений — они могут скачать и установить необходимые приложения в Kubernetes через Helm.

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

  1. Шлемовая версия
  • шлем2

Архитектура C/S, helm взаимодействует с k8s через Tiller

  • Учитывая безопасность и простоту использования, helm3 удалил сервер Tiller. Helm3 напрямую использует файл kubeconfig для аутентификации и доступа к серверу APIServer. Конфигурация) helm install very_important_app ./very_important_app Количество копий этого приложения равно 3. Теперь, если кто-то случайно выполнит kubectl edit или: kubectl scale -replicas=0 deployment/very_important_app Затем кто-то из команды обнаружит, что very_important_app не работает без причины, попробуйте выполнить команду: helm rollback very_important_app В Helm 2 эта операция будет Сравните старую конфигурацию с новой конфигурацией и создайте исправление для обновления. Потому что человек, который неправильно действовал, только модифицировал онлайн-статус приложения (старая конфигурация не обновлялась). Helm ничего не делает, когда откатывается. Потому что нет разницы между старой конфигурацией и новой конфигурацией (обе 3 копии). Тогда Helm не выполняет откат, а количество реплик продолжает оставаться равным 0. Хранилище локального репозитория helm-сервера должно указывать имя при создании приложения (или --generate-name генерируется случайным образом)
  1. Важная концепция Helm, диаграмма, представляет собой набор информации о приложении, включая шаблоны конфигурации для различных объектов, определения параметров, зависимости, описания документации и т. д. Репозиторий, хранилище диаграмм, где хранятся диаграммы, и файл списка диаграммы пакет Репозитория предоставляется для справок. Helm может одновременно управлять несколькими разными репозиториями. релиз, когда чарт установлен в кластере kubernetes, генерируется релиз, который является работающим экземпляром чарта и представляет работающее приложение

helm — это инструмент управления пакетами, а пакет — это диаграмма.

  • Создать диаграмму с нуля
  • Взаимодействуйте со складом, извлекайте, сохраняйте и обновляйте диаграммы
  • Установка и удаление выпуска в кластере kubernetes
  • Обновление, откат, тестовый релиз

Практика установки и быстрого старта

Загрузите последнюю стабильную версию: https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz .

Дополнительные версии см. по адресу:  https://github.com/helm/helm/releases.

# k8s-master节点
$ wget https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz
$ tar -zxf helm-v3.2.4-linux-amd64.tar.gz

$ cp linux-amd64/helm /usr/local/bin/

# 验证安装
$ helm version
version.BuildInfo{Version:"v3.2.4", GitCommit:"0ad800ef43d3b826f31a5ad8dfbb4fe05d143688", GitTreeState:"clean", GoVersion:"go1.13.12"}
$ helm env

# 添加仓库
$ helm repo add stable https://mirror.azure.cn/kubernetes/charts/
# 同步最新charts信息到本地
$ helm repo update

Практика быстрого старта:

Пример 1: Установка приложения mysql с помощью helm

# helm 搜索chart包
$ helm search repo mysql

# 从仓库安装
$ helm install mysql stable/mysql

$ helm ls
$ kubectl get all 

# 从chart仓库中把chart包下载到本地
$ helm pull stable/mysql
$ tree mysql

Пример 2: Создайте новую диаграмму nginx и установите ее

$ helm create nginx

# 从本地安装
$ helm install nginx ./nginx

# 安装到别的命名空间luffy
$ helm -n luffy install ./nginx

# 查看
$ helm ls
$ helm -n luffy ls

#
$ kubectl get all 
$ kubectl -n luffy get all

Синтаксис и разработка шаблона диаграммы

анализ реализации диаграммы nginx

Формат:

$ tree nginx/
nginx/
├── charts                        # 存放子chart
├── Chart.yaml                    # 该chart的全局定义信息
├── templates                    # chart运行所需的资源清单模板,用于和values做渲染
│   ├── deployment.yaml
│   ├── _helpers.tpl            # 定义全局的命名模板,方便在其他模板中引入使用
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt                # helm安装完成后终端的提示信息
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml                    # 模板使用的默认值信息

Очевидно, что список ресурсов находится в шаблонах, а данные поступают из values.yaml Процесс установки заключается в объединении шаблона и данных в список ресурсов, распознаваемый k8s, а затем развертывание его в среде k8s.

Реализация файла шаблона анализа:

  • Ссылка на именованный шаблон и передача области { { include "nginx.fullname" . }} включает ссылку на именованный шаблон из _helpers.tpl и передача области верхнего уровня.
  • Встроенный объект .Values ​​.Release.NameRelease: Этот объект описывает соответствующую информацию самого релиза, и внутри него есть несколько объектов: Release.Name: Название релиза Release.Namespace: Пространство имён, где релиз установлен Release.IsUpgrade: если текущая операция предназначена для обновления или отката, значение равно trueRelease.IsInstall: если текущая операция — установка, установите значение trueRelease.Revision: номер версии версии выпуска.При установке значение равно 1. Каждое обновление или откат будет добавлять Release.Service: службу, которая отображает текущий шаблон.В Helm значение на самом деле всегда HelmValues: значение Values, переданное в шаблон из файла values.yaml, и пользователь- предоставленный файл значений. Диаграмма: получить содержимое файла Chart.yaml. Можно получить доступ к любым данным в этом файле, например, { { .Chart.Name }}-{ { .Chart.Version }} можно отобразить как mychart -0.1.0
  • определение шаблона { {- определить "nginx.fullname" -}} { { {- if .Values.fullnameOverride }} { {- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} { { - else }} { { - $name := default .Chart.Name .Values.nameOverride }} { { - если содержит $name .Release.Name }} { {- .Release.Name | trunc 63 | trimSuffix "-" }} { { - else } } { {- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} { { - end }} { { - end }} { {- end }}{ { - удалить пробелы и новые строки слева, -}} удалить пробелы и новые строки справа Пример apiVersion: v1 type: метаданные ConfigMap: name: { { .Release.Name }}-configmap data: myvalue: "Hello World" drink: { { .Ценности.любимый.напиток | по умолчанию "чай" | цитата }} еда: { { .Values.favorite.food | верхний | quote }} { { if eq .Values.favorite.drink "coffee" }} mug: true { { end }} 渲染完后是:apiVersion: v1 вид: метаданные ConfigMap: имя: mychart-1575971172-configmap data: myvalue: Напиток "Hello World": "кофе" еда: "ПИЦЦА" кружка: правда
  • Конвейер и метод trunc означает перехват строки, 63 передается в качестве параметра методу trunc, trimSuffix означает удаление -суффикса { { - .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} nindent означает количество пробелов в передний селектор: matchLabels: { {- include "nginx.selectorLabels" . | nindent 6 }}lower означает перевод содержимого в нижний регистр, а quote означает заключение содержимого в двойные кавычки value: { { include "mytpl" . | lower | quote }}
  • Каждый оператор условного суждения if соответствует end{ { - if .Values.fullnameOverride }} ... { { - else }} ... { {- end }} обычно используется для управления в соответствии с переключателем, определенным в values.yaml Отображать в шаблоне: { {- если нет .Values.autoscaling.enabled }} реплики: { { .Values.replicaCount }} { {- end }}
  • Определить переменные, на которые можно ссылаться по именам переменных в шаблонах.
{
   
   {- $name := default .Chart.Name .Values.nameOverride }}
  • Обходим данные значений { {- with .Values.nodeSelector }} nodeSelector: { {- toYaml .| nindent 8 }} { {- end }}

toYaml обрабатывает экранирование и специальные символы в значении, " http://kubernetes.io/role "=master , name="value1,value2" подобные случаи

  • по умолчанию установить значение по умолчанию
image: "{
   
   { .Values.image.repository }}:{
   
   { .Values.image.tag | default .Chart.AppVersion }}"

hpa.yaml

{
   
   {- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: {
   
   { include "nginx.fullname" . }}
  labels:
    {
   
   {- include "nginx.labels" . | nindent 4 }}
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: {
   
   { include "nginx.fullname" . }}
  minReplicas: {
   
   { .Values.autoscaling.minReplicas }}
  maxReplicas: {
   
   { .Values.autoscaling.maxReplicas }}
  metrics:
  {
   
   {- if .Values.autoscaling.targetCPUUtilizationPercentage }}
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: {
   
   { .Values.autoscaling.targetCPUUtilizationPercentage }}
  {
   
   {- end }}
  {
   
   {- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
    - type: Resource
      resource:
        name: memory
        targetAverageUtilization: {
   
   { .Values.autoscaling.targetMemoryUtilizationPercentage }}
  {
   
   {- end }}
{
   
   {- end }}

Назначается при создании заявки

  • установить метод
# 改变副本数和resource值
$ helm install nginx-2 ./nginx --set replicaCount=2 --set resources.limits.cpu=200m --set resources.limits.memory=256Mi
  • Путь значения файла
$ cat nginx-values.yaml
resources:
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 100m
    memory: 128Mi
autoscaling:
  enabled: true
  minReplicas: 1
  maxReplicas: 3
  targetCPUUtilizationPercentage: 80
ingress:
  enabled: true
  hosts:
    - host: chart-example.luffy.com
      paths:
      - /

$ helm install -f nginx-values.yaml nginx-3 ./nginx

Дополнительная справка по синтаксису:

https://helm.sh/docs/topics/charts/

Проблема невозможности развернуть mysql

Настоящий бой: используйте Helm для развертывания хранилища изображений и карт Harbour.

Гавань наступает на развертывание ямы

Архитектура  https://github.com/goharbor/harbor/wiki/Architecture-Overview-of-Harbor

  • Core, основной компонент API Server, получает и обрабатывает запросы пользователей. Config Manager: настройка всех систем, таких как аутентификация, электронная почта, конфигурация сертификатов и т. д. Project Manager: управление проектами Quota Manager: управление квотами Chart Controller: управление диаграммами Replication Controller: контроллер зеркального копирования, может осуществлять зеркальную синхронизацию с различными типами хранилищ Распределение (реестр Docker) Docker Hub... Диспетчер сканирования: управление сканированием, внедрение сторонних компонентов и выполнение зеркального сканирования безопасности Драйвер реестра: драйвер зеркального хранилища, используемый в настоящее время реестр докеров
  • Служба заданий, выполнение асинхронных задач, таких как синхронизация зеркальной информации.
  • Log Collector, единый сборщик журналов, собирает журналы каждого модуля.
  • Контроллер ГХ
  • Картографический музей, картографический склад, третья сторона
  • Docker Registry, сервис зеркальных складов
  • kv-storage, служба кеша Redis, используемая службой заданий, хранит метаданные заданий
  • локальное/удаленное хранилище, служба хранения, сравнение зеркального хранилища
  • База данных SQL, postgresl, хранящая метаданные, такие как пользователи и проекты

Обычно используется в качестве службы зеркального склада на уровне предприятия, но на самом деле функция намного мощнее.

Компонентов много, поэтому используйте helm для деплоя

# 添加harbor chart仓库
$ helm repo add harbor https://helm.goharbor.io

# 搜索harbor的chart
$ helm search repo harbor

# 不知道如何部署,因此拉到本地
$ helm pull harbor/harbor --version 1.4.1

создать пвх

$ kubectl create namespace harbor
$ cat harbor-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: harbor-pvc
  namespace: harbor
spec:
  accessModes:     
    - ReadWriteOnce
  storageClassName: dynamic-cephfs
  resources:
    requests:
      storage: 20Gi

Измените конфигурацию гавани:

  • Открытый входной доступ
  • externalURL, запись веб-доступа, совпадает с доменным именем входящего
  • Персистентность с использованием cephfs, состыкованных с PVC
  • гаваньAdminPassword: «Harbor12345», учетная запись администратора по умолчанию admin/Harbor12345
  • открытая картамузей
  • Компоненты сканирования уязвимостей Clair and trivy, которые еще не включены

руль создать:

# 使用本地chart安装
$ helm install harbor ./harbor -n harbor

Шаг 1: Redis сохраняет права доступа к каталогу данных, что приводит к невозможности входа в систему.

Для каталога данных redis, /var/lib/redis, необходимо установить права пользователя и группы пользователей redis.

initContainers:
      - name: "change-permission-of-directory"
        image: {
   
   { .Values.database.internal.initContainerImage.repository }}:{
   
   { .Values.database.internal.initContainerImage.tag }}
        imagePullPolicy: {
   
   { .Values.imagePullPolicy }}
        command: ["/bin/sh"]
        args: ["-c", "chown -R 999:999 /var/lib/redis"]
        volumeMounts:
        - name: data
          mountPath: /var/lib/redis
          subPath: {
   
   { $redis.subPath }}

Trample 2: Разрешение каталога хранения изображений компонента реестра приводит к сбою отправки образа

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

initContainers:
      - name: "change-permission-of-directory"
        image: {
   
   { .Values.database.internal.initContainerImage.repository }}:{
   
   { .Values.database.internal.initContainerImage.tag }}
        imagePullPolicy: {
   
   { .Values.imagePullPolicy }}
        command: ["/bin/sh"]
        args: ["-c", "chown -R 10000:10000 {
   
   { .Values.persistence.imageChartStorage.filesystem.rootdirectory }}"]
        volumeMounts:
        - name: registry-data
          mountPath: {
   
   { .Values.persistence.imageChartStorage.filesystem.rootdirectory }}
          subPath: {
   
   { .Values.persistence.persistentVolumeClaim.registry.subPath }}

Trample 3: права доступа к каталогу хранения диаграммы, что приводит к сбою при отправке диаграммы

initContainers:
      - name: "change-permission-of-directory"
        image: {
   
   { .Values.database.internal.initContainerImage.repository }}:{
   
   { .Values.database.internal.initContainerImage.tag }}
        imagePullPolicy: {
   
   { .Values.imagePullPolicy }}
        command: ["/bin/sh"]
        args: ["-c", "chown -R 10000:10000 /chart_storage"]
        volumeMounts:
        - name: chartmuseum-data
          mountPath: /chart_storage
          subPath: {
   
   { .Values.persistence.persistentVolumeClaim.chartmuseum.subPath }}

После обновления содержимого выполните выпуск обновления

$ helm upgrade harbor -n harbor ./

Отправьте образ в репозиторий Harbour.

Настройте хосты и незащищенное хранилище докеров:

$ cat /etc/hosts
...
172.21.51.67 k8s-master core.harbor.domain
...

$ cat /etc/docker/daemon.json
{                                            
  "insecure-registries": [                   
    "172.21.51.67:5000",                   
    "core.harbor.domain"                     
  ],                                         
  "registry-mirrors" : [                     
    "https://8xpk5wnt.mirror.aliyuncs.com"   
  ]                                          
}                           

#
$ systemctl restart docker

# 使用账户密码登录admin/Harbor12345
$ docker login core.harbor.domain

$ docker tag nginx:alpine core.harbor.domain/library/nginx:alpine
$ docker push core.harbor.domain/library/nginx:alpine

Отправить диаграмму на склад Harbour

В helm3 по умолчанию не установлен плагин helm push, и его необходимо установить вручную. Адрес плагина  https://github.com/chartmuseum/helm-push

Установите плагин:

$ helm plugin install https://github.com/chartmuseum/helm-push

Автономная установка:

$ helm plugin install ./helm-push

добавить репо

$ helm repo add myharbor https://harbor.luffy.com/chartrepo/luffy
# x509错误

# 添加证书信任,根证书为配置给ingress使用的证书
$ kubectl get secret harbor-ingress -n harbor -o jsonpath="{.data.ca\.crt}" | base64 -d >harbor.ca.crt

$ cp harbor.ca.crt /etc/pki/ca-trust/source/anchors
$ update-ca-trust enable; update-ca-trust extract

# 再次添加
$ helm repo add luffy https://harbor.luffy.com/chartrepo/luffy --ca-file=harbor.ca.crt  --username admin --password Harbor12345

$ helm repo ls

Отправьте диаграмму на склад:

$ helm push harbor luffy --ca-file=harbor.ca.crt -u admin -p Harbor12345

Посмотреть схему портового склада

Supongo que te gusta

Origin blog.csdn.net/guolianggsta/article/details/131609785
Recomendado
Clasificación