ConfigMap のホット アップデートを実現する 3 つの一般的な方法: サイドカー、CI スクリプト、カスタム コントローラーの使用

目次

バックグラウンド

方法 1: ConfigMap-Reload サイドカーを使用する

方法 2: CI スクリプトを使用して ConfigMap ホット アップデートを実装する

方法 3: コントローラーを使用して ConfigMap ホット アップデートを実装する

結論は


バックグラウンド

ConfigMap は、Kubernetes に構成情報を保存するために使用されるリソース タイプです。Kubernetes クラスターでは、アプリケーション構成情報を保存するために ConfigMap が広く使用されています。これらの構成情報には、環境変数、構成ファイル、コマンド ライン パラメーターなどが含まれる場合があります。アプリケーションの実行中に構成情報を更新する必要がある場合は、アプリケーションを再起動する必要があります。ただし、本番環境ではアプリケーションの再起動により影響が出る可能性があるため、ConfigMap のホットアップデートを実現するには何らかの方法が必要です。この記事では、ConfigMap ホット アップデートを実装する 3 つの方法を紹介し、これらの方法の長所と短所を分析します。

方法 1: ConfigMap-Reload サイドカーを使用する

ConfigMap-Reload Sidecar は、非常に人気のある ConfigMap ホット アップデート方法です。このメソッドの基本的な考え方は、アプリケーションのポッドでサイドカー コンテナを起動し、ConfigMap の変更を監視することです。ConfigMap が変更されると、Sidecar コンテナはアプリケーションの構成情報を再ロードし、HTTP リクエストを通じて構成情報を再読み取るようにアプリケーションに通知します。

ConfigMap-Reload Sidecar の利点は、実装が簡単で、ミラーの形式で迅速に展開できることです。また、Sidecarコンテナとアプリケーションコンテナは同じPod内で動作するため、同じネットワークとストレージ容量を共有できるため、データ転送速度が速く、同期更新も容易に実現できます。

ただし、ConfigMap-Reload Sidecar にはいくつかの欠点もあります。まず、ConfigMap 内の環境変数が変更された場合、それを有効にするためにアプリケーションを再起動する必要があります。次に、サイドカー コンテナとアプリケーション コンテナは同じポッド内で実行されるため、ライフサイクルも一貫しており、不必要な再起動が発生する可能性があります。

最初の方法を使用する場合は、prometheus の configmap-reload イメージを使用できます。yaml ファイルの例を次に示します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: myapp
          env:
            - name: MY_APP_CONFIG
              valueFrom:
                configMapKeyRef:
                  name: myapp-config
                  key: config.yaml
        - name: config-reloader
          image: prometheus-community/configmap-reload:v0.5.0
          args:
            - --webhook-url=http://localhost:5000/-/reload
            - --volume-dir=/etc/config
            - --watched-dir=/etc/config
          volumeMounts:
            - name: config-volume
              mountPath: /etc/config
      volumes:
        - name: config-volume
          configMap:
            name: myapp-config

この yaml ファイルでは、2 つのコンテナーを使用します。1 つはアプリケーションで、もう 1 つは configmap-reload のサイドカーです。ConfigMap 内の構成ファイルをアプリケーション コンテナーの環境変数にマウントし、ConfigMap を config-reloader コンテナーにマウントします。config-reloader コンテナでは、ConfigMap の watched-dir と volume-dir を指定し、webhook-url を localhost:5000/-/reload として指定しました。ConfigMap が変更されると、config-reloader は HTTP POST リクエストを送信します。 、これによりアプリケーションの再読み取りがトリガーされます。 

方法 2: CI スクリプトを使用して ConfigMap ホット アップデートを実装する

2 番目の方法は、CI スクリプトを使用して ConfigMap ホット アップデートを実装することです。このメソッドの基本的な考え方は、ConfigMap が変更されたときに ConfigMap 内のファイルの MD5 値を計算し、それをデプロイメントのアノテーションまたはラベルに書き込むことです。このようにして、次回のデプロイ時に、Kubernetes がローリング方式でポッドを自動的に更新し、ホット アップデートを実現します。

このアプローチの利点は、実装が簡単で、CI/CD プロセスを通じて自動的にデプロイできることです。さらに、Kubernetes は Pod のロールと更新を自動的に行うため、手動操作が不要となり、人的エラーが削減されます。

ただし、この方法にはいくつかの欠点もあります。まず、CI スクリプトを作成する必要があり、構成は複雑で、特定のプログラミング スキルが必要です。第 2 に、このメソッドはファイル タイプの ConfigMap にのみ適用できます。ConfigMap 内の構成情報が環境変数またはコマンド ライン パラメーターである場合、有効にするためにアプリケーションを再起動する必要があります。

2 番目のアプローチでは、Pod のアノテーションまたはラベルを自動的に更新する CI スクリプトを作成する必要があります。スクリプトの例を次に示します。

#!/bin/bash
set -e

configmap_name=myapp-config
deployment_name=myapp
namespace=default

# Get current deployment image tag
current_image_tag=$(kubectl get deployment $deployment_name -n $namespace -o jsonpath='{.spec.template.spec.containers[0].image}' | cut -d: -f2)

# Get current configmap md5
configmap_md5=$(kubectl get configmap $configmap_name -n $namespace -o jsonpath='{.data.config\.yaml}' | md5sum | cut -d' ' -f1)

# Update deployment image tag and configmap md5 as annotations
kubectl patch deployment $deployment_name -n $namespace -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"configmap-md5\":\"$configmap_md5\"}}},\"spec\":{\"containers\":[{\"name\":\"myapp\",\"image\":\"myapp:$configmap_md5\"}]}}}"

スクリプトは、現在のデプロイメントで使用されているイメージ タグと ConfigMap の MD5 値を取得し、kubectl patch コマンドを使用してデプロイメントのコメントとコンテナー イメージ タグを更新します。ConfigMap が変更された場合、このスクリプトを実行すると、Deployment のイメージ タグと ConfigMap の MD5 値を自動的に更新できます。

方法 3: コントローラーを使用して ConfigMap ホット アップデートを実装する

3 番目の方法は、コントローラーを使用して ConfigMap ホット アップデートを実装することです。

このメソッドの基本的な考え方は、ConfigMap の変更イベントをリッスンすることで自動更新を実現するコントローラーを作成することです。ConfigMap が変更されると、コントローラーは対応するポッドのアノテーションまたはラベルを更新し、ポッドの更新をトリガーします。

方法 2 と同様に、コントローラーを使用して ConfigMap ホット アップデートを実装する利点は、高度な自動化が可能で、手動操作が不要で、人的エラーを削減できることです。同時に、方法 1 および方法 2 と比較して、この方法はより柔軟であり、環境変数、コマンド ライン パラメーター、ファイルなどを含むさまざまなタイプの ConfigMap をサポートできます。さらに、柔軟性を向上させるために、さまざまなビジネス シナリオに応じてコントローラーをカスタマイズすることもできます。

ただし、コントローラーを使用して ConfigMap ホット アップデートを実装する場合には、いくつかの欠点もあります。まず、方法 1 や方法 2 に比べて、この方法は実装の複雑さが高く、Controller のコードを記述する必要があるため、ある程度の開発経験が必要です。次に、コントローラーは ConfigMap 変更イベントを監視し、対応するポッドを更新する必要があるため、クラスターの負荷が増加し、クラスターの安定性に影響を与える可能性があります。

結論は

上記 3 つの方法は、ConfigMap のホット アップデートを実現できますが、それぞれ異なる利点と欠点があります。どの方法を使用するかを選択するときは、特定のビジネス シナリオとニーズに基づいてトレードオフを行う必要があります。シンプルで高速なホット アップデートを実装する必要がある場合は、方法 1 の使用を検討できます。自動展開とローリング アップデートが必要な場合は、方法 2 の使用を検討できます。さらに柔軟性とカスタマイズ性が必要な場合は、方法 3 の使用を検討できます。

実際のアプリケーションでは、いくつかのオープンソース プロジェクトを使用して ConfigMap のホット アップデートを実現することもできます。たとえば、Reloader は比較的人気のあるオープン ソース プロジェクトであり、ConfigMap の変更イベントを自動的に監視し、対応する Pod の更新をトリガーできます。ConfigmapController と k8s-trigger-controller もオプションのオープン ソース プロジェクトであり、特定のニーズに応じて選択して使用できます。

つまり、ConfigMap のホットアップデートを実現することは、Kubernetes において非常に重要な機能です。適切な方法とツールを採用することで、アプリケーションの可用性と安定性を向上させ、さまざまなビジネス シナリオのニーズを満たすことができます。

おすすめ

転載: blog.csdn.net/kingu_crimson/article/details/129933905