Для тестов я использую кластер kubernetes, установленный при помощи kubeadm (ansible плейбук тут).
В кластере установлен минимальный набор приложений из директорий 01* и 02*.
Вы можете использовать свой набор компонентов. Но в кластере обязательно должны работать сервисы типа LoadBalancer. Сервисы этого типа в дальнейшем будут использоваться в примерах.
Перед установкой Istio поставим тестовое приложение BookInfo, которое разработчики Istio любезно предоставили для тестовых целей.
kubectl apply -f bookinfo/bookinfo.yamlКак мы в дальнейшем убедимся, Istio можно внедрять по мере необходимости без остановки работы текущих приложений пользователей.
Приложение запущено, но мы пок ане имеем к нему доступа из-за пределов кластера. Вывести приложение можно при помощи сервисов типа NodePort.
Ставить Istio будем при помощи helm chart.
helm repo add istio https://istio-release.storage.googleapis.com/charts
helm repo updateВ первую очередь устанавливаем чарт, содержащий базовые компоненты. Такие как: CRD, ClusterRoles, Validating webhook.
helm install istio-base istio/base -n istio-system --create-namespace --waitСледующим ставим CRD GatewayAPI. Прокси сервер Envoy, который будет реализовывать функционал GatewayAPI будет установлен позднее, как компонент Istio.
kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.1/standard-install.yamlТеперь istio control plane. Сразу указываем, что будет использоваться режим ambient.
helm install istiod istio/istiod --namespace istio-system \
--set profile=ambient --set global.logAsJson=true --wait CNI node agent.
helm install istio-cni istio/cni -n istio-system \
--set profile=ambient --set global.logAsJson=true --waitУстановим data plane:
- ztunnel
helm install ztunnel istio/ztunnel -n istio-system \
--set logAsJson=true --wait- Ingress controller (опционально)
Важно! У меня в кластере установлен Metallb, отвечающий за сервисы типа LoadBalancer. По умолчанию Ingress controller будет использовать этот тип сервиса.
helm install istio-ingress istio/gateway -n istio-ingress --create-namespaceСмотрим, какой IP адрес получил сервис istio-ingress:
kubectl -n istio-ingress get svc- GatewayAPI
Функционал GatewayAPI уже включен в Istio. Реализован на базе прокси сервера Envoy. Важно понимать, что эта реализация отличается от проекта Envoy Gateway.
В случае, когда мы устанавливаем Istio в режиме ambient, можно воспользоваться чартом "оберткой":
helm install istio istio/ambient -n istio-systemОн включает в себя чарты: base, cni, istiod и ztunnel. Имеет простейший файл values:
global:
variant: distroless
# Overrides for the `istiod-remote` dep
istiod:
enabled: true
profile: ambient
# Overrides for the `ztunnel` dep
ztunnel:
profile: ambient
resourceName: ztunnel
# Overrides for the `cni` dep
cni:
profile: ambientУ нас уже установлено приложение в namespace default. После установки базовых компонент istio мы можем получить доступ к приложению. Несмотря на то, что мы установили Ingress controller, будем пользоваться функционалом GatewayAPI. Поскольку в istio планирует полностью перейти на него.
kubectl apply -f manifests/00-gateway-bookinfo.yamlТрадиционно для GatewayAPI запускается отдельный экземпляр Envoy.
kubectl get pods | grep ^bookИ сервис типа LoadBalancer. Посмотрим, какой IP получил сервис:
kubectl get svc | grep ^bookПостучимся в наше приложение:
curl -v 192.168.218.181