В первом посте серии – Istio: обзор и запуск service mesh в Kubernetes – мы деплоили Istio с помощью istioctl
.
Теперь, используем Ansible и Helm, что бы запустить Istio и настроить его сервисы.
Не нашёл Хельм-репозитория с чартом, судя по всему его и нет, хотя обсуждения есть, см. Proposal: Publish Helm chart to a chart repository.
В Ansible используем модуль helm
для работы с чартом.
Документация по установке Istio с Helm – тут>>>.
Содержание
Удаление Istio
Устанавливать будем на тот же кластер, который использовался в первом посте, и где Istio сейчас установлен через istioctl
.
Перед тем, как устанавливать с Helm – удалим существующую установку.
Выполняем удаление аддонов – Grafana, Prometheus, etc:
[simterm]
$ kubectl delete -f samples/addons
[/simterm]
Istio мы устанавливали с профилем default – генерируем его манифест, передаём его в kubectl
с опцией delete
:
[simterm]
$ istioctl manifest generate --set profile=default | kubectl delete --ignore-not-found=true -f -
[/simterm]
И удаляем namespace:
[simterm]
$ kubectl delete namespace istio-system
[/simterm]
Third-party service account tokens
Перед установкой – проверим токены, см. Configure third party service account tokens.
У нас AWS EKS, должны быть включены:
[simterm]
$ kubectl get --raw /api/v1 | jq '.resources[] | select(.name | index("serviceaccounts/token"))' { "name": "serviceaccounts/token", "singularName": "", "namespaced": true, "group": "authentication.k8s.io", "version": "v1", "kind": "TokenRequest", "verbs": [ "create" ] }
[/simterm]
Так и есть.
Ansible роль
Теперь можно приступать к автоматизации.
Создаём каталоги:
[simterm]
$ mkdir -p roles/istio/tasks
[/simterm]
В файле плейбука добавляем её вызов:
... - role: istio tags: istio, create-cluster
Через теги позволяем выполнять установку либо только Istio, либо всех ролей плейбука. К примеру, тег cluster-create включает в себя вызов роли с CloudFormation для создания инфрастуктуры (см. AWS Elastic Kubernetes Service: автоматизация создания кластера, часть 1 — CloudFormation), роли monitoring, которая устанавливает Prometheus Operator, и так далее.
Пишем роль – файл roles/istio/tasks/main.yml
.
В ней нам надо выполнить 4 действия:
- скачать гит-репозиторий с манифестами Istio
- установить istio-base – CRD, роли
- установить istio-discovery –
istiod
- и установить istio-ingress – Ingress Gateway
Git clone
Можем сделать через Ansible-модуль git
– клонировать по тегу версии нужный архив, и распаковывать.
Можем сделать “рекомендованным” способом – через вызов скрипта downloadIstioCandidate.sh
.
Используем модуль shell
, через переменную ISTIO_VERSION
задаём версию для установки:
- name: "Download Istio Latest Git-repo" shell: "curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.9.1 sh -" - command: "ls istio-1.9.1" register: dir_out - debug: var={{ item }} with_items: dir_out.stdout_lines
Мы деплоим через Jenkins – коммитим, пушим, проверяем содержимое каталога istio-1.9.1
:
Окей – всё загружается, можно приступать к установке.
Install istio-base
Перед установкой каждого компонента полезно посмотреть доступные values
. Для istio-base это будет файл manifests/charts/base/values.yaml
.
Например, для istio-base полезным будет включить enableAnalysis
, см. Configuration Status Field.
Описываем установку istio-base:
- name: "Download Istio Latest Git-repo" shell: "curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.9.1 sh -" - name: "Install Istio Base to the istio-system namespace" community.kubernetes.helm: kubeconfig: "{{ kube_config_path }}" name: "istio-base" chart_ref: "istio-1.9.1/manifests/charts/base" release_namespace: "istio-system" create_namespace: true values: global: istiod: enableAnalysis: true
Деплоим пока его, проверяем CRD:
[simterm]
$ kubectl get crd | grep istio authorizationpolicies.security.istio.io 2021-03-29T10:24:22Z destinationrules.networking.istio.io 2021-03-29T10:24:22Z envoyfilters.networking.istio.io 2021-03-29T10:24:22Z gateways.networking.istio.io 2021-03-29T10:24:22Z istiooperators.install.istio.io 2021-03-29T10:24:23Z peerauthentications.security.istio.io 2021-03-29T10:24:22Z requestauthentications.security.istio.io 2021-03-29T10:24:22Z serviceentries.networking.istio.io 2021-03-29T10:24:22Z sidecars.networking.istio.io 2021-03-29T10:24:22Z virtualservices.networking.istio.io 2021-03-29T10:24:22Z workloadentries.networking.istio.io 2021-03-29T10:24:22Z workloadgroups.networking.istio.io 2021-03-29T10:24:22Z
[/simterm]
И роли:
[simterm]
$ kubectl -n istio-system get role NAME CREATED AT istiod-istio-system 2021-03-29T10:24:27Z
[/simterm]
Добавляем установку остальных компонентов.
Install istio-discovery
Тут без дополнительных параметров, хотя посомтреть файл manifests/charts/istio-control/istio-discovery/values.yaml
тоже стоит:
... - name: "Install Istio Discovery to the istio-system namespace" community.kubernetes.helm: kubeconfig: "{{ kube_config_path }}" name: "istiod" chart_ref: "istio-1.9.1/manifests/charts/istio-control/istio-discovery" release_namespace: "istio-system" create_namespace: true
Деплоим, проверяем поды:
[simterm]
$ kubectl -n istio-system get pod NAME READY STATUS RESTARTS AGE istiod-7475457497-4d2p9 1/1 Running 0 43s
[/simterm]
istiod
под запущен, отлично.
Install istio-ingress
Последним устанавливаем Istio Ingress Gateway.
Тут нам надо задать annotations
в serviceAnnotations
для настройки AWS ALB, см. Istio: интеграция Ingress Gateway с AWS Application LoadBalancer:
... - name: "Install Istio Ingress Gateway to the istio-system namespace" community.kubernetes.helm: kubeconfig: "{{ kube_config_path }}" name: "istio-ingress" chart_ref: "istio-1.9.1/manifests/charts/gateways/istio-ingress" release_namespace: "istio-system" create_namespace: true values: gateways: istio-ingressgateway: serviceAnnotations: alb.ingress.kubernetes.io/healthcheck-path: /healthz/ready alb.ingress.kubernetes.io/healthcheck-port: "30218" type: "NodePort"
Деплоим, проверяем аннотации:
[simterm]
$ kubectl -n istio-system get svc istio-ingressgateway -o yaml apiVersion: v1 kind: Service metadata: annotations: alb.ingress.kubernetes.io/healthcheck-path: /healthz/ready alb.ingress.kubernetes.io/healthcheck-port: "30218" ...
[/simterm]
Всё на месте.
Для проверки – деплоим тестовое приложение из того же поста, и проверяем его URL:
Запуск Kiali и Prometheus сделаем в следующем посте.
Готово.