Kgateway — легковесный Gateway API на основе Envoy, который реализует Kubernetes Gateway API. В отличие от Istio, Kgateway предоставляет более простое и быстрое решение для управления входящим трафиком.
В инструкции рассмотрим пример настройки Kgateway в кластере Managed Kubernetes для предоставления доступа к контейнерному приложению извне.
Создайте кластер Managed Kubernetes и хотя бы одну группу узлов.
Минимальные параметры для группы узлов:
Гарантированная доля vCPU, % — 10.
CPU, шт. — 2.
RAM, ГБ — 4.
Объем хранилища, ГБ — 40.
Количество узлов — 1.
В созданном кластере перейдите в раздел Плагины и в правом верхнем углу нажмите Добавить плагин.
В списке плагинов выберите Kgateway и нажмите Установить.
Выберите версию плагина.
Нажмите Установить.
Дождитесь, когда состояние плагина изменится на «Установлен».
Убедитесь, что все поды Kgateway в статусе «Running»:
kubectl get pods -n kgateway-system
Результат:
NAME READY STATUS RESTARTS AGEkgateway-58d9f2f***-***** 1/1 Running 0 25m
Создайте cloudru-httpbin.yaml и сохраните манифесты:
apiVersion: v1kind: Namespacemetadata:name: httpbin---apiVersion: v1kind: Servicemetadata:name: httpbinnamespace: httpbinspec:ports:- port: 8000targetPort: 8080selector:app: httpbin---apiVersion: apps/v1kind: Deploymentmetadata:name: httpbinnamespace: httpbinspec:replicas: 1selector:matchLabels:app: httpbintemplate:metadata:labels:app: httpbinspec:containers:- name: httpbinimage: emk8s.cr.cloud.ru/mccutchen/go-httpbin:v2.6.0ports:- containerPort: 8080
Примените манифесты:
kubectl apply -f cloudru-httpbin.yaml
Примерный результат:
namespace/httpbin createdservice/httpbin createddeployment.apps/httpbin created
Убедитесь, что поды запущены.
kubectl get pods -n httpbin
Примерный результат:
NAME READY STATUS RESTARTS AGEhttpbin-6d8bs2s***-***** 1/1 Running 0 69s
Создайте cloudru-gateway.yaml и сохраните манифест:
kind: GatewayapiVersion: gateway.networking.k8s.io/v1metadata:name: httpnamespace: httpbinspec:gatewayClassName: kgatewaylisteners:- protocol: HTTPport: 8080name: http
Создайте cloudru-gateway-http.yaml и сохраните манифест:
apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata:name: httpbinnamespace: httpbinspec:parentRefs:- name: httprules:- backendRefs:- name: httpbinport: 8000
Последовательно выполните:
kubectl apply -f cloudru-gateway.yamlkubectl apply -f cloudru-gateway-http.yaml
Результат:
gateway.gateway.networking.k8s.io/http createdhttproute.gateway.networking.k8s.io/httpbin created
Получите внешний IP-адрес Gateway:
kubectl get svc -n httpbin
Вы получите примерно такой вывод:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEhttp LoadBalancer 10.***.**.*** <external_ip> 8080:32610/TCP 110shttpbin ClusterIP 10.***.**.*** <none> 8000/TCP 7m22s
Где <external_ip> — назначенный IP-адрес.
Отправьте запрос на внешний IP-адрес балансировщика:
curl http://<external_ip>:8080/get
Пример успешного ответа:
{"args": {},"headers": {"Accept": ["*/*"],"Host": ["37.**.***.***:8080"],"User-Agent": ["curl/8.19.0"],"X-Envoy-Expected-Rq-Timeout-Ms": ["15000"],"X-Envoy-External-Address": ["10.*.*.***"],"X-Forwarded-For": ["10.*.*.***"],"X-Forwarded-Proto": ["http"],"X-Request-Id": ["80983427-8393-40c5-834d-d566********"]},"origin": "10.*.*.***","url": "http://37.**.***.***:8080/get"}
Kgateway правильно обрабатывает объекты Gateway API и перенаправляет вызовы на httpbin.