Рубрики
Uncategorized

Современная непрерывная доставка на Kubernetes для разработчиков

Непрерывная доставка (CD) в среде Kubernetes всегда была сложной и сложной задачей … Теги с DevOps, Kubernetes, учебным пособием, программированием.

Непрерывная доставка (CD) в среде Kubernetes всегда была сложной и сложной задачей для настройки и поддержания, но так не должно быть. Современные инструменты могут сделать процесс разработки и развертывания ваших приложений как можно более эффективным, быстрым и устойчивым, не требуя большой конфигурации.

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

К концу этой статьи вы поймете наиболее важные концепции современной непрерывной доставки и получите работающее развертывание Kubernetes с полным рабочим процессом непрерывной доставки — все без необходимости писать одну строку кода трубопровода.

Среда CD, которую вы собираетесь настроить, будет иметь многоступенчатую среду с двумя этапами для упрочнения, а также ворот производства и качества, которые будут использовать метрики Prometheus из вашего приложения, чтобы проверить, готово ли развертывание для продвижения в производство. Рабочий процесс показан на изображении ниже.

Предварительные условия

Прежде чем начать, вам понадобится следующее

  • Кластер Kubernetes, по крайней мере, с одним узлом с 4 VCPU и 16 ГБ памяти. Чтобы создать кластер GKE, подходящий для развертывания демонстрации, см. GKE QuickStart Из Heartn инструмент с открытым исходным кодом, который вы будете использовать в этой статье.
  • kubectl Инструмент командной строки установлен на вашем компьютере разработки и подключен к вашему кластеру. Вы можете узнать больше об установке Kubectl в Официальная документация Анкет
  • git Инструмент командной строки установлен для клонирования демонстрационного приложения от GitHub.

Шаг 1: Понять концепции современного компакт -диска

Перед настройкой среды крайне важно, чтобы вы знакомы с наиболее важными понятиями, касающимися современного компакт -диска.

Декларативный

Большинство компаний сегодня по -прежнему строят свои рабочие процессы непрерывной доставки. Написание и поддержание кода трубопровода может быть очень сложным и может привести к большой ручной работе для разработчиков; Это время, которое они не могут использовать для разработки реального программного обеспечения.

Однако декларативный подход позволяет разработчикам определить, что необходимо сделать, и инструмент CD обрабатывает все остальное. Это не только уменьшает время, необходимое для написания и поддержания конфигурации, это также приносит пользу разработчикам, которые уже знакомы с определением декларативных конфигураций с использованием таких инструментов, как Kubernetes, и не нужно изучать сложные инструменты.

Масштабируемый

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

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

Расширяется

Многие компании уже имеют существующий технологический стек, в том числе инструменты наблюдения, такие как Prometheus или Test Automation, такие как Jmeter или Neoload, и, следовательно, хотят повторно использовать свою уже реализованную функциональность в своем рабочем процессе CD. Современные инструменты CD позволяют организациям использовать существующие инструменты для интеграции со своим рабочим процессом CD и предоставления основы для реализации новых пользовательских функций наряду с существующей функциональностью.

Качественные ворота

Чтобы обеспечить наилучший пользовательский опыт, приложениям нужна проверка качества, прежде чем их можно будет развернуть в производственной среде. Качественные ворота используются для автоматического обеспечения того, чтобы конкретно определенные критерии (например, время отклика, частота ошибок, пропускная способность и т. Д.) Согласно внедрению ваших услуг в производство.

Эти критерии могут быть декларативно определены с использованием концепций инженерии сайтов (SRE), таких как SLIS (индикаторы уровня обслуживания) и SLO (цели уровня обслуживания).

Индикатор уровня обслуживания (SLI)

Индикатор уровня обслуживания является количественной мерой (метрикой) некоторых аспектов вашего приложения, например, время ответа, частота ошибок или пропускная способность.

Цель уровня обслуживания (SLO):

Цель уровня обслуживания определяет определенное условие с использованием SLI, которое должно быть выполнено, чтобы пройти тест. Примером этого является время отклика на конкретной конечной точке, которая должна оставаться ниже 200 миллисекунд или частота ошибок, которая должна оставаться ниже 1%.

Шаг 2 — Наш оркестратор на компакт -диск по выбору: сохранил

Теперь, когда вы установили основные концепции современного компакт -диска, давайте посмотрим на оркестратора, который построен на этих концепциях и делает их доступными и простыми в использовании.

Сохранил является облачным натуральным циклом с открытым исходным костюмом оркестратором и Облачный нативный вычислительный фундамент (CNCF) Проект. HETER использует декларативный подход, который позволяет вам указать рабочие процессы DevOps и SRE Automation, такие как автоматизация доставки или операции без сценариев всех деталей. Затем определения могут быть переданы по любому количеству микросервисов без необходимости создавать отдельные трубопроводы и сценарии.

Поддерживается также включает в себя встроенные качественные ворота, основанные на принципах SRE, таких как SLIS и SLO, которые помогают вам оценить и оценить ваши определенные критерии, чтобы решить, разрешена ли новая версия для продвижения на следующий этап развертывания или если она должна быть сдержана или даже откатился назад.

Кроме того, HETEDN обеспечивает отличную интеграционную экосистему, где она переводит четко определенные облачные события в API-проприетарного поставщика. Экосистема уже имеет много интеграций для известных услуг, таких как JMeter, Litmuschaos и Prometheus, и позволяет пользователю легко добавлять свои собственные интеграции. И благодаря своей природе с открытым исходным кодом возможны добавление новых интеграций.

Шаг 3 — Настройка платформы

Теперь, когда вы знаете основные понятия современного CD и преимущества, которые предоставляет современный CD — вы готовы настроить.

В этом разделе вы будете развернуть Heportn в своем кластере Kubernetes и подключите кластер к CLI CLI (обязательно следите за предпосылками на вершине этой статьи).

Прежде чем настройка, сохранившись на вашем кластере Kubernetes, вам сначала нужно решить, как вы хотите выставить Hardn. Вы можете завершить настройку, используя сервер Ingress, как описано в этой статье, или с помощью любого из других вариантов, упомянутых в Сохранила документацию .

В этой статье вы выставите через Istio. Поэтому вы начнете с загрузки сценария установки ISTIO с официального веб -сайта, используя следующую команду:

curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.8.2 sh -

Эта команда создаст папку с именем istio затем загруженная версия в вашем текущем каталоге. Вы можете выполнить установщик, выполнив следующую команду:

./istio-1.8.2/bin/istioctl install

Установщик создаст все ресурсы, необходимые в вашем кластере Kubernetes для использования ISTIO, включая CRD (пользовательские определения ресурсов), configmaps и многое другое.

Далее вы загрузите и установите CLI HEFTN, который можно использовать для установки и управления HEFTN.

Если вы используете Linux или MacOS, вы также можете установить CLI, используя следующую команду:

curl -sL https://get.keptn.sh | KEPTN_VERSION=0.8.0 bash

Если хотите, вы также можете вручную загрузить двоичный файл из GitHub и установите CLI, перемещая его в свой путь.

Теперь вы можете проверить установку, используя – Хелп флаг:

keptn --help

Веденник состоит из плоскости управления и плоскости исполнения. Плона управления позволяет использовать HEFTN для качественных ворот и автоматических вариантов использования операций, в то время как плоскость выполнения добавляет дополнительные функциональные возможности, такие как возможности непрерывной доставки и услуги для интеграции с такими структурами тестирования, как JMeter. В этом случае вы установите Heportn, используя вариант использования непрерывной доставки.

keptn install --endpoint-service-type=ClusterIP --use-case=continuous-delivery

Процесс установки обычно занимает менее 3 минут и создает все основные ресурсы Kubernetes, необходимые для запуска. Вы можете проверить статус, используя следующую команду:

kubectl get deployments -n keptn

Как только установка завершена, ваш выход должен выглядеть похоже на это:

NAME                                             READY   UP-TO-DATE   AVAILABLE   AGE
api-gateway-nginx                                1/1     1            1           2m44s
api-service                                      1/1     1            1           2m44s
bridge                                           1/1     1            1           2m44s
configuration-service                            1/1     1            1           2m44s
eventbroker-go                                   1/1     1            1           2m44s
gatekeeper-service                               1/1     1            1           2m44s
helm-service                                     1/1     1            1           2m44s
helm-service-continuous-deployment-distributor   1/1     1            1           2m44s
jmeter-service                                   1/1     1            1           2m44s
lighthouse-service                               1/1     1            1           2m44s
mongodb                                          1/1     1            1           2m44s
mongodb-datastore                                1/1     1            1           2m44s
remediation-service                              1/1     1            1           2m44s
shipyard-service                                 1/1     1            1           2m44s

После установки следующего шага — настройка ISTIO, чтобы вы могли получить доступ к вашему экземпляру HOWERN. ISTIO используется в качестве контроллера входа, который отвечает за маршрутизацию трафика в ваш кластер.

Чтобы сделать опыт настройки как можно более плавным, команда Heartn предоставила сценарии, которые автоматически настраивают ISTIO со стандартными рабочими настройками. Если вы хотите настроить настройку самостоятельно, посмотрите на Сохранила документацию Анкет

Сначала вы загрузите сценарий конфигурации с GitHub с помощью Curl.

curl -o configure-istio.sh https://raw.githubusercontent.com/keptn/examples/release-0.8.0/istio-configuration/configure-istio.sh

Далее запустите скрипт конфигурации, используя следующие команды:

chmod +x configure-istio.sh
./configure-istio.sh

Теперь убедитесь, что вход был создан:

kubectl get ingress -n keptn

Команда выведет следующее:

NAME                HOSTS                  ADDRESS         PORTS   AGE
api-keptn-ingress   ${IP-Address}.nip.io   ${IP-Address}   80      56d

После успешной настройки ISTIO вы будете аутентифицировать свой HET CLI в отношении только что установившейся плоскости управления, который вы только что установили. Для этого вам нужна конечная точка вашего API, а также токен API, оба из которых можно прочитать с помощью kubectl.

KEPTN_ENDPOINT=http://$(kubectl -n keptn get ingress api-keptn-ingress -ojsonpath='{.spec.rules[0].host}')/api
KEPTN_API_TOKEN=$(kubectl get secret keptn-api-token -n keptn -ojsonpath='{.data.keptn-api-token}' | base64 --decode)

Это kubectl Get Команда использует -n Флаг, чтобы установить пространство имен, где находится ресурс, и -ojsonpath Флаг, чтобы указать переменную, которая должна быть прочитана в возвращенном выходе. Значения, возвращаемые командами, сохраняются непосредственно в переменные среды.

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

keptn auth --endpoint=$KEPTN_ENDPOINT --api-token=$KEPTN_API_TOKEN

Как только CLI успешно аутентифицируется с помощью кластера Heartn, вы получите вывод, аналогичный:

Starting to authenticate
Successfully authenticated

Шаг 4 — Создайте ресурсы CD и разверните приложение

Теперь, когда вы успешно настроились на свой кластер Kubernetes, вы продолжите, создав простое приложение HTTP Server и создав все ресурсы CD, необходимые для развертывания приложения с помощью Heportn. Мы собираемся использовать демонстрационное приложение, предоставленное Облачным вычислительным фондом (CNCF), которое было создано для демонстрации различных возможностей для развертывания/доставки.

Во -первых, вы клонируете репозиторий проекта, так что у вас есть все ресурсы, необходимые для начала развертывания вашего приложения на Kubernetes, используя Heartn.

git clone https://github.com/cncf/podtato-head.git

Эта команда будет клонировать репозиторий головы Podtato из GitHub и создаст папку с именем Подтато-голова в вашем каталоге. Теперь вы можете продолжить, открыв проект в вашем любимом редакторе кода. Затем вы можете найти приложение в Podtato-Server Папка репозитория.

Приложение уже предназначено в Dockerfile и файле утилиты Bash, который помогает вам продвигать разные версии изображений Docker в реестр.

Изображения реестра теперь будут использоваться для создания диаграммы Helm, которая используется для развертывания приложения на Kubernetes. Диаграмма Helm состоит из нескольких файлов и может быть найдена под Доставка> сохранилась> Хелм-диаграммы> Helloserver Анкет

  • Chart.yaml — Этот файл содержит всю информацию о диаграмме, включая имя, номер версии и т. Д.
  • values.yaml — Этот файл используется для определения значений, которые вы хотите внедрить в свои шаблоны.
  • Шаблоны — это папка, где вы храните фактические манифесты, которые развернуты с помощью диаграммы. Этот пример содержит только файл развертывания и обслуживания для приложения, но он также может включать в себя больше конфигураций Kubernetes, таких как ConfigMaps, Secrets и т. Д.

Манифест ресурса развертывания выглядит так:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloservice
  namespace: {{ .Release.Namespace }} 
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: helloservice
  template:
    metadata:
      labels:
        app: helloservice
    spec:
      terminationGracePeriodSeconds: 5
      containers:
      - name: server
        image: {{ .Values.image}}
        imagePullPolicy: Always
        ports:
        - containerPort: 9000
        env:
        - name: PORT
          value: "9000"

Раздел Spec определяет желаемое состояние вашего развертывания, содержащую информацию, такую как количество реплик, и информация о созданном контейнере. Затем Kubernetes пытается создать желаемое состояние и принять меры, чтобы сохранить это состояние, если что -то изменится.

Ключ Spec.Template определяет правила, которые Kubernetes будет использовать для создания вашего POD. Здесь вы определяете специфики развертывания PODS, как имя изображения, политика вытягивания и контейнерные порты.

Затем давайте посмотрим на файл сервиса Kubernetes, который разоблачает порт 9000 вашего POD на порту 80 работника Kubernetes.

apiVersion: v1
kind: Service
metadata:
  name: helloservice
  namespace: {{ .Release.Namespace }} 
spec:
  selector:
    app: helloservice
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 9000
  type: ClusterIP

Теперь, когда все ресурсы Helm и Kubernetes определены, вы можете продолжить, создав определение верфи. Серманная сторона определяет последовательность задач для доставки вашего приложения. Он может содержать несколько выделенных этапов, каждая из которых имеет различную стратегию развертывания, тестирования и восстановления.

Благодаря декларативному подходу верфи, нет необходимости писать какой -либо императивный код трубопровода.

apiVersion: "spec.keptn.sh/0.2.0"
kind: "Shipyard"
metadata:
  name: "shipyard-sockshop"
spec:
  stages:
    - name: "hardening"
      sequences:
        - name: "delivery"
          tasks:
            - name: "deployment"
              properties:
                deploymentstrategy: "blue_green_service"
            - name: "test"
              properties:
                teststrategy: "performance"
            - name: "evaluation"
            - name: "release"
    - name: "production"
      sequences:
        - name: "delivery"
          triggeredOn:
            - event: "hardening.delivery.finished"
          tasks:
            - name: "deployment"
              properties:
                deploymentstrategy: "blue_green_service"
            - name: "release"

Согласно файлу, вы собираетесь создать многоэтапную среду с упрочнением и стадией производства. HETSN выполняет синее/зеленое развертывание (то есть два развертывания одновременно с маршрутизацией трафика только к одному развертыванию) и вызывает тест на производительность на стадии затверждения. Как только тесты успешно завершены, развертывание перемещается на стадию производства, используя еще одно синее/зеленое развертывание. Обратите внимание, что определение инструмента (например, какой инструмент тестирования выполняет тесты) не является частью файла верфи; Это определяется как часть поддержанной формы. В этом примере вы будете использовать стандартный инструмент, который поставляется с установкой по умолчанию.

Теперь, когда вы определили файл Shipyard, пришло время создать свой первый проект HERTN, используя следующую команду:

cd podtato-head/delivery/keptn

keptn create project pod-tato-head --shipyard=./shipyard.yaml

После того, как проект создан, вы можете продолжить с помощью HelloServer в качестве услуги для вашего проекта, используя Ведь на бортовой сервис командование и прохождение проекта, на который вы хотите на борту службы, а также на графике Helm Service.

keptn onboard service helloservice --project="pod-tato-head" --chart=helm-charts/helloserver

Теперь вы можете взглянуть на проект, который вы только что создали, используя мост Heartn, который является пользовательским интерфейсом HET. Вы можете найти сгенерированные учетные данные доступа, используя следующую команду:

keptn configure bridge --output

Теперь используйте учетные данные и URL -адрес следующей команды, чтобы получить доступ к мосту HEFTN.

echo http://$(kubectl -n keptn get ingress api-keptn-ingress -ojsonpath='{.spec.rules[0].host}')/bridge

После того, как вы успешно подписались на учетную запись, вы увидите следующий пользовательский интерфейс.

Теперь, когда вы создали проект и наградили услугу, вы можете продолжить, развернув свой первый артефакт, используя Хранила доставка триггера Команда:

keptn trigger delivery --project="pod-tato-head" --service=helloservice --image="gabrieltanner/hello-server" --tag=v0.1.1

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

После развертывания вы можете вернуться к мосту Heartn, чтобы увидеть событие, которое было создано для вашего артефакта.

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

kubectl get pods --all-namespaces | grep helloservice

Обычно это занимает пару минут, поэтому просто освежайтесь, пока ваш вывод не отражает что -то вроде следующего:

pod-tato-head-hardening    helloservice-primary-5f779966f9-vjjh4                        2/2     Running   0          4m55s
pod-tato-head-production   helloservice-primary-5f779966f9-kbhz5                        2/2     Running   0          2m52s

После того, как стручки работают, вы можете просмотреть свой сервис, используя URL, который вы получаете из следующей команды, или посетить его через мост.

echo http://helloservice.pod-tato-head-hardening.$(kubectl -n keptn get ingress api-keptn-ingress -ojsonpath='{.spec.rules[0].host}')

Вы должны, чем увидеть страницу, похожую на это:

Теперь вы успешно развернули свой первый сервис на Heartn в многоэтапной доставке, не написав ни одной строки кода трубопровода. Затем вы добавите качественные ворота в свой проект, чтобы автоматически обеспечить соответствие конкретных определенных критериев, прежде чем внедрить услугу в производство.

Шаг 5 — Добавить качественные ворота к CD

Теперь, когда вы успешно развернули свое приложение на Kubernetes, используя Heardn, пришло время добавить функциональность качества Gate, чтобы убедиться, что ваше приложение работает правильно, прежде чем оно будет развернуто к производству.

Приложение уже раскрывает следующие пользовательские метрики Прометея:

  • http_requests_total — Общее количество HTTP -запроса на каждом сайте
  • http_server_request_duration_seconds_sum — Сумма продолжительности всего HTTP -запроса для каждой страницы
  • go_routines — Количество в настоящее время работает
  • Запрос пропускной способности — Пропускная способность — это количество запросов, которые успешно выполняются за единицу времени

Эти метрики теперь можно использовать для определения пользовательских метрик в вашем файле SLI с помощью синтаксиса Prometheus. Например, вы определяете request_throughput в качестве суммы успешных запросов (200 кода статуса) в определенный период времени, указанный $ Duration_seconds Переменная среда, которая поддерживала автоматические настройки.

---
spec_version: '1.0'
indicators:
  http_response_time_seconds_main_page_sum: http_requests_total_sucess: go_routines: request_throughput: sum(rate(http_requests_total{status="success"}[$DURATION_SECONDS]))

Затем вы можете определить условия, которые вам необходимо встретить вашим SLIS, чтобы развертывание проходило тест и был повышен на следующем этапе.

Следующий SLO -файл содержит три цели:

  • Время отклика на главной странице должно быть меньше или равно 1 секунду.
  • Процент успешных запросов должен составлять от 80% до 100%.
  • Там может быть не более 20 одновременных goroutines.

Если все три критерия удовлетворены, эта цель выполняется и получает полный результат.

---
spec_version: '0.1.0'
comparison:
  compare_with: "single_result"
  include_result_with_score: "pass"
  aggregate_function: avg
objectives:
  - sli: http_response_time_seconds_main_page_sum
    pass:
      - criteria:
          - "<=1"
    warning:
      - criteria:
          - "<=0.5"
  - sli: request_throughput
    pass:
      - criteria:
          - "<=+100%"
          - ">=-80%"
  - sli: go_routines
    pass:
      - criteria:
          - "<=100"
total_score:
  pass: "90%"
  warning: "75%"

Прежде чем вы сможете использовать файлы SLI и SLO, вам необходимо настроить мониторинг PROMETHEUS для вашего проекта HEFTN. Вы можете установить официальную службу Prometheus, используя следующую команду:

kubectl apply -f https://raw.githubusercontent.com/keptn-contrib/prometheus-service/release-0.4.0/deploy/service.yaml

Далее вы установите правила менеджера Prometheus Manager, используя сохраняет мониторинг командование

keptn configure monitoring prometheus --project=pod-tato-head --service=helloservice

Прометеус теперь автоматически настроил задание с царапином для вашего приложения. Теперь, когда вы соскребаете метрики, используя Prometheus, вам также необходимо установить службу Prometheus sli, которая принесет значения для SLIS, упомянутых в файле конфигурации SLO в процессе оценки сборки.

kubectl apply -f https://raw.githubusercontent.com/keptn-contrib/prometheus-sli-service/release-0.3.0/deploy/service.yaml

Теперь, когда все службы настроены правильно, вы можете добавить файлы SLI и SLO в качестве ресурсов для вашего проекта.

keptn add-resource --project=pod-tato-head --stage=hardening --service=helloservice --resource=prometheus/sli.yaml --resourceUri=prometheus/sli.yaml

keptn add-resource --project=pod-tato-head --stage=hardening --service=helloservice --resource=slo.yaml --resourceUri=slo.yaml

Также полезно сгенерировать некоторый трафик к конечной точке вашего приложения при запуске тестов. Это можно сделать с помощью уже определенных файлов JMeter:

keptn add-resource --project=pod-tato-head --stage=hardening --service=helloservice --resource=jmeter/load.jmx --resourceUri=jmeter/load.jmx
keptn add-resource --project=pod-tato-head --stage=hardening --service=helloservice --resource=jmeter/jmeter.conf.yaml --resourceUri=jmeter/jmeter.conf.yaml

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

keptn trigger delivery --project="pod-tato-head" --service=helloservice --image="gabrieltanner/hello-server" --tag=v0.1.1

После отправки артефакта вы можете увидеть результаты испытаний на мосту HET.

Все тестовые случаи, определенные в файле SLO, прошли, и развертывание было продвинуто до производства.

Шаг 6 — проверить качественные ворота

Теперь, когда вы работаете с качественными воротами, пришло время подтвердить, что они работают, намеренно развертывая медленную сборку, которая должна провалить критерии успеха, которые вы определили на последнем шаге. POD-TATO-HEAVE Приложение уже имеет реализованную версию медленной сборки (v0.1.2), где каждый запрос задерживается на 2 секунды.

keptn trigger delivery --project="pod-tato-head" --service=helloservice --image="gabrieltanner/hello-server" --tag=v0.1.2

После отправки артефакта вы можете увидеть результаты испытаний на мосту HET.

Здесь вы можете видеть, что некоторые из ваших определенных тестовых случаев (например, время отклика) не удалось, потому что вы развернули медленную сборку, которая не подходит для производства. После того, как тест не удастся, развертывание не будет способствовать производству, а этап укрепления вернется в свое первоначальное состояние.

Вывод

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

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

Оригинал: «https://dev.to/gabrieltanner/modern-continuous-delivery-on-kubernetes-for-developers-5chf»