...

Создание собственного сервиса для ELMA365 с помощью пакетного менеджера Helm

Тема в разделе "ELMA365 On-Premises", создана пользователем kroshikhin, 18 авг 2023.

  1. kroshikhin

    kroshikhin Участник

    Входные данные:
    1. Установленная Система ELMA365 on-premises, поставка не имеет значения, главное чтобы это был kubernetes-кластер в любом его проявлении
    2. Необходим сервис, который должен быть доступен внутри kubernetes-кластера (далее k8s), + снаружи по доменному имени. Установка должна осуществляться с помощью пакетного менеджера Helm, т.к. это позволяет гибко настроить предполагаемый сервис, а также обеспечить его отказоустойчивость/масштабируемость штатными средствами k8s.
    Допустим это будет банальный сервис hello-world(просто имя) из образа nginx:stable.
    Последнее редактирование: 18 авг 2023
  2. kroshikhin

    kroshikhin Участник

    Работы по созданию сервиса, включают следующие этапы:
    1. Установка пакетного менеджера k8s helm, пример описывается в статье: Шаг 5: Установка HELM
    2. Создание файлов helm-чартов для hello-world

    Код:
    
    helm create hello-world
    Creating hello
    -world
    3. Настройка параметров сущностей helm для hello-world
    3.1. Настройка файла Chart.yaml

    Код:
    
    nano hello-world/Chart.yaml
    
    
    Здесь вы можете указать номер версии helm-чарта (chart version), номер версии приложения (version number of the application) и пр., в нашем случае оставим тут все по-умолчанию:
    Код:
    
    apiVersionv2
    name
    hello-world
    description
    A Helm chart for Kubernetes

    # A chart can be either an 'application' or a 'library' chart.
    #
    # Application charts are a collection of templates that can be packaged into ve>
    # to be deployed.
    #
    # Library charts provide useful utilities or functions for the chart developer.>
    # a dependency of application charts to inject those utilities and functions in>
    # pipeline. Library charts do not define any templates and therefore cannot be >
    typeapplication

    # This is the chart version. This version number should be incremented each tim>
    # to the chart and its templates, including the app version.
    # Versions are expected to follow Semantic Versioning (https://semver.org/)
    version0.1.0

    # This is the version number of the application being deployed. This version nu>
    # incremented each time you make changes to the application. Versions are not e>
    # follow Semantic Versioning. They should reflect the version the application i>
    # It is recommended to use it with quotes.
    appVersion"1.16.0"
    3.2. Настройка файла values.yaml
    Код:
    
    nano hello-world/values.yaml
    
    
    В данном файле можно изменить основные настройки вашего приложения, заострю ваше внимание на следующих, которые зачастую требуется изменить:
    * Количество реплик
    Код:
    
    replicaCount1
    
    
    * Используемый образ, его тэг, политика загрузки образа

    Код:
    
    image:
     
    repositorynginx #Здесь укажем наш образ, в данном случае - это nginx
     
    pullPolicyAlways #Изменим политику, чтобы всегда загружался свежий образ независимо от его присутствия (чтобы все свежие изменения в нем попадали при перезапуске/обновлении/удалении)
     # Overrides the image tag whose default is the chart appVersion.
     
    tag"stable" #Укажем тэг stable, в таком случае будет использована стабильная версия.
    * Настройки сервиса
    Код:
    
    service:
     
    typeClusterIP #Доступ внутри, по IP кластера
     
    port80 #Порт, на котором работает сервис
    * Настройки ингреса
    Код:
    
    ingress:
     
    enabledtrue #Изменим на true, т.к. нам нужно, чтобы сервис был доступен извне
     
    className""
     
    annotations: {}
     
    # kubernetes.io/ingress.class: nginx
     # kubernetes.io/tls-acme: "true"
     
    hosts:
     - 
    hosthello-world.local #Заполним FQDN имя сервиса
     
    paths:
     - 
    path: /
     
    pathTypeImplementationSpecific
     tls
    #Заполним параметры, т.к. нам нужно, чтобы сервис был доступен извне
     
    secretNamehello-world-tls #Заполним имя секрета tls, предварительно необходимо загрузить сертификат и ключ для нашего сервиса
     
    hosts:
     - 
    hello-world.local #Заполним FQDN имя сервиса
    * Настройка ресурсов
    Код:
    
    resources#Заполним параметры, на случай, если нам нужно ограничить наш сервис по ресурсам во избежание дальнейших проблем (например чрезмерное потребление памяти сервисом).
     # We usually recommend not to specify default resources and to leave this as a conscious
     # choice for the user. This also increases chances charts run on environments with little
     # resources, such as Minikube. If you do want to specify resources, uncomment the following
     
    linesadjust them as necessary, and remove the curly braces after 'resources:'.
     
    limits:
     
    cpu100m
     memory
    128Mi
     requests
    :
     
    cpu100m
     memory
    128Mi
    * Задание параметров авто-скейлинга и CPU Utilization
    Код:
    
    autoscaling:
     
    enabledtrue #Изменим на true, допустим нам нужно, чтобы сервис мог скейлится 
     
    minReplicas#Минимальное оставим по-умолчанию
     
    maxReplicas#Укажем до 2х реплик (сервис сам будет скейлится при превышении лимита по ресурсам)
    3.3. Настройка файла deployment.yaml
    Код:
    
    nano hello-world/templates/deployment.yaml
    
    
    Настройка liveness/readiness Probe (Проверка работоспособности и готовности сервиса). Настройка переменных (которые может использовать ваш сервис внутри контейнера при работе)
    Код:
    
     livenessProbe:
     
    httpGet:
     
    path: / #Напимер, “/healthz”, но т.к. у этого образа их нет, то не используем
     
    porthttp
     readinessProbe
    :
     
    httpGet:
     
    path: / #Напимер, “/healthz”, но т.к. у этого образа их нет, то не используем
     
    porthttp
     env
    #Так можно задать переменные
     
    nameTestENV #Имя переменной
     
    value"HellowENV_Value" #Значение переменной
    3.4. Удаление лишнего.
    Код:
    
    nano hello-world/templates/deployment.yaml
    
    
    Отключение использования сервис-аккаунта (в простых сервисах в основном это не требуется). Файл deployment.yaml
    Код:
    
    serviceAccount:
     
    # Specifies whether a service account should be created
     
    createfalse #Изменим значение с true на false
     # Annotations to add to the service account
     
    annotations: {}
     
    # The name of the service account to use.
     # If not set and create is true, a name is generated using the fullname template
     
    name"" 
    4. Установка сервиса hello-world с помощью helm в имеющийся k8s-кластер c указанием неймспейса.
    Команда для установки приведена ниже:

    Код:
    
    $helm upgrade --install hello-world ./hello-world -./hello-world/values.yaml -n test
    
    
    Результат выполнения команды:
    Код:
    
    Release "hello-world" does not existInstalling it now.
    W0816 18:38:41.841471   16928 warnings.go:70autoscaling/v2beta1 HorizontalPodAutoscaler is deprecated in v1.22+, unavailable in v1.25+; use autoscaling/v2 HorizontalPodAutoscaler
    W0816 18
    :38:42.289723   16928 warnings.go:70autoscaling/v2beta1 HorizontalPodAutoscaler is deprecated in v1.22+, unavailable in v1.25+; use autoscaling/v2 HorizontalPodAutoscaler
    NAME
    hello-world
    LAST DEPLOYED
    Wed Aug 16 18:38:41 2023
    NAMESPACE: test
    STATUS
    deployed
    REVISION
    1
    NOTES
    :
    1. Get the application URL by running these commands:
     
    https://hello-world.local/
    5. Убедимся, что наш сервис запустился и работает.
    Команда для проверки работы с помощью "kubectl" и ее результат:

    Код:
    
     kubectl get pods -n elma-test grep hello
    hello
    -world-7cd468d69f-gpxvm             1/1     Running     0          7m43s
    А также визуально, открыв его в браузере увидим приветственную страницу Nginx
    [​IMG]

    6. Поздравляю! На этом создание собственного сервиса можно считать успешным.
    Теперь за ненадобностью можно его удалить, команда для удаления с помощью "helm" и ее результат:
    Код:
    
    helm uninstall hello-world -n test
    W0816 19
    :05:47.588429   24204 warnings.go:70autoscaling/v2beta1 HorizontalPodAutoscaler is deprecated in v1.22+, unavailable in v1.25+; use autoscaling/v2 HorizontalPodAutoscaler
    release 
    "hello-world" uninstalled
    ЗЫ: Это просто пример, в котором приведен самый минимальный набор настроек.
    Ваши пожелания, комментарии и дополнения приветствуются :)
  3. korshunov

    korshunov Новичок

    В чём преимущество такого способа перед стандартным kubectl apply?
  4. kroshikhin

    kroshikhin Участник

    Основные преимущества при использовании helm следующие:
    1. Проще создавать с 0 собственные приложения, т.к. уже есть дефолтные значения сущностей k8s в виде различных шаблонов.
    2. Можно гибко настраивать, изменяя параметры, вы можете использовать один и тот же helm-чарт для нескольких сред (dev-test-stage-prod)
    3. Helm хранит историю версий.
    - Когда что-то пойдет не так (к примеру одна из worker-нод выйдет из строя) k8s поднимет реплику приложения на другой ноде, пока та будет недоступна;
    - Можно быстро вернуться к предыдущей версии приложения с помощью helm rollback.
    Последнее редактирование: 30 авг 2023
  5. ilia_beh

    ilia_beh Новичок

    Наконец-то нормальная подробная статья. Лайк