取得領先
VMware 提供培訓和認證,以加速您的進展。
了解更多當我們收到最新的 State Of Spring 調查結果時,67% 的人表示希望看到對 Kubernetes 上的服務探索和配置管理有更好的支援。
隨著Spring Cloud 2021.0.0-M3 的發布,我們正在朝著解決這兩個問題的方向邁出一大步!
Spring Cloud Kubernetes 自成立以來就提供 DiscoveryClient
實作。但是,該實作要求應用程式具有使用 Kubernetes API 伺服器的權限。這對許多 Spring Cloud 使用者來說是一個主要障礙,因為 Kubernetes 管理員不願意授予應用程式權限,以向 Kubernetes API 伺服器發出 API 請求。
使用 Spring Cloud Kubernetes 的配置管理也存在需要存取 API 伺服器的相同要求。此外,許多 Spring Cloud 使用者非常熟悉使用 Spring Cloud Config Server 來外部化和管理配置,並且 Spring Cloud Config Server 不支援使用 ConfigMaps 和 Secrets(用於在 Kubernetes 上外部化配置的資源)。
為了解決這些限制和疑慮,我們發布了一些新功能(作為 Spring Cloud 2021.0.0-M3 的一部分),我們很樂意收到您的反饋。
注意:這些功能都不是為了取代 Kubernetes 本身提供的類似功能。相反,它們主要旨在促進 Spring Cloud 應用程式遷移到 Kubernetes。您仍然可以選擇利用 ConfigMaps、Secrets、Kubernetes 的服務發現,使用基本的 Spring Boot 應用程式,如本主題指南中所述。將來,我們將提供第二個主題指南,概述何時以及為何您可以選擇從 Spring Cloud Kubernetes 中利用這些功能,而不僅僅是 Kubernetes 本身提供的功能。
Kubernetes 具有內建於平台中的服務探索概念。但是,如果您使用 Spring Cloud DiscoveryClient
實作建立應用程式,或者使用 Spring Cloud Load Balancer,則當您在 Kubernetes 上執行這些應用程式時,它們將無法運作。您可以決定移除 DiscoveryClient 和 Load Balancer 依賴項,但您可能不願意或無法這樣做,並且需要在 Kubernetes 上執行應用程式時使用 DiscoveryClient
。
作為 Spring Cloud 2021.0.0-M3 的一部分,我們新增了一個可以部署到 Kubernetes 的服務探索伺服器。此服務探索伺服器的作用與 Eureka 大致相同,它提供了幾個 HTTP 端點,應用程式可以使用這些端點來取得有關部署在 Kubernetes 上的其他服務的資訊。您可以閱讀我們的文件,以了解有關這些端點的更多資訊。
與 Eureka 不同,這種新的服務探索伺服器實作不需要應用程式明確向伺服器註冊。相反,服務探索伺服器使用 Kubernetes API 來提取 Kubernetes 服務和端點,以向應用程式提供服務資訊。同樣,這確實需要服務探索伺服器存取 Kubernetes API 伺服器,但它消除了每個應用程式都必須具有該要求的需求,就像之前的 DiscoveryClient
實作一樣。
您可以執行以下命令,從 Docker Hub 提取服務探索伺服器映像。
docker pull springcloud/spring-cloud-kubernetes-discoveryserver:2.1.0-M3
要將映像部署到 Kubernetes,您可以使用以下 YAML。
---
apiVersion: v1
kind: List
items:
- apiVersion: v1
kind: Service
metadata:
labels:
app: spring-cloud-kubernetes-discoveryserver
name: spring-cloud-kubernetes-discoveryserver
spec:
ports:
- name: http
port: 80
targetPort: 8761
selector:
app: spring-cloud-kubernetes-discoveryserver
type: ClusterIP
- apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app: spring-cloud-kubernetes-discoveryserver
name: spring-cloud-kubernetes-discoveryserver
- apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
labels:
app: spring-cloud-kubernetes-discoveryserver
name: spring-cloud-kubernetes-discoveryserver:view
roleRef:
kind: Role
apiGroup: rbac.authorization.k8s.io
name: namespace-reader
subjects:
- kind: ServiceAccount
name: spring-cloud-kubernetes-discoveryserver
- apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: namespace-reader
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["services", "endpoints"]
verbs: ["get", "list", "watch"]
- apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-kubernetes-discoveryserver-deployment
spec:
selector:
matchLabels:
app: spring-cloud-kubernetes-discoveryserver
template:
metadata:
labels:
app: spring-cloud-kubernetes-discoveryserver
spec:
serviceAccount: spring-cloud-kubernetes-discoveryserver
containers:
- name: spring-cloud-kubernetes-discoveryserver
image: springcloud/spring-cloud-kubernetes-discoveryserver:2.1.0-M3
imagePullPolicy: IfNotPresent
readinessProbe:
httpGet:
port: 8761
path: /actuator/health/readiness
livenessProbe:
httpGet:
port: 8761
path: /actuator/health/liveness
ports:
- containerPort: 8761
除了服務探索伺服器之外,我們還新增了一個使用新服務探索伺服器的新 DiscoveryClient
實作。要將此新實作新增到您的應用程式,您需要在應用程式的類別路徑中包含 spring-cloud-starter-kubernetes-discoveryclient
。使用此啟動器的任何應用程式都需要將 spring.cloud.kubernetes.discovery.discovery-server-url
設定為部署在 Kubernetes 上的服務探索伺服器的 URL。
作為 Spring Cloud 2021.0.0-M3 的一部分,我們為 Config Server 新增了一個 EnvironmentRepository
。它新增了對從儲存在 Kubernetes 上的 Config Maps 和 Secrets 提取資料的支援。您仍然可以使用 Config Server 支援的其他 EnvironmentRepository
s,但是,現在,當您將 Config Server 部署到 Kubernetes 並啟用 kubernetes
設定檔時,您可以包含儲存在 Config Maps 或 Secrets 中的任何配置資料。
雖然 Config Server 仍然需要存取 Kubernetes API 伺服器,但不再是每個應用程式都需要存取。相反,只有 Config Server 需要存取,而其餘的應用程式只需要像往常一樣向 Config Server 發出 HTTP 請求。
您可以在我們的文件中閱讀有關 Kubernetes Config Server 的更多資訊,並且我們提供了一個映像,您可以使用它將 Config Server 部署到 Docker Hub 上的 Kubernetes。
您可以使用 Docker Hub 執行以下命令來提取此映像。
docker pull springcloud/spring-cloud-kubernetes-configserver:2.1.0-M3
要將映像部署到 Kubernetes,您可以使用以下 YAML。
---
apiVersion: v1
kind: List
items:
- apiVersion: v1
kind: Service
metadata:
labels:
app: spring-cloud-kubernetes-configserver
name: spring-cloud-kubernetes-configserver
spec:
ports:
- name: http
port: 8888
targetPort: 8888
selector:
app: spring-cloud-kubernetes-configserver
type: ClusterIP
- apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app: spring-cloud-kubernetes-configserver
name: spring-cloud-kubernetes-configserver
- apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
labels:
app: spring-cloud-kubernetes-configserver
name: spring-cloud-kubernetes-configserver:view
roleRef:
kind: Role
apiGroup: rbac.authorization.k8s.io
name: namespace-reader
subjects:
- kind: ServiceAccount
name: spring-cloud-kubernetes-configserver
- apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: namespace-reader
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["configmaps", "secrets"]
verbs: ["get", "list"]
- apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-kubernetes-configserver-deployment
spec:
selector:
matchLabels:
app: spring-cloud-kubernetes-configserver
template:
metadata:
labels:
app: spring-cloud-kubernetes-configserver
spec:
serviceAccount: spring-cloud-kubernetes-configserver
containers:
- name: spring-cloud-kubernetes-configserver
image: springcloud/spring-cloud-kubernetes-configserver:2.1.0-M3
imagePullPolicy: IfNotPresent
env:
- name: SPRING_PROFILES_INCLUDE
value: "kubernetes"
readinessProbe:
httpGet:
port: 8888
path: /actuator/health/readiness
livenessProbe:
httpGet:
port: 8888
path: /actuator/health/liveness
ports:
- containerPort: 8888
透過這些新功能,總是有改進的空間,因此請嘗試一下並在 GitHub 上的 issue 中提供反饋,以便我們可以使這些功能盡可能有用。