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 應用程式易於消費這些資料,並根據環境動態配置自身。