クラウド ネイティブ アーキテクチャ向けの Spring Cloud+Kubernetes 構成センター ソリューション

プログラム概要

構成センターとして Kubernetes のネイティブ configmap/secret リソースを使用すると、サービスの可用性、つまりネットワークの問題に注意を払う必要がなく、新しいコンポーネントを導入する必要がないため、運用と保守のコストが発生します。

2 つの SpringCloudKubernetes 構成センター ソリューション

2.1 プログラム紹介

2.1.1 spring-cloud-starter-kubernetes-config

spring-cloud-starter-kubernetes-config は、spring-cloud-starter-kubernetes の下のライブラリであり、kubernetes の configmap を SpringCloud Config と組み合わせるために使用されます。 spring-boot-actuator /  spring-boot-actuator-autoconfigure 2 つのパッケージの導入により、アプリケーションのホット アップデートが可能 configmap/secret が変更された場合、Pod またはプロセスを再起動せずにホット チェンジ設定を実行できます。

2.1.2 機能紹介

SpringCloud Kubernetes Config コンポーネントは、主に次の機能を提供します。

  • ConfigMap と Secret の構成変更をリアルタイムで監視して、サービス構成を更新します。
  • 定期的なポーリングでは、ConfigMap とシークレットの構成が読み込まれ、サービス構成が更新されます。

2.2 構成検出プロセス

本質的には、構成管理は etcd のストレージを利用します. まず、アプリケーションは spring-cloud-kubernetes-config パッケージを呼び出します。このパッケージは、基盤となる java によって実装された kubernetes-client を呼び出し、configmap とシークレット リソース情報を etcd から取得します。 k8s API を呼び出します。

2.3 プログラムの特徴

  • アドバンテージ:
    • K8s の組み込みリソースを使用すると、構成センター サービスの導入を検討する必要はなく、構成センター サービスの高可用性を考慮する必要もありません。
    • クラウドネイティブ アーキテクチャである構成センターは、ビジネス コードの結合なしでインフラストラクチャ レイヤーにシンクし、コストを削減します。
  • 不十分:
    • 開発/テスト環境でも、環境の一貫性を確保するために K8 を使用する必要があります。
    • 構成リソース configmap/secret を GitOps プロセスに導入する必要があります。

3つの戦闘

新しい bootstrap.yml 構成ファイルを作成し、最終的な application.yaml は k8s configmap/secret リソースを使用します。

spring: 
  profiles: 
    ## If PROFILE is empty, use dev 
    active: ${PROFILE:dev} 
  application: 
    name: springboot-config 
  cloud: 
    # k8s configmap/secret api を監視して構成を取得する
    kubernetes: 
      reload: 
        #構成スイッチを自動的に更新するopen
        有効に設定: true 
        #構成情報更新モード: ポーリングはアクティブプル、イベントはイベント通知
        モード: ポーリング
        #アクティブプル間隔は 500 ミリ秒
        period: 500 
        #Secret の変更を監視して更新
        監視を実行するかどうか- secrets: true 

      config:
        名前空間: springconfig
        名前: ${spring.application.name}-cm 
        enable-api: true 
      # モードは configmap の取得のみを開始し、secret が enable-api を使用できるようにします
      secrets: 
        namespace: springconfig 
        name: ${spring.application.name}-secret 
        #labels: #Label ラベル名を指定し、このラベルに従って Secret をフィルタリングし、構成を読み取ります
        # secret: enabled #Customized Label 


management: 
  endpoint: 
    restart :
      有効: true 
    health:
      有効: true 
    info:
      有効: true
コードをコピー

ここでは、構成を取得する 3 つの方法をシミュレートします。

構成プロパティ
環境

3.1 コンフィグマップ

3.1.1 値法

// -----------------value configmap----------------- 
@Value("${config.applicationVersion}")
プライベート文字列 applicationVersion; 

@Value("${config.app.domain}")
プライベート文字列ドメイン。


// configmap 値
@RequestMapping("/value") 
public String value() { 
    return applicationVersion + "|" + ドメイン; 
}
复制代码

3.1.2 構成プロパティ

@Data 
@ConfigurationProperties(prefix = "config") 
@Component 
public class SpringBootConfigProperties { 
    private String applicationVersion; 

    public String getApplicationVersion() { 
        return applicationVersion; 
    } 
} 

// -----------------properties configmap----------------- 
@Autowired
プライベート SpringBootConfigProperties springBootConfigProperties; 

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

3.1.3 環境

// ---env configmap & secret----------------- 
@Autowired
プライベート環境 environment; 

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

3.2 秘密

3.2.1 値

// -----------------値の秘密----------------- 
@Value("${secret.username}")
プライベート文字列のユーザー名。

@Value("${secret.password}")
プライベート文字列パスワード; 


// シークレット値
@RequestMapping("/valuesecret") 
public String values() { 
    return username + "|" + パスワード; 
}
复制代码

3.2.2 構成プロパティ

@ConfigurationProperties("secret") 
@Component 
@Data 
public class SpringBootConfigPropertiesSecret {
    プライベート文字列ユーザー名; 
    プライベート文字列パスワード; 

} 

// -----------------プロパティ シークレット----------------- 
@Autowired
プライベート SpringBootConfigPropertiesSecret springBootConfigPropertiesSecret; 

// 秘密のプロパティ
@RequestMapping("/propertiessecret") 
public String properties() { 
    return springBootConfigPropertiesSecret.getUsername() + "|" + springBootConfigPropertiesSecret.getPassword(); 
}
复制代码

3.2.3 環境

// ---env configmap & secret----------------- 
@Autowired
プライベート環境 environment; 

// シークレット env 
@RequestMapping("/envsecret") 
public String envs() { 
    return environment.getProperty("secret.username") + "|" + environment.getProperty("secret.password"); 
}
复制代码

3.3 プロジェクトのディレクトリ構造

3.4 K8s 展開ファイル

3.4.1 展開

ここで単純な springboot Web アプリケーションをシミュレートし、Web インターフェースを提供して、取得した configmap/secret コンテンツを返します。

apiVersion: アプリ/v1
種類: デプロイ メタ
データ:
  名前空間: springconfig
  名前: springboot-config
  ラベル:
    アプリ: springboot-config
仕様:
  レプリカ: 1
  セレクター: 
    matchLabels:
      アプリ: springboot-config
  テンプレート:
    メタデータ:
      ラベル:
        アプリ: springboot-config 
    spec: 
      containers: 
        - name: springboot-config 
          image: ccr.ccs.tencentyun.com/xxxxxxxxxxxxxops-dev/springbootconfig:img_v2 
          imagePullPolicy: IfNotPresent 
          # ここでその変数を使用して構成ファイルを指定 env 
          : 
            - name: PROFILE
              値: prod
          ポート: 
            - containerPort: 8080
              プロトコル: TCP 

          livenessProbe: 
            httpGet:
              ポート: 8080
              パス: /actuator/health 
            periodSeconds: 10 
            initialDelaySeconds: 
            3terminationGracePeriodSeconds: 10 
            failureThreshold: 5 
            timeoutSeconds: 10 
          readinessProbe: 
            httpGet:
              ポート: 8080 
              path: /アクチュエーター/ヘルス
            initialDelaySeconds: 5 
            periodSeconds: 10 
            failureThreshold: 5
            timeoutSeconds: 10
コードをコピーする

3.4.2 コンフィグマップ

dev/test/prod 環境コンテンツを含む configmap リソースを作成します。具体的にはその構成を使用し、デプロイメントで PROFILE 環境変数を渡します。

種類: ConfigMap 
apiVersion: v1
メタデータ:
  名前: springboot-config-cm
  名前空間: springconfig
データ: 
  application.yml: |- 
    spring:
      プロファイル: dev 
    config: 
      applicationVersion: dev-0.0.1 
      app:
        ドメイン: dev.web.app. com 
        api-domain: 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-ポート: 8118 
        cors-allowed-origins: http://local.web.app.com、https://dev.web.app.com 
    ---
    春:
      プロファイル: テスト
    構成:
      applicationVersion: test-0.0.1
      アプリ:
        ドメイン: test.web.app.com 
        API ドメイン: 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 
    - -- 
    spring:
      プロファイル: prod 
    config: 
      applicationVersion: prod-0.0.1 
      app: 
        domain: 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
コードをコピー

3.4.3 シークレット

シークレットには比較的機密性の高い情報が保存されます (K8s のシークレットは base64 暗号化を使用しますが、vault と連携して後で K8s 構成のセキュリティ問題を解決できます)

apiVersion: v1
種類: シークレット
タイプ: 不透明
メタデータ:
  名前: springboot-config-secret
  名前空間: springconfig
  ラベル:
    シークレット: 有効化
データ: 
  secret.username: YWRtaW4NCg== 
  secret.password: MTIzNDU2
复制代码

3.4.4 サービス

Web アプリケーションであるため、サービス公開インターフェースを提供します。

apiVersion: v1
種類: サービス
メタデータ:
  名前: springbootconfig
  名前空間: springconfig
  ラベル:
    アプリ: springboot-config
仕様:
  ポート: 
    - ポート: 8080
      プロトコル: TCP
      ターゲットポート: 8080
  タイプ: ClusterIP
  セレクター:
    アプリ: springboot-config
复制代码

3.5 プロジェクトのソースコード

プロジェクトの場所:  github.com/redhatxl/cl…

3.6 設定パラメータ

3.6.1 ConfigMap の構成可能なパラメーター

パラメータ名 タイプ デフォルト パラメータ 説明
spring.cloud.kubernetes.config.enabled ブール値 真実 Config 動的構成を有効にするかどうか
spring.cloud.kubernetes.config.name ${spring.application.name} 検索する ConfigMap の名前を設定します
spring.cloud.kubernetes.config.namespace クライアント名前空間 ConfigMap リソースを探す Kubernetes 名前空間を設定する
spring.cloud.kubernetes.config.paths リスト ヌル ConfigMap 読み込みインスタンスのパスを設定する
spring.cloud.kubernetes.config.enableApi ブール値 真実 ConfigMap は、API を介して使用インスタンスを有効または無効にします

3.6.2 秘密の構成可能なパラメータ

パラメータ名 タイプ デフォルト パラメータ 説明
spring.cloud.kubernetes.secrets.enabled ブール値 真実 シークレットの動的構成を有効にするかどうか
spring.cloud.kubernetes.secrets.name ${spring.application.name} 検索するシークレットの名前を設定します
spring.cloud.kubernetes.secrets.namespace クライアント名前空間 シークレット リソースを探す Kubernetes 名前空間を設定する
spring.cloud.kubernetes.secrets.labels 地図 ヌル Secret の検索に使用するラベルを設定します
spring.cloud.kubernetes.secrets.paths リスト ヌル Secret をインストールするパスを設定する
spring.cloud.kubernetes.secrets.enableApi ブール値 間違い API を介した Secret のリッスンを有効または無効にします

3.6.3 構成可能なパラメータのリロード

パラメータ名 タイプ デフォルト パラメータ 説明
spring.cloud.kubernetes.reload.enabled ブール値 間違い 動的構成の監視を開始する
spring.cloud.kubernetes.reload.monitoring-config-maps ブール値 真実 ConfigMap の変更を監視できるようにします
spring.cloud.kubernetes.reload.monitoring-secrets ブール値 間違い シークレットの変更を監視できます
spring.cloud.kubernetes.reload.strategy 列挙型 リフレッシュ 更新戦略を構成します。 – refresh (更新) – restart_context (Spring コンテナーを再起動します) – shutdown (アプリケーションを強制終了して Kubernetes を再起動させます))
spring.cloud.kubernetes.reload.mode 列挙型 イベント 監視戦略を指定します。 – イベント: 構成が変更されたときに更新します – ポーリング: 構成の変更を定期的に検出して、構成を更新します
spring.cloud.kubernetes.reload.period 間隔 15秒 ポーリング戦略を使用する場合の検出間隔

4つのテスト

サービスは springconfig 名前空間にデプロイされます

4.1 コンフィグマップ

  • ビュー値

  • プロパティを表示

  • 環境を見る

cm コンテンツの変更 (  k edit cm -n springconfig springboot-config-cm )、コンテンツの表示

結論: value は pull モードを使用しており、コンテンツの変更を完了できません.env/properties メソッドを使用してコンテンツを取得し、cm で変更され、pull サイクルの理解に従って有効になります.

4.2 秘密

  • ビュー値

  • プロパティを表示

  • 環境を見る

シークレット コンテンツの変更 (k edit secret -n springconfig springboot-config-secret)

  • 結論: value は pull モードを使用しており、コンテンツの変更を完了できません.env/properties メソッドを使用してコンテンツを取得し、cm で変更され、pull サイクルの理解に従って有効になります.

他に5人

ビジネス シナリオに応じてプル モードとプル頻度を選択し、影響範囲を制御するために IOC コンテナを再起動するかどうかを選択する必要があります。

おすすめ

転載: blog.csdn.net/AS011x/article/details/126676432