Skip to content

izhigalko/otus-demo-istio

Repository files navigation

Практика к занятию по теме "Service mesh на примере Istio"

Зависимости

Для выполнения задания вам потребуется установить зависимости:

После установки нужно запустить Kubernetes. При необходимости можно изменить используемый драйвер с помощью флага --driver.

minikube start --driver virtualbox --cpus=4 --memory=8g --cni=flannel --kubernetes-version="v1.19.0"

Операции будут совершаться с помощью утилиты kubectl

Содержание

Устройство Istio

Создать неймспейсы для операторов:

kubectl apply -f namespaces.yaml

Разворачиваем Jaeger

Jaeger - решение трассировки. Компоненты Istio, такие как: sidecar-контейнер, gateway, отправляют данные запросов в систему. Таким образом получается полная трассировка запроса.

Добавить репозиторий в Helm:

helm repo add jaegertracing https://jaegertracing.github.io/helm-charts
helm repo update

Установить оператор, разворачивающий Jaeger:

helm install --version "2.19.0" -n jaeger-operator -f jaeger/operator-values.yaml jaeger-operator jaegertracing/jaeger-operator

Развернуть Jaeger:

kubectl apply -f jaeger/jaeger.yaml

Проверить состояние Jaeger:

kubectl get po -n jaeger -l app.kubernetes.io/instance=jaeger

Открыть web-интерфейс Jaeger:

minikube service -n jaeger jaeger-query-nodeport

Разворачиваем Prometheus

Prometheus - система мониторинга. С помощью неё собираются метрики Service mesh.

Добавить репозиторий в Helm:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add stable https://charts.helm.sh/stable
helm repo update

Развернуть решение по мониторингу на основе Prometheus:

helm install --version "13.7.2" -n monitoring -f prometheus/operator-values.yaml prometheus prometheus-community/kube-prometheus-stack

Проверить состояние компонентов мониторинга:

kubectl get po -n monitoring

Добавить сервис типа NodePort для прямого доступа к Prometheus и Grafana:

kubectl apply -f prometheus/monitoring-nodeport.yaml

Открыть web-интерфейс Grafana:

minikube service -n monitoring prometheus-grafana-nodeport

Открыть web-интерфейс Prometheus:

minikube service -n monitoring prom-prometheus-nodeport

Разворачиваем Istio

Istio - Service mesh решение для облачных платформ, использующее Envoy.

Установить оператор, разворачивающий Istio:

istioctl operator init --watchedNamespaces istio-system --operatorNamespace istio-operator

Развернуть Istio c помощью оператора:

kubectl apply -f istio/istio.yaml

Проверить состояние Istio:

kubectl get all -n istio-system -l istio.io/rev=default

Установить настройки по-умолчанию:

kubectl apply -f istio/disable-mtls.yaml

Устанавливаем Kiali

Kiali - доска управления Service mesh

Добавить репозиторий в Helm:

helm repo add kiali https://kiali.org/helm-charts
helm repo update

Установить Kiali Operator, разворачивающий Kiali

helm install --version "1.33.1" -n kiali-operator -f kiali/operator-values.yaml kiali-operator kiali/kiali-operator

Развернуть Kiali:

kubectl apply -f kiali/kiali.yaml

Проверить состояние Kiali:

kubectl get po -n kiali -l app.kubernetes.io/name=kiali

Открыть web-интерфейс Kiali:

minikube service -n kiali kiali-nodeport

Устанавливаем echoserver

Echoserver - сервис, отдающий в виде текста параметры входящего HTTP запроса.

Собрать Docker-образ:

eval $(minikube docker-env) && docker build -t proxy-app:latest -f app/src/Dockerfile app/src

Развернуть приложение echoserver в кластере:

kubectl apply -f app/echoserver.yaml

Проверить статус echoserver:

kubectl get po -l "app=echoserver"

Выполнить запрос к сервису:

curl $(minikube service echoserver --url)

Устанавливаем proxy-app

Proxy-app - сервис, умеющий запрашивать другие запросы по query-параметру url.

Развернуть приложение proxy-app в кластере:

kubectl apply -f app/proxy-app.yaml

Проверить статус приложения:

kubectl get po -l "app=proxy-app"

Выполнить запрос к сервису:

curl $(minikube service proxy-app --url)

Посмотреть логи приложения:

kubectl logs -l app=proxy-app -c proxy-app

Нагружаем приложения

Собрать нагрузочный образ:

eval $(minikube docker-env) && docker build -t load-otus-demo:latest -f app/load/Dockerfile app/load

Запустить нагрузочный образ:

kubectl apply -f app/load.yaml

Посмотреть логи нагрузки:

kubectl logs -l app=load

Настраиваем взаимодействие между сервисами

Сервис proxy-app позволяет запросить другие сервисы с помощью параметра url, сделаем это.

Выполнить запрос к сервису echoserver:

curl "$(minikube service proxy-app --url)?url=http://echoserver"

В результате исполнения команды видно, что запрос на echoserver проходит.

Ограничим доступ proxy-app ко всем сервисам:

kubectl apply -f manage-traffic/proxy-app-sidecar-disable.yaml

Выполнить запрос к сервису echoserver:

curl "$(minikube service proxy-app --url)?url=http://echoserver"

В результате исполнения команды получается ошибка, так как правила для исходящего трафика proxy-app настроены таким образом, что ему запрещены любые исходящие сетевые соединения.

Применим настройки, в которых сказано, что proxy-app может осуществлять запросы к echoserver:

kubectl apply -f manage-traffic/proxy-app-sidecar-enable.yaml

Выполнить запрос к сервису echoserver:

curl "$(minikube service proxy-app --url)?url=http://echoserver"

В результате исполнения команды видно, что запрос на echoserver проходит.

Настраиваем безопасности

В качестве примера настройки безопасности будем использовать настройку межсервисной аутентификации.

Включить аутентификацию для echoserver:

kubectl apply -f auth/echoserver-auth.yaml

Выполнить запрос к сервису echoserver:

curl "$(minikube service proxy-app --url)?url=http://echoserver"

Выполнить запрос к сервису с указанием токена:

curl -H "X-AUTH-TOKEN: token" "$(minikube service proxy-app --url)?url=http://echoserver"

Добавить автоматическую подстановку токена при вызове сервиса echoserver:

kubectl apply -f auth/proxy-app-auth.yaml

Выполнить запрос к сервису echoserver без указания токена:

curl "$(minikube service proxy-app --url)?url=http://echoserver"

Настраиваем отказоустойчивость

Рассмотрим настройку отказоустойчивости для метода http://echoserver/error?times=3. При его вызове последовательно возвращается 500 ошибка в количестве, указанном в параметре times. В этом случае, метод вернёт ошибку 3 раза, а на 4 вернет код 200.

curl "$(minikube service proxy-app --url)?url=http://echoserver/error?times=3"

Применим правило, которое позволяет автоматически делать повтор запроса при возникновении ошибок с кодом 500 или ошибок соединения.

Применить политику повторов:

kubectl apply -f retries/echoserver-retries.yaml

Выполнить запрос:

curl "$(minikube service proxy-app --url)?url=http://echoserver/error?times=3"

Настраиваем Service Discovery

Применить настройки service-discovery:

kubectl apply -f service-discovery/

Получить настройки iptables

docker inspect <app-container> --format '{{ .State.Pid }}'
nsenter -t <pid> -n iptables -t nat -S

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published