Explicación detallada de Spring Cloud Kubernetes

Tabla de contenido

1. ¿Por qué necesita Spring Cloud Kubernetes?

2. Arrancador

3. Discovery Client para Kubernetes

4. Descubrimiento de servicios nativos de Kubernetes (descubrimiento de servicios)

5. Implementación de Kubernetes PropertySource

1. Utilice el origen de propiedades de ConfigMap


1. ¿Por qué necesita Spring Cloud Kubernetes?

Spring Cloud Kubernetes proporciona implementaciones de las conocidas interfaces de Spring Cloud, lo que permite a los desarrolladores crear y ejecutar aplicaciones de Spring Cloud en Kubernetes. Si bien este proyecto puede resultarle útil al crear aplicaciones nativas de la nube, no es un requisito para implementar aplicaciones Spring Boot en Kubernetes. Si recién está comenzando a ejecutar su aplicación Spring Boot en Kubernetes, solo necesita una aplicación Spring Boot básica y Kubernetes en sí mismo puede hacer mucho.

2. Arrancador

Los arrancadores son descripciones de dependencia convenientes que puede incluir en su aplicación. Importe un Starter para las dependencias del conjunto de funciones y la configuración automática de Spring Boot. Los principiantes que comienzan con spring-cloud-starter-kubernetes-fabric8 proporcionan implementaciones mediante el cliente Fabric8 Kubernetes Java. Los principiantes que comienzan con spring-cloud-starter-kubernetes-client proporcionan implementaciones mediante el cliente Kubernetes Java.

Inicio Características

Dependencias de Fabric8

<dependencia> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-kubernetes-fabric8</artifactId> 
</dependency>

Dependencias del cliente de Kubernetes

<dependencia> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-kubernetes-client</artifactId> 
</dependency>

 Implementación de Discovery Client, el nombre del servicio (nombre del servicio)

Resuelto como un servicio de Kubernetes.

Dependencias de Fabric8

<dependencia> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-kubernetes-fabric8-config</artifactId> 
</dependency>

Dependencias del cliente de Kubernetes

<dependencia> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-kubernetes-client-config</artifactId> 
</dependency>

Cargue la aplicación desde Kubernetes ConfigMap y Secret

propiedades de la aplicación. Cuando ConfigMap o Secret

Cuando se produce un cambio, las propiedades de la aplicación se vuelven a cargar.

Dependencias de Fabric8

<dependencia> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-kubernetes-fabric8-all</artifactId> 
</dependency>

Dependencias del cliente de Kubernetes

<dependencia> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-kubernetes-client-all</artifactId> 
</dependency>

Todas las características de Spring Cloud Kubernetes.

3. Discovery Client para Kubernetes

Este proyecto proporciona una implementación de Discovery Client para Kubernetes. Este cliente (Cliente) le permite consultar los puntos finales de Kubernetes por nombre (ver servicios). Un servicio, normalmente expuesto por un servidor API de Kubernetes, es una colección de puntos finales que representan direcciones http y https a las que los clientes pueden acceder desde una aplicación Spring Boot que se ejecuta como un pod.

Esto es algo que obtiene automáticamente al agregar las siguientes dependencias a su proyecto.

<dependencia> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-kubernetes-discoveryclient</artifactId> 
</dependency>

<dependencia> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-kubernetes-fabric8</artifactId> 
</dependency>

<dependencia> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-kubernetes-client</artifactId> 
</dependency>

Para habilitar la carga DiscoveryClientde , @EnableDiscoveryClientagréguelo a la configuración o clase de aplicación adecuada, como se muestra en el siguiente ejemplo.

@SpringBootApplication 
@EnableDiscoveryClient 
public class Application { 
  public static void main(String[] args) { 
    SpringApplication.run(Application.class, args); 
  } 
}

Luego puede inyectar el cliente en su código a través de la inyección automática, como se muestra en el ejemplo a continuación.

@Autowired 
privado DiscoveryClient discoveryClient;

Puede participar en todos los espacios de nombres configurando la siguiente propiedad application.propertiesen DiscoveryClient.

spring.cloud.kubernetes.discovery.all-namespaces=true

Para descubrir servicios y puntos finales solo desde espacios de nombres específicos, debe all-namespacesestablecer en falsey establecer las siguientes propiedades application.propertiesen (en este ejemplo, los espacios de nombres son: ns1y ns2).

spring.cloud.kubernetes.discovery.namespaces[0]=ns1 
spring.cloud.kubernetes.discovery.namespaces[1]=ns2

Para descubrir direcciones de punto final de servicio que no están marcadas como "listas" por el servidor api de kubernetes, se puede application.propertiesestablecer (predeterminada: false):

spring.cloud.kubernetes.discovery.include-not-ready-addresses=true

Si su servicio expone varios puertos, deberá especificar qué puerto DiscoveryClientse debe usar. DiscoveryClientLa siguiente lógica se utilizará para seleccionar el puerto.

  1. Si el servicio tiene una etiqueta primary-port-name, utilizará el puerto con el nombre especificado en el valor de la etiqueta.
  2. Si no hay ninguna etiqueta, se utilizará el nombre de puerto especificado spring.cloud.kubernetes.discovery.primary-port-nameen .
  3. Si no se especifica ninguno de los anteriores, utilizará el puerto httpsdenominado .
  4. Si no se cumple ninguna de las condiciones anteriores, utilizará el puerto httpdenominado .
  5. Como último recurso, seleccionará el primer puerto de la lista de puertos.

De forma predeterminada, todos los puertos y sus nombres se agregarán ServiceInstancea los metadatos.

Si por alguna razón necesita deshabilitarlo DiscoveryClient, puede establecer la siguiente propiedad application.propertiesen :

spring.cloud.kubernetes.discovery.enabled=false

Utilizado por algunos componentes de Spring Cloud DiscoveryClientpara obtener información sobre instancias de servicios locales. Para hacer esto, debe alinear el nombre del servicio de Kubernetes con spring.application.nameel atributo .

Spring Cloud Kubernetes también puede observar cambios en el catálogo de servicios de Kubernetes y actualizar DiscoveryClientla implementación . Por "ver" nos referimos a publicar un evento de latido cada spring.cloud.kubernetes.discovery.catalog-services-watch-delaymilisegundos (30000 por defecto). El evento de latido contendrá la referencia de destino, así como todas las direcciones de punto final en el espacio de nombres (para obtener detalles exactos sobre lo que se devuelve, puede consultar KubernetesCatalogWatchlas partes internas ). Este es un detalle de implementación y los oyentes de eventos de latido no deben confiar en estos detalles. En cambio, deben seguir equalsel método para ver si hay una diferencia entre dos latidos cardíacos posteriores. Nos encargaremos de devolver una correcta ejecución, obedeciendo equalsel contrato . El punto final se consultará de dos maneras.

  • Todos los espacios de nombres ( spring.cloud.kubernetes.discovery.all-namespaces=truehabilitados )
  • Espacios de nombres específicos ( spring.cloud.kubernetes.discovery.namespaceshabilitados ), por ejemplo:
primavera: 
  nube: 
    kubernetes: 
      descubrimiento: 
        espacios de nombres: 
          - espacio de nombres-a 
          - espacio de nombres-b

  • Si no tomamos las dos rutas anteriores, usaremos la resolución de espacio de nombres (Namespace Resolution).

Para habilitar esta función, debe agregar @EnableScheduling a la clase de configuración en su aplicación. De manera predeterminada, usamos la API de Endpoints (consulte kubernetes.io/docs/concepts/services-networking/service/#endpoints) para encontrar el estado actual del servicio. Pero hay otra forma, a través de EndpointSlices (kubernetes.io/docs/concepts/services-networking/endpoint-slices/). Este soporte se puede habilitar a través de una propiedad: spring.cloud.kubernetes.discovery.use-endpoint-slices=true (el valor predeterminado es falso). Por supuesto, su clúster también debe admitirlo. De hecho, si habilita esta propiedad, pero su clúster no la admite, no podremos iniciar la aplicación. Si decide habilitar este soporte, también deberá configurar Role/ClusterRole de manera adecuada. Por ejemplo:

apiVersion: rbac.authorization.k8s.io/v1 
tipo: Rol metadatos 
: 
  espacio de nombres: nombre predeterminado : 
reglas 
  del lector de espacios de nombres : 
  - apiGroups: ["discovery.k8s.io"] 
    recursos: ["endpointslices"] 
    verbos: ["get ", "lista", "ver"]

4. Descubrimiento de servicios nativos de Kubernetes (descubrimiento de servicios)

Kubernetes en sí es capaz de descubrir servicios (del lado del servidor) (consulte: kubernetes.io/docs/concepts/services-networking/service/#discovering-services). El uso de la detección de servicios nativos de Kubernetes garantiza la compatibilidad con otras herramientas como Istio (istio.io), una red de servicios capaz de equilibrar la carga, disyuntores, conmutación por error y más.

El servicio de llamada simplemente hace referencia a un nombre resoluble en el clúster de Kubernetes específico. Una implementación simple podría usar un RestTemplate Spring que apunte a un nombre de dominio completo (FQDN), como {service-name}.{namespace}.svc.{cluster}.local:{service-port}.

Además, puede utilizar Hystrix para:

Implemente el disyuntor en el lado de la persona que llama anotando @EnableCircuitBreaker en la aplicación Spring Boot.

Función alternativa, anotando el método correspondiente con @HystrixCommand(fallbackMethod=…).

5. Implementación de Kubernetes PropertySource

La forma más común de configurar una aplicación Spring Boot es crear un archivo application.properties o application.yaml o application-profile.properties o application-profile.yaml que contenga pares clave-valor que proporcionen valores personalizados para su aplicación o Arrancador de resorte. Puede anular estas propiedades especificando propiedades del sistema o variables de entorno.

Para habilitar esto, debe configurar spring.config.import=kubernetes en las propiedades de configuración de su aplicación: Actualmente, no puede usar spring.config.import para especificar un ConfigMap o Secreto para cargar, de manera predeterminada, Spring Cloud Kubernetes cargará ConfigMap y/ o Secreto basado en la propiedad spring.application.name. Si spring.application.name no está configurado, cargará un ConfigMap y/o un secreto con el nombre de la aplicación.

Si desea cargar el PropertySource de Kubernetes al inicio, como antes de 3.0.x, puede agregar spring-cloud-starter-bootstrap a la ruta de clase de su aplicación o configurar spring.cloud.bootstrap.enabled=true como una variable de entorno.

1. Utilice el origen de propiedades de ConfigMap

Kubernetes proporciona un recurso llamado ConfigMap que externaliza los parámetros para pasarlos a su aplicación en forma de pares clave-valor o archivos application.properties o application.yaml integrados. El proyecto Spring Cloud Kubernetes Config hace que las instancias de Kubernetes ConfigMap estén disponibles durante el inicio de la aplicación y activa la recarga en caliente de beans o contextos de Spring cuando se detectan cambios en las instancias de ConfigMap observadas.

Todo lo que se explica a continuación se refiere principalmente a ejemplos que usan ConfigMap, pero lo mismo es cierto para Secret, es decir, ambos admiten todas las funciones.

El comportamiento predeterminado es crear un Fabric8ConfigMapPropertySource (o KubernetesClientConfigMapPropertySource) basado en Kubernetes ConfigMap, cuyo valor metadata.name es el nombre de la aplicación Spring (definido por su propiedad spring.application.name) o un nombre personalizado definido en la aplicación. archivo de propiedades, la clave es la siguiente: spring.cloud.kubernetes.config.name.

Sin embargo, son posibles configuraciones más avanzadas y puede usar varias instancias de ConfigMap. La lista spring.cloud.kubernetes.config.sources lo hace posible. Por ejemplo, puede definir la siguiente instancia de ConfigMap:

spring: 
  application: 
    name: cloud-k8s-app 
  cloud: 
    kubernetes: 
      config: 
        name: default-name 
        namespace: default-namespace 
        sources: 
         # Spring Cloud Kubernetes busca un ConfigMap llamado c1 en el espacio de nombres default-namespace - 
         name: c1 
         # Spring Cloud Kubernetes busca un ConfigMap llamado nombre predeterminado en cualquier espacio de nombres n2 
         - espacio de nombres: n2 
         # Spring Cloud Kubernetes busca un ConfigMap llamado c3 en el espacio de nombres n3 
         - espacio de nombres: n3 
           nombre: c3

Supongo que te gusta

Origin blog.csdn.net/qq_25580555/article/details/131171431
Recomendado
Clasificación