Я пытаюсь настроить K8s Ingress для экземпляра spring-cloud-gateway, развернутого в Kubernetes, но не могу понять, как обслуживать его с действительным сертификатом SSL.
Вот мой вход:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-production
acme.cert-manager.io/http01-edit-in-place: "true"
name: demo-bff
namespace: demo-bff
spec:
rules:
- host: bff.demo.c4-soft.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: bff-gateway
port:
number: 8080
tls:
- hosts:
- bff.demo.c4-soft.com
secretName: demo-bff-tls
Кластер-эмитент letsencrypt-production успешно используется из другого пространства имен для раскрытия Keycloak.
Я считаю, что проблема в конфигурации моего шлюза, которая неправильно маршрутизирует/авторизует вызов HTTP-01. Кто-нибудь знает, как настроить spring-cloud-gateway с помощью диспетчера сертификатов, эмитента кластера и letsencrypt?
Что я пробовал до сих пор для конфигурации шлюза (в дополнение к стандартной конфигурации клиента OAuth2):
spring:
cloud:
gateway:
default-filters:
- TokenRelay=
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
- SaveSession
routes:
- id: letsencrypt
uri: http://cert-manager-webhook
predicates:
- Path=/.well-known/acme-challenge/**
экстракт kubectl get services --all-namespaces
cert-manager service/cert-manager-webhook ClusterIP 10.3.8.243 <none> 443/TCP 4d2h
default service/kubernetes ClusterIP 10.3.0.1 <none> 443/TCP 4d2h
demo-bff service/bff-gateway ClusterIP 10.3.49.122 <none> 8080/TCP 175m
ingress-nginx service/ingress-nginx-controller LoadBalancer 10.3.86.83 148.113.158.14 80:30664/TCP,443:31206/TCP 4d2h
ingress-nginx service/ingress-nginx-controller-admission ClusterIP 10.3.31.34 <none> 443/TCP 4d2h
kube-system service/kube-dns ClusterIP 10.3.0.10 <none> 53/UDP,53/TCP,9153/TCP 4d2h

Наконец-то я заработал, изменив две вещи:
cert-manager-webhook URI на https (сервис привязан к порту 443, как видно выше)/.well-known/acme-challenge/** path-matcher есть permitAll() авторизация на биржахspring:
cloud:
gateway:
default-filters:
- TokenRelay=
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
- SaveSession
routes:
- id: letsencrypt
uri: https://cert-manager-webhook
predicates:
- Path=/.well-known/acme-challenge/**
com:
c4-soft:
springaddons:
security:
client:
security-matchers: /**
permit-all:
- /login/**
- /oauth2/**
- /
- /login-options
- "/me"
- /ui/**
- /actuator/health/readiness
- /actuator/health/liveness
- /.well-known/acme-challenge/**
Свойства com.c4-soft.springaddons.security используются моим альтернативным стартером Spring Boot (обертывание spring-boot-starter-oauth2-client). Указанные здесь используются в http.authorizeExchange(authorizeExchange -> authorizeExchange.pathMatchers(permitAll).permitAll()).