Как настроить spring-cloud-gateway с помощью кластера-эмитента letsencrypt на k8s?

Я пытаюсь настроить 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
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
0
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Наконец-то я заработал, изменив две вещи:

  • переключите 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()).

Другие вопросы по теме