このチュートリアルでは、Azure Kubernetes Service (AKS) でインベントリ アプリケーションをホストし、アクティブ geo レプリケーションを使用して Azure Cache for Redis Enterprise または Azure Managed Redis インスタンス内のデータを Azure リージョン間でレプリケートする方法について説明します。
[前提条件]
- Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、無料アカウントを作成してください。
- 1 つの Azure Kubernetes Service クラスター - クラスターの作成の詳細については、「クイック スタート:Azure portal を使用して Azure Kubernetes Service (AKS) クラスターをデプロイする」を参照してください。 または、2 つの異なる AKS クラスターでデモ アプリケーションの 2 つのインスタンスをホストすることもできます。 運用環境では、クラスターと同じリージョンに配置された 2 つの異なるクラスターを使用して、アプリケーションの 2 つのバージョンをデプロイします。 このチュートリアルでは、アプリケーションの両方のインスタンスを同じ AKS クラスターにデプロイします。
Von Bedeutung
このチュートリアルでは、コンテナー、ポッド、サービスなどの Kubernetes の基本的な概念について理解していることを前提としています。
概要
このチュートリアルでは、3 つの異なる T シャツ オプションを示すサンプル在庫ページを使用します。 ユーザーは、各 T シャツを "購入" し、在庫の減少を確認できます。 このデモのユニークな点は、在庫アプリが 2 つの異なるリージョンで実行されることです。 通常、整合性の問題が発生しないように、在庫データを格納するデータベースを単一のリージョンで実行する必要があります。 他のデータベース バックエンドと同期を使用すると、異なる Azure リージョン間での呼び出しの待ち時間が長くなるため、顧客に不快な経験をさせる可能性があります。 Azure Cache for Redis Enterprise をバックエンドとして使用する場合、アクティブ geo レプリケーションを使用して 2 つのキャッシュをリンクすると、両方のリージョン間で在庫の整合性を維持しながら、同じリージョン内の Redis Enterprise の低待機時間のパフォーマンスを実現できます。
2 つの Azure Redis インスタンスを設定する
Azure portal または任意の CLI ツールを使用して、 米国西部 2 リージョンに新しい Azure Cache for Redis Enterprise または Azure Managed Redis インスタンスを作成します。 または、任意のリージョンを使用することもできます。 クイックスタート ガイドを使用して作業を開始します。
[詳細] タブで、次の操作を行います。
- [非 TLS アクセスのみ] を有効にします。
- [クラスタリング ポリシー] を [エンタープライズ] に設定します
- こちらのガイドを使用して、新しいアクティブ geo レプリケーション グループを構成します。 最終的には、両方のキャッシュを同じレプリケーション グループに追加します。 最初のキャッシュでグループ名を作成し、同じグループに 2 番目のキャッシュを追加します。
Von Bedeutung
このチュートリアルでは、デモに非 TLS ポートを使用しますが、運用環境では TLS ポートを使用することを強くお勧めします。
米国東部リージョンに、最初のキャッシュと同じ構成で別の Azure Cache for Redis Enterprise を設定します。 または、任意のリージョンを使用することもできます。 必ず、最初のキャッシュと同じレプリケーション グループを選択してください。
Kubernetes デプロイ ファイルを準備する
次の手順を使用して、2 つの .yml ファイルを作成します (2 つのリージョンで作成したキャッシュごとに 1 つのファイル)。
リージョン間のデータ レプリケーションを実際に示すために、同じアプリケーションの 2 つのインスタンスを異なるリージョンで実行します。 1 つのインスタンスをシアトル (west 名前空間) で実行し、2 つ目のインスタンスをニューヨーク (east 名前空間) で実行してみましょう。
west 名前空間
次の YAML ファイル内の次のフィールドを更新し、app_west.yaml として保存します。
- ポート サフィックスを削除した後、変数
REDIS_HOSTをエンドポイント値 URL (10000) で更新します。 -
REDIS_PASSWORDを "米国西部 2" キャッシュのアクセス キーで更新します。 -
APP_LOCATIONを更新して、このアプリケーション インスタンスが実行されているリージョンが表示されるようにします。 このキャッシュの場合、APP_LOCATIONをSeattleに構成して、このアプリケーション インスタンスがシアトルで実行されていることを示します。 - 変数
namespaceの値が、ファイル内の両方の場所でwestであることを確認します。
コードは、次のようになります。
apiVersion: apps/v1
kind: Deployment
metadata:
name: shoppingcart-app
namespace: west
spec:
replicas: 1
selector:
matchLabels:
app: shoppingcart
template:
metadata:
labels:
app: shoppingcart
spec:
containers:
- name: demoapp
image: mcr.microsoft.com/azure-redis-cache/redisactivereplicationdemo:latest
resources:
limits:
cpu: "0.5"
memory: "250Mi"
requests:
cpu: "0.5"
memory: "128Mi"
env:
- name: REDIS_HOST
value: "DemoWest.westus2.redisenterprise.cache.azure.net"
- name: REDIS_PASSWORD
value: "myaccesskey"
- name: REDIS_PORT
value: "10000" # redis enterprise port
- name: HTTP_PORT
value: "8080"
- name: APP_LOCATION
value: "Seattle, WA"
---
apiVersion: v1
kind: Service
metadata:
name: shoppingcart-svc
namespace: west
spec:
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 8080
selector:
app: shoppingcart
east 名前空間
同じ YAML ファイルの別のコピーを app_east.yaml として保存します。 今度は、2 番目のキャッシュに対応する値を使用します。
- ポート サフィックスを削除した後、変数
REDIS_HOSTをエンドポイント値 (10000) で更新します。 -
REDIS_PASSWORDを "米国東部" キャッシュのアクセス キーで更新します。 -
APP_LOCATIONを更新して、このアプリケーション インスタンスが実行されているリージョンが表示されるようにします。 このキャッシュの場合、APP_LOCATIONを New York に構成して、このアプリケーション インスタンスがニューヨークで実行されていることを示します。 - 変数
namespaceの値が、ファイル内の両方の場所でeastであることを確認します。
コードは、次のようになります。
apiVersion: apps/v1
kind: Deployment
metadata:
name: shoppingcart-app
namespace: east
spec:
replicas: 1
selector:
matchLabels:
app: shoppingcart
template:
metadata:
labels:
app: shoppingcart
spec:
containers:
- name: demoapp
image: mcr.microsoft.com/azure-redis-cache/redisactivereplicationdemo:latest
resources:
limits:
cpu: "0.5"
memory: "250Mi"
requests:
cpu: "0.5"
memory: "128Mi"
env:
- name: REDIS_HOST
value: "DemoEast.eastus.redisenterprise.cache.azure.net"
- name: REDIS_PASSWORD
value: "myaccesskey"
- name: REDIS_PORT
value: "10000" # redis enterprise port
- name: HTTP_PORT
value: "8080"
- name: APP_LOCATION
value: "New York, NY"
---
apiVersion: v1
kind: Service
metadata:
name: shoppingcart-svc
namespace: east
spec:
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 8080
selector:
app: shoppingcart
Kubernetes CLI をインストールして AKS クラスターに接続する
このセクションでは、まず Kubernetes CLI をインストールしてから、AKS クラスターに接続します。
注
このチュートリアルでは、Azure Container Service クラスターが必要です。 アプリケーションの両方のインスタンスを同じ AKS クラスターにデプロイします。
Kubernetes CLI のインストール
Kubernetes CLI (kubectl) を使用して、ローカル コンピューターから Kubernetes クラスターに接続します。 ローカルで実行している場合は、次のコマンドを使用して kubectl をインストールできます。
az aks install-cli
Azure Cloud Shell を使用する場合、kubectl は既にインストールされているため、この手順はスキップできます。
2 つのリージョンで AKS クラスターに接続する
ポータルを使用して、米国西部 2 リージョンの AKS クラスターのリソース グループとクラスター名をコピーします。 AKS クラスターに接続するように kubectl を構成するには、リソース グループとクラスター名を指定して次のコマンドを使用します。
az aks get-credentials --resource-group myResourceGroup --name myClusterName
次のコマンドを実行して、クラスターに接続できることを確認します。
kubectl get nodes
クラスター ノードの一覧を示す同様の出力が表示されます。
NAME STATUS ROLES AGE VERSION
aks-agentpool-21274953-vmss000001 Ready agent 1d v1.24.15
aks-agentpool-21274953-vmss000003 Ready agent 1d v1.24.15
aks-agentpool-21274953-vmss000006 Ready agent 1d v1.24.15
アプリケーションをデプロイしてテストする
アプリケーションを AKS クラスターで実行するには、2 つの名前空間が必要です。 west を作成して、アプリケーションをデプロイします。
次のコマンドを実行して、アプリケーション インスタンスを west名前空間内の AKS クラスターにデプロイします。
kubectl create namespace west
kubectl apply -f app_west.yaml
デプロイとサービスが作成されたことを示す応答が表示されます。
deployment.apps/shoppingcart-app created
service/shoppingcart-svc created
アプリケーションをテストするには、次のコマンドを実行してポッドが実行されているかどうかをチェックします。
kubectl get pods -n west
次のように表示されれば、ポッドは正常に実行されています。
NAME READY STATUS RESTARTS AGE
shoppingcart-app-5fffdcb5cd-48bl5 1/1 Running 0 68s
次のコマンドを実行して、アプリケーションのエンドポイントを取得します。
kubectl get service -n west
数分間、EXTERNAL-IP の状態が <pending> と表示される場合があります。 状態が IP アドレスに置き換えられるまで、再試行を続けます。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
shoppingcart-svc LoadBalancer 10.0.166.147 20.69.136.105 80:30390/TCP 90s
External-IP が使用可能になったら、Web ブラウザーを開いてサービスの External-IP アドレスにアクセスすると、アプリケーションが表示されます。
同じデプロイ手順を実行して、米国東部リージョンで実行するデモ アプリケーションのインスタンスをデプロイします。
kubectl create namespace east
kubectl apply -f app_east.yml
kubectl get pods -n east
kubectl get service -n east
ブラウザーで 2 つのサービスをそれぞれ開いて、一方のリージョンで在庫を変更すると、もう一方のリージョンにほぼ即座に反映されることがわかります。 在庫データは、Redis Enterprise インスタンスに格納され、データはリージョン間でレプリケートされます。
おめでとうございます。 ボタンをクリックして、デモを確認してみましょう。
カウントをリセットするには、URL の後に /reset を追加します。
<IP address>/reset
デプロイをクリーンアップする
クラスターをクリーンアップするには、次のコマンドを実行します。
kubectl delete deployment shoppingcart-app -n west
kubectl delete service shoppingcart-svc -n west
kubectl delete deployment shoppingcart-app -n east
kubectl delete service shoppingcart-svc -n east
リソースをクリーンアップする
この記事で作成したリソースを引き続き使用する場合は、リソース グループを保持します。
それ以外の場合、リソースを使い終わったら、課金されないように、作成した Azure リソース グループを削除できます。
Von Bedeutung
リソース グループを削除すると、元に戻すことができません。 リソース グループを削除すると、そのリソース グループ内のすべてのリソースは完全に削除されます。 間違ったリソース グループやリソースをうっかり削除しないようにしてください。 リソースを既存のリソース グループ内に作成し、そのリソース グループ内に保持したいリソースが含まれている場合は、リソース グループを削除するのではなく、各リソースを個別に削除できます。
リソース グループを削除するには
Azure portal にサインインし、 [リソース グループ] を選択します。
削除するリソース グループを選択します。
多数のリソース グループがある場合は、[任意のフィールドのフィルター...] ボックスを使用し、この記事用に作成したリソース グループの名前を入力します。 結果リストでリソース グループを選びます。
[リソース グループの削除] を選択します。
リソース グループの削除の確認を求めるメッセージが表示されます。 確認のためにリソース グループの名前を入力し、[削除] を選択します。
しばらくすると、リソース グループとそのリソースのすべてが削除されます。