Kubernetesを使ったAzure上でのGridDBアプリのデプロイとスケーリング

この記事は、以前の取り組みの直接的な続きであり、ローカルのkubernetes(シングルノード)クラスタにGridDBアプリケーションをデプロイしました。このデプロイで得た知識を、同じクラスタをMicrosoftのクラウド・コンピューティング・サービスにデプロイする際に役立てたいと思います: Azureです。ほとんどの作業はすでに終わっているので、このプロジェクトをAzure上で稼働させるために必要なAzure固有の変更について簡単に説明します。

幸運なことに、AKSクラスタのセットアップは無料です。アカウントを取得したら、この記事に沿って進んでください。最後まで進めば、前回のブログで説明したシンプルなTodoアプリがAzure上でホストされ、インターネットにアクセスできる場所であればどこからでもアクセスできるようになります。

はじめに

始めるには、Microsoft Azureのアカウントを作成し、このプロジェクトに関する過去のエントリーを読んでください。また、GitHubからソースコードをクローンして、提供されている.yamlファイルを使えるようにしてください。また、自分のイメージを保存するためにDockerhubのアカウントを作成する必要があるかもしれませんが、今のところは私がDockerhubにプッシュしたイメージを使うことができます。

  1. GridDB
  2. Auth
  3. Web-Server
 $ git clone https://github.com/griddbnet/Blogs.git --branch azure_kubernetes

もう一つのオプションのステップは、Azure CLIをインストールすることで、Azureのコマンドを自分のマシンから実行できるようになり、クラウドシェルを使う必要がなくなりますが、これもオプションです。

ローカルクラスタからAzureへの変更

まず、このプロジェクトをローカルのK3sシングルノードではなく、AzureのマネージドAKSクラスタ上で実行するために必要な少量の変更について説明します。第一に、コンテナイメージをDockerhub(または他のコンテナイメージリポジトリ)で公開する必要があります。あとは特にありません。最後の違いは、永続ストレージの扱い方です。

AKSクラスタの作成

まず始めに、Microsoftチームから直接提供されているガイドに沿って説明します: これに従って、リソースグループを作成し、AKSクラスタを作成し、クラスタに接続します。そこから、自分のコンテナで踏み込むことができます。

AzureクラウドシェルかローカルのAzure CLIに接続し、Azureアカウントに接続します。

Azureリソースの作成

まず、リソースグループを作成しよう。

$ az group create --name myResourceGroup --location westus

そして実際のAKSクラスタを作成してみよう。

$ az aks create -g myResourceGroup -n myAKSCluster --enable-managed-identity --node-count 1 --enable-addons monitoring --enable-msi-auth-for-monitoring  --generate-ssh-keys

なお、シンプルかつ無料にするため、私自身はモニタリング用のアドオンを削除しましたが、残すかどうかはお好みでどうぞ。

それでは、kubectlをインストールしてクラスタに接続してみましょう(Cloud Shellを使う場合は不要です)。

$ az aks install-cli

そしてそれをつなぐ:

$ az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

そしてそれをテストする:

$ kubectl get nodes
NAME                       STATUS   ROLES   AGE     VERSION
aks-nodepool1-31718369-0   Ready    agent   6m44s   v1.12.8

これで、コマンドラインを使ってAzure AKSクラスタに直接リソースを追加する準備が整ったことになります。

Kubernetes リソースの作成

azureリソースにはgitがインストールされているので、このプロジェクトのソースコードがすべて入っているリポジトリをクローンしてください: https://github.com/griddbnet/Blogs/tree/kubernetes。3つの固有のディレクトリは、AKSクラスタに含まれるコンテナ/マイクロサービスとして実行する予定の異なるコンテナに対応しています。

K3sのローカルインスタンス上でこのプロジェクトを実行する私たちの以前の取り組みを読んでいれば、この大部分はなじみがあると思います。.yamlファイルをほとんど変更する必要はありませんでした。数少ない変更の一つは、イメージをどこからプルするかということです。

    spec:
      containers:
        - name: griddbcontainer
          image: imru/griddb-server:latest

私はすでにこれらのイメージにタグを付け、Dockerhubにプッシュして使用していますが、もしあなたがそのプロセスについて興味があるのなら:

$ docker build -t griddb-server .
$ docker tag griddb-server imru/griddb-server:latest
$ docker push imru/griddb-server:latest

イメージに変更を加えてポッドを更新したい場合は、更新したイメージをdockerhubにプッシュしてデプロイメントを削除し、更新した新しいポッドを作成するように設定し直すだけです。

つまり、基本的には各ディレクトリに入り、kubectlでcreateコマンドを実行してサービスを作成します。

$ kubectl create -f griddb-server.yaml

Azureの永続ストレージ

冒頭で永続ストレージが変更されたことを述べました。ローカルのK3sクラスタと同じように、ホストマシンを永続ストレージとして使う方法を使おうとすると、AKSのデプロイは失敗します。まずazureディスクを作成し、それをGridDBストレージの永続ストレージとして使用する必要があります。

今回のアプリケーションは非常にシンプルで小規模なので、以下のようにAzure上のボリュームを静的にプロビジョニングする: ボリュームの静的プロビジョニング

ここでは、ディスクを作成し、そのストレージをGridDBポッドに適用するために必要なコマンドを紹介します。

まず、ノードのリソースグループを取得します。

$ az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv

Output
MC_myResourceGroup_myAKSCluster_eastus

これができたら、コマンドを使ってディスクを作成しましょう:

$ az disk create 
  --resource-group MC_myResourceGroup_myAKSCluster_eastus 
  --name myAKSDisk 
  --size-gb 1 
  --query id --output tsv

ここでは1GBの小さなディスクを作成し、yamlファイルに必要なディスクリソースIDを出力します:

/subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk。

そして、永続ボリュームを作成し、永続ボリュームのクレームを作成し、最後にgriddbデプロイyamlファイルにアタッチする必要があります。

pv-azuredisk.yaml`を作成しましょう。

apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    pv.kubernetes.io/provisioned-by: disk.csi.azure.com
  name: pv-azuredisk
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: managed-csi
  csi:
    driver: disk.csi.azure.com
    readOnly: false
    volumeHandle: /subscriptions/<subscriptionid>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk
    volumeAttributes:
      fsType: ext4</subscriptionid>

pvc: pvc-azuredisk.yaml です。

ここで、storageClassName が standard ではなく managed-csi になっていることに気づくだろう。これは我々が望むものです!

そして

$ kubectl apply -f pv-azuredisk.yaml
$ kubectl apply -f pvc-azuredisk.yaml

output

NAME            STATUS   VOLUME         CAPACITY    ACCESS MODES   STORAGECLASS   AGE
pvc-azuredisk   Bound    pv-azuredisk   1Gi        RWO                           5s

そして、GridDBのデプロイメントyamlを作成する:

      volumes:
        - name: azure
          persistentVolumeClaim:
            claimName: pvc-azuredisk

And in the container section of our yamlそして、yamlのコンテナ・セクションに

      containers:
        - name: griddbcontainer
          image: imru/griddb-server:latest
          ports:
            - containerPort: 10001
          securityContext:
            runAsUser: 0
            runAsGroup: 0
          volumeMounts:
            - name: azure
              mountPath: /mnt/azure

GridDBのデプロイを削除して再デプロイすると、Azure AKS上に永続的なストレージを持つようになります。

Azureポータルを見ると(コマンドラインだけでなく)、以下のリソースが表示されます。

最後に

最小限の労力で、アプリケーションのローカルインスタンスから、Azure上の堅牢で強力なクラウドベースのクラスタに移行できました。Azureを初めて使う人は、オンラインポータルで自分のクラスタをノードやサービスなどと一緒に見ることができます。

If you have any questions about the blog, please create a Stack Overflow post here https://stackoverflow.com/questions/ask?tags=griddb .
Make sure that you use the “griddb” tag so our engineers can quickly reply to your questions.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください