领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多当我们收到来自最新 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 并不支持使用ConfigMap 和Secret(用于在 Kubernetes 上外部化配置的资源)。
为了解决其中一些限制和问题,我们发布了一些新功能(作为 Spring Cloud 2021.0.0-M3 的一部分),我们希望收到您的反馈。
注意:这些功能都不是为了取代 Kubernetes 本身提供的类似功能。相反,它们的主要目的是促进将 Spring Cloud 应用程序迁移到 Kubernetes。您仍然可以选择利用 ConfigMap、Secret、使用基本 Spring Boot 应用程序从 Kubernetes 进行服务发现,如本主题指南中所述。将来,我们将提供第二个主题指南,概述何时以及为何选择利用 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 Map 和 Secret 中获取数据的功能的支持。您仍然可以使用 Config Server 支持的其他 EnvironmentRepository
,但是,现在,当您将 Config Server 部署到 Kubernetes 并启用 kubernetes
配置文件时,您可以包含存储在 Config Map 或 Secret 中的任何配置数据。
虽然 Config Server 仍然需要访问 Kubernetes API 服务器,但每个应用程序都需要访问的情况不再存在。相反,只有 Config Server 需要访问,其他应用程序只需要像往常一样向 Config Server 发出 HTTP 请求。
您可以在我们的文档中阅读有关 Kubernetes Config Server 的更多信息,并且我们提供了一个您可以用来将 Config Server 部署到 Kubernetes 的镜像,该镜像可以在Docker Hub上找到。
您可以使用 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 上的问题,以便我们能够使这些功能尽可能有用。