Istio поддерживает Kubernetes Gateway API для управления трафиком. В инструкции рассмотрим пример настройки Istio в кластере Managed Kubernetes для предоставления доступа к приложению извне с использованием Gateway API.
Создайте кластер Managed Kubernetes и хотя бы одну группу узлов.
Минимальные параметры для группы узлов:
Гарантированная доля vCPU, % — 10.
CPU, шт. — 4.
RAM, ГБ — 8.
Объем хранилища, ГБ — 40.
Количество узлов — 1.
Убедитесь, что в зоне доступности, которая выбрана для группы узлов, создан SNAT-шлюз .
Установите CRD для Gateway API:
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.5.1/standard-install.yaml
Проверьте, что CRD установлен:
kubectl get crd | grep gateway
Примерный результат:
backendtlspolicies.gateway.networking.k8s.iogatewayclasses.gateway.networking.k8s.iogateways.gateway.networking.k8s.iogrpcroutes.gateway.networking.k8s.iohttproutes.gateway.networking.k8s.iolistenersets.gateway.networking.k8s.ioreferencegrants.gateway.networking.k8s.iotlsroutes.gateway.networking.k8s.io
В созданном кластере перейдите в раздел Плагины и справа над списком установленных плагинов нажмите Добавить плагин.
В списке плагинов выберите Istio и нажмите Установить.
(Опционально) Выберите версию плагина.
Нажмите Установить.
Дождитесь, когда состояние плагина изменится на «Установлен».
Убедитесь, что все поды Istio в статусе Running:
kubectl get pods -n istio-system
Результат:
NAME READY STATUS RESTARTS AGEistio-ingressgateway-58d8bc5c94-pz8gm 1/1 Running 0 25mistiod-5586bcd5b-288bp 1/1 Running 0 25m
Проверьте, что Istio распознает Gateway API:
kubectl logs deploy/istiod -n istio-system | grep "gateway"
Вы должны увидеть сообщения о запуске контроллеров Gateway API.
GatewayClass определяет, какой контроллер реализует Gateway. Istio автоматически создает GatewayClass с названием istio.
Выполните команду:
kubectl get gatewayclass
Результат:
NAME CONTROLLER ACCEPTED AGEistio istio.io/gateway-controller True 9m25sistio-remote istio.io/unmanaged-gateway True 9m25s
Создайте nginx-deployment.yaml и сохраните манифест:
apiVersion: apps/v1kind: Deploymentmetadata:name: nginx-deploymentlabels:app: nginxspec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80
Создайте nginx-service.yaml и сохраните манифест:
apiVersion: v1kind: Servicemetadata:name: nginx-servicelabels:app: nginxspec:type: ClusterIPports:- port: 80targetPort: 80selector:app: nginx
Примените манифесты:
kubectl apply -f nginx-deployment.yamlkubectl apply -f nginx-service.yaml
Результат:
deployment.apps/nginx-deployment createdservice/nginx-service created
Теперь создадим Gateway и HTTPRoute для доступа к приложению через внешний IP-адрес.
Создайте cloudru-gateway.yaml и сохраните манифест:
apiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata:name: cloudru-gatewayspec:gatewayClassName: istiolisteners:- name: httpprotocol: HTTPport: 80allowedRoutes:namespaces:from: All
Создайте cloudru-gateway-http.yaml и сохраните манифест:
apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata:name: cloudru-gateway-httpspec:parentRefs:- name: cloudru-gatewayhostnames:- "console.example.ru"rules:- backendRefs:- name: nginx-serviceport: 80weight: 100
Примените манифесты:
kubectl apply -f cloudru-gateway.yamlkubectl apply -f cloudru-gateway-http.yaml
Результат:
gateway.gateway.networking.k8s.io/cloudru-gateway createdhttproute.gateway.networking.k8s.io/cloudru-gateway-http created
Получите внешний IP-адрес Gateway:
kubectl get gateway -o wide
Вы получите примерно такой вывод:
NAME CLASS ADDRESS PROGRAMMED AGEcloudru-gateway istio <external-ip> True 13m
Где <external-ip> — назначенный IP-адрес.
Пропишите в hosts:
<external-ip> console.example.ru
Откройте браузер и в адресную строку введите: http://console.example.ru.
В результате вы увидите стандартную страницу приветствия Nginx.