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

当我们收到最新的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的服务发现和客户端

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 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上的问题的形式提供反馈,以便我们能使这些功能尽可能地有用。


原文: