Azure Arc Enabled PostgreSQL Hyperscale (Citus)をやっていき

Azure

Azure Arcはハイブリッドクラウドを管理するためのソリューションで、Azure以外のパブリッククラウドやオンプレミス環境を一括してAzure Portalから扱うことが可能になるんだけども、このArcを使ってKubernetes上にAzure Database for PostgreSQL Hyperscale (Citus)を構築することも出来ると。

でもまあKubernetesを自前で構築するのは面倒なので、Azure Kubernetes Service (AKS)のクラスタをデプロイしてそこにHyperscaleを立てちゃう、という記事がAzure Arc Jumpstartに公開されてると。面倒じゃ無い人は自前のKubernetesを用意すれば、もちろんそこにHyperscale (Citus)も構築できます。比較的簡単に。

要はAzure Resource Manager Template (ARM Template)なんで、こいつをちょいちょいと編集して実行すれば良いのだけれど、例によって例のごとく英語なんで、手順の主要なところだけ日本語で解説しましょう、というのがこのエントリーの主旨。macOSでの手順なので、Windowsでやりたい人は適宜読み替えるかWSL上でやってください。

下準備

さて。まずはレポジトリをコピります。gitが入ってない人はいませんよね?ここからつまづくようだと、先生ちょっと不安です。

$ git clone https://github.com/microsoft/azure_arc.git

Azure CLIはインストールされてると思うけれど、無ければHomebrewでインストール、有るならアップグレードしときます。

$ brew install azure-cli
$ brew upgrade azure-cli

SSHのキーが要るので、作ってない場合は以下で。

$ ssh-keygen -t rsa

キーは.ssh/id_rsa.pubに出来てるので、あとで

$ cat ~/.ssh/id_rsa.pub | pbcopy

すればクリップボードに。自分は以下のaliasを設定しちゃってますが。

alias pbkey="cat ~/.ssh/id_rsa.pub | pbcopy"

az cliでの準備

これで最新のazコマンドが使えるようになってると思うので、ログインします。

$ az login

つぎにサービスプリンシパルを作成。MyAzureArcDataは任意の文字列で。

$ az ad sp create-for-rbac -n "http://MyAzureArcData" --role contributor

何回かリトライするかもしれないけどちょっと待ってれば作成されます。あとで使うのでファイルにコピペして保存しとく。作成時にリダイレクトしておいてももちろん可。

{
"appId": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"displayName": "MyAzureArcData",
"name": "http://MyAzureArcData",
"password": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"tenant": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

今回がAzureArcDataを利用するのが初めて!という人は、リソースプロバイダを有効化する必要があります。以下。

$ az provider register --namespace Microsoft.AzureArcData

登録中は以下の通り、Registeringという表示。

$ az provider show -n Microsoft.AzureArcData -o table
Namespace               RegistrationPolicy    RegistrationState
----------------------  --------------------  -------------------
Microsoft.AzureArcData  RegistrationRequired  Registering

登録完了するとStateがRegisteredになるので、ウマ娘でもやりながら待っててください。

$ az provider show -n Microsoft.AzureArcData -o table
Namespace               RegistrationPolicy    RegistrationState
----------------------  --------------------  -------------------
Microsoft.AzureArcData  RegistrationRequired  Registered

登録完了したら、いよいよデプロイと行きたいところだけど、その前にAKSのバージョンをチェック。このエントリーを読んでる人はだいたい東日本人だろうからリージョンをAzure東日本にしてるけど、西日本人はAzure西日本にするのも悪くない考えです。

$ az aks get-versions -l japaneast -o table
The behavior of this command has been altered by the following extension: aks-preview
KubernetesVersion    Upgrades
-------------------  -------------------------
1.20.2(preview)      None available
1.19.7               1.20.2(preview)
1.19.6               1.19.7, 1.20.2(preview)
1.18.14              1.19.6, 1.19.7
1.18.10              1.18.14, 1.19.6, 1.19.7
1.17.16              1.18.10, 1.18.14
1.17.13              1.17.16, 1.18.10, 1.18.14

執筆時点では1.20.2はプレビュー、1.19.7がstableなので1.19.7を使いました。previewを敢えてデプロイしてバグを踏んでSupport Requestをあげてくれるのは大歓迎ですが?

次にパラメータファイルを編集しないといけません。パラメータファイルはgit cloneしたディレクトリのJSONなので、VimでもEmacsでもVSCodeでもnanoでもJeditでもお好きなエディタでどうぞ(宗教戦争を回避するスタイルで)。

$ cd azure_arc/azure_arc_data_jumpstart/aks/arm_template/postgres_hs
$ vim azuredeploy.parameters.json

JSONにパラメータの例が入っているので分かると思うけれど、sshRSAPublicKeyはcat ~/.ssh/id_rsa.pub | pbcopyしたやつ、SPN_CLIENT_ID / CLIENT_SECRET / TENANT_IDはサービスプリンシパルを作成した時の、appId / password / tenant、ARC_DC_SUBSCRIPTIONはaz account showのid、vmSizeはaz vm list-sizes -l japaneast -o tableで好きなのを(強火にすると高いよ!)。

POSTGRES_WORKER_NODE_COUNTPOSTGRES_DATASIZEはIntegerなので、以下のようにダブルクォートを付けないこと。

        "POSTGRES_WORKER_NODE_COUNT": {
            "value": 3
        },
        "POSTGRES_DATASIZE": {
            "value": 524288
        },

ちょっと不安になるのが、POSTGRES_DATASIZEで、単位がMBになってる。Hyperscaleのストレージは現時点では512GB / 1TB / 2TBなので、とりあえず512 * 1024で524288を入れてみると。POSTGRES_SERVICE_TYPEはClusterIPで。

残りのパラメータはFQDNの衝突だけ気を付けて任意で。

デプロイ

さて、パラメータが揃ったのでデプロイ。しかし、なんでJSON中にリソースグループ名もリージョンも指定してるのにリソースグループを作ってくれないんだ?
jqで抜いてシェル変数にセットしておけばtypoしないのでよろしいかと。

$ rg=$(jq -r ".parameters.resourceGroup.value" azuredeploy.parameters.json)
$ lc=$(jq -r ".parameters.ARC_DC_REGION.value" azuredeploy.parameters.json)
$ az group create --name $rg --location $lc

$ az deployment group create --resource-group $rg \
--name arcdatapostgresdemo \
--template-file azuredeploy.json \
--parameters azuredeploy.parameters.json

はい、ここまで行けば後は20分ぐらい、アズールレーンでもやりながら待っててください。

Jumpstartのドキュメントでは、このあと、Windowsにログインしてホゲホゲしましょうとあるんだけど、別に手元にkubectlやpostgresql-clientがインストールされてれば、ダイレクトに操作すれば良いんじゃないの?となるので、vmSizeを指定したのは何だったんだ?となるんだけども、このWindowsにログインしないとデプロイが完了しないという罠が仕掛けてあるので、まだ消しちゃダメですw
なんでPowerShellにするかなぁ…。

2021-03-5追記:vmSizeはKubernetesのノードのサイズですね。Windowsのサイズではなかったです。

あ、ついでにkubectlとpostgresql-clientはインストールしておいてもバチは当たらないと思うので、MacのSSDが残り5%とかになってなかったら入れときましょう。5%になってる人はMacを買い換えて、このエントリーの最初からやり直しです。

$ az aks install-cli

すればkubectlはインストールされますし、

$ brew install postgresql-client

すればHyperscaleとお喋り出来るので、そこはよしなに。

デプロイ後の設定

さて、Azure Portalを開いてみると、リソースグループが2つ作成されていて、WindowsのVMがあります。

IPアドレスを見つけて、Microsoft Remote Desktopで接続します。

なんかPowerShellが走り出します。

kubectlが走り出して

コンテナ(正確にはポッド)が作られていきます。この辺で眺めているのに飽きてくるので、しばらく放置してTwitterでもやっててください。

Twitterから帰ってきましたか?油断している間に、arcpgc-0(HyperscaleのCoordinator Node)、arcpgw-0/1/2(HyperscaleのWorker Nodes)がRunningしちゃってますよ、予想に反して一発で動いちゃってるじゃん!
で、裏になってる画面にPostgreSQL InstanceのIPアドレスが表示されてますね?

できあがり!

psqlで接続してみましょう。

$ psql -h 20.46.123.242 -U postgres
Password for user postgres: 
psql (13.2, server 12.3 (Ubuntu 12.3-1))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=#

うお、繋がった!ビックリした!

分散テーブルを作ってみましょう。

postgres=# CREATE TABLE hoge (id bigint);
CREATE TABLE
postgres=# SELECT create_distributed_table('hoge', 'id');
 create_distributed_table 
--------------------------
 
(1 row)

当然っちゃ当然ですけど、参照テーブルも作れますね。

postgres=# CREATE TABLE fuga (id bigint);
CREATE TABLE
postgres=# SELECT create_reference_table('fuga');
 create_reference_table 
------------------------
 
(1 row)

PostGISを有効にしてみる、と。

postgres=# CREATE EXTENSION postgis;
CREATE EXTENSION

はい、というわけで「Re:ゼロバイトから始めるYAML生活(ネット遮断環境で)」みたいな地獄を経験しないでも、Kubernetes上に作成されたAzure Database for PostgreSQL Hyperscale (Citus)が動いちゃったので、「Kubernetes完全に分かった」って言えるようになりましたね?現場からは以上です。

2021-03-05追記:AKSノードを追加してからWorker Nodeを30とかにすると、ちゃんと動きますね…。

ContainerCreatingになってるけど、そのうち動く。