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
,那么你需要在 bootstrap.{properties|yml}
(或特定环境的配置文件)中设置 spring.main.cloud-platform
。另外请注意,这些属性:spring.cloud.kubernetes.config.enabled
和 spring.cloud.kubernetes.secrets.enabled
只有在 bootstrap.{properties|yml}
中设置时才会生效,前提是你的 classpath 中有 spring-cloud-starter-bootstrap
或者设置了 spring.cloud.bootstrap.enabled=true
。
3.0.x 版本中的重大变更
在 Spring Cloud Kubernetes 3.0.x
之前的版本中,Kubernetes 感知功能是通过 spring.cloud.kubernetes.enabled
属性实现的。该属性已被移除且不再支持。取而代之的是使用 Spring Boot 的 API:ConditionalOnCloudPlatform。如果需要显式启用或禁用此感知功能,请使用 spring.main.cloud-platform=NONE/KUBERNETES
。
- 另一个重大变化是加载 ConfigMap/Secret 时需要使用额外的
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 集群中,一个新的配置文件将被添加到应用程序中。然后,你可以在你的 Beans 和 @Configuration
类中使用 Spring 的 @Profile("istio")
注解。
Istio 感知模块使用 me.snowdrop:istio-client
与 Istio API 进行交互,使我们能够发现流量规则、断路器等信息,从而使我们的 Spring Boot 应用程序能够轻松地使用这些数据,根据环境动态配置自身。