Создайте проект DevOps

Эксплуатация и обслуживание

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

Основываясь на моем личном понимании DevOps, я создал серверный проект с открытым исходным кодом на основе Gin, чтобы практиковать различные концепции DevOps:GitHub.com/Ван Хао Департамент 30….

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

Как собрать проект в режиме DevOps

Что такое DevOps?Официальное определение DevOps выглядит следующим образом:

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

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

В этом базовом проекте практика DevOps будет в основном строиться вокруг следующих частей:

  • Непрерывная интеграция: практика разработки программного обеспечения, при которой разработчики периодически объединяют свои изменения кода в центральный репозиторий, после чего операции сборки и тестирования выполняются автоматически.
  • Непрерывная поставка: Автоматически создавайте и тестируйте изменения кода и подготавливайте их к выпуску в рабочую среду, позволяя расширениям непрерывной интеграции.
  • Инфраструктура как код. Используйте инструменты на основе кода для подключения инфраструктуры и возможности работать с инфраструктурой так же, как с кодом приложения. Инфраструктура и серверы определяются кодом.
  • Мониторинг и ведение журналов. Организации отслеживают метрики и журналы, чтобы понять, как производительность приложений и инфраструктуры влияет на работу конечных пользователей с их продуктами.

Процесс разработки всего проекта выглядит следующим образом:

Инструменты и среда разработки

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

  1. Среда разработки кода Go 1.13
  2. Аккаунт на гитхабе
  3. Контейнерный склад, этот проект использует Tencent Cloud Container Service
  4. Jenkins 2.190
  5. Kubernetes В этом проекте используется трехузловой кластер на основе k8s v1.16.1.

Процесс разработки DevOps-проекта

пройти черезadvprojectПроцесс обновления кода, отправки, завершения автоматического тестирования, упаковки и развертывания этого бэкэнд-проекта на основе Gin.

серверный проект

advprojectПроект в основном включает в себя следующие части:

Структура всего кода следующая

.
├── Dockerfile                  // Docker镜像打包文件
├── Jenkinsfile                 // Jenkins CI 定义
├── README.md
├── api
│   └── status.go               // 运行状态接口
├── config
│   ├── base.go                 // 基础配置
│   └── init.go                 // 配置模块初始化
├── deployment-template.yaml    // Kubernetes部署模板文件
├── docs                        // swag 接口文档
│   ├── docs.go
│   ├── swagger.json
│   └── swagger.yaml
├── go.mod
├── go.sum
├── main.go
├── serializer
│   └── common.go               // 接口格式定义
├── server
│   └── router.go               // 路由
├── test
│   └── status_test.go          // 测试代码
└── util
    └── logger.go               // 日志模块

Конфигурация CI Дженкинса

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

Вы можете быстро запустить Jenkins с помощью следующей команды docker. Для использования в контейнере Jenkinsdockerкоманда, которая сопоставляет команду docker с контейнером и указывает запускать контейнер от имени пользователя root.

docker run --name=jenkins_lts -d -u root -v jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/bin/docker -p 8080:8080 -p 50000:50000 -e JAVA_OPTS=-Duser.timezone=Asia/Shanghai jenkins/jenkins:lts

После запуска контейнера Jenkins и успешного входа в систему вы можете щелкнуть в правом нижнем углу основного интерфейса.Jenkins 中文社区ссылку, а затем установите зеркало центра обновлений в качестве внутреннего источника, чтобы ускорить скорость загрузки плагина.

Конфигурация среды

Эти плагины Jenkins в основном используются в этом проекте, их можно найти и установить на странице управления плагинами:

  • Blue Ocean легко использовать с Pipeline
  • Плагин Kubernetes Cli управляет кластером k8s через kubectl

В процессе развертывания push-изображений, уведомлений и т. д. необходимо использовать ключи, которые неудобно выставлены в коде Как использовать эти ключи в Jenkinsfile? Эти ключи можно заранее ввести в управление учетными данными Jenkins, и они называются переменными в Jenkinsfile. Здесь настраиваются следующие учетные данные:

  • Ключ входа в реестр tcloud-docker-reg
  • kubectl-config ключ kubectl
  • PUSH_KEY основан на ключе, нажатом в уведомлении серверного соуса.

создать проект

Чтобы определить процесс непрерывной интеграции в форме объявления кода через файл Jenkinsfile, вам необходимо создать проект конвейера конвейера в Jenkins.

Выберите «Новая задача», введите имя задачи, чтобы создать проект конвейера:

Проверьте проект GitHub на вкладке «Общие» и введите адрес проекта:

После отправки кода используйте функцию веб-перехватчика GitHub, чтобы отправить сообщение об обновлении кода, которое необходимо проверить в триггере сборки.GitHub hook trigger for GITScm polling:

После этого нужно настроить адрес пуш-апдейта вебхука в проекте GitHub code, статей на эту тему много, поэтому я не буду их здесь повторять.

Наконец, заполните кодовый адрес в конфигурации конвейера:

По умолчанию в указанной ветке*/master, что означает тянуть обновление основной ветки, если вы хотите тянуть код указанного тега. Его можно настроить в таком формате:+refs/tags/*:refs/remotes/origin/tags/*.

Запустите его, и вы увидите, что Jenkins запущен и работает.

Через Blue Ocean можно увидеть более подробную схему работы.

отправить результаты

Нажатый результат пройдетСерверный соусНажмите на привязанный WeChat. Серверный соус — это очень удобный push-сервис WeChat: вам нужно только привязать учетную запись GitHub, а затем запросить соответствующий адрес для отправки сообщений в WeChat. Передаваемая информация включает в себя результаты этой интеграции и записи об обновлениях кода. Доступ к результатам интеграции можно получить через Jenkinsfile.${currentBuild.result}чтобы получить. В записи обновления кода Jenkins нет соответствующей переменной, которую можно запустить, запустивgit log --pretty=format:\'%h - %an,%ar : %s\' --since=\'1 hours\' | head -n 1чтобы получить самые последние изменения в коде.

Развертывание в Kubernetes

После завершения каждого обновления проекта, а также после того, как код протянут через Jenkins и протестирован без ошибок, проект будет упакован в зеркальное изображение и загружен с помощьюbuild-${BUILD_NUMBER}В качестве тега и отправьте его в частный репозиторий изображений Tencent Cloud,${BUILD_NUMBER}Это переменная среды, когда Jenkins запускает задачу, указывающая серийный номер запускаемой задачи интеграции. позже в проектеdeployment-template.yamlВ качестве шаблона замените соответствующие переменные и разверните в кластере k8s.

После выполнения конвейера Jenkins войдите в узел кластера и запуститеkubectl get pods, вы можете видеть, что все только что развернутые проекты находятся в состоянии «Выполняется».

NAME                          READY   STATUS    RESTARTS   AGE
advproject-6f5d4d7d5d-pwmrp   1/1     Running   0          33s
advproject-6f5d4d7d5d-zscz2   1/1     Running   0          19s

Чтобы облегчить тестирование и быстро получить доступ к службам в кластере, вы можете запустить службу следующим образом.NodePortСервис предоставляет порт Pod.

apiVersion: v1
kind: Service
metadata:
  name: advproject-svc
spec:
  type: NodePort
  ports:
  - port: 3000
    targetPort: 3000
    protocol: TCP
  selector:
    app: advproject

пройти черезkubectl get serviceВы можете видеть, что номер порта, назначенный NodePode, равен 30942:

NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
advproject-svc   NodePort    10.110.152.165   <none>        3000:30942/TCP   25d

запустить на узлеcurl localhost:30942/api/v1/hostname, вы можете просмотреть имя хоста, соответствующее проекту, из-за настройки в файле развертывания развертыванияreplicas: 2, количество узлов, развернутых проектом, равно 2, и запрошенное имя хоста также будет отображаться случайным образом.

мониторинг журнала

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

容器日志

Чтобы лучше собирать и анализировать журналы, для единообразного сбора журналов будет использоваться подключаемый модуль ELK k8s. Клонируйте код соответствующей версии k8s и используйте проект k8s/cluster/addons/fluentd-elasticsearchПример кода в каталоге, используйтеkubectl apply -f .команда для быстрого развертывания плагина ELk.

После развертывания войдите в kibana и создайте шаблон logstash-* по умолчанию.

index

Просто подожди немногоDiscoverВ меню вы можете увидеть журналы, собранные в журнале ElasticSearch, выполнить поиск Gin в фильтрах и просмотреть журналы этого проекта.

日志

Суммировать

На этом процесс разработки проекта в режиме DevOps примерно завершен. Конечно, в этом процессе еще есть много областей, которые можно улучшить, например, создание более подробных отчетов о тестировании кода, использование kibana для создания отчетов журнала, мониторинг журналов ошибок в коде и оповещение о них и т. д. Благодаря DevOps этапы разработки, тестирования, эксплуатации и обслуживания тесно связаны между собой, поэтому сборка, тестирование и выпуск программного обеспечения могут выполняться быстрее, чаще и надежнее. В дополнение к этим технологиям и инструментам DevOps также требует хорошей коммуникации, совместной работы и интеграции между различными отделами организации. В реальной разработке разработчикам необходимо писать бизнес-коды и коды модульных тестов посредством разделения и сотрудничества различных отделов; тестировщики разрабатывают тестовые примеры и обращают внимание на отчеты о тестировании кода; операционный и обслуживающий персонал разрабатывает шаблоны развертывания Kubernetes, отслеживает систему и данные журналов, поэтому что они могут сыграть свою роль Наибольшая эффективность DevOps, лучшее обслуживание клиентов и более высокая конкурентоспособность на рынке.

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