Репозиторий инфраструктуры
В данном репозитории хранится инфраструктурная часть проекта “Пельменная №2”.
Ссылка на репозиторий с приложением пельменной
Оглавление
- Структура репозитория
- Подготовка инфраструктуры
- Подготовка к созданию кластера в Я.Облаке
- Создание кластера
- Настройка доступа подключения к k8s
- Установка NGINX Ingress Controller и менеджера пакетов Kubernetes Helm
- Установка менеджера сертификатов
- Установка ArgoCD
- Правила версионирования
- Мониторинг, логирование и дашборд
Cтруктура репозитория
├── k8s - Компоненты инфраструктуры
│ ├── argocd - Декларативный GitOps-инструмент непрерывной доставки
| ├── helm - Чарты и манифесты для momo-store
│ ├── acme-issuer.yaml - Для получения сертификата в Let's Encrypt
│ └── service-account.yaml - Сервисный аккаунт с которого будем работать
├── terraform - Манифесты IaC (также папка с картинками, которые загружаются в S3 при развертывании)
└── README.md
Подготовка инфраструктуры
Подключаемся к Я.Облаку (https://yandex.cloud/ru/) и перейдём в консоль. 1. Создаём каталог для нашего проекта 2. Создадим сервистный аккаунт. 3. Создадим авторизованный ключ для сервисного аккаунта и запишем его файл
Шаги 2 и 3 выполняются по инструкции Я.Облака на любой машине или ВМ в Я.Облаке или любом другом сервисе. https://cloud.yandex.ru/ru/docs/iam/quickstart-sa#create-sa
- Добавим аутентификационные данные в переменные окружения:
export YC_TOKEN=$(yc iam create-token)
export YC_CLOUD_ID=$(yc config get cloud-id)
export YC_FOLDER_ID=$(yc config get folder-id)
Где:
- YC_TOKEN — IAM-токен.
- YC_CLOUD_ID — идентификатор облака.
- YC_FOLDER_ID — идентификатор каталога.
Подготовка к созданию кластера в Я.Облаке
Создавать K8s кластер будем при помощи Terraform. Terraform позволяет быстро создать облачную инфраструктуру в Yandex Cloud и управлять ею с помощью файлов конфигураций.
Предварительно создадим ACCESS_KEY_ID и SECRET_ACCESS_KEY для подключения backend terraform и S3 хранилищу для сохранения состония работы terraform
- Выполним команды:
export AWS_ACCESS_KEY_ID="<идентификатор_ключа>"
export AWS_SECRET_ACCESS_KEY="<секретный_ключ>"
- При создании хранилища в конслоя Я.Облака для хранилища нужно задать имя “dumplingbucket”
Создание кластера
- Скачаем все файлы из этого репозитория на машину, на которой выполняется натройка инфраструктуры:
git clone https://gitlab.praktikum-services.ru/std-016-008/infra-dumpling.git
- Перейдём в папку terraform и выполним следующие команды:
terraform init
terraform validate
terraform apply
Настройка доступа подключения к k8s
- Получаем ID кластера.
yc managed-kubernetes cluster list
- Выполним команды, взяв ID кластера из предыдушего пункта.
CLUSTER_ID=$<ID_кластера>
yc managed-kubernetes cluster get-credentials --id <ID_кластера> --external
- Проверим, что кластер доступен.
kubectl cluster-info
- Переходим в папку k8s и выполняем команду:
kubectl apply -f service-account.yaml
- Подготовим токен объекта ServiceAccount
SA_TOKEN=$(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep admin-user-token | awk '{print $1}') -o json | jq -r .data.token | base64 --d)
- Получим IP-адрес кластера:
MASTER_ENDPOINT=$(yc managed-kubernetes cluster get --id $CLUSTER_ID \
--format json | \
jq -r .master.endpoints.external_v4_endpoint)
- Дополним файл конфигурации:
kubectl config set-cluster sa-test2 \
--certificate-authority=$var_crt_k8s \
--server=$MASTER_ENDPOINT \
--kubeconfig=config
- Добавим информацию о токене для admin-user в файл конфигурации:
kubectl config set-credentials admin-user \
--token=$SA_TOKEN \
--kubeconfig=config
- Добавим информацию о контексте в файл конфигурации:
kubectl config set-context default \
--cluster=sa-test2 \
--user=admin-user \
--kubeconfig=config
- Теперь конфиг из ~/.kube/config может быть помещён на машине с установленным kubectl в папку .kube, чтобы сразу работать с kubernetes кластером.
Установка Nginx ingress controller и менеджера пакетов Kubernetes Helm
- Для установки Helm-чарта с Ingress-контроллером NGINX выполним команду:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx && \
helm repo update && \
helm install ingress-nginx ingress-nginx/ingress-nginx
- Выполним команду, чтобы узнать внешний IP нашего Load Balancer.
kubectl get svc | grep ingress
Результат команды:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.96.255.56 158.160.122.131 80:30223/TCP,443:32637/TCP 3d7h
- Данный EXTERNAL-IP необходимо сопоставить с адресом магазина https://dumpling.telnor.ru/, сделано это в личном кабинете регистратора NETHOUSE (https://domains.nethouse.ru/)
Установка менеджера сертификатов
- Выполним команду:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.1/cert-manager.yaml
- В папке k8s этого репозитория есть гужный нам манифест acme-issuer.yaml, при необходимости в нём нужно сменить mail на актуальный. Выполним команду:
kubectl apply -f acme-issuer.yaml
Установка ArgoCD
Доступ к ArgoCD можно получить сделав kubectl port-forward svc/argocd-server -n argocd 8080:443, сервис не выставлен наружу для большей безопасности, можно задеплоить ingress в папке argocd, тогда доступ появится
- Для установки ArgoCD в отдельный namespace выполним следующие команды:
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
kubectl apply -n argocd -f ingress.yml
kubectl apply -n argocd -f app.yaml ## реализация методологии GitOps, argo смотрит на k8s/helm
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "ClusterIP"}}' #локально
- Для безопасности доступ к ArgoCD осуществляется локально на машине, на которой выполняется настройка инфраструктуры. Для этого нужно выполнить команду:
kubectl port-forward svc/argocd-server -n argocd 8080:443
После проброса портов ArgoCD будет доступен по адресу https://localhost:8080
Для получения паролья от УЗ admin нужно выполнить команду:
kubectl get secrets -n argocd argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
Необходимо довить данный репозиторий в ArgoCD в Settings/Repositories.
На основании добавленого репозитория создать Application и наслаждаться работой магазина.
Правила версионирования
Изменения вносятся в репозитории https://gitlab.praktikum-services.ru/std-016-008/dumpling-store
Версия приложения формируется из переменной
VERSION
в пайплайне -1.0.${CI_PIPELINE_ID}
Контейнеры фронтенда и бэкенда собираются и публикуются в отдельных пайплайнах, при сборке каждый образ получает тег с номером версии приложения.
После тестирования образа, образ тегируется как latest.
Образы публикуются в GitLab Container Registry.
Мониторинг, логирование и дашборд
Минимальный мониторинг и чтение логов доступно в ArgoCD.
Более серьёзная система логгирования и мониторинга в разработке.
Описание
Дипломный проект "Пельменная №2" курса Яндекс.Практикум "DevOps для эксплуатации и разработки". В репозитории содержится terraform и helm чарты для магазина https://gitflic.ru/project/telnor/dumpling-store-diplom