SQL Server 2019 ビッグデータクラスターを AKS で使う -  azdata 既定の構成でインストール

今回は SQL Server 2019 ビッグデータクラスター (BDC) を Azure Kubernetes Service (AKS) にインストールする方法についてみていきます。

# 前提条件

Windows 10 PC での手順です。Linux の場合は参照リンクから詳細を確認してください。
また今回は Azure Kubernetes Service は自分で構築して、そこに SQL Server 2019 BDC をインストールします。

# 事前準備

まずはインストールにも利用するクライアントツールをインストールします。

[参照: SQL Server 2019 のビッグ データ ツールをインストールする](https://docs.microsoft.com/ja-jp/sql/big-data-cluster/deploy-big-data-tools?view=sql-server-ver15)

- python
- azdata
- Azure Data Studio と Data Virtualization 拡張
- Azure Kubernetes Service

※ Python スクリプトで AKS も同時にインストールする手順もあります。
[参照:Python スクリプトを使用して SQL Server ビッグ データ クラスターを Azure Kubernetes Service (AKS) に展開する](https://docs.microsoft.com/ja-jp/sql/big-data-cluster/quickstart-big-data-cluster-deploy?view=sql-server-ver15
)

## python

今回想定しているバージョンは python 3 です。

1\. Python が含まれる次のいずれかの圧縮ファイルをダウンロード。
Windows
https://go.microsoft.com/fwlink/?linkid=2074021
Linux
https://go.microsoft.com/fwlink/?linkid=2065975
OSX
https://go.microsoft.com/fwlink/?linkid=2065976

2\. 圧縮されたファイルをターゲット コンピューターにコピーし、任意のフォルダーに展開。

3\. フォルダーから installLocalPythonPackages.bat を実行して、パラメーターと同じフォルダーへの完全なパスを設定。

```PowerShell
installLocalPythonPackages.bat "C:\python-3.6.6-win-x64-0.0.1-offline\0.0.1"
```

## azdata

MSI が用意されています。[azdata Windows インストーラー](https://aka.ms/azdata-msi) をダウンロードして実行してください。

## Azure Data Studio と Data Virtualization 拡張

Azure Data Studio はクロスプラットフォームで動作する Azure データサービス用のクライアントツールです。

1\. [Windows 用の Azure Data Studio ユーザー インストーラー](https://go.microsoft.com/fwlink/?linkid=2109256)をダウンロードしてインストール。

2\. インストール完了後 Azure Data Studio を起動。

3\. 左ペインより Extensions アイコンをクリックして「Data Virtualization」を検索してインストール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/6ff30a89-c422-7bac-6242-a2675aa0486b.png)

## Azure Kubernetes Service

既存の AKS を使うこともできますが、ここでは新規に環境を作成します。

1\. リソースグループを作成。

```shell
az group create --name sqlbdcrg --location japaneast
```

2\. AKS を作成。ここではテストのため最小限の構成で作成。

- Linux OS の Standard_L8s を 1 台指定

```shell
az aks create -n sqlbdc -g sqlbdcrg --generate-ssh-key --node-vm-size Standard_L8s -c 1
```
3\. 作成完了後、環境に接続。

```shell
az aks get-credentials -n sqlbdc -g sqlbdcrg 
```

4\. ノードを確認。

```shell
>kubectl get nodes
NAME                                STATUS   ROLES   AGE     VERSION
aks-nodepool1-41170276-vmss000000   Ready    agent   4m17s   v1.13.12
```

# SQL Server 2019 BDC のインストール

[参照: Kubernetes 上に SQL Server ビッグ データ クラスターを展開する方法](https://docs.microsoft.com/ja-jp/sql/big-data-cluster/deployment-guidance?view=sql-server-ver15)

azdata ツールでインストールを実行することができます。構成は json 形式で定義しますが、既定でテンプレートがいくつか用意されています。SQL Server 各種コンポーネントのコンテナイメージは mcr.microsoft.com にホストされており、構成ファイルがその情報をすでに持っているため、必要最小限の情報構成のみでインストールが開始できます。

AKS 用は既定で 2 つのパターンの構成ファイルが用意されています。

- aks-dev-test: 基本となる構成
- aks-dev-test-ha: 高可用性を含んだ構成

全ての構成は ```azdata bdc config list -o table```　で確認できます。

## 既定でのインストール

まずは既定でどのようなコンポーネントが、どうインストールされるかを見ていきます。

1\. 管理者のユーザー名とパスワードを環境変数として設定。ドキュメントにある以下の内容に注意。

>特殊文字が含まれている場合は、必ずパスワードを二重引用符で囲みます。 AZDATA_PASSWORD は自由に設定できますが、必ずパスワードを十分に複雑にして、!、&、' 文字は使用しないでください。 二重引用符の区切り記号は bash コマンドでしか機能しないことに注意してください。

```powershell
SET AZDATA_USERNAME=admin
SET AZDATA_PASSWORD=<password>
```

2\. 既定の構成でインストールを実行。

```powershell
azdata bdc create --config-profile aks-dev-test --accept-eula yes
```
3\. 以下メッセージにもあるとおり、15-30 分くらい時間がかかるので、SQL Server 2019 BDC 展開の概要ビデオでも見て待つ。

```shell
NOTE: Cluster creation can take a significant amount of time depending on
configuration, network speed, and the number of nodes in the cluster.
```
[![Big Data Clusters deployment overview | Data Exposed](http://img.youtube.com/vi/h4u8MI-iR7U/0.jpg)](http://www.youtube.com/watch?v=h4u8MI-iR7U)

4\. インストールが完了したメッセージを確認。

```shell
Starting cluster deployment.
Waiting for cluster controller to start.
Waiting for cluster controller to start.
Waiting for cluster controller to start.
Waiting for cluster controller to start.
Waiting for cluster controller to start.
Waiting for cluster controller to start.
Waiting for cluster controller to start.
Cluster controller endpoint is available at xxx.xxx.xxx.xxx:30080.
Waiting for control plane to be ready after 5 minutes.
Cluster control plane is ready.
Data pool is ready.
Storage pool is ready.
Master pool is ready.
Compute pool is ready.
Cluster deployed successfully.
```

## インストール構成ファイルの確認

既定の構成ファイルは以下の手順で確認可能です。

1\. 以下コマンドで aks-dev-test を custom としてコピー。

```shell
azdata bdc config init --source aks-dev-test --target custom
```

2\. 生成された custom フォルダを開く。

```shell
start custom
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/a073e8bc-da07-834b-3616-3a1360fe657c.png)

3\. Visual Studio Code などでファイルを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/ad919be6-6a96-9dc0-1f33-fd2e3594a05f.png)

## インストールされたコンポーネントの確認

既定で SQL Server 2019 BDC は control.json に指定されている mssql-cluster 名前空間にインストールされます。よって kubectl でコンポーネントを表示する場合は -n mssql-cluster を使うか、既定の名前空間を変えたものを用意します。ここでは既定の名前空間を変えておきます。

1\. sqlbdc 設定を確認。

```shell
>kubectl config get-contexts sqlbdc
CURRENT   NAME     CLUSTER   AUTHINFO                      NAMESPACE
*         sqlbdc   sqlbdc    clusterUser_sqlbdcrg_sqlbdc
```
2\. 新しく名前空間を指定してコンテキストを作成。

```shell
kubectl config set-context mssql-cluster --namespace=mssql-cluster --cluster=sqlbdc --user=clusterUser_sqlbdcrg_sqlbdc
```

3\. コンテキストを切り替え。

```shell
kubectl config use-context mssql-cluster
```

### ポッドを確認

ポッドの一覧を確認すると、bdc.json で定義された内容と同一のポッドが確認可能。また controldb や metricsdb などコントローラー用のポッドも配置されていることが確認できます。

```shell
>kubectl get pods
NAME              READY   STATUS    RESTARTS   AGE
appproxy-j4qxz    2/2     Running   2          110m
compute-0-0       3/3     Running   3          110m
control-hnkt6     3/3     Running   3          125m
controldb-0       2/2     Running   2          125m
controlwd-4xg8d   1/1     Running   1          120m
data-0-0          3/3     Running   3          110m
data-0-1          3/3     Running   3          110m
gateway-0         2/2     Running   2          110m
logsdb-0          1/1     Running   1          120m
logsui-fs4x8      1/1     Running   1          120m
master-0          3/3     Running   3          110m
metricsdb-0       1/1     Running   1          120m
metricsdc-d9lwk   1/1     Running   1          120m
metricsui-9trpv   1/1     Running   1          120m
mgmtproxy-qw79h   2/2     Running   2          120m
nmnode-0-0        2/2     Running   2          110m
sparkhead-0       4/4     Running   4          110m
storage-0-0       4/4     Running   4          110m
storage-0-1       4/4     Running   4          110m
```

### サービスを確認

サービスは環境に接続できるエンドポイントが作成されていることが確認可能です。

- control.json で定義された Controller と ServiceProxy、および BDC のエンドポイント
- BDC の各種コンポーネントの内部 ClusterIP

```shell
>kubectl get svc
NAME                      TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                                                                                                                                                                                                                                                 AGE
appproxy-svc              ClusterIP      None           <none>          8080/TCP                                                                                                                                                                                                                                                141m
appproxy-svc-external     LoadBalancer   10.0.139.201   52.xxx.xx.xxx    30778:30442/TCP                                                                                                                                                                                                                                         141m
compute-0-svc             ClusterIP      None           <none>          1433/TCP,8300/TCP,8310/TCP,8311/TCP,8400/TCP,8410/TCP,8411/TCP,5502/TCP                                                                                                                                                                                 141m
controldb-svc             ClusterIP      10.0.15.221    <none>          1433/TCP,8311/TCP,8411/TCP                                                                                                                                                                                                                              156m
controller-svc            ClusterIP      None           <none>          443/TCP,8311/TCP,8301/TCP,8411/TCP,8401/TCP                                                                                                                                                                                                             156m
controller-svc-external   LoadBalancer   10.0.17.229    52.xxx.xx.xxx   30080:31669/TCP                                                                                                                                                                                                                                         156m
data-0-svc                ClusterIP      None           <none>          135/TCP,1433/TCP,8300/TCP,8310/TCP,8311/TCP,8312/TCP,8313/TCP,8400/TCP,8410/TCP,8411/TCP,8412/TCP,8413/TCP,51000/TCP                                                                                                                                    141m
gateway-svc               ClusterIP      None           <none>          8443/TCP,8300/TCP,8311/TCP,8400/TCP,8411/TCP                                                                                                                                                                                                            141m
gateway-svc-external      LoadBalancer   10.0.186.187   52.xxx.xx.xxx   30443:31769/TCP                                                                                                                                                                                                                                         141m
logsdb-svc                ClusterIP      None           <none>          9200/TCP,8300/TCP,8400/TCP                                                                                                                                                                                                                              151m
logsui-svc                ClusterIP      None           <none>          5601/TCP,8300/TCP,8400/TCP                                                                                                                                                                                                                              151m
master-p-svc              ClusterIP      10.0.148.90    <none>          1433/TCP                                                                                                                                                                                                                                                141m
master-svc                ClusterIP      None           <none>          135/TCP,8088/TCP,50075/TCP,50020/TCP,50010/TCP,8031/TCP,8032/TCP,8033/TCP,8040/TCP,8042/TCP,8080/TCP,1433/TCP,1533/TCP,9995/TCP,8998/TCP,8300/TCP,8301/TCP,8302/TCP,8310/TCP,8311/TCP,8400/TCP,8401/TCP,8402/TCP,8410/TCP,8411/TCP,8312/TCP,51000/TCP   141m
master-svc-external       LoadBalancer   10.0.128.187   52.xxx.xx.xxx   31433:30783/TCP                                                                                                                                                                                                                                         141m
metricsdb-svc             ClusterIP      None           <none>          8086/TCP,8300/TCP,8400/TCP                                                                                                                                                                                                                              151m
metricsui-svc             ClusterIP      None           <none>          3000/TCP,8300/TCP,8400/TCP                                                                                                                                                                                                                              151m
mgmtproxy-svc             ClusterIP      None           <none>          443/TCP,8300/TCP,8311/TCP,8400/TCP,8411/TCP                                                                                                                                                                                                             151m
mgmtproxy-svc-external    LoadBalancer   10.0.76.84     52.xxx.xx.xxx   30777:31730/TCP                                                                                                                                                                                                                                         151m
nmnode-0-svc              ClusterIP      None           <none>          9000/TCP,50470/TCP,14000/TCP,8300/TCP,8311/TCP,8400/TCP,8411/TCP,2020/TCP,50200/TCP                                                                                                                                                                     141m
sparkhead-svc             ClusterIP      None           <none>          135/TCP,8088/TCP,8031/TCP,8032/TCP,8033/TCP,8080/TCP,1433/TCP,9995/TCP,8998/TCP,8300/TCP,8301/TCP,8302/TCP,8400/TCP,8401/TCP,8402/TCP,51000/TCP                                                                                                         141m
storage-0-svc             ClusterIP      None           <none>          50470/TCP,50075/TCP,50200/TCP,50020/TCP,9000/TCP,50010/TCP,8040/TCP,8042/TCP,1433/TCP,8443/TCP,8300/TCP,8301/TCP,8310/TCP,8311/TCP,8400/TCP,8401/TCP,8410/TCP,8411/TCP                                                                                  141m
```
クラスターのエンドポイントはサービスごとに役割を持っています。
![](https://docs.microsoft.com/ja-jp/sql/big-data-cluster/media/concept-security/cluster_endpoints.png?view=sql-server-ver15)

また Azure 側にも対応する外部 IP があることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/bb2d857c-76eb-8c5d-a38e-aac057b4ad7c.png)

### ステートフルセットとデーモンセットを確認

SQL Server 2019 BDC はステートフルなサービスであるため、Statefulsets が作成されるほか、裏でメトリックを取るためデーモンも作成されます。

[参照: StatefulSet](https://kubernetes.io/ja/docs/concepts/workloads/controllers/statefulset/)
[参照: DaemonSet](https://kubernetes.io/ja/docs/concepts/workloads/controllers/daemonset/)

```shell
>kubectl get statefulsets
NAME        READY   AGE
compute-0   1/1     153m
controldb   1/1     168m
data-0      2/2     153m
gateway     1/1     153m
logsdb      1/1     163m
master      1/1     153m
metricsdb   1/1     163m
nmnode-0    1/1     153m
sparkhead   1/1     152m
storage-0   2/2     152m

>kubectl get daemonsets
NAME        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
metricsdc   1         1         1       1            1           <none>          164m
```

また詳細は以下のようなコマンドで確認。

```shell
kubectl get statefulset master -o yaml
```

### ボリュームと要求を確認

各ポッドはボリュームが必要であり、data と logs が割り当てられます。これらの設定は control.json の storage で定義されています。

```shell
>kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                            STORAGECLASS   REASON   AGE
pvc-084b1ac5-1a52-11ea-9062-26efe99880fd   15Gi       RWO            Delete           Bound    mssql-cluster/data-metricsdb-0   default                 169m
pvc-084c691b-1a52-11ea-9062-26efe99880fd   10Gi       RWO            Delete           Bound    mssql-cluster/logs-metricsdb-0   default                 169m
pvc-09a0776f-1a52-11ea-9062-26efe99880fd   15Gi       RWO            Delete           Bound    mssql-cluster/data-logsdb-0      default                 169m
pvc-09a1e09b-1a52-11ea-9062-26efe99880fd   10Gi       RWO            Delete           Bound    mssql-cluster/logs-logsdb-0      default                 169m
...<省略>

>kubectl get pvc
NAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
data-compute-0-0   Bound    pvc-767e0f16-1a53-11ea-9062-26efe99880fd   15Gi       RWO            default        161m
data-controldb     Bound    pvc-645d5908-1a51-11ea-9062-26efe99880fd   15Gi       RWO            default        176m
data-controller    Bound    pvc-64389d94-1a51-11ea-9062-26efe99880fd   15Gi       RWO            default        176m
data-data-0-0      Bound    pvc-779b689f-1a53-11ea-9062-26efe99880fd   15Gi       RWO            default        161m
...<省略>
```
Azure ポータルからも同じ数の Disk が作成されている事を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/052421c4-10d9-89d1-024b-cd709fafb820.png)

# SQL Server 2019 BDC への接続

[参照: Azure Data Studio を使用して SQL Server ビッグ データ クラスターに接続する](https://docs.microsoft.com/ja-jp/sql/big-data-cluster/connect-to-big-data-cluster?view=sql-server-ver15#master)

ドキュメントにはセキュリティの観点からパスワードを変更するように記述があります。必要に応じて変えてみてください。
>AZDATA_USERNAME ログインは、セットアップ時に作成される SQL Server マスター インスタンス上でのシステム管理者です。 SQL Server のコンテナーを作成した後、そのコンテナーで echo $AZDATA_PASSWORD を実行すると、指定した環境変数 AZDATA_PASSWORD が検索できるようになります。 セキュリティ上の理由から、ベスト プラクティスとしてパスワードを変更してください。

1\. Azure Data Studio よりマスターインスタンスへ接続。

- アドレス: kubectl get svc で表示した service/master-svc-external の外部 IP とポート (既定で 31433) 
- ユーザ名とパスワード: インストール時に環境変数に設定したもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/58c2f36d-f840-7813-53bd-16a70a8efb78.png)

2\. SQL Server Big Data Cluster タブでエンドポイントを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/5af4ae60-94b0-c3e1-f22c-4bbf35ed96e5.png)

# まとめ

今回は azdata で簡単に SQL Server 2019 BDC をインストールできる事と、AKS 上に構成されるコンポーネントを見ていきました。次回はこの環境にサンプルをインストールしていくつかの操作を試します。

[次の記事へ](https://qiita.com/kenakamu/items/9d113deb1dcec2c5a058)
[目次へ戻る](https://qiita.com/kenakamu/items/e155740aa60c85a3d867)