Kubernetesクラスターの構成データを使用してSpringBootアプリケーションをデプロイしようとしています。 Kubernetesクラスターから読み取ることでメッセージを出力する単純なRestControllerがあります。
private String message = "Message not coming from Kubernetes config map";
@RequestMapping(value="/echo", method=GET)
public String printKubeConfig() {
return message;
}
Application.ymlで構成マップの名前を指定しました
spring:
application:
name: echo-configmap
echo-configmap
apiVersion: v1
kind: ConfigMap
metadata:
name: echo-configmap
data:
application.properties: |-
message=Hello from dev Kubernetes Configmap
application_qa.properties: |-
message=Hello from qa Kubernetes Configmap
Qa、int、testなどのようないくつかの環境があります
これは Helm の良いユースケースのように聞こえます。アプリケーションを ヘルムチャート としてデプロイできます。これにより、基本的に、テンプレートからKubernetesリソース(ConfigMaps、Deploymentsなどの必要なもの)を生成できます。
Helm Chartsのドキュメント を使用してHelmの使用を開始できます。 helm create
を使用してグラフを作成すると、templates/
ディレクトリが作成されます。このディレクトリに、ConfigMap用に次のYAMLテンプレートを配置できます。
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ printf "%s-%s" .Release.Name .Chart.Name }}
labels:
app: {{ .Chart.Name | trunc 63 | trimSuffix "-" }}
chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
data:
application.properties: |-
message={{ .Values.properties.message }}
Deploymentオブジェクトに2番目のYAMLテンプレートを追加できます(実際には、helm create
はすでに適切なデフォルトのデプロイメントを作成します)。 ConfigMapをボリュームとして追加するだけです。
containers:
- name: {{ .Chart.Name }}
# [...]
volumes:
- name: property-volume
mountPath: /etc/your-app/properties
volumes:
- name: property-volume
configMap:
name: {{ printf "%s-%s" .Release.Name .Chart.Name }}
各ヘルムチャートにはvalues.yaml
ファイルがあり、このファイルでデフォルト値を定義して、テンプレートの入力に使用できます。このデフォルトファイルは次のようになります(上記のConfigMapテンプレートには{{ .Values.properties.message }}
式が含まれていることに注意してください)。
replicaCount: 1
image:
repository: your-docker-image
tag: your-docker-tag
properties:
message: Hello!
次に、このヘルムチャートと helm install
コマンド を使用して、さまざまな構成でアプリケーションを何度でもデプロイします。 values.yaml
ファイルから特定の値をオーバーライドするさまざまなYAMLファイルを提供するか、--set
を使用して個々の値をオーバーライドできます。
$ helm install --name dev --set image.tag=latest --set replicaCount=1 path/to/chart
$ helm install --name prod --set image.tag=stable --set replicaCount=3 --set properties.message="Hello from prod" path/to/chart
2番目の質問について:もちろん、ヘルムチャートをバージョン管理に入れる必要があります。次に、 helm upgrade
コマンド を使用して、すでにデプロイされているアプリケーションに変更を適用できます。
ほとんどのボックスにインストールする以外のツールを使用せずに、必要なものが得られると思う答えを提供してみましょう。最初にこれを試してみてください。アプローチの管理と拡張が困難になった場合は、より洗練されたものに移行してください。
k8s/configmaps
などのフォルダーを作成し、環境ごとに1つの構成マップを作成します。
k8s/configmaps/properties.dev.yaml
k8s/configmaps/properties.qa.yaml
k8s/configmaps/properties.sit.yaml
k8s/configmaps/properties.uat.yaml
各構成マップには、環境固有の設定が含まれている必要があります。
次のように、環境ごとにk8s名前空間を作成します。
application-dev
application-qa
application-sit
application-uat
ここで少しバッシュが役立ちます:
#!/usr/bin/env bash
# apply-configmaps.sh
namespace="application-${ENVIRONMENT}"
for configmap in ./k8s/configmaps/*.${ENVIRONMENT}.yml; do
echo "Processing ConfigMap $configmap"
kubectl apply -n ${namespace} -f $configmap
done
これで、任意の環境のまたは更新 configmapsを作成するために必要なことは次のとおりです。
ENVIRONMENT=dev ./update-configmaps.sh
これで、CI/CDパイプラインを作成できます。configmapソースが変更された場合は、上記のコマンドを実行するだけです。
プリミティブコマンドに基づいており、特別なツールはありません。
同じ問題を解決するために、より洗練されたツールに飛び込む前に、この基本的な「第一原理」アプローチに従うことを強くお勧めします。多くの場合、多くの場合、多くの労力をかけずに自分でそれを行い、重要な概念を学び、より洗練されたツールを後で保存することができます。あなたは本当にそれを必要としています。
お役に立てば幸いです。
非秘密データの各gitプロジェクトにこのツールを使用します。 https://github.com/kubernetes-sigs/kustomize
メタデータでは、ポッドをフィルタリングできます
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: mycomponent
env: dev
tier: backend
name: mycomponent
namespace: myapplication
kubectl get pods -n myapplication -l env = dev、tier = backend、app = mycomponent
通常、qa
で実行されているアプリケーションがproduction
で実行されているアプリケーションに干渉しないようにする必要があります。 Kubernetesを使用すると、この種の分離を取得できます 環境ごとに異なる名前空間を使用 。このように、prod
名前空間上のオブジェクトはqa
名前空間上のオブジェクトとは異なります。もう1つのより高価なアプローチは、さまざまな環境にさまざまなk8sクラスターを使用することです。
この設定があれば、デプロイ先の特定の環境の名前空間にアプリケーションをデプロイし、その名前空間にDeployment
オブジェクトを作成します。このDeployment
は、SpringBootプロパティを含むConfigMap
オブジェクトを利用します。たとえば、これをConfigMap
echo-propertiesと呼びましょう。
そうすれば、すべての名前空間にecho-propertiesConfigMap
の一意のコピーがあります。それぞれに、それが属する環境の特定の構成が含まれています。
Deployment
オブジェクトは、環境変数を使用するかファイルを読み取ることにより、ConfigMap
プロパティを消費します。ここで重要なのは、echo-propertiesConfigMap
データを変更すると、アプリケーションはそれらの新しい値を認識しないということです。デフォルト。 Kubernetesにはこれまでこの機能がありません。 ConfigMap
sを動的構成ソリューションであるSpringCloudConfigと比較することはできません。
同様の動作(ただし、まったく同じではない)を取得するアプローチは、クラスターで fabric8 ConfigMap Controller を使用することです。このコントローラーはクラスター上で実行されるプロセスであり、ConfigMap
が変更されるたびにアプリケーションを再起動して、新しい構成値を読み取ります。
構成が変更されるたびにアプリケーションを再起動したくない場合は、変更される可能性のある値についてはSpring Cloud Configに固執し、アプリケーション名など、変更されない他のプロパティについてはConfigMaps
を使用する必要があります。またはポート。
ユースケースは、spring-cloud-config
-- https://cloud.spring.io/spring-cloud-config/ を確認する必要があるように聞こえます。
Config-serverは、gitリポジトリに配置できる構成を提供するインフラストラクチャコンポーネントです。
Config-clientアプリケーションは、起動時にconfig-server
に接続し、現在のプロファイルに適用可能な構成をロードします。
環境ごとに異なるブランチを作成することも、環境ごとにプロファイルを使用することもできます。 kubernetesデプロイメントマニフェストで、SPRING_PROFILES_ACTIVE
環境変数を設定してプロファイルを設定できます。