мета-данные страницы
Это старая версия документа!
Выполнение домашнего задания для 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 если таковы имеются. В моем случае ошибки есть и их нужно исправить
Обсуждение