Redis
 Computer >> コンピューター >  >> プログラミング >> Redis

Azure Kubernetes Service(AKS)へのアプリケーションデプロイ 第2回:ConfigMapによる高度な構成

はじめに

本記事は、Azure Kubernetes Service(AKS)へのアプリケーションデプロイシリーズの第2回です。前回の記事では、作成したRedisマスターのデプロイメントを確認し、DeploymentとReplicaSet、そしてReplicaSetとPodの関係について学びました。今回は、そのRedisマスターを、ConfigMap経由で提供される環境固有の設定を使って再作成していきます。

本記事で扱う内容

  • ConfigMapとは何か
  • ConfigMapを使ったRedisマスターの構成
  • ファイルからConfigMapを作成する方法
  • YAMLファイルからConfigMapを作成する方法
  • ConfigMapを使って構成データを読み込む方法

前提条件

  • AKSへのアプリケーションデプロイ | 第1回 の内容を完了していること

それでは早速、まず「ConfigMapとは何か」から見ていきましょう。

ConfigMapとは?

ConfigMapは、Podに対して構成情報を提供するためのKubernetesオブジェクトです。最大の特徴は、実際のコンテナイメージから構成設定を分離できる点にあります。ConfigMapを作成し、それをデプロイメントに接続することで、アプリケーションに構成詳細を渡すことができます。

ConfigMapを使ったRedisマスターの構成

前回作成したデプロイメント自体には問題ありませんでしたが、実務では何らかの設定なしにアプリケーションを起動することはほとんどありません。そこで今回は、ConfigMapを使ってredis-masterの構成設定を行います。

ConfigMapは、構成ごとに専用のイメージを用意しなくても済む、ポータブルなコンテナ構成手段です。データはキーと値のペアとして保持され、コンテナに必要な設定値を格納します。なお、ConfigMapは機密性のない(non-secret)構成情報向けのオブジェクトです。パスワードなどの重要なデータを含む構成には、別途「Secret」というオブジェクトが用意されているので、用途に応じて使い分けましょう。

この例では、キーを redis-config とし、その値として次の2行を設定したConfigMapを作成します。

maxmemory: "2mb"
maxmemory-policy: "allkeys-lru"

ConfigMapの作成方法は大きく2つあります。

  • ファイルから作成する
  • YAMLファイルから作成する

それぞれ詳しく見ていきます。

ファイルからConfigMapを作成する

以下の手順で、ファイルからConfigMapを作成できます。

ステップ1. ターミナルで code redis-config と入力し、Azure Cloud Shellのコードエディタを開きます。以下の2行をコピー&ペーストして、redis-config という名前で保存してください。

maxmemory: "2mb"
maxmemory-policy: "allkeys-lru"

ステップ2. 次のコマンドを実行してConfigMapを作成します。

kubectl create configmap example-redis-config --from-file=redis-config

以下のような出力が表示されれば成功です。

configmap/example-redis-config created

ステップ3. 同じコマンドでこのConfigMapの詳細を確認してみましょう。

kubectl describe configmap/example-redis-config

出力には、作成したキーと値の情報が表示されます。

YAMLファイルからConfigMapを作成する

続いて、前節で作成したConfigMapを、今度はYAMLファイルから作り直してみます。宣言的なマニフェスト管理という観点では、こちらの方法が実運向きと言えるでしょう。

ステップ1. まず、先ほど作成したConfigMapを削除します。

kubectl delete configmap/example-redis-config

ステップ2. 以下の内容を example-redis-config.yaml という名前のファイルにコピー&ペーストして保存します。

apiVersion: v1
data:
 redis-config: |-
 maxmemory 2mb
 maxmemory-policy allkeys-lru
kind: ConfigMap
metadata:
 name: example-redis-config
 namespace: default

ステップ3. 次のコマンドでConfigMapを再作成します。

kubectl create -f example-redis-config.yaml

以下の出力が得られれば成功です。

configmap/example-redis-config created

確認のため、再度describeコマンドを実行すると、前の手順と同じ結果が返ってくるはずです。このように、YAMLファイルを使ってもまったく同じConfigMapを作成できました。

ポイント: kubectl get コマンドには便利な -o オプションがあり、オブジェクトの内容をYAML形式またはJSON形式で出力できます。システムに手動で変更を加えた後、その結果のオブジェクトをYAML形式で確認したい場合などに非常に役立ちます。現在のConfigMapをYAML形式で取得するには、次のコマンドを実行します。

kubectl get -o yaml configmap/example-redis-config

これでConfigMapの定義が完成しました。次は、これを実際に使ってみましょう。

ConfigMapを使って構成データを読み込む

このセクションでは、redis-masterのデプロイメントを修正し、ConfigMapから構成を読み込むように変更します。

ステップ1. まず、 redis-master-deployment.yaml を以下のように編集して、ConfigMapを参照するようにします。ソースコードの後に、各セクションの説明を記載しています。

注意: GitHubからソースコードをダウンロードした場合は、「Application deployment on AKS」フォルダ内に、必要な変更がすでに適用された redis-master-deployment_Modified.yaml が含まれています。

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
 name: redis-master
 labels:
 app: redis
spec:
 selector:
 matchLabels:
 app: redis
 role: master
 tier: backend
 replicas: 1
 template:
 metadata:
 labels:
 app: redis
 role: master
 tier: backend
 spec:
 containers:
 - name: master
 image: k8s.gcr.io/redis:e2e
 command:
 - redis-server
 - "/redis-master/redis.conf"
 env:
 - name: MASTER
 value: "true"
 volumeMounts:
 - mountPath: /redis-master
 name: config
 resources:
 requests:
 cpu: 100m
 memory: 100Mi
 ports:
 - containerPort: 6379
 volumes:
 - name: config
 configMap:
 name: example-redis-config
 items:
 - key: redis-config
 path: redis.conf

それでは、コードの重要なセクションを順番に掘り下げて理解しましょう。

24〜26行目:起動コマンドの指定

ここでは、Pod起動時に実行されるコマンドを定義しています。この例では、特定の構成ファイルを指定してredis-serverを起動します。

command: 
 - redis-server 
 - "/redis-master/redis.conf" 

27〜29行目:環境変数による構成データの受け渡し

実行中のコンテナへ構成データを渡す方法の一つとして、環境変数を利用しています。Dockerで言えば、 docker run -e "MASTER=true" --name master -p 6379:6379 -m 100M -c 100m -d kubernetes/redis:v1 に相当します。これにより環境変数MASTERがtrueに設定され、アプリケーションはこの環境変数を読み取って自身の構成に利用できます。

env: 
 - name: MASTER 
 value: "true" 

30〜32行目:ボリュームのマウント

ここでは、39行目以降で定義されるconfigという名前のボリュームを、実行中のコンテナ内の /redis-master パスにマウントしています。元のコンテナイメージの /redis-master 配下にある既存の内容は、このマウントによって隠されることに注意してください。Dockerで言えば、 docker run -v config:/redis-master ... に相当する操作です。

volumeMounts:
 - mountPath: /redis-master
 name: config

40行目:ボリューム名の定義

ボリュームにconfigという名前を付けています。この名前は、このPod内でのみ有効な識別子として使われます。

name: config 

41〜42行目:ConfigMapの指定

このボリュームを example-redis-config というConfigMapから読み込むことを宣言しています。このConfigMapはシステム上にすでに存在している必要がありますが、前のセクションで作成済みなので準備は整っています。

configMap:    
            name: example-redis-config  

43〜45行目:キーからファイルへのマッピング

ここでは、redis-configキーの値(maxmemoryに関する2行の設定)を、 redis.conf というファイルとして読み込んでいます。

items:
 - key: redis-config
 path: redis.conf

ステップ2. 更新したデプロイメントを作成しましょう。

kubectl create -f redis-master-deployment_Modified.yml

以下の出力が得られます。

deployment.apps/redis-master created

ステップ3. 構成が正しく適用されたかを確認します。まず、Podの名前を取得します。

kubectl get pods

ステップ4. 次に、Podにexecで接続し、設定が反映されていることを検証します。

kubectl exec -it redis-master-<pod-id> redis-cli
127.0.0.1:6379> CONFIG GET maxmemory
 1) "maxmemory"
 2) "2097152"
127.0.0.1:6379> CONFIG GET maxmemory-policy
 "maxmemory-policy"
 "allkeys-lru"
127.0.0.1:6379> exit

まとめ

今回は、クラウドネイティブアプリケーションの構成において重要かつ少し難易度の高い部分を体験しました。アプリケーション側も、動的に構成を読み取れるように設計されている必要がある点にも注目してください。ConfigMapでアプリケーションに構成を与えた後、実行中のコンテナにアクセスして、稼働中の構成を実際に検証するところまで行いました。

第2回となる本記事では、RedisマスターがConfigMapから構成データを読み込むように設定しました。最終回となる第3回では、エンドツーエンドのアプリケーション全体をデプロイしていきますので、お楽しみに。

  1. Redis GEORADIUSコマンド徹底解説 – 特定エリア内の位置情報データを取得する方法

    このチュートリアルでは、Redisに保存された位置情報(ジオスペーシャル)データの中から、特定のエリア内に存在する要素を取得する方法を解説します。そのために使用するのが GEORADIUS コマンドです。 GEORADIUSコマンドとは GEORADIUSコマンドは、キーに保存されたソート済みセット(Sorted Set)形式の位置情報データのうち、経度・緯度・半径の各引数から算出される円形エリアの境界内に含まれるメンバーを1つ以上返すコマンドです。 エリアは、指定した経度と緯度を円の中心とし、指定した単位での半径を円の半径として計算されます。 半径には以下のいずれかの単位を指定します。 m

  2. QStashでRedisの状態をデータベースへシームレスに同期する方法

    前回の記事では、フルスタックなNext.jsアプリケーションにおいて、ユーザーのクォータ(利用制限)の状態をRedisに保存する方法について解説しました。一般的にRedisはデータベースよりもはるかに高速なため、この手法を採用することでアプリケーションのパフォーマンスを大幅に向上させることができます。 特にUpstash Redisは、このユースケースに最適な選択肢です。完全マネージド型のRedisデータベースであり、HTTP経由でアクセスできるため、Vercelのようなエッジランタイム上でも、ユーザーに近い場所で低レイテンシのコード実行が可能になります。 QStashとは何か? QStash