Diplom
Описание
Языки
- HCL67,3%
- Jinja29,7%
- Smarty2,1%
- HTML0,6%
- Dockerfile0,3%
7 месяцев назад
7 месяцев назад
7 месяцев назад
7 месяцев назад
7 месяцев назад
7 месяцев назад
7 месяцев назад
7 месяцев назад
7 месяцев назад
7 месяцев назад
7 месяцев назад
7 месяцев назад
README.md
Создание облачной инфраструктуры.
- Создал сервисный аккаунт с помощью terraform.

- Передал креды сервисного аккаунта в output для дальнейшего использования.
- Создал backet с помощью terraform.

- С помощью следующей команды передал креды от сервисного аккаунта в переменные окружения.
terraform output -json | jq -r 'to_entries[] | .key + "=" + (.value.value | tostring)' | while read -r line ; do echo export "$line"
- Инициализировал терраформ для создания инфраструктуры следующей командой, для того чтобы terraform.tfstate хранить в s3 backet.
terraform init -backend-config="access_key=$access_key" -backend-config="secret_key=$secret_key"
- Создал подсети в трёх зонах доступности.

- Создал в первом приближении 4 вм для кластека k8s.

Создание Kubernetes кластера.
- Кластер Kubernetes разворачивал с помощью kubespray.
- Сделал через terraform генерацию insentory для kubspray, а так же запуск playbook для установки кластера.
- В файле ~/.kube/config находятся данные для доступа к кластеру.

- Команда kubectl get pods --all-namespaces отрабатывает без ошибок.

Создание тестового приложения.
- Создал Dockerfile простого приложения nginx со статической страничкой.


- Создан Yandex Container Registry с помощью terraform.
- В реестр помещён образ приложения.

Подготовка cистемы мониторинга и деплой приложения.
- Написал ansible роли для установки (эта роль из ansible-galaxy) helm, деплоя чарта kube-prometheus-stack, так же деплой своего приложения. Образ приложения берётся из яндекс реестра.
- Доступ к графане и приложению организован по 80 порту, через ingress:


- Скрины из графаны - ресурсы кластера и сети кластера:


Установка и настройка CI/CD
Выбрал для использования gitlab. Написал pipline .gitlab-ci.yml:
stages:
- build
- deploy
variables:
DOCKER_REGISTRY: "cr.yandex/crprfm6ra9ig2st28ao1/diplom-web" # Указываем репозиторий
docker-build:
image: docker:latest
stage: build
services:
- docker:dind
before_script:
- echo "$key_ci_cd" | base64 -d > key_ci.json #Ключ сервисного аккаунта
- cat key_ci.json | docker login --username json_key --password-stdin $DOCKER_REGISTRY #Логинимся в репозиторий
rules: #Тут делаем проверку, если есть тег ставим его, если нет ставим latest
- if: '$CI_COMMIT_TAG != null'
variables:
TAG: '${CI_COMMIT_TAG}'
- if: '$CI_COMMIT_BRANCH != null && $CI_COMMIT_TAG == null'
variables:
TAG: 'latest'
script:
- docker build -t $DOCKER_REGISTRY:$TAG .
- docker push $DOCKER_REGISTRY:$TAG
deploy-k8s:
stage: deploy
only:
- tags # Выполняется только при появлении нового тега
image:
name: alpine/kubectl:latest
entrypoint: ["/bin/sh", "-c"]
script:
- export KUBECONFIG=${KUBECONFIG} #Логинимся в k8s
- kubectl set image deployment/app app=$DOCKER_REGISTRY:${CI_COMMIT_TAG}
Для теста изменим index.html. И комитим изменения:


Работа выполненна, изменённый образ залит в реестр, но не деплоится в кластере k8s, т.к. нет тега.

На страничке соответственно изменений нет:

Добавляем тег: v2. Теперь происходит деплоймент:


И изменилась наша страничка:
