Режим Istio Ambient — это модель плоскости данных, которая устраняет необходимость в боковом прокси-сервере envoy для каждой рабочей нагрузки. Это снижает накладные расходы на ресурсы, проблемы со временем между жизненным циклом расширения и контейнерами, а также необходимость перезапуска рабочих нагрузок для обновления версий прокси-сервера.
В этой статье я покажу вам, как установить и протестировать режим Ambient на локальном кластере Minikube на Ubuntu 22.04/Debian 12.
Установите необходимые инструменты и Minikube
Установите Docker
Смотрите мою статью здесь об установке Docker на Ubuntu/Debian.
Установка kubectl
Kubectl — это средство командной строки, используемое для развертывания приложений и управления ими.
curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/bin/.
Проверить версию можно с помощью:
# check path and version
which kubectl
kubectl version
Установите Minikube
Теперь скачайте и поместите последний двоичный файл minikube в /usr/local/bin.
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
# check version
minikube version
Запустить Minikube
Запустите Minikube явно с помощью среды выполнения/драйвера контейнера Docker и сетевой политики kindnet.
minikube start --container-runtime=docker --driver=docker --cni=kindnet
# check status
minikube status
# logs should reflect docker driver
minikube logs | grep -i "selected driver:"
# logs should reflect kindnet CNI
minikube logs | grep "Creating CNI manager"
# logs should reflect docker runtime
minikube logs | grep -i "container runtime version"
# test kubectl against cluster
kubectl get nodes
Обратите внимание, что я успешно протестировал установку с CNI=kindnet|calico, driver=docker|kvm2 и container runtime=docker|containerd. Хотя драйвер kvm2 требует, чтобы мы установили istio в режиме IPv4 в следующем разделе.
# starting minikube with alternate driver and container runtime
minikube -c containerd start --driver=kvm2 --cni=kindnet
Установка Istio
Согласно официальной документации, загрузите и установите Istio вместе с более новым Gateway CRD (Gateway API заменяет Istio API, например, VirtualService).
curl -L https://istio.io/downloadIstio | sh -
cd istio-*
# if using KVM2 container runtime add: --set values.cni.ambient.ipv6=false
bin/istioctl install --set profile=ambient --skip-confirmation
bin/istioctl verify-install
# deploy Gateway CRD
kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \
{ kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.1.0/standard-install.yaml; }
Если вы используете драйвер KVM2 для Minikube, вам необходимо установить Istio в режиме IPv4, чтобы избежать ошибок при запуске istio-cni-node, "ip6tables-restore unable to initialize table 'nat'". Это устанавливает AMBIENT_IPV6=false в configmap/istio-cni-config.
Развертывание примера приложения BookInfo
Теперь мы собираемся развернуть небольшое веб-приложение "Book Info", которое поставляется с Istio. Это создание развертываний и служб, но НЕ передача приложений под контроль Ambient Mesh.
# deploy bookinfo solution
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.23/samples/bookinfo/platform/kube/bookinfo.yaml # use multiple versions of services
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.23/samples/bookinfo/platform/kube/bookinfo-versions.yaml
# wait for deployments to be ready
kubectl rollout status deployment productpage-v1 ratings-v1 reviews-v1 -n default --timeout=90s
# verify bookinfo app returning page with title (internal, from inside pod)
kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep "<title>"
Создать шлюз
В соответствии с более новым API шлюза теперь мы хотим создать объект шлюза, который предоставляет службу. Опять же, это не помещает приложение под контроль Ambient mesh, это произойдет позже, когда мы правильно обозначим пространство имен по умолчанию.
# create 'bookinfo-gateway' Gateway and 'bookinfo' HttpRoute
kubectl apply -f samples/bookinfo/gateway-api/bookinfo-gateway.yaml
# wait for auto-created 'bookinfo-gateway-istio' waypoint proxy
kubectl rollout status deployment bookinfo-gateway-istio -n default --timeout=90s
# by default creates loadbalancer service, no address available
$ kubectl get gateway
NAME CLASS ADDRESS PROGRAMMED AGE
bookinfo-gateway istio False 109s
# this loadbalancer service is <pending>, but not necessary for us
$ kubectl get service bookinfo-gateway-istio
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
bookinfo-gateway-istio LoadBalancer 10.96.238.79 <pending> 15021:32380/TCP,80:31433/TCP 33s
# so change the service type to ClusterIP
kubectl annotate gateway bookinfo-gateway networking.istio.io/service-type=ClusterIP --namespace=default
# loadbalancer IP no longer awaiting creation with <pending>
$ kubectl get service bookinfo-gateway-istio
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
bookinfo-gateway-istio ClusterIP 10.96.238.79 <none> 15021/TCP,80/TCP 2m18s
# gateway now was internal service name
$ kubectl get gateway
NAME CLASS ADDRESS PROGRAMMED AGE
bookinfo-gateway istio bookinfo-gateway-istio.default.svc.cluster.local True 2m44s
API тестового шлюза
Прокси-серверы Istio waypoint развертываются ресурсами шлюза. Используйте эту опцию, чтобы связаться со службой на месте.
# forward Istio waypoint proxy to local port 8080
kubectl port-forward svc/bookinfo-gateway-istio 8080:80
# check with local browser, or another console
curl -s http://localhost:8080/productpage | grep '<title>'
Kiali, инструмент наблюдения Istio
Развернуть Kiali
Для того, чтобы лучше понять приложение и его участие в сетке режима Ambient mode, мы установим в Kiali дашборд наблюдаемости Istio.
# install kiali dashboard
kubectl apply -f samples/addons
kubectl rollout status deployment/kiali -n istio-system --timeout=90s
Просмотр примера состояния приложения в Kiali
# forwards local port and opens local browser to Kiali dashboard
bin/istioctl dashboard kiali
Обратите внимание, что если мы перейдем в раздел «Приложения» в Kiali, приложения будут перечислены как «Вне сетки». Это связано с тем, что приложения еще не были направлены на участие в сетке Ambient mesh.
Включение режима Ambient для примера приложения
Как показано в предыдущем разделе, пример приложения не участвует в сетке Ambient mesh. Мы можем включить это, добавив метку "istio.io/dataplane-mode" в пространство имен по умолчанию.
# show current namespaces that are ambient mesh enabled (should be none)
kubectl get ns default -L istio.io/dataplane-mode=ambient
# make sample app part of the mesh with namespace label
kubectl label namespace default istio.io/dataplane-mode=ambient
С этой меткой единого пространства имен примеры служб приложений "Book Info" теперь участвуют в сетке служб Ambient service. Это не потребовало перезапуска рабочих нагрузок.
Проверка участия в режиме Ambient для примера приложения
Если мы теперь передадим нагрузку на сервис, мы сможем вернуться к веб-интерфейсу Kiali и убедиться, что они участвуют в сетке Ambient mesh.
# forward service to local port
kubectl port-forward svc/bookinfo-gateway-istio 8080:80 # throw load at app from a different console for i in $(seq 1 100); do curl -sS http://localhost:8080/productpage >/dev/null; done
# open Kiali in local browser
bin/istioctl dashboard kiali
Теперь мы должны видеть, что пространство имен "по умолчанию" участвует в сетке, согласно значку "Ambient" рядом с его именем.
А в разделе «Приложения» у развертываний больше нет сообщения «вне сетки», что доказывает, что они действительно поддерживают сетку.
А из "Traffic Graph" страница товара, на которую мы выставляем нагрузку, показывает нам его базовые зависимости, переходя к сервису деталей и отзывов.
ПРИМЕЧАНИЯ
Если CNI=calico, то существует Daemonset
kubectl describe ds calico-node -n kube-system
Проверка необходимого маршрута от CNI pod к ztunnel pod, проблема на github
CNI_IP=$(kubectl get -n istio-system pod $(kubectl get pod -n istio-system -l k8s-app=istio-cni-node -o jsonpath='{.items..metadata.name}') -o jsonpath='{.status.podIP}')
ZTUN_IP=$(kubectl get -n istio-system pod $(kubectl get pod -n istio-system -l app=ztunnel -o jsonpath='{.items..metadata.name}') -o jsonpath='{.status.podIP}')
kubectl debug -it $(kubectl get pod -n istio-system -l k8s-app=istio-cni-node -oname) -n istio-system --image=busybox -- ip route get from $CNI_IP to $ZTUN_IP
Прометей также был установлен в рамках этой статьи
Вы можете перенаправить на локальный порт и открыть браузер с помощью:
# https://istio.io/latest/docs/tasks/observability/metrics/querying-metrics/
bin/istioctl dashboard prometheus
Ниже приведен пример запроса к 'istio_requests_total'
показать модули ядра, загруженные и требуемые istio CNI, проблема на github
minikube ssh
# operate as root
sudo su
# show currently loaded kernel modules
lsmod
# load modules required by istio CNI
modprobe br_netfilter ; modprobe nf_nat ; modprobe xt_REDIRECT ; modprobe xt_owner; modprobe iptable_nat; modprobe iptable_mangle; modprobe iptable_filter
Обновление kubeconfig для minikube
minikube update-context