AKS で asp.net core アプリケーション : 事前準備

このシリーズでは asp.net core アプリケーションを AKS にデプロイする方法について紹介していきます。今回は事前準備ということでソリューションの構成とリソースの作成を行います。

尚、シリーズはスすでに以下シリーズの知識がある前提とします。

- [AKS チュートリアルの深堀](https://qiita.com/kenakamu/items/e155740aa60c85a3d867#aks-%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%AE%E6%B7%B1%E5%A0%80)
- [SQL Server 2017 を AKS で使う](https://qiita.com/kenakamu/items/e155740aa60c85a3d867#sql-server-2017-%E3%82%92-aks-%E3%81%A7%E4%BD%BF%E3%81%86)

# ソリューションの構成

これから作成する構成は以下の通りです。

- Linux Node で構成された AKS
- 複数の Web サーバー
- SQL Server 2017 on Linux
- アプリは Azure Container Registry (ACR) から取得
- 外部からはロードバランサー経由でアクセス
- Web サーバーと SQL 間はクラスタ IP 経由
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/3ae25430-dacc-16f7-b5a4-23ad746f2c64.png)

# 事前準備

以下の環境を用意してください。

- Visual Studio 2019 または dotnet core 3.0 が利用できる環境
- ローカル PC に Docker 最新版
- Azure が利用できる環境および Azure CLI

## AKS のインストール

まず ACR と AKS をインストールします。詳細は [AKS チュートリアルの深堀](https://qiita.com/kenakamu/items/e155740aa60c85a3d867#aks-%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%AE%E6%B7%B1%E5%A0%80) を参照してください。既に環境がある場合はスキップしてください。

1. az コマンドでログインを実行。ウィザードに従ってログインを実施。

    ```shell
    az login
    ```
1. 利用するサブスクリプションをセット。

    ```shell
    az account list
    az account set --subscription <subscription id>
    az account show
    ```
1. リソースグループと ACR を作成

    ```shell
    az group create --name netcoresample --location japaneast
    az acr create -g netcoresample -n kenakamuacr --sku basic
    az acr login -n kenakamuacr
    ```
1. 作成した ACR のAdmin 認証を有効化

    ```shell
    az acr update -n kenakamuacr --admin-enabled true
    ```

1. AKS で使うサービスプリンシパル作成。

    ```shell
    az ad sp create-for-rbac --skip-assignment
    ```
1. 作成した ACR をリソースを取得。

    ```shell
    az acr show --resource-group netcoresample --name kenakamuacr --query "id" --output tsv   
    ```
1. ACR のリソースとサービスプリンシパルの AppId を使って ACR PULL 権限を設定。

    ```shell
    az role assignment create --assignee <appId> --scope <acrId> --role acrpull
    ```
1. AKS の作成

    ```shell
    az aks create -g netcoresample -n myaks -c 2 --service-principal <appId> --client-secret <password> --generate-ssh-keys
    ```
1. kubectl のインストールと認証。

    ```shell
    az aks install-cli
    az aks get-credentials --resource-group netcoresample --name myaks 
    ```

1. ノードを取得してインストールを確認。

    ```shell
    >kubectl get nodes
    NAME                       STATUS   ROLES   AGE     VERSION
    aks-nodepool1-23705949-0   Ready    agent   4m14s   v1.13.11
    aks-nodepool1-23705949-1   Ready    agent   4m16s   v1.13.11
    ```

## SQL Server 2017 のインストール

今回の asp.net core アプリではデータベースとして SQL Server 2017 をインストールします。詳細は [SQL Server 2017 を AKS で使う](https://qiita.com/kenakamu/items/e155740aa60c85a3d867#sql-server-2017-%E3%82%92-aks-%E3%81%A7%E4%BD%BF%E3%81%86) を確認してください。ここでは手順のみ示します。

1\. 以下内容で sql2017.yaml を作成。

- secret の値は ```echo -n 'MyC0m9l&xP@ssw0rd' | base64``` で取得したもの
 
```yaml:sql2017.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
     name: azure-disk
provisioner: kubernetes.io/azure-disk
parameters:
  storageaccounttype: Premium_LRS
  kind: Managed
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mssql-data
  annotations:
    volume.beta.kubernetes.io/storage-class: azure-disk
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
---
apiVersion: v1
kind: Secret
metadata:
  name: mssql
type: Opaque
data:
  SA_PASSWORD: "TXlDMG05bCZ4UEBzc3cwcmQ="
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: mssql-deployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: mssql
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: mssql
        image: mcr.microsoft.com/mssql/server:2017-latest
        ports:
        - containerPort: 1433
        env:
        - name: MSSQL_PID
          value: "Developer"
        - name: ACCEPT_EULA
          value: "Y"
        - name: MSSQL_SA_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mssql
              key: SA_PASSWORD 
        volumeMounts:
        - name: mssqldb
          mountPath: /var/opt/mssql
      volumes:
      - name: mssqldb
        persistentVolumeClaim:
          claimName: mssql-data
---
apiVersion: v1
kind: Service
metadata:
  name: mssql-deployment
spec:
  selector:
    app: mssql
  ports:
    - protocol: TCP
      port: 1433
      targetPort: 1433
  type: LoadBalancer
```

2\. apply コマンドで適用。

```shell
kubectl apply -f sql2017.yaml
```

3\. デプロイの適用が完了したらサービスをポッドを確認。

```shell
> kubectl get svc
NAME               TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes         ClusterIP      10.0.0.1       <none>        443/TCP          11m
mssql-deployment   LoadBalancer   10.0.228.137   52.243.63.3   1433:30488/TCP   3m5s
> kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
mssql-deployment-5b74bdb6f7-755wh   1/1     Running   0          4m16s
```
4\. Azure Data Studio より外部ポートに接続確認。

# まとめ

今回は ACR、AKS そして SQL の準備を行いました。また SQL はパブリックからアクセスできる状態にしてあります。これで Azure 側の準備が整いました。次回は asp.net core アプリをローカルで開発する方法を見ていきます。

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