- Вступление
- Загрузите и установите ISTIO CLI
- Установка ISTIO
- Развернем образец приложения
- Развертывание примера приложения
- Тестирование
- Настройка маршрутизации запросов
- Маршрут основанный на идентификации пользователя
- Маршрут на основе трафика
- Мониторинг и визуализация IIstio
- Удаление тестового стенда
- Способствующие ссылки
Вступление
Istio является независимым Service Mesh с открытым исходным кодом, которая обеспечивает основы, необходимые для успешной работы архитектуры распределенных микросервисов.
Service Mesh – это выделенный уровень инфраструктуры для обработки связи между сервисами.
Он отвечает за надежную доставку запросов через сложную топологию сервисов, которые составляют современное облачное собственное приложение.
Service Mesh Istio логически разделен на data plane и control plane.
- data plane состоит из набора интеллектуальных прокси (Envoy), развернутых в качестве sidecar. Эти прокси-серверы обеспечивают и контролируют всю сетевую связь между микросервисами, а также микшером, универсальным центром политик и телеметрии.
- control plane управляет и настраивает прокси для маршрутизации трафика. Кроме того,control plane настраивает микшеры для применения политик и сбора телеметрии.
- Envoy
-
Прозрачно обрабатывает входящий / исходящий трафик между сервисами.
-
- Pilot
-
Pilot обеспечивает обнаружение служб для сайдкаров Envoy, а также возможность управления трафиком для интеллектуальной маршрутизации (например, A / B-тесты, канареечные развертывание и т.д.) И отказоустойчивость (таймауты, повторы, прерыватели цепи и т. д.)
-
- Mixer
-
Mixer обеспечивает контроль доступа и политики использования и собирает данные телеметрии с прокси-сервера Envoy и других служб.
-
- Citadel
-
Citadel обеспечивает надежную аутентификацию между сервисами и конечными пользователями со встроенной идентификацией и управлением учетными данными.
-
Загрузите и установите ISTIO CLI
Прежде чем мы сможем начать настройку Istio, нам нужно сначала установить инструменты командной строки, с которыми вы будете взаимодействовать.
Для этого запустите следующую команду:
curl -L https://git.io/getLatestIstio | sh -
// version can be different as istio gets upgraded
cd istio-*
sudo mv -v bin/istioctl /usr/local/bin/
Пример вывода:
# curl -L https://git.io/getLatestIstio | sh -
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 1631 100 1631 0 0 1849 0 --:--:-- --:--:-- --:--:-- 1849
Downloading istio-1.1.2 from https://github.com/istio/istio/releases/download/1.1.2/istio-1.1.2-linux.tar.gz ...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 614 0 614 0 0 1485 0 --:--:-- --:--:-- --:--:-- 1483
100 15.0M 100 15.0M 0 0 8379k 0 0:00:01 0:00:01 --:--:-- 21.5M
Downloaded into istio-1.1.2:
bin install istio-telemetry.yaml istio.VERSION LICENSE README.md samples tools
Add /root/istio-1.1.2/bin to your path; e.g copy paste in your shell and/or ~/.profile:
export PATH="$PATH:/root/istio-1.1.2/bin"
root@kube-master:~# cd istio-*
root@kube-master:~/istio-1.1.2# sudo mv -v bin/istioctl /usr/local/bin/
'bin/istioctl' -> '/usr/local/bin/istioctl'
Установка ISTIO
Определим учетную запись для Tiller
Сначала создайте сервисную учетную запись для Tiller:
kubectl apply -f install/kubernetes/helm/helm-service-account.yaml
Вывод:
serviceaccount/tiller unchanged
clusterrolebinding.rbac.authorization.k8s.io/tiller unchanged
# helm install install/kubernetes/helm/istio-init --name istio-init --namespace istio-system
# kubectl get crds | grep 'istio.io'
adapters.config.istio.io 2019-04-08T12:39:02Z
apikeys.config.istio.io 2019-04-08T12:39:02Z
attributemanifests.config.istio.io 2019-04-08T12:39:01Z
authorizations.config.istio.io 2019-04-08T12:39:02Z
bypasses.config.istio.io 2019-04-08T12:39:02Z
checknothings.config.istio.io 2019-04-08T12:39:02Z
circonuses.config.istio.io 2019-04-08T12:39:02Z
cloudwatches.config.istio.io 2019-04-08T12:39:00Z
clusterrbacconfigs.rbac.istio.io 2019-04-08T12:39:01Z
deniers.config.istio.io 2019-04-08T12:39:02Z
destinationrules.networking.istio.io 2019-04-08T12:39:01Z
dogstatsds.config.istio.io 2019-04-08T12:39:00Z
edges.config.istio.io 2019-04-08T12:39:02Z
envoyfilters.networking.istio.io 2019-04-08T12:39:01Z
fluentds.config.istio.io 2019-04-08T12:39:02Z
gateways.networking.istio.io 2019-04-08T12:39:01Z
.....
....
Наконец, установите основные компоненты Istio:
# helm install install/kubernetes/helm/istio --name istio --namespace istio-system --set global.configValidation=false --set sidecarInjectorWebhook.enabled=false --set grafana.enabled=true --set servicegraph.enabled=true
Проверьте установленные службы:
# kubectl get svc -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grafana ClusterIP 10.96.171.173 <none> 3000/TCP 2m40s
istio-citadel ClusterIP 10.96.65.75 <none> 8060/TCP,15014/TCP 2m40s
istio-galley ClusterIP 10.106.97.125 <none> 443/TCP,15014/TCP,9901/TCP 2m40s
istio-ingressgateway LoadBalancer 10.102.204.117 172.20.240.112 80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30709/TCP,15030:30672/TCP,15031:31789/TCP,15032:32654/TCP,15443:30390/TCP,15020:31778/TCP 2m40s
istio-pilot ClusterIP 10.109.0.98 <none> 15010/TCP,15011/TCP,8080/TCP,15014/TCP 2m40s
istio-policy ClusterIP 10.106.140.39 <none> 9091/TCP,15004/TCP,15014/TCP 2m40s
istio-telemetry ClusterIP 10.98.74.109 <none> 9091/TCP,15004/TCP,15014/TCP,42422/TCP 2m40s
prometheus ClusterIP 10.98.183.129 <none> 9090/TCP 2m40s
servicegraph ClusterIP 10.100.212.98 <none> 8088/TCP
Убедитесь, что поды находятся в рабочем состоянии.
# kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
grafana-57586c685b-5nsb9 1/1 Running 0 3m25s
istio-citadel-7579f8fbb9-frnqz 1/1 Running 0 3m25s
istio-galley-79d4c5d9f7-llpvk 1/1 Running 0 3m25s
istio-ingressgateway-5fbcf4488f-vzt98 1/1 Running 0 3m25s
istio-init-crd-10-cwn8j 0/1 Completed 0 6m28s
istio-init-crd-11-k4lx4 0/1 Completed 0 6m28s
istio-pilot-df78f86cb-sfzjt 2/2 Running 0 3m25s
istio-policy-5f4747447c-rvt72 2/2 Running 2 3m25s
istio-telemetry-84697c64d7-btbbm 2/2 Running 2 3m25s
prometheus-66c9f5694-lp2wq 1/1 Running 0 3m25s
servicegraph-57d6f5b58c-4m92m 1/1 Running 1 3m24s
Развернем образец приложения
Теперь, когда у нас есть все ресурсы, установленные для Istio, мы будем использовать пример приложения под названием BookInfo для проверки ключевых возможностей service mesh, таких как интеллектуальная маршрутизация, и просмотра данных телеметрии с помощью Prometheus & Grafana.
- productpage. Микросервис productpage вызывает детали и просматривает микросервисы для заполнения страницы.
- details. Микросервис details содержит информацию о книках.
- reviews. Микросервис reviews содержит рецензии на книги.
- ratings. Микросервис ratings содержит информацию о рейтинге книг, которая сопровождает рецензирование книг.
- Версия v1 не вызывает службу ratings.
- Версия v2 вызывает сервис ratings и отображает каждый рейтинг в виде от 1 до 5 черных звездочек.
- Версия v3 вызывает сервис ratings и отображает каждый рейтинг в виде от 1 до 5 красных звездочек.
Развертывание примера приложения
Разверните примеры приложений вручную, добавив istio proxy и подтвердив, что службы работают правильно
# kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
Пример вывода:
service/details created deployment.extensions/details-v1 created service/ratings created deployment.extensions/ratings-v1 created service/reviews created deployment.extensions/reviews-v1 created deployment.extensions/reviews-v2 created deployment.extensions/reviews-v3 created service/productpage created deployment.extensions/productpage-v1 created
# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/details-v1-54c6f46b4b-q5b45 2/2 Running 0 58s
pod/my-nginx-6cc48cd8db-n6scm 1/1 Running 4 27d
pod/productpage-v1-5c4f6df4dd-7lcws 2/2 Running 0 58s
pod/ratings-v1-6ccbd9c4f4-2cjbd 2/2 Running 0 58s
pod/reviews-v1-bfc99c79-jhqr6 2/2 Running 0 58s
pod/reviews-v2-6ffb5f6b44-zf9tt 2/2 Running 0 58s
pod/reviews-v3-7c67bd445-bc5ms 2/2 Running 0 58s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/details ClusterIP 10.99.96.161 <none> 9080/TCP 58s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 27d
service/productpage ClusterIP 10.106.134.93 <none> 9080/TCP 58s
service/ratings ClusterIP 10.106.213.22 <none> 9080/TCP 58s
service/reviews ClusterIP 10.100.60.83 <none> 9080/TCP 58s
Определите виртуальный сервис и ingress:
# kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
Вывод:
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created
Тестирование
Чтобы проверить установки, сделайте следующее:
- Откройте новую вкладку браузера
- Вставьте конечную точку DNS, возвращенную предыдущей командой get service istiogateway
- Добавьте / productpage в конец этой конечной точки DNS
- Нажмите Enter, чтобы получить страницу.
- Нажмите «обновить» несколько раз, чтобы увидеть, как макет и содержание обзоров изменяются при вызове различных версий (v1, v2, v3) приложения.
Настройка маршрутизации запросов
Service versions (a.k.a. subsets).
В сценарии непрерывного развертывания предоставляемый сервис может иметь разные подмножества и может запускать разные версии одного и того же приложения.
Распространенные сценарии, в которых это происходит, включают A / B-тестирование, развертывание канареек и т. д.
Выбор конкретной версии может быть решен на основе различных критериев (заголовки, URL-адрес и т. д.) И / или объемов, присвоенных каждой версии.
Каждый сервис имеет версию по умолчанию, состоящую из всех его экземпляров.
Чтобы продемонстрировать это поведение
Применим правило назначения
# kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
Вывод:
destinationrule.networking.istio.io/productpage created
destinationrule.networking.istio.io/reviews created
destinationrule.networking.istio.io/ratings created
destinationrule.networking.istio.io/details created
kubectl get destinationrules -o yaml
...
...
spec:
host: details
subsets:
- labels:
version: v1
name: v1
- labels:
version: v2
name: v2
spec:
host: productpage
subsets:
- labels:
version: v1
name: v1
spec:
host: ratings
subsets:
- labels:
version: v1
name: v1
- labels:
version: v2
name: v2
- labels:
version: v2-mysql
name: v2-mysql
- labels:
version: v2-mysql-vm
name: v2-mysql-vm
spec:
host: reviews
subsets:
- labels:
version: v1
name: v1
- labels:
version: v2
name: v2
- labels:
version: v3
name: v3
# kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
virtualservice.networking.istio.io/productpage created
virtualservice.networking.istio.io/reviews created
virtualservice.networking.istio.io/ratings created
virtualservice.networking.istio.io/details created
# kubectl get virtualservices reviews -o yaml
Вывод
.......
.......
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
Маршрут основанный на идентификации пользователя
Пользовательская маршрутизация.
В этом случае весь трафик от пользователя с именем Jason будет перенаправлен на обзоры сервиса: v2.
# kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
virtualservice.networking.istio.io/reviews configured
kubectl get virtualservices reviews -o yaml
...........
...........
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1
Маршрут на основе трафика
Далее мы покажем, как постепенно переносить трафик с одной версии микросервиса на другую.
В нашем примере мы отправим 50% трафика на reviews:v1 и 50% на reviews:v3.
kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
kubectl get virtualservice reviews -o yaml
root@kube-master:~/istio-1.1.2# kubectl get virtualservice reviews -o yaml
.............
.............
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 50
- destination:
host: reviews
subset: v3
weight: 50
Мониторинг и визуализация IIstio
Сначала соберите новые данные телеметрии и загрузите файл YAML для хранения конфигурации для новой метрики и потока журналов, которые Istio будет генерировать и собирать автоматически.
# curl -LO https://eksworkshop.com/servicemesh/deploy.files/istio-telemetry.yaml
# kubectl apply -f istio-telemetry.yaml
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 2254 100 2254 0 0 3994 0 --:--:-- --:--:-- --:--:-- 3996
metric.config.istio.io/doublerequestcount created
prometheus.config.istio.io/doublehandler created
rule.config.istio.io/doubleprom created
logentry.config.istio.io/newlog created
stdio.config.istio.io/newhandler created
rule.config.istio.io/newlogstdio created
# kubectl -n istio-system get svc prometheus
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus ClusterIP 10.98.183.129 <none> 9090/TCP 75m
# kubectl -n istio-system get svc grafana
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grafana ClusterIP 10.96.171.173 <none> 3000/TCP 75m
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 8080:3000
Вывод:
items[0].metadata.name}') 8080:3000
Forwarding from 127.0.0.1:8080 -> 3000
Откройте GUI grafana
# while true; do curl -o /dev/null -s "172.20.240.112/productpage"; done
Удаление тестового стенда
Необходимо:
- Удалить конфигурацию телеметрии
- Удалить приложение виртуальных сервисов / правила назначения
- Удалить шлюз
- Удалить Istio
kubectl delete -f istio-telemetry.yaml
kubectl delete -f samples/bookinfo/networking/virtual-service-all-v1.yaml
kubectl delete -f samples/bookinfo/networking/destination-rule-all.yaml
kubectl delete -f samples/bookinfo/networking/bookinfo-gateway.yaml
kubectl delete -f samples/bookinfo/platform/kube/bookinfo.yaml
helm delete --purge istio
helm delete --purge istio-init
Способствующие ссылки
https://istio.io/docs/
Сначала создайте сервисную учетную запись для Tiller:
kubectl apply -f install/kubernetes/helm/helm-service-account.yaml
А что это, для чего и откуда нужно догадаться? И не ясно, должен ли быть установлен kubernetes или kubectl достаточно?
А вы забавный. Это как спросить достаточно ли руля что бы ехать по трассе, или нужна еще и машина =))