Kubernetes 生态系统感知

本指南前面描述的所有功能都能正常工作,无论您的应用程序是否在 Kubernetes 内部运行。这对于开发和故障排除非常有帮助。从开发角度来看,这允许您启动 Spring Boot 应用程序并调试此项目的一部分模块。您无需将其部署到 Kubernetes,因为项目的代码依赖于 Fabric8 Kubernetes Java 客户端,它是一个流畅的 DSL,可以使用 http 协议与 Kubernetes Server 的 REST API 通信。

Kubernetes 感知基于 Spring Boot API,特别是 ConditionalOnCloudPlatform。该属性将自动检测您的应用程序当前是否部署在 kubernetes 中。可以通过 spring.main.cloud-platform 覆盖此设置。

例如,如果您需要测试某些功能,但不想部署到集群,只需设置:spring.main.cloud-platform=KUBERNETES。这将使 spring-cloud-kubernetes 的行为如同部署在真实的集群中一样。

如果您的 classpath 中有 spring-cloud-starter-bootstrap 或正在设置 spring.cloud.bootstrap.enabled=true,那么您必须将 spring.main.cloud-platform 设置在 bootstrap.{properties|yml} 中(或特定 profile 的文件中)。另请注意,当您的 classpath 中有 spring-cloud-starter-bootstrap 或正在设置 spring.cloud.bootstrap.enabled=true 时,属性 spring.cloud.kubernetes.config.enabledspring.cloud.kubernetes.secrets.enabled 只有在 bootstrap.{properties|yml} 中设置时才会生效。

3.0.x 版本中的重大变更

3.0.x 之前的 Spring Cloud Kubernetes 版本中,Kubernetes 感知是使用 spring.cloud.kubernetes.enabled 属性实现的。此属性已被移除且不再支持。取而代之的是,我们使用 Spring Boot API:ConditionalOnCloudPlatform。如果需要显式启用或禁用此感知,请使用 spring.main.cloud-platform=NONE/KUBERNETES

  • 另一个重大变更是加载 configmaps/secrets 所需的额外 list 动词。例如

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-role
rules:
  - apiGroups: ["", "extensions", "apps", "discovery.k8s.io"]
    resources: ["configmaps", "pods", "services", "endpoints", "secrets", "endpointslices"]
    verbs: ["get", "list", "watch"]

Kubernetes Profile 自动配置

当应用程序作为 pod 在 Kubernetes 内部运行时,名为 kubernetes 的 Spring profile 会自动激活。这允许您自定义配置,以定义在 Spring Boot 应用程序部署到 Kubernetes 平台时应用的 bean(例如,不同的开发和生产配置)。

Istio 感知

当您在应用程序 classpath 中包含 spring-cloud-kubernetes-fabric8-istio 模块时,如果应用程序运行在安装了 Istio 的 Kubernetes 集群中,则会向应用程序添加一个新的 profile。然后,您可以在 Bean 和 @Configuration 类中使用 spring @Profile("istio") 注解。

Istio 感知模块使用 me.snowdrop:istio-client 与 Istio API 交互,使我们能够发现流量规则、熔断器等,从而使我们的 Spring Boot 应用程序易于消费这些数据,并根据环境动态配置自身。