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

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

當我們收到最新的 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 不支援使用 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 支援的其他 EnvironmentRepositorys,但是,現在,當您將 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 中提供反饋,以便我們可以使這些功能盡可能有用。

取得 Spring 電子報

透過 Spring 電子報保持聯繫

訂閱

取得領先

VMware 提供培訓和認證,以加速您的進展。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將舉辦的活動

查看 Spring 社群中所有即將舉辦的活動。

查看全部