在 Spring Boot 应用程序中获取 k8s 命名空间?

问题描述 投票:0回答:2

我在 k8s 集群中部署了一个 Spring Boot 应用程序(一组服务)。对于微米指标,我需要动态获取此应用程序运行的命名空间,以便我可以将其添加为指标中的标记。以下是我的自定义标签创建 bean

@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> {
  String hostname = getHostName();
  registry.config().commonTags(TAG_NAME_INSTANCE,hostname);

  final String applicationName = environment.getProperty(SPRING_BOOT_APPLICATION_NAME_PROPERTY_KEY);
  registry.config().commonTags(TAG_NAME_APPLICATION, applicationName);
  registry.config().commonTags(TAG_NAME_APP, applicationName);

  registry.config().commonTags(TAG_NAME_KUBE_NAME_SPACE, getKubeNamespace());
};

}

当前

getKubeNamespace
返回硬编码值。我如何获取此 Pod 正在运行哪个命名空间?

java spring-boot kubernetes spring-cloud
2个回答
5
投票

Kubernetes 有一个访问此类字段的功能,称为 Downward API .

借助 Downward API,可以通过在 pod 定义中定义环境变量来访问 pod 的命名空间,如下所示:

- name: NAMESPACE
  valueFrom:
    fieldRef:
      fieldPath: metadata.namespace

之后Spring就可以读取环境变量了:

@Value("${NAMESPACE}")
private String namespace;

0
投票

如果您使用Spring Cloud,则无需添加环境变量。只需使用这个属性:

@Value("${spring.cloud.kubernetes.client.namespace}")
private String namespace;
© www.soinside.com 2019 - 2024. All rights reserved.