AKSのためのDocker/VSCode開発環境準備 ～初心者がKubernetesでアプリをデプロイするまで1～

#目的
Webを知らない組み込みエンジニアが転生して、Webエンジニアになったので、Kubernetesで無双してみよう。という内容です。
Kubernetesについて、Hello World実現まで一から丁寧に解説している記事がなかったので、挑戦してみたいと思います。

###筆者の前提知識
組み込みエンジニアとして十年ほどの経験
Web関係についての筆者の知識はこんな感じ
Linux：そこそこ
HTML：経験なし
CSS：なにそれおいしいの
Javascript：なんかかっこだらけで気持ち悪い
python：書ける
SQL：データベースを扱うっぽい、SQL構文ってのがあるのね
クラウド：AWSとかAzureとかいうやつね
コンテナ：どなどなどーな
Kubernetes：読み方がわからない

#最終システム構成

![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761310/6859c494-4044-a179-970a-d3c117fd3730.png)

今回は、Hello Worldと言いながら、一般的なフルスタックなWebサイトを構築したいと思います。

要件を列挙すると、次のような感じになります。

- K8Sを用いて、フルスタックのWebサイトを構築
- DNSを取得して、HTTPSアクセス(TLS終端)を実現
- 静的ファイルは、Webサーバーから配信
- Webサーバーにはnginxを採用
- アプリサーバーはPythonで構築、フレームワークはDjangoを採用
- DBはPostgre SQLを使う
- DBの永続化にはAzure Diskをマウントする

###Kubernetes(k8S)について
K8Sでは、Podと呼ばれる最小の実行単位のオブジェクトをK8S内に複数浮かべ、それらを仮想ネットワークで接続して、お互いに通信することで機能を実現していきます。
1つのPod内部に複数の機能を持たせても良いですが、なるべく小さい機能単位に分けた方が、メンテナンスしやすいかと思います。
Podは、Dockerで作成したコンテナイメージとなることが多いです。Docker Hubなどで提供されるDockerコンテナのイメージをそのままK8Sコンテナにデプロイし、Pod同士を接続することで簡単に様々なアプリを実現することが可能になります。

K8Sでは、ユーザーが定義するのは、各Podの理想的な挙動のみを記述するだけで、負荷分散や障害からの回復など雑多なことはK8Sが自動的にやってくれます。
したがって、従来の1台のサーバーですべてを自分で管理するよりも運用コストが下がると言われています。

##Docker開発環境
筆者の開発用のPCはWindowsです。
最終的に以下のような感じになりました。
詳細は参考資料を参照してください。

- 統合開発環境としてVSCodeを使用
    - Docker Extension
    - Remote Development Extension
- Git Bashの導入
- Docker Desktop for Windowsのインストール
- docker-composeのインストール
- DockerのバックエンドとしてWSL2を設定
    - Windows 10のバージョン2004以降へのアップデート
- Pythonのインストール
    - Anaconda環境でもOK

AKSの操作は、リモートで設定したAzureのLinux環境から実行する構成にしたので、Azure CLIやkubectlはインストールしていません。


##K8S開発環境
筆者は、元々、機械学習を使ったアプリ開発に挑戦していたので、K8Sの開発環境をAzure MLの仮想マシン上に構築しています。
筆者のようにAzure MLにとってK8S開発環境を紹介しようと思います。

![K8S開発環境.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761310/887ef8cd-eabf-b10e-afab-f91f81e60277.png)

Azure MLを構成すると、同時に4つのリソースが追加されます。

- Application Insights (挙動監視)
- Azure Key Vault (秘密情報の保持)
- Azure Storage Account (ストレージ)
- Azure Container Registory (コンテナレジストリ)

このうち、K8S開発で重要なのは最後のAzure Container Registory (ASR)です。
ACRは、作成したDockerコンテナを登録するためのプライベートレジストリとなります。
Docker Hubなどに公に公開したくないコンテナをここに登録することで、AKSから利用が可能になります。

Azure MLからコンピューティングインスタンスを作成するとAzure CLI、kubectl、Anaconda(python)がインストール済みのUbuntu環境が作成されます。
なお、仮想マシンからのログイン時にはデバイスログインが求められることがあります。

- [Microsoft アカウントで使用されるデバイスを管理する](https://support.microsoft.com/ja-jp/windows/microsoft-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%A7%E4%BD%BF%E7%94%A8%E3%81%95%E3%82%8C%E3%82%8B%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%82%92%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B-d4044995-81db-b24b-757e-1102d148f441)

と、Azure MLの仮想マシンがAKSの開発にぴったりなので、これを活用します。
Azure MLからコンピューティングインスタンスを作成する際にSSHアクセスを許可できるので、これを使って、VS Codeからリモートログインすると便利です。

![vmcreate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761310/0454f0c0-a574-0fcc-a2fa-bcaabe00f0ea.png)

図のようにコンピューティングインスタンスを作成する際にSSHを有効化できます。
ここに、ssh-keygenなどでSSHの公開鍵をコピペしましょう。
[【 ssh-keygen 】コマンド――SSHの公開鍵と秘密鍵を作成する](https://www.atmarkit.co.jp/ait/articles/1908/02/news015.html)
Windowsで鍵情報を使ってSSHアクセスする際は以下の情報が参考になります。

- [Windows 10のssh-agentをコマンド プロンプト、WSL、Git Bashで使ってみた](https://qiita.com/q1701/items/3cdc2d7ef7a3539f351d)
- [VSCodeからSSH接続をする方法](https://www.server-memo.net/memo/vscode/vscode_ssh.html)

SSH接続先の情報は下図のような感じでAzure Machine Learning Studioで取得できます。
![azurevm2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761310/c12656e0-36e8-5e20-5341-3b53b53dff24.png)


これをもとに.ssh/configファイルを書きましょう。

```config:.ssh/config
Host aks-remote #好きなホスト名
    HostName xx.xx.xx.xx # Public IP address
    User azureuser
    Port 50000
    IdentityFile C:\Users\ユーザー名\.ssh\id_rsa # ssh-keygenで生成した秘密鍵
```

なお、K8Sをローカルでテストできるようにminikubeなるものもありますが、制約があるのと、開発PCがノートパソコンでメモリが少ないので、今回は、開発時点から直接AKSにデプロイすることにしました。

##ACRへの接続
ついでにここで、ACRへの接続まで終わらせておきましょう。
Azure MLリソースを作成した場合は、ACRの作成も自動的に終わっているので、これを流用します。
まずは、Azureへのログインです。

```sh
az login
```

Dockerで作ったコンテナイメージをACRで扱うためには、ACRにログインする必要があります。
初めにAzure MLで作成したACRの名称を取得しましょう。

```sh
az acr list | grep loginServer
```
結果

```sh
"loginServer": "myakscrabcdefg.azurecr.io",
```
このACRの名称は様々なところで使うので、環境変数に登録しておくと便利です。

ACRへのログインはこのACR名称を使ってログインします。

```sh
az acr login --name myakscrabcdefg
# .azurecr.ioは省略可能です、'--name'は'-n'でもOK
```

acrへのログイン状態は、1日程度で切れるため、ちょいちょいログインが必要となります。


#参考資料
[vscodeでgit bash環境を作成する。](https://qiita.com/y_marito/items/22ffd8c28119066c47f6)
[WSL2(Windows Subsystem for Linux)導入手順](https://qiita.com/kenchan1193/items/74edfc67910b51469b45)
[Docker Compose のインストール](https://docs.docker.jp/compose/install.html)
[VS CodeでPython環境を整える](https://qiita.com/ayuchiy/items/82d6d2dfcf1acc3bec00)

(続く)