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

Posted

技术标签:

【中文标题】在 Spring Boot 应用程序中获取 k8s 命名空间?【英文标题】:Get k8s namespace inside spring boot application? 【发布时间】:2021-09-13 04:45:12 【问题描述】:

我在 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 正在运行的命名空间?

【问题讨论】:

【参考方案1】:

Kubernetes 具有访问此类字段的功能,称为 Downward API。

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

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

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

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

【讨论】:

我认为这是最好和最干净的方法。只需将其作为环境变量提供即可。

以上是关于在 Spring Boot 应用程序中获取 k8s 命名空间?的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 应用在 k8s 中的健康检查

在K8S 中部署 Spring Boot 应用,爽..

在 K8S 中部署 Spring Boot 应用,爽!

部署 Spring Boot 应用到 K8S 教程

使用Spring Boot Operator部署SpringBoot到K8S

spring boot 使用 k8s 的 configMap 作为外部配置