У меня есть служба K8s Prometheus, которая использует два разных порта для сопоставления с одним и тем же targetPort, и я хотел бы применить политику аутентификации только к одному порту. Идея состоит в том, чтобы иметь возможность предоставлять сервис вне меша с помощью аутентификации jwt (используя шлюз / виртуальный сервис), а также иметь внутреннюю версию без аутентификации (мне это нужно, поскольку внутри меша есть клиент, который не поддерживает jwtаутентификация).
Хотя моя политика определяет цель как первый порт, политика затрагивает оба порта. Ниже приведены некоторые дополнительные сведения
Служба
Прометей-служба ClusterIP 10.233.31.30 9095 / TCP, 9090 / TCP 22d
Как видно, есть два порта 9095 и 9090, которые называются соответственно http-port1 и http-port-2
Policy
Ниже я создал политику, которая определяет цель только для первого порта, http-port1.
Name: prometheus-auth-policy
Namespace: powerone-ns
API Version: authentication.istio.io/v1alpha1
Kind: Policy
Spec:
Origins:
Jwt:
Issuer: testing@secure.istio.io
Jwks Uri: https://raw.githubusercontent.com/istio/istio/release-1.3/security/tools/jwt/samples/jwks.json
Peers:
Mtls:
Principal Binding: USE_ORIGIN
Targets:
Name: prometheus-service
Ports:
Name: http-port1
Используя команду istioctl, я вижу, чтополитика, кажется, применяется хорошо. Например, запустив команду . / Istioctl authn tls-check prometheus-bb6f66586-ffwml -n powerone-ns Я вижу, что моя политика применяется только к первой службе, а вторая использует толькопо умолчанию.
HOST:PORT STATUS SERVER CLIENT AUTHN POLICY DESTINATION RULE
prometheus-service01.prometheus-service.svc.cluster.local:9090 OK mTLS mTLS prometheus-auth-policy/prometheus-service default/prometheus-service
prometheus-service02.prometheus-service.svc.cluster.local:9095 OK HTTP/mTLS mTLS default/ default/pprometheus-service
Когда я запрашиваю службу на обоих портах, не сообщая ни о каком токене, я могу подключиться нормально, что неправильно, так как политика должна требовать токен JWT. Как только я удаляю второй порт, запрос завершается ошибкой с ожидаемой ошибкой 401 (аутентификация источника не удалась.), Поскольку я не сообщаю ни о каком токене. Поэтому кажется, что ISTIO не соблюдает целевую информацию в моей политике.
Я также попробовал вариант подхода. Я имею в виду, что вместо одного сервиса с двумя разными портами я создал два разных сервиса (по одному для каждого порта), но возникает одна и та же проблема.
С моей точки зрения это похоже на ошибку.