Kubernetes 生态系统认知
本指南之前描述的所有功能,无论您的应用程序是否在 Kubernetes 内部运行,都能同样良好地工作。这对于开发和故障排除非常有帮助。从开发的角度来看,这允许您启动 Spring Boot 应用程序并调试属于该项目一部分的某个模块。您无需将其部署在 Kubernetes 中,因为项目的代码依赖于 Fabric8 Kubernetes Java 客户端,这是一个流畅的 DSL,可以通过 http 协议与 Kubernetes 服务器的 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,那么你需要在 bootstrap.{properties|yml}(或特定环境的配置文件)中设置 spring.main.cloud-platform。同时请注意,这些属性:spring.cloud.kubernetes.config.enabled 和 spring.cloud.kubernetes.secrets.enabled 只有在你的 classpath 中包含 spring-cloud-starter-bootstrap 或者设置了 spring.cloud.bootstrap.enabled=true 时,在 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 配置文件自动配置
当应用程序在 Kubernetes 中以 Pod 形式运行时,名为 kubernetes 的 Spring 配置文件会自动激活。这允许您自定义配置,定义在 Spring Boot 应用程序部署于 Kubernetes 平台时应用的 Bean(例如,不同的开发和生产配置)。
Istio 感知
当你在应用程序的类路径中包含 spring-cloud-kubernetes-fabric8-istio 模块时,只要应用程序运行在安装了 Istio 的 Kubernetes 集群中,就会向应用程序添加一个新的配置文件。然后,你可以在你的 Bean 和 @Configuration 类中使用 Spring 的 @Profile("istio") 注解。
Istio感知模块使用me.snowdrop:istio-client与Istio API进行交互,让我们能够发现流量规则、熔断器等,从而使我们的Spring Boot应用程序能够轻松地使用这些数据,根据环境动态配置自身。