Solution de centre de configuration Spring Cloud+Kubernetes pour l'architecture cloud native

Un aperçu du programme

L'utilisation des ressources configmap/secret natives de Kubernetes en tant que centre de configuration n'a pas besoin de prêter attention à la disponibilité des services, c'est-à-dire aux problèmes de réseau, et n'a pas besoin d'introduire de nouveaux composants, ce qui entraîne des coûts d'exploitation et de maintenance.

Deux solutions de centre de configuration SpringCloudKubernetes

2.1 Présentation du programme

2.1.1 spring-cloud-starter-kubernetes-config

spring-cloud-starter-kubernetes-config est une bibliothèque sous spring-cloud-starter-kubernetes, qui est utilisée pour combiner le configmap de kubernetes avec SpringCloud Config. spring-boot-actuator /  spring-boot-actuator-autoconfigure L'introduction des deux packages permet à l'application d'être mise à jour à chaud. Lorsque le configmap/secret change, la configuration du changement à chaud peut être effectuée sans redémarrer le pod ou le processus.

2.1.2 Présentation des fonctions

Le composant SpringCloud Kubernetes Config fournit principalement les fonctions suivantes :

  • Surveillez les changements de configuration ConfigMap et Secret en temps réel pour mettre à jour les configurations de service.
  • L'interrogation régulière charge les configurations ConfigMap et Secret pour mettre à jour les configurations de service.

2.2 Processus de découverte de configuration

Essentiellement, la gestion de la configuration utilise le stockage d'etcd. Tout d'abord, l'application appelle le package spring-cloud-kubernetes-config, qui appelle le client kubernetes implémenté par le Java sous-jacent, et obtient la configmap et les informations sur les ressources secrètes d'etcd par appelant l'API k8s.

2.3 Caractéristiques du programme

  • avantage:
    • En utilisant les ressources intégrées de K8, il n'est pas nécessaire d'envisager l'introduction de services de centre de configuration, ni de prendre en compte la haute disponibilité des services de centre de configuration.
    • Architecture cloud-native, le centre de configuration s'enfonce dans la couche infrastructure, sans couplage de code métier, réduisant les coûts.
  • insuffisant:
    • L'environnement de développement/test doit également utiliser des K8 pour assurer la cohérence de l'environnement.
    • La ressource de configuration configmap/secret doit être introduite dans le processus GitOps.

Trois combats

Créez un nouveau fichier de configuration bootstrap.yml, et l'application finale.yaml utilise la ressource k8s configmap/secret.

spring: 
  profiles: 
    ## Si PROFILE est vide, utilisez dev 
    active: ${PROFILE:dev} 
  application: 
    name: springboot-config 
  cloud: 
    # Monitor k8s configmap/secret api to get configuration 
    kubernetes: 
      reload: 
        #Automatically update the configuration switch Set to open 
        enabled : true 
        #Update configuration information mode : polling is active pull, event is event notification 
        mode : polling 
        #Active pull interval is 500 milliseconds 
        period: 500 
        #Whether to monitor Secret changes to perform update 
        monitoring- secrets: true 

      config: 
        espace de noms : 
        nom de springconfig : ${spring.application.name}-cm 
        enable-api : vrai 
      # le mode ne démarre que l'acquisition de configmap, permet au secret d'utiliser enable-api
      secrets : 
        namespace : springconfig 
        name : ${spring.application.name}-secret 
        #labels : #Spécifiez le nom du libellé du libellé, filtrez le secret en fonction de ce libellé et lisez la configuration 
        # secret : activé #Gestion personnalisée des libellés


: 
  endpoint : 
    redémarrez : 
      activé : vrai 
    santé : 
      activé : vrai 
    info : 
      activé : vraiCopier 
le code

Trois méthodes d'obtention de configuration sont simulées ici :


Environnement de propriétés de configuration

3.1 Carte de configuration

3.1.1 méthode de la valeur

// -----------------valeur configmap----------------- 
@Value("${config.applicationVersion}") 
applicationVersion de chaîne privée ; 

@Value("${config.app.domain}") 
domaine de chaîne privé ; 


// valeur de configmap 
@RequestMapping("/value") 
public String value() { 
    return applicationVersion + "|" + domaine ; 
}
复制代码

3.1.2 Propriétés de configuration

@Data 
@ConfigurationProperties(prefix = "config") 
@Component 
public class SpringBootConfigProperties { 
    chaîne privée applicationVersion ; 

    public String getApplicationVersion() { 
        return applicationVersion ; 
    } 
} 

// -----------------properties configmap----------------- 
@Autowired 
private SpringBootConfigProperties springBootConfigProperties; 

// configmap properties 
@RequestMapping("/properties") 
public String property() { 
    return springBootConfigProperties.getApplicationVersion(); 
}
复制代码

3.1.3 Environnement

// -----------------env configmap & secret----------------- 
@Autowired 
environnement d'environnement privé ; 

// configmap env 
@RequestMapping("/env") 
public String env() { 
    return environment.getProperty("config.applicationVersion") + "|" + environnement.getProperty("config.app.domain"); 
}
复制代码

3.2 Secrète

3.2.1 valeur

// -----------------valeur secret----------------- 
@Valeur("${secret.nomutilisateur}") 
nom d'utilisateur de chaîne privée ; 

@Value("${secret.password}") 
Chaîne privée mot de passe ; 


// valeur secrète 
@RequestMapping("/valuesecret") 
public String values() { 
    return username + "|" + mot de passe ; 
}
复制代码

3.2.2 Propriétés de configuration

@ConfigurationProperties("secret") 
@Component 
@Data 
public class SpringBootConfigPropertiesSecret { 
    chaîne privée nom d'utilisateur ; 
    mot de passe de chaîne privé ; 

} 

// -----------------properties secret----------------- 
@Autowired 
private SpringBootConfigPropertiesSecret springBootConfigPropertiesSecret ; 

// propriétés secrètes 
@RequestMapping("/propertiessecret") 
public String properties() { 
    return springBootConfigPropertiesSecret.getUsername() + "|" + springBootConfigPropertiesSecret.getPassword(); 
}
复制代码

3.2.3 Environnement

// -----------------env configmap & secret----------------- 
@Autowired 
environnement d'environnement privé ; 

// secret env 
@RequestMapping("/envsecret") 
public String envs() { 
    return environment.getProperty("secret.username") + "|" + environnement.getProperty("secret.password"); 
}
复制代码

3.3 Structure du répertoire du projet

3.4 Fichier de déploiement K8s

3.4.1 Déploiement

Simulez une simple application Web springboot ici, fournissez une interface Web et renvoyez le contenu configmap/secret obtenu.

apiVersion : apps/v1 
kind : Deployment 
metadata : 
  namespace : springconfig 
  name : springboot-config 
  labels : 
    app : springboot-config 
spec : 
  répliques : 1
  sélecteur : 
    matchLabels : 
      app : springboot-config 
  template : 
    metadata : 
      labels : 
        app : springboot-config 
    spec : 
      conteneurs : 
        - nom : 
          image springboot-config : ccr.ccs.tencentyun.com/xxxxxxxxxxxxxops-dev/springbootconfig:img_v2 
          imagePullPolicy : IfNotPresent 
          # Utilisez cette variable ici pour spécifier le fichier de configuration 
          env : 
            - nom : PROFILE
              valeur : prod 
          ports : 
            - containerPort : 8080 
              protocole : TCP 

          livenessProbe : 
            httpGet : 
              port : 8080 
              chemin : /actuator/health 
            periodSeconds : 10 
            initialDelaySeconds : 3 
            terminateGracePeriodSeconds : 10 
            failureThreshold : 5 
            timeoutSeconds : 10 
          readinessProbe : 
            httpGet : 
              port : 8080 
              chemin : / actionneur/santé 
            initialDelaySeconds : 5 
            periodSeconds : 10 
            failureThreshold : 5
            timeoutSecondes : 10Copier le 
code

3.4.2 Carte de configuration

Créez une ressource configmap contenant le contenu de l'environnement dev/test/prod. Utilisez spécifiquement cette configuration et transmettez la variable d'environnement PROFILE dans le déploiement.

kind : ConfigMap 
apiVersion : v1 
metadata : 
  name : springboot-config-cm 
  namespace : springconfig 
data : 
  application.yml : |- 
    spring : 
      profiles : dev 
    config : 
      applicationVersion : dev-0.0.1 
      app : 
        domaine : dev.web.app. com 
        domaine api : devapi.web.app.com 
        auth-callback-api : https://dev.web.app.com/dev/wx/bind-callback 
        aws-proxy-host : 192.168.9.82 
        aws-proxy- port : 8118 
        cors-allowed-origins : http://local.web.app.com, https://dev.web.app.com 
    --- 
    spring : 
      profiles : test 
    config :
      applicationVersion : test-0.0.1 
      app : 
        domaine : test.web.app.com 
        api-domain : testapi.web.app.com 
        auth-callback-api : https://test.web.app.com/dev/wx /bind-callback 
        aws-proxy-host : 192.168.9.82 
        aws-proxy-port : 8118 
        cors-allowed-origins : http://local.web.app.com, https://test.web.app.com 
    - -- 
    printemps : 
      profils : prod 
    config : 
      applicationVersion : prod-0.0.1 
      app : 
        domaine : web.app.com 
        api-domain : api.web.app.com 
        auth-callback-api : https://web.app. com/dev/wx/bind-callback 
        aws-proxy-host : 192.168.9.82
        aws-proxy-port : 8118 
        cors-allowed-origins : http://web.app.com, https://web.app.com 
Copier le code

3.4.3 Secret

Le secret stocke des informations relativement sensibles (bien que le secret dans K8s utilise le cryptage base64, il peut coopérer avec le coffre-fort pour résoudre le problème de sécurité de la configuration K8s plus tard)

apiVersion : v1 
kind : 
Type de secret : Opaque 
metadata : 
  name : springboot-config-secret 
  namespace : springconfig 
  labels : 
    secret : enabled 
data : 
  secret.username : YWRtaW4NCg== 
  secret.password : MTIzNDU2
复制代码

3.4.4 Entretien

Puisqu'il s'agit d'une application Web, elle fournit une interface de service exposée.

apiVersion : v1 
kind : Service 
metadata : 
  name : springbootconfig 
  namespace : springconfig 
  labels : 
    app : springboot-config 
spec : 
  ports : 
    - port : 8080 
      protocol : TCP 
      targetPort : 8080 
  type : clusterIP 
  selector : 
    app : springboot-config
复制代码

3.5 Code source du projet

Emplacement du projet :  github.com/redhatxl/cl…

3.6 Paramètres de configuration

3.6.1 Paramètres configurables de ConfigMap

le nom du paramètre taper Valeurs par défaut Paramètre Description
spring.cloud.kubernetes.config.enabled booléen vrai Activer ou non la configuration dynamique de Config
spring.cloud.kubernetes.config.name Chaîne ${spring.application.name} Définissez le nom de la ConfigMap à rechercher
spring.cloud.kubernetes.config.namespace Chaîne Espace de noms client Définir l'espace de noms Kubernetes dans lequel rechercher les ressources ConfigMap
spring.cloud.kubernetes.config.paths Liste nul Définir le chemin de l'instance de chargement de ConfigMap
spring.cloud.kubernetes.config.enableApi booléen vrai ConfigMap active ou désactive les instances d'utilisation via l'API

3.6.2 Paramètres configurables secrets

le nom du paramètre taper Valeurs par défaut Paramètre Description
spring.cloud.kubernetes.secrets.enabled booléen vrai Activer ou non la configuration dynamique secrète
spring.cloud.kubernetes.secrets.name Chaîne ${spring.application.name} Définissez le nom du secret à trouver
spring.cloud.kubernetes.secrets.espace de noms Chaîne Espace de noms client Définir l'espace de noms Kubernetes à rechercher pour les ressources secrètes
spring.cloud.kubernetes.secrets.labels Carte nul Définissez l'étiquette utilisée pour trouver le secret
spring.cloud.kubernetes.secrets.chemins Liste nul Définissez le chemin d'installation de Secret
spring.cloud.kubernetes.secrets.enableApi booléen FAUX Activer ou désactiver l'écoute de Secret via l'API

3.6.3 Recharger les paramètres configurables

le nom du paramètre taper Valeurs par défaut Paramètre Description
spring.cloud.kubernetes.reload.enabled booléen FAUX Démarrer la surveillance dynamique de la configuration
spring.cloud.kubernetes.reload.monitoring-config-maps booléen vrai Permet de surveiller les changements dans la ConfigMap
spring.cloud.kubernetes.reload.monitoring-secrets booléen FAUX Permet de surveiller les modifications secrètes
spring.cloud.kubernetes.reload.strategy Énumération rafraîchir Configurez la stratégie de mise à jour : – refresh (mise à jour) – restart_context (redémarrez le conteneur Spring) – shutdown (tuez l'application pour que Kubernetes la redémarre))
spring.cloud.kubernetes.reload.mode Énumération événement Spécifiez la stratégie de surveillance : – événement : mettre à jour lorsque la configuration change – interrogation : détecter périodiquement les changements de configuration pour mettre à jour la configuration
spring.cloud.kubernetes.reload.période Durée 15s Intervalle de détection lors de l'utilisation de la stratégie d'interrogation

quatre épreuves

Le service est déployé sous l'espace de noms springconfig

4.1 Carte de configuration

  • afficher la valeur

  • voir les propriétés

  • voir env

Modifier le contenu du cm (  k edit cm -n springconfig springboot-config-cm ), afficher le contenu

Conclusion : la valeur utilise le mode pull et ne peut pas terminer le changement de contenu. La méthode env/properties est utilisée pour obtenir le contenu, et elle sera modifiée avec cm, et elle prendra effet en fonction de la compréhension du cycle pull.

4.2 Secrète

  • afficher la valeur

  • voir les propriétés

  • voir env

Modifier le contenu secret (k edit secret -n springconfig springboot-config-secret)

  • Conclusion : la valeur utilise le mode pull et ne peut pas terminer le changement de contenu. La méthode env/properties est utilisée pour obtenir le contenu, et elle sera modifiée avec cm, et elle prendra effet en fonction de la compréhension du cycle pull.

cinq autres

Il est toujours nécessaire de sélectionner le mode pull et la fréquence pull en fonction du scénario métier, et de redémarrer ou non le conteneur IOC pour contrôler la portée d'influence.

Je suppose que tu aimes

Origine blog.csdn.net/AS011x/article/details/126676432
conseillé
Classement