мета-данные страницы
Это старая версия документа!
Выполнение домашнего задания для DevOps-тренировок в Яндексе, лекция "Облако. Кто виноват и что делать."
Для начала нужно создать две виртуальные машины на Яндекс облаке и клонировать себе в каждую машину репозиторий с гитхаба. В рамках проекта тренировок предоставляется возможность бесплатно использовать виртуальные машины по запросу.
Машины созданы
Подключаемся удобным способом к ним по SSH, я использую Windows Terminal. Клонируем репозиторий
git clone https://github.com/igkfellk/y-y-devops-trainings-cloud-1/
Сборка образа для catGPT
Создаем каталог
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
Для полноценного выполнения задания еще потребуется настроить связь через oauth яндекса с яндекс облаком. Тут ничего сложного, нужно получить токен через свой аккаунт яндекса перейдя по ссылке Далее в ранее созданной виртуальной машине или машинах выполнить подключение в несколько этапов:
- Скачать и установить яндекс CLI
curl -sSL https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash
- Выполнить настройку подключения через созданный токен
yc init
Создаем реестр
Выполнив одну команду, получаем созданный реестр
yc container registry create --name registry-ikfellk
- registry-ikfellk - любое имя на ваше усмотрение
Загружаем образ в реестр
Для начала смотрим на образы
docker images
Выбираем нужный нам образ для загрузки и присваиваем тег яндекса
docker tag ikfellk/catgpt:v1 \
cr.yandex/crp3b70qbcrknbg22qbk/ikfellkcatgpt:v1Где:
- crp3b70qbcrknbg22qbk - идентификатор вашего реестра на яндекс облаке
Загружаем образ в реестр
docker push cr.yandex/crp3b70qbcrknbg22qbk/ikfellkcatgpt:v1Проверяем что образ загрузился командой
yc container image listИ получаем такую картину
Автосборка с помощью Github CI и отправка в Яндекс облако
Для начала нужно создать ключи доступа к яндекс облаку из Github
yc iam access-key create --service-account-name ikfellk
Где:
- 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
- YANDEX_USERNAME - логин от яндекс облака
- YANDEX_CLOUD_SERVICE_ACCOUNT_KEY - Токен авторизации созданный ранее
- crj3b74hbhretbg25qbk - Идентификатор вашего реестра на яндекс облаке
Создаем секреты описанные в предыдущем шаге для создания вы должны находится в своем репозитории и нажать кнопку 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 И видим что процесс автосборки пошел
Буквально через несколько минут там же вы увидите такую картину
Процесс сборки завершился успешно
Теперь переходим в свое яндекс облако и проверяем действительно ли там появился образ
Вуаля и он действительно там
Автосборка с помощью Github CI и отправка в Docker Hub
Для начала нужно создать токен авторизации на docker hub:
- Переходим на сайт
- Логинимся под своей учеткой
- Переходим в Account Settings
- Далее Security
- Нажимаем New Access Token
- Даем ему имя и права
- Получаем готовый токен
Токен копируем и не теряем, он пригодится для создания секретов на гитхабе Создаем в репозитории на гитхабе файл
.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 }}
- USERNAME - логин от docker hub
- PASSWORD - Токен авторизации созданный ранее
Создаем секреты описанные в предыдущем шаге для создания вы должны находится в своем репозитории и нажать кнопку Settings
Далее перейти в Secrets and variables и далее в Actions
Теперь создаем секреты для авторизации Нужно нажать New repository secret Ввести названия что упоминались выше или можете посмотреть свой файл docker-publish.yml и там найти строки с секретами и изменить на ваши названия, которые вы создали
Тестируем автосборку и отправку в Docker Hub
В консоли переходим в каталог клонированной ветки репозитория гитхаба
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
Установка
Для начала нужно установить 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
Проверка работы Terraform
Переходим в заранее клонированный репозиторий с 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В конце, как отработает команда, вы получите такой вывод
Тестируем отработанный Terraform
Переходим в свой личный кабинет яндекс облака и смотрим что там появились машины, сети, балансировщик и регистр
Теперь нужно загрузить актуальную версию приложения в контейнер Для этого выполняем уже знакомые нам команды
git pull
git tag -a v1.2.5 -m "Тест автосборки"
git push origin v1.2.5Вводим логин и пароль от гитхаба Спустя примерно минуту или полторы, смотрим в личный кабинет яндекс облака и видим там контейнер
Теперь переходим в веб браузер по ip адресам виртуальный машин созданный нашим terraform файлом и видим там рабочее приложение и метрики




Обсуждение