プログラム概要
構成センターとして 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 コンテナを再起動するかどうかを選択する必要があります。