当我们收到最新的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的服务发现和客户端
Kubernetes有服务发现的概念直接建在平台上。然而,如果你有使用Spring Cloud DiscoveryClient
实现构建的应用程序,或使用Spring Cloud负载平衡器,那么当你在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
实现,它使用新的发现服务器。要在你的应用程序中添加这个新的实现,你需要在你的应用程序的classpath中包含spring-cloud-starter-kubernetes-discoveryclient
。任何使用该启动器的应用程序都需要将spring.cloud.kubernetes.discovery.server-url
设置为部署在Kubernetes上的发现服务器的URL。
Kubernetes上的Spring Cloud Config Server
作为Spring Cloud 2021.0.0-M3的一部分,我们为配置服务器增加了一个 “环境存储库”(EnvironmentRepository)。它增加了对从Kubernetes上存储的Config Maps和Secrets获取数据的支持。你仍然可以使用配置服务器支持的其他 “EnvironmentRepository”,但现在,当你将配置服务器部署到Kubernetes并启用 "kubernetes "配置文件时,你可以包括存储在配置地图或秘密中的任何配置数据。
虽然配置服务器仍然需要访问Kubernetes API服务器,但不再是每个应用程序都需要访问。相反,只有配置服务器需要访问,其余的应用程序只需要向配置服务器发出HTTP请求,就像平常一样。
你可以在我们的文档中阅读更多关于Kubernetes配置服务器的信息,我们还提供了一个镜像,你可以用它来将配置服务器部署到Kubernetes[在Docker Hub上](Docker
你可以通过运行以下命令,用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上的问题的形式提供反馈,以便我们能使这些功能尽可能地有用。
原文: