Для начала нужно создать две виртуальные машины на Яндекс облаке и клонировать себе в каждую машину репозиторий с гитхаба. В рамках проекта тренировок предоставляется возможность бесплатно использовать виртуальные машины по запросу.
Машины созданы
Подключаемся удобным способом к ним по SSH, я использую Windows Terminal. Клонируем репозиторий
git clone https://github.com/igkfellk/y-y-devops-trainings-cloud-1/
Создаем каталог
sudo mkdir /etc/docker/catGPTКопируем нужные файлы в созданный каталог
sudo cp -r /home/ikfellk/y-y-devops-trainings-cloud-1/catgpt/. /etc/docker/catGPT/Переходим в каталог
cd /etc/docker/catGPTСоздаем Dockerfile
sudo nano Dockerfile
# Используем образ Golang рекомендуемый в задании FROM golang:1.21 AS builder # Указываем автора файла MAINTAINER Igor Kucherenko <i.kucherenko@test.ru> # Устанавливаем и переходим в рабочую директорию WORKDIR /go/src/app # Копируем go.mod и go.sum для загрузки зависимостей COPY go.mod go.sum ./ # Загружаем зависимости RUN go mod download # Копируем исходный код приложения COPY . . # Собираем приложение RUN CGO_ENABLED=0 go build -o /go/bin/app RUN chmod +x /go/bin/app # Создаем runtime образ на основе gcr.io/distroless/static-debian12:latest-amd64 FROM gcr.io/distroless/static-debian12:latest-amd64 # Копируем собранный бинарный файл из builder образа COPY --from=builder /go/bin/app /go/bin/app # Определяем команду, которая будет запускаться при запуске контейнера CMD ["/go/bin/app"]
Запуск сборки
sudo docker build -t ikfellk/catgpt:v1 .
Запуск контейнера
docker run -d -p 8080:8080 ikfellk/catgpt:v1
Для проверки созданных образов выполняем команду
docker imagesи получаем подобный вывод
Для проверки созданных контейнеров выполняем команду
docker ps -aи получаем подобный вывод
идем в браузер и открываем страницу
http://ваш_ip:8080/
Получаем такой вывод
Для полноценного выполнения задания еще потребуется настроить связь через oauth яндекса с яндекс облаком. Тут ничего сложного, нужно получить токен через свой аккаунт яндекса перейдя по ссылке Далее в ранее созданной виртуальной машине или машинах выполнить подключение в несколько этапов:
curl -sSL https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash
yc init
Выполнив одну команду, получаем созданный реестр
yc container registry create --name registry-ikfellk
Для начала смотрим на образы
docker images
Выбираем нужный нам образ для загрузки и присваиваем тег яндекса
docker tag ikfellk/catgpt:v1 \
cr.yandex/crp3b70qbcrknbg22qbk/ikfellkcatgpt:v1Где:
Загружаем образ в реестр
docker push cr.yandex/crp3b70qbcrknbg22qbk/ikfellkcatgpt:v1Проверяем что образ загрузился командой
yc container image listИ получаем такую картину
Для начала нужно создать ключи доступа к яндекс облаку из Github
yc iam access-key create --service-account-name ikfellk
Где:
Получаем такой вывод
Создаем токен авторизации
yc iam create-token
Создаем в репозитории на гитхабе файл
.github/workflows/docker-build-catgpt.yml
name: Docker Build and Deploy catgpt
on:
push:
tags:
- '*' # Любой тег
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Login to Yandex
run: docker login -u ${{ secrets.YANDEX_USERNAME }} -p ${{ secrets.YANDEX_CLOUD_SERVICE_ACCOUNT_KEY }} cr.yandex/crj3b74hbhretbg25qbk
- name: Build and push Docker image
run: |
docker build -t cr.yandex/crj3b74hbhretbg25qbk/catgpt:v1 ./catgpt
docker push cr.yandex/crj3b74hbhretbg25qbk/catgpt:v1
Создаем секреты описанные в предыдущем шаге для создания вы должны находится в своем репозитории и нажать кнопку Settings
Далее перейти в Secrets and variables и далее в Actions
Теперь создаем секреты для авторизации Нужно нажать New repository secret Ввести названия что упоминались выше или можете посмотреть свой файл docker-build-catgpt.yml и там найти строки с секретами и изменить на ваши названия, которые вы создали
У вас должен лежать Dockerfile в каталоге, который использует команда docker build.
В случае данного задания у меня лежит файл в каталоге ./catgpt
В консоли переходим в каталог клонированной ветки репозитория гитхаба
cd y-y-devops-trainings-cloud-1/Выполняем команды
git pull
git tag -a v1.2.4 -m "Тест автосборки"
git push origin v1.2.4Вводим логин и пароль от гитхаба и получаем такой вывод
Переходим в браузере в данный репозиторий во складку Actions И видим что процесс автосборки пошел
Буквально через несколько минут там же вы увидите такую картину
Процесс сборки завершился успешно
Теперь переходим в свое яндекс облако и проверяем действительно ли там появился образ
Вуаля и он действительно там
Для начала нужно создать токен авторизации на docker hub:
Токен копируем и не теряем, он пригодится для создания секретов на гитхабе Создаем в репозитории на гитхабе файл
.github/workflows/docker-publish.yml
name: Publish Docker image
on:
push:
tags:
- '*' # Любой тег
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v4
- name: Log in to Docker Hub
uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
with:
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: ikfellk/catgpt
- name: Build and push Docker image
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
with:
context: ./catgpt
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
Создаем секреты описанные в предыдущем шаге для создания вы должны находится в своем репозитории и нажать кнопку Settings
Далее перейти в Secrets and variables и далее в Actions
Теперь создаем секреты для авторизации Нужно нажать New repository secret Ввести названия что упоминались выше или можете посмотреть свой файл docker-publish.yml и там найти строки с секретами и изменить на ваши названия, которые вы создали
В консоли переходим в каталог клонированной ветки репозитория гитхаба
cd y-y-devops-trainings-cloud-1/Выполняем команды
git pull
git tag -a v1.2.4 -m "Тест автосборки"
git push origin v1.2.4
Получаем выполненный процесс как и в предыдущем тестировании Переходим в свой репозиторий на Docker hub и убеждаемся что файлы попали туда
Для начала нужно установить Terraform, а т.к. мы в России, то делать будем это через репозиторий яндекса Заходим на сайт https://hashicorp-releases.yandexcloud.net/terraform/ и копируем ссылку последней версии Выполняем команды: Скачать архив
wget https://hashicorp-releases.yandexcloud.net/terraform/1.6.3/terraform_1.6.3_linux_amd64.zipРаспаковать архив
unzip terraform_1.6.3_linux_amd64.zipПереместить файл
sudo mv terraform /usr/local/bin
Переходим в заранее клонированный репозиторий с github в папку terraform И выполняем команду
terraform initЕсли получаете ошибку такого рода
То нужно выполнить следующее: Создать файл
nano ~/.terraformrc
provider_installation {
network_mirror {
url = "https://terraform-mirror.yandexcloud.net/"
include = ["registry.terraform.io/*/*"]
}
direct {
exclude = ["registry.terraform.io/*/*"]
}
}
После этого пробуем еще раз команду
terraform initИ получаем положительный результат
Для начала нужно выполнить команду
terraform planДанная команда покажет ошибки в вашем main.tf если таковы имеются. В моем случае ошибки есть и их нужно исправить
1) Ошибка в названии регистра
Тут все просто, в файле output.tf не верно указано название регистра registry1 В моем случае оно называется ikfellk-registry Просто меняю на корректное название и ошибка уходит
2) Отсутствует json файл с данными
Для решения нужно сгенерировать json файл с данными для входа Мы это уже делали ранее тут Теперь выполняем команду
terraform planВидим что ошибки ушли, но появилась еще одна
3) Отсутствует SSH ключ для авторизации
Для решения нужно сгенерировать SSH ключ
ssh-keygen -t rsaУказываем путь и название как в ошибке /root/.ssh/devops_training Вводим пароль Проверяем полученные сертификаты
~/.ssh/
Теперь выполняем команду
terraform planИ получаем полностью корректный план. Небольшой пример как это выглядит
После этого можно запускать команду, которая настроит все необходимые ресурсы в автоматическом режиме
terraform applyВ конце, как отработает команда, вы получите такой вывод
Переходим в свой личный кабинет яндекс облака и смотрим что там появились машины, сети, балансировщик и регистр
Теперь нужно загрузить актуальную версию приложения в контейнер Для этого выполняем уже знакомые нам команды
git pull
git tag -a v1.2.5 -m "Тест автосборки"
git push origin v1.2.5Вводим логин и пароль от гитхаба Спустя примерно минуту или полторы, смотрим в личный кабинет яндекс облака и видим там контейнер
Теперь переходим в веб браузер по ip адресам виртуальный машин созданный нашим terraform файлом и видим там рабочее приложение и метрики
Для проверки балансировки нужно отключить одну виртуальную машину и со второй ничего не должно произойти и приложение так же останется в рабочем состоянии
Все работает как нужно.
Делаем удаление всех ресурсов
terraform destroy
Задание выполнено.