В области back-end разработки уже существует множество различных фреймворков разработки, при разработке проекта вы можете выбрать подходящий фреймворк разработки в соответствии с различными потребностями и требованиями. Однако, когда необходимо разработать полноценный инженерный проект, недостаточно только серверной среды разработки, а также возникают такие проблемы, как тестирование, развертывание и мониторинг при быстрой итерации проекта разработки. Для решения этих проблем и возникла модель разработки DevOps.
Основываясь на моем личном понимании DevOps, я создал серверный проект с открытым исходным кодом на основе Gin, чтобы практиковать различные концепции DevOps:GitHub.com/Ван Хао Департамент 30….
DevOps - это широкое понятие, и этот проект просто представляет новую концепцию. Он соединяет основные инструменты различных DevOps в тестовой среде. Вы можете указывать на недостатки и учиться и общаться вместе.
Как собрать проект в режиме DevOps
Что такое DevOps?Официальное определение DevOps выглядит следующим образом:
DevOps — это сочетание культурной философии, практик и инструментов, которые могут улучшить способность организации предоставлять приложения и услуги с высокой скоростью, помогая организациям развивать и улучшать продукты быстрее, чем с помощью традиционных процессов разработки программного обеспечения и управления инфраструктурой. Эта скорость позволяет организациям лучше обслуживать своих клиентов и более эффективно конкурировать на рынке.
Можно сказать, что DevOps — это общий термин для набора процессов, методов и систем, включающих организационную структуру, инструменты разработки, инфраструктуру и так далее. Но в основе лежит акцент на автоматизации доставки программного обеспечения и процессов изменения инфраструктуры с помощью различных автоматизированных инструментов для быстрого, частого и надежного создания, тестирования и выпуска программного обеспечения. Проекты DevOps также будут строиться в основном вокруг этой идеи.
В этом базовом проекте практика DevOps будет в основном строиться вокруг следующих частей:
- Непрерывная интеграция: практика разработки программного обеспечения, при которой разработчики периодически объединяют свои изменения кода в центральный репозиторий, после чего операции сборки и тестирования выполняются автоматически.
- Непрерывная поставка: Автоматически создавайте и тестируйте изменения кода и подготавливайте их к выпуску в рабочую среду, позволяя расширениям непрерывной интеграции.
- Инфраструктура как код. Используйте инструменты на основе кода для подключения инфраструктуры и возможности работать с инфраструктурой так же, как с кодом приложения. Инфраструктура и серверы определяются кодом.
- Мониторинг и ведение журналов. Организации отслеживают метрики и журналы, чтобы понять, как производительность приложений и инфраструктуры влияет на работу конечных пользователей с их продуктами.
Процесс разработки всего проекта выглядит следующим образом:
Инструменты и среда разработки
Конечно, для завершения ряда процессов от разработки до развертывания необходима поддержка различных инструментов и сред автоматизации.Среда, используемая в этом проекте, выглядит следующим образом:
- Среда разработки кода Go 1.13
- Аккаунт на гитхабе
- Контейнерный склад, этот проект использует Tencent Cloud Container Service
- Jenkins 2.190
- Kubernetes В этом проекте используется трехузловой кластер на основе k8s v1.16.1.
Процесс разработки DevOps-проекта
пройти черезadvprojectПроцесс обновления кода, отправки, завершения автоматического тестирования, упаковки и развертывания этого бэкэнд-проекта на основе Gin.
серверный проект
advprojectПроект в основном включает в себя следующие части:
- документация по интерфейсуswag
- журналzap
- настроитьgodotenv
- Docker-контейнерные файлыDockerfile
- Jenkinsflie Jenkinsfile
- Файлы развертывания Kubernetesdeployment-template.yaml
Структура всего кода следующая
.
├── 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-* по умолчанию.
Просто подожди немногоDiscover
В меню вы можете увидеть журналы, собранные в журнале ElasticSearch, выполнить поиск Gin в фильтрах и просмотреть журналы этого проекта.
Суммировать
На этом процесс разработки проекта в режиме DevOps примерно завершен. Конечно, в этом процессе еще есть много областей, которые можно улучшить, например, создание более подробных отчетов о тестировании кода, использование kibana для создания отчетов журнала, мониторинг журналов ошибок в коде и оповещение о них и т. д. Благодаря DevOps этапы разработки, тестирования, эксплуатации и обслуживания тесно связаны между собой, поэтому сборка, тестирование и выпуск программного обеспечения могут выполняться быстрее, чаще и надежнее. В дополнение к этим технологиям и инструментам DevOps также требует хорошей коммуникации, совместной работы и интеграции между различными отделами организации. В реальной разработке разработчикам необходимо писать бизнес-коды и коды модульных тестов посредством разделения и сотрудничества различных отделов; тестировщики разрабатывают тестовые примеры и обращают внимание на отчеты о тестировании кода; операционный и обслуживающий персонал разрабатывает шаблоны развертывания Kubernetes, отслеживает систему и данные журналов, поэтому что они могут сыграть свою роль Наибольшая эффективность DevOps, лучшее обслуживание клиентов и более высокая конкурентоспособность на рынке.
Впервые опубликовано из личного блогаЧернокожий научно-технический исследовательский центр в средней школе, добро пожаловать на биржу.