Istio: установка с Ansible и Helm

Автор: | 01/04/2021

В первом посте серии – 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 действия:

  1. скачать гит-репозиторий с манифестами Istio
  2. установить istio-base – CRD, роли
  3. установить istio-discovery – istiod
  4. и установить 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 сделаем в следующем посте.

Готово.