Практика к занятию по теме "Service mesh на примере Istio"
Зависимости
Для выполнения задания вам потребуется установить зависимости:
После установки нужно запустить Kubernetes. При необходимости можно изменить используемый драйвер с помощью
флага --driver
.
minikube start \
--cpus=4 --memory=8g \
--cni=flannel \
--kubernetes-version="v1.19.0" \
--extra-config=apiserver.enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,\
DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,PodPreset \
--extra-config=apiserver.authorization-mode=Node,RBAC
Операции будут совершаться с помощью утилиты 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://kubernetes-charts.storage.googleapis.com/
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
Устанавливаем 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 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"