使用 Kubernetes 服务发现从 Spring Boot Admin 访问安全执行器

问题描述

我有一个 Spring Boot Admin 应用程序,它使用 Kubernetes 服务发现来获取 Spring Boot 客户端应用程序。

spring:
  cloud:
      kubernetes:
        discovery:
          all-namespaces: true
          service-labels:
            springbootadmin: true
        reload:
          enabled: true
          period: 60s
          strategy: refresh

如果没有安全的执行器端点,这可以正常工作。

但是一旦客户端执行器端点受到基本身份验证的保护,这将不再起作用。 Spring Boot Admin Documentation 描述了如何将身份验证数据添加到 Spring Boot Admin Server 位,但没有描述在通过 Kubernetes 发现服务时如何提供。

我已经尝试过这些配置。但它们不起作用:

  1. Spring Boot Admin Docsspring.boot.admin.instance-auth.default-user-name + password
  2. Spring Boot Admin Tutorial spring.boot.admin.client.instance.metadata.user.name + password

我还找到了一个描述如何configure the credentials in the Kubernetes annotations的答案。这可行,但我更愿意在 Spring Boot Admin 配置(我可以在其中使用 Secrets)中配置凭据,而不是将 Kubernetes 配置中的每个服务单独配置为不安全标签。

我想我必须在服务发现元数据中注入凭据。但是如何?

编辑

我检查了服务发现,没有发现可以提供的身份验证配置选项:

  1. 类 KubernetesDiscoveryProperties.Metadata
  2. class de.codecentric.boot.admin.server.cloud.discovery.DefaultServiceInstanceConverter

解决方法

可以选择向 SBA 发送给客户端的请求添加自定义标头:

@Bean
public HttpHeadersProvider customHttpHeadersProvider() {
    return (instance) -> {
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("Authorization","Basic bXlTcGVjaWFsVXNlcm5hbWU6bXlTcGVjaWFsUGFzc3dvcmQ=");
        return httpHeaders;
    };
}
,

可以通过以下设置来设置身份验证:

spring:
  boot:
    admin:
      instance-auth:
        default-user-name: user
        default-password: pw

这些设置由实例化 bean AdminServerInstanceWebClientConfiguration 的配置类 basicAuthHttpHeadersProvider 读取。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...