vtikh microservices repository
Для запуска необходимо развернуть в Я.облаке кластер k8s согласно инструкциям из ДЗ 18. Далее установить Ingress controller:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/cloud/deploy.yaml
Создать в Я.облаке диск для PersistenVolume БД mongo и получить его id:
yc compute disk create \\n --name k8s \\n --size 4 \\n --description "disk for k8s"
yc compute disk list
Записать id в файл kubernetes/reddit/mongo-volume.yml
Далее применить манифесты для развертывания приложения и узнать его внешний адрес (external-ip):
kubectl apply -f ./kubernetes/reddit/ -n dev
kubectl get ingress -n dev
Сгенерировать и загрузить в kubernetes сертификат (приложение теперь работает по TLS):
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=<external-ip>"
Приложение будет доступно по адресу https://<external-ip>
В ДЗ:
- манифесты приложения дорабатываются до работоспособного состояния
- описываются k8s services
- приложение разворачивается в локальном minicube, а затем в облаке Яндекс (kubernetes managed service)
Для локального развертывания потребуется ВМ с 4 ядрами / 4 ГБ ОЗУ Сначала необоходимо установить kubectl:
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl
Установить и развернуть так:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
minikube start --kubernetes-version 1.19.7
kubectl get nodes #проверка
Создать кластер kubernetes в Яндекс Облаке с 2 узлами. Затем:
yc managed-kubernetes cluster get-credentials test-cluster --external
kubectl config current-context
kubectl apply -f ./kubernetes/reddit/dev-namespace.yml
kubectl apply -f ./kubernetes/reddit/ -n dev
Определить внешний адрес и порт приложения:
kubectl get nodes -o wide
kubectl describe service ui -n dev | grep NodePort
После чего его можно открыть в браузере.
В Я.облаке запущены 2 вм, в каждой из ни:
- установлены необходимые пакеты:
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
sudo apt update
sudo apt-get install docker-ce=5:19.03.15~3-0~ubuntu-bionic docker-ce-cli=5:19.03.15~3-0~ubuntu-bionic containerd.io kubelet=1.19.14-00 kubeadm=1.19.15-00 kubectl=1.19.15-00
- на первой (мастер) развернут kubernetes:
kubeadm init --apiserver-cert-extra-sans=<IP> --apiserver-advertise-address=0.0.0.0 --control-plane-endpoint=<IP> --pod-network-cidr=10.128.0.0/24
- вторая подключена к мастер-узлу:
sudo kubeadm join <IP>:6443 --token 9gzb3g.ob9xyzqow7kf4bj4 --discovery-token-ca-cert-hash sha256:07adfcf7e90e162059ac3cc50cc6e18ab6490499d61d70e572fc1174811d1e80
- на мастер узле создана конфигурация
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- скачан и применен манифест Calico:
curl https://docs.projectcalico.org/manifests/calico.yaml -O
kubectl apply -f calico.yaml
- а также запущен один из подов:
kubectl apply -f ui-deployment.yml
...
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
ui-deployment-864cd78b97-jf6fh 1/1 Running 0 95m
Логирование и распределенная трассировка
Запуск новой docker-machine:
yc compute instance create \
--name logging --memory 4 \
--zone ru-central1-a \
--network-interface subnet-name=default-ru-central1-a,nat-ip-version=ipv4 \
--create-boot-disk image-folder-id=standard-images,image-family=ubuntu-1804-lts,size=15 \
--ssh-key ~/.ssh/id_rsa.pub
docker-machine create \
--driver generic \
--generic-ip-address=51.250.5.232 \
--generic-ssh-user yc-user \
--generic-ssh-key ~/.ssh/id_rsa \
logging
eval $(docker-machine env logging)
Запуск контейнеров:
cd docker
docker-compose -f docker-compose-logging.yml up -d
docker-compose up -d
Теперь по белому адресу ВМ работают сервисы:
- kibana: http://<ip>:5601
- zipkin: http://<ip>:9411
- основное веб-приложение: http://<ip>:9292
В kibana стоит начать с создания индекса. Для этого перейти Discover > Index Pattern > Create Index Pattern В поле Index Pattern ввести fluentd-*
, в Time filter - @timestamp
и создать индекс.
Добавляем мониторинг к микросервисному приложению.
Для запуска:
Создаем ВМ
yc compute instance create \
--name docker-host \
--zone ru-central1-a \
--network-interface subnet-name=default-ru-central1-a,nat-ip-version=ipv4 \
--create-boot-disk image-folder-id=standard-images,image-family=ubuntu-1804-lts,size=15 \
--ssh-key ~/.ssh/id_rsa.pub
Настроить docker-machine и переключить окружение на нее
docker-machine create \
--driver generic \
--generic-ip-address=84.201.135.110 \
--generic-ssh-user yc-user \
--generic-ssh-key ~/.ssh/id_rsa \
docker-host
eval $(docker-machine env docker-host)
Cобрать образы приложения:
for i in ui post-py comment; do cd src/$i; bash docker_build.sh; cd -; done
Далее перейти в директорию docker, заполнить файл .env, как показано в примере. Собрать образ prometheus:
export USER_NAME=username
docker build -t $USER_NAME/prometheus .
Запустить приложение:
docker-compose up -d
Приложение доступно по протоколу http и адресу ВМ на порту 9292. Мониторинг - на 9090
Образы загружены на docker hub: https://hub.docker.com/u/vtikh
В задании разворачивается сервер gitlab на ВМ в Я.облаке, который настраивается как дополнительный удаленный репозиторий. В gitlab настраивается пайплайн и окружения.
Необходимо создать ВМ на ubuntu 18.04 в Я.облаке (2cpu/4RAM), в ней:
mkdir -p /srv/gitlab/config /srv/gitlab/data /srv/gitlab/logs
разместить в ВМ по пути srv/gitlab
файл gitlab-ci/docker-compose.yml
. Запустить контейнер:
docker-compose up -d
После успешного развертывания добавить удаленный репозиторий к этому проекту и отправить туда код:
git remote add gitlab http://<gitlab-vm-ip>/homework/example.git
git push gitlab gitlab-ci-1
Репозиторий уже содержит описание пайплайна .gitlab-ci.yml
, поэтому требуется настроить только серверную часть. На ВМ-сервере gitlab создать воркер:
sudo docker run -d --name gitlab-runner --restart always -v /srv/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sockgitlab/gitlab-runner:latest
и зарегистрировать его:
docker exec -it gitlab-runner gitlab-runner register \
--url http://<your-ip>/ \
--non-interactive \
--locked=false \
--name DockerRunner \
--executor docker \
--docker-image alpine:latest \
--registration-token <your-token> \
--tag-list "linux,xenial,ubuntu,docker" \
--run-untagged
Также в пайплайне .gitlab-ci.yml
объявлены окружения dev, beta и production. Последние два запускаются вручную.
Кроме запуска контейнеров в разных типах docker-сетей в задании изучается docker-compose.
Для запуска кода необходимо:
- установить docker-compose
- заполнить файл переменных
src/.env
основываясь на примере. - если необходимо, присоединиться к удаленной docker-machine (см. предыдущие hw)
- выполнить:
cd src
docker-compose up -d
Приложение доступно по адресу хоста, где запущены контейнеры.
В задании приложение разбивается на микросервисы
docker build -t vtikh/post:1.0 ./post-py
docker build -t vtikh/comment:1.0 ./comment
docker build -t vtikh/ui:2.0 ./ui
Создать сеть и хранилище для контейнера с БД:
docker network create reddit
docker volume create reddit_db
Запуск:
docker run -d --network=reddit --network-alias=post_db --network-alias=comment_db -v reddit_db:/data/db mongo:latest
docker run -d --network=reddit --network-alias=post <your-dockerhub-login>/post:1.0
docker run -d --network=reddit --network-alias=comment <your-dockerhub-login>/comment:1.0
docker run -d --network=reddit -p 9292:9292 <your-dockerhub-login>/ui:2.0
В задании изучается docker. Сделано:
- Локально развернут docker, опробованы простые команды управления контейнерами и образами
- Развернута docker-machine на базе ВМ в Яндекс.облаке
- Собран образ docker с приложением
- Образ проверен на docker-machine и загружен на docker hub
- Проверено развертывание приложения из образа, загружженого на docker hub
Развертывание docker-machine и подключение к ней:
yc compute instance create \
--name docker-host \
--zone ru-central1-a \
--network-interface subnet-name=default-ru-central1-a,nat-ip-version=ipv4 \
--create-boot-disk image-folder-id=standard-images,image-family=ubuntu-1804-lts,size=15 \
--ssh-key ~/.ssh/id_rsa.pub \
--core-fraction=5
docker-machine create \
--driver generic \
--generic-ip-address=<ip> \
--generic-ssh-user yc-user \
--generic-ssh-key ~/.ssh/id_rsa \
docker-host
eval $(docker-machine env docker-host)
Для запуска этого образа:
docker run --name reddit -d -p 9292:9292 vtikh/otus-reddit:1.0
Приложение будет доступно по адресу http://localhost:9292