Spring Cloud Kubernetes 在 Spring Cloud 2021.0.0-M3 中的新功能

工程 | Ryan Baxter | 2021 年 10 月 26 日 | ...

在收到 最新 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 不支持使用 ConfigMapsSecrets(用于在 Kubernetes 上外部化配置的资源)。

为了解决其中一些限制和疑虑,我们发布了一些新功能(作为 Spring Cloud 2021.0.0-M3 的一部分),我们非常希望您能提供反馈。

注意:这些功能都不是为了取代 Kubernetes 本身提供的类似功能。相反,它们主要旨在促进 Spring Cloud 应用程序迁移到 Kubernetes。您仍然可以选择利用 ConfigMaps、Secrets、Kubernetes 的服务发现,使用基本的 Spring Boot 应用程序,如本 专题指南中所述。未来,我们将提供第二篇专题指南,概述何时以及为何您可能选择利用 Spring Cloud Kubernetes 的这些功能而不是仅使用 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。

Kubernetes 上的 Spring Cloud Config Server

作为 Spring Cloud 2021.0.0-M3 的一部分,我们为 Config Server 添加了一个 EnvironmentRepository。它增加了从 Kubernetes 上存储的 Config Maps 和 Secrets 获取数据的支持。您仍然可以使用 Config Server 支持的其他 EnvironmentRepository,但现在,当您将 Config Server 部署到 Kubernetes 并启用 kubernetes profile 时,您可以包含存储在 Config Maps 或 Secrets 中的任何配置数据。

虽然 Config Server 仍然需要访问 Kubernetes API 服务器,但不再是每个应用程序都需要访问。相反,只有 Config Server 需要访问,而其余应用程序只需要像平常一样通过 HTTP 请求与 Config Server 通信。

您可以在我们的文档中了解有关 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 上以 issue 的形式提供反馈,以便我们能够使这些功能尽可能有用。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有