☸️ Как установить и настроить Service Mesh с Istio — Information Security Squad
☸️  Как установить и настроить Service Mesh с Istio

Вступление

Istio является независимым Service Mesh с открытым исходным кодом, которая обеспечивает основы, необходимые для успешной работы архитектуры распределенных микросервисов.

Service Mesh — это выделенный уровень инфраструктуры для обработки связи между сервисами.

Он отвечает за надежную доставку запросов через сложную топологию сервисов, которые составляют современное облачное собственное приложение.

Service Mesh Istio логически разделен на data plane и control plane.

  • data plane состоит из набора интеллектуальных прокси (Envoy), развернутых в качестве sidecar. Эти прокси-серверы обеспечивают и контролируют всю сетевую связь между микросервисами, а также микшером, универсальным центром политик и телеметрии.
  • control plane управляет и настраивает прокси для маршрутизации трафика. Кроме того,control plane настраивает микшеры для применения политик и сбора телеметрии.
Давайте рассмотрим более подробно, что представляет собой каждый из компонентов, составляющих этот Service Mesh.
  • 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
Установите Istio CRD
# 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.

Приложение Bookinfo разбито на четыре отдельных микросервиса:
  • productpage. Микросервис productpage вызывает детали и просматривает микросервисы для заполнения страницы.
  • details. Микросервис details содержит информацию о книках.
  • reviews. Микросервис reviews содержит рецензии на книги.
  • ratings. Микросервис ratings содержит информацию о рейтинге книг, которая сопровождает рецензирование книг.
Существует 3 версии микросервиса reviews:
  • Версия 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

Тестирование

Чтобы проверить установки, сделайте следующее:

  1. Откройте новую вкладку браузера
  2. Вставьте конечную точку DNS, возвращенную предыдущей командой get service istiogateway
  3. Добавьте / productpage в конец этой конечной точки DNS
  4. Нажмите Enter, чтобы получить страницу.
  5. Нажмите «обновить» несколько раз, чтобы увидеть, как макет и содержание обзоров изменяются при вызове различных версий (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
Посмотреть правило назначения для bookinfo
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
Для маршрутизации только к одной версии вы применяете виртуальные службы, которые устанавливают версию по умолчанию для микросервисов.
В этом случае виртуальные сервисы направят весь трафик на reviews:v1.
# 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
Попробуйте перезагрузить страницу несколько раз и обратите внимание, как каждый раз отображается только версия 1 !

Маршрут основанный на идентификации пользователя

Пользовательская маршрутизация.

В этом случае весь трафик от пользователя с именем Jason будет перенаправлен на обзоры сервиса: v2.

# kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
Вывод
virtualservice.networking.istio.io/reviews configured
Если заголовок пользователя соответствует jason, он будет перенаправлен на reviews:v2.
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
Попробуйте сейчас, войдbnt в систему с именем пользовате jason, а пароль оставьте пустым

Маршрут на основе трафика

Далее мы покажем, как постепенно переносить трафик с одной версии микросервиса на другую.

В нашем примере мы отправим 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
Subset установлен для 50% трафика на v1 и 50% трафика на v3 для всех запросов reviews
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
Чтобы проверить это, обновляйте свой браузер снова и снова, и вы увидите только reviews:v1 и reviews:v3.

Мониторинг и визуализация 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
Убедитесь в наличии служб prometheus и grafana
# 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
Настройте переадресацию портов для grafana
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

Откройте новый терминал и отправьте трафик на mesh
# 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/

1 комментария на “☸️ Как установить и настроить Service Mesh с Istio

  1. Сначала создайте сервисную учетную запись для Tiller:
    kubectl apply -f install/kubernetes/helm/helm-service-account.yaml

    А что это, для чего и откуда нужно догадаться? И не ясно, должен ли быть установлен kubernetes или kubectl достаточно?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *