В первом посте серии — 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 сделаем в следующем посте.
Готово.






