「.NET マイクロサービスを Kubernetes にデプロイする」をやってみる🍕

https://qiita.com/official-events/8bc3780a142f8ee8effa

# はじめに
- [Azure Kubernetes Service(AKS)](https://azure.microsoft.com/ja-jp/services/kubernetes-service/#overview)を楽しんでいますか:bangbang::bangbang::bangbang:
- 私は[Kubernetes](https://kubernetes.io/ja/)初心者です[^1]
- 「[Azure Kubernetes Serviceに関する記事を投稿しよう！](https://qiita.com/official-events/8bc3780a142f8ee8effa)」を期に入門してみようとおもいます

[^1]: 何の自慢にもなりません

# [コンテナー化されたアプリケーションを Azure Kubernetes Service にデプロイする](https://docs.microsoft.com/ja-jp/learn/modules/aks-deploy-container-app/)
どこから始めたらいいの？
[MS Learn](https://docs.microsoft.com/ja-jp/learn/)でしょ:bangbang:
ってことで「[コンテナー化されたアプリケーションを Azure Kubernetes Service にデプロイする](https://docs.microsoft.com/ja-jp/learn/modules/aks-deploy-container-app/)」から取り組んでみました。
しかし、「[演習 - Azure Kubernetes Service クラスターを作成する](https://docs.microsoft.com/ja-jp/learn/modules/aks-deploy-container-app/3-exercise-create-aks-cluster?tabs=linux)」がどうもうまくいきませんでしたよ:sob:
必殺技の<font color="purple">$\huge{英語で読む}$</font>リンクを押して、英語のページを読んで英語は英語のまま理解することを心がけている私には解決できませんでした。

> アクティブ化したら、サンドボックス用の Azure portal にサインインします。 必ず、サンドボックスをアクティブ化したときと同じアカウントを使用してください。


> When the sandbox is activated, sign into the Azure portal for sandbox. Make sure to use the same account you activated the sandbox with.

この手順で「サンドボックス用の Azure portal にサインイン」したあとに何かsomethingをする必要があるのではないかとおもいますがよくわかりませんでした。

## エラー
こんなエラーです。

![スクリーンショット 2021-11-10 20.56.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/7d31bcc8-1a77-4f89-b10b-13a4e2f856c0.png)

赤い文字が怖い。
とにかく貼っておきます。

```
torifuku_kaiou@Azure:~$ export RESOURCE_GROUP=learn-f2e5c9f0-7772-4a45-ae69-2de97f79cf04
torifuku_kaiou@Azure:~$ export CLUSTER_NAME=aks-contoso-video
torifuku_kaiou@Azure:~$ az aks create \
>     --resource-group $RESOURCE_GROUP \
>     --name $CLUSTER_NAME \
>     --node-count 2 \
>     --enable-addons http_application_routing\
>     --generate-ssh-keys \
>     --node-vm-size Standard_B2s \
>     --network-plugin azure
(RequestDisallowedByPolicy) Provisioning of resource(s) for container service aks-contoso-video in resource group learn-f2e5c9f0-7772-4a45-ae69-2de97f79cf04 failed. Message: Resource 'aks-nodepool1-37735957-vmss' was disallowed by policy. Policy identifiers: '[{"policyAssignment":{"name":"containers-assignment","id":"/providers/Microsoft.Management/managementGroups/eab64c3d-95b6-9f1f-755f-9f8578c31e45/providers/Microsoft.Authorization/policyAssignments/containers-assignment"},"policyDefinition":{"name":"Allowedresource types","id":"/providers/Microsoft.Authorization/policyDefinitions/a08ec900-254a-4555-9bf5-e42af04b5c5c"},"policySetDefinition":{"name":"containers-initiative","id":"/providers/Microsoft.Management/managementGroups/learn-sandbox-prod/providers/Microsoft.Authorization/policySetDefinitions/containers-initiative"},"policyDefinitionReferenceId":"allowed-resource-types_1"}]'.. Details:
Code: RequestDisallowedByPolicy
Message: Provisioning of resource(s) for container service aks-contoso-video in resource group learn-f2e5c9f0-7772-4a45-ae69-2de97f79cf04 failed. Message: Resource 'aks-nodepool1-37735957-vmss' was disallowed by policy. Policy identifiers: '[{"policyAssignment":{"name":"containers-assignment","id":"/providers/Microsoft.Management/managementGroups/eab64c3d-95b6-9f1f-755f-9f8578c31e45/providers/Microsoft.Authorization/policyAssignments/containers-assignment"},"policyDefinition":{"name":"Allowed resource types","id":"/providers/Microsoft.Authorization/policyDefinitions/a08ec900-254a-4555-9bf5-e42af04b5c5c"},"policySetDefinition":{"name":"containers-initiative","id":"/providers/Microsoft.Management/managementGroups/learn-sandbox-prod/providers/Microsoft.Authorization/policySetDefinitions/containers-initiative"},"policyDefinitionReferenceId":"allowed-resource-types_1"}]'.. Details:
```

さすがにここで辞めちゃうのははやすぎるし、そうだ、私は[Kubernetes](https://kubernetes.io/ja/)初心者です。[^1]
まだ私には[Azure Kubernetes Service(AKS)](https://azure.microsoft.com/ja-jp/services/kubernetes-service/#overview)は早かったようです。
まずは[Kubernetes](https://kubernetes.io/ja/)をローカルマシンでイゴかす[^2]ところからやってみよう:rocket::rocket::rocket:

[^2]: 動かすの意。たぶん西日本の方言、おそらく。[NervesJP](https://nerves-jp.connpass.com/)ではおなじみの表現。

次になにをやろうかしら。
そんなときにも<font color="purple">$\huge{MS\ Learn}$</font>:bangbang:

# [.NET マイクロサービスを Kubernetes にデプロイする](https://docs.microsoft.com/ja-jp/learn/modules/dotnet-deploy-microservices-kubernetes/)
結論から申しますと、最後まで行けました。
ただ、2021年11月10日現在、日本語訳にはいくつか誤りがあります。
そこは、必殺技の<font color="purple">$\huge{英語で読む}$</font>リンクを押して、英語のページを読んで英語は英語のまま理解することを心がけている私は解決できました。

このLearnでは以下を学べます。

- 既にコンテナー化されたマイクロサービスに分割されている .NET アプリケーションを、Kubernetes 環境にデプロイする方法
- Docker Hub に Docker イメージをプッシュして、Kubernetes インスタンスによってイメージをダウンロードできるようにしてから、Kubernetes が各マイクロサービスに対して実行する内容を宣言的に記述するデプロイファイルを作成
- Kubernetes を使用してコンテナー化されたマイクロサービスをスケーリングすることがいかに簡単かを体験

もちろん誤りがあったところはちゃ〜んと、問題を報告しておきました。

## [はじめに](https://docs.microsoft.com/ja-jp/learn/modules/dotnet-deploy-microservices-kubernetes/1-introduction)

> あなたは、世界で最も人気のあるピザ店である Contoso Pizza でソフトウェア開発者として新しい仕事を始めたとします。 ビジネスが好調なので、最近、ピザの在庫があるかどうかを表示する Contoso Pizza の Web サイトは Docker コンテナーでホストされるマイクロサービスにリファクターされました。

:pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza:

## [オーケストレーターとは](https://docs.microsoft.com/ja-jp/learn/modules/dotnet-deploy-microservices-kubernetes/2-what-are-orchestrators)

説明を**味読**:pizza:しました。
とてもコンパクトに大事なことがまとまっています。
私みたいな[Kubernetes](https://kubernetes.io/ja/)初心者はまずここをよく読むことから始めるとよいとおもいます。[^3]
オススメです。
マヂおすすめです。

[^3]: 一体、何目線なのでしょう。

## [演習 - マイクロサービス イメージを Docker Hub にプッシュする](https://docs.microsoft.com/ja-jp/learn/modules/dotnet-deploy-microservices-kubernetes/3-exercise-push-to-docker-hub)
Docker HubへのPushは経験があります。

日本語訳に誤りがあります。たいした問題ではないです。

## 問題報告
ちゃ〜んと、問題を報告しておきました。

![スクリーンショット 2021-11-10 17.28.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/cd5bc53b-8d96-f4d6-b157-9b4c8833d496.png)

## [マイクロサービス コンテナーを Kubernetes にデプロイする](https://docs.microsoft.com/ja-jp/learn/modules/dotnet-deploy-microservices-kubernetes/4-exercise-deploy-to-kubernetes)

ここが難関でした。
日本語訳をそのまま写すと、だってこんな画面ですよ :sob:

```bash
$ kubectl apply -f backend-deploy.yml

$ kubectl apply -f frontend-deploy.yml
```

と、馴染みのないコマンドを意味をわからずに打ったあとの画面がこれ↓↓↓

![スクリーンショット 2021-11-10 19.21.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/091bd7a6-cda3-eee9-d1e1-4428d9d6c31f.png)

困ったときは、必殺技の<font color="purple">$\huge{英語で読む}$</font>リンクを押して、英語のページを読んで英語は英語のまま理解することを心がけている私はイゴかす[^1]ことができました。
`backend-deploy.yml`に誤りがあります。
もちろんちゃ〜んと、問題を報告しておきました。

![スクリーンショット 2021-11-10 19.18.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/8e533d01-e3e2-f8d5-f85b-193934e6394f.png)

誤りを含んでいるbackendの止め方がわからず右往左往しました。
こんな感じで止めました。

```bash
$ kubectl get deployments --all-namespaces
NAMESPACE     NAME            READY   UP-TO-DATE   AVAILABLE   AGE
default       pizzabackend    1/1     1            1           99m
default       pizzafrontend   1/1     1            1           104m
kube-system   coredns         2/2     2            2           3h16m

$ kubectl delete -n default deployment pizzabackend

$ kubectl delete -n default deployment pizzafrontend
```

`pizzafrontend`はそのままでよかったのかも。
気を取り直して再度、

```bash
$ kubectl apply -f backend-deploy.yml

$ kubectl apply -f frontend-deploy.yml

$ kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
pizzabackend-85fd76dd68-mt2wm   1/1     Running   0          20s
pizzafrontend-df9d577d5-s9thl   1/1     Running   0          6s
```


![スクリーンショット 2021-11-10 19.22.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/06be7666-ac43-1791-fdb4-f99cfe970c65.png)

<font color="purple">$\huge{all\ right}$</font>
:pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza:
:tada::tada::tada::tada::tada::tada::tada::tada::tada::tada::tada:
:pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza:
:tada::tada::tada::tada::tada::tada::tada::tada::tada::tada::tada:

## [Kubernetes でコンテナー インスタンスをスケーリングする](https://docs.microsoft.com/ja-jp/learn/modules/dotnet-deploy-microservices-kubernetes/5-exercise-scale-microservice)

> あなたのマイクロサービスは、1 日のうちの特定の時間帯に大きな負荷がかかることがあります。 Kubernetes を使用すると、追加のインスタンスが自動的に追加され、マイクロサービスを簡単にスケーリングすることができます。

へえ〜　って感じで記事の通りにスケールアップ、スケールダウンができました :tada:

```bash
$ kubectl scale --replicas=5 deployment/pizzabackend

$ kubectl scale --replicas=1 deployment/pizzabackend
```

## [Kubernetes でマイクロサービスの回復性を証明する](https://docs.microsoft.com/ja-jp/learn/modules/dotnet-deploy-microservices-kubernetes/6-exercise-microservice-resilience)

```bash
$ kubectl delete pod pizzafrontend-5b6cc765c4-hjpx4
```

記事の通りにこんな感じで`delete`しても、すぐに別のポッドインスタンスが起動されます。

```bash
$ kubectl get pods

NAME                             READY   STATUS    RESTARTS   AGE
pizzabackend-7445bdb5c9-pnpk6    1/1     Running   0          31m
pizzafrontend-5b6cc765c4-vwmv8   1/1     Running   0          7s
```

こういうのはどうかなってことで、試してみました。
[Docker](https://www.docker.com/)には多少の心得はござる。

```
$ docker ps
CONTAINER ID   IMAGE                         COMMAND                 CREATED         STATUS         PORTS     NAMES
a937d6e26641   torifukukaiou/pizzafrontend   "dotnet frontend.dll"   5 minutes ago   Up 5 minutes             k8s_pizzafrontend_pizzafrontend-df9d577d5-s9thl_default_e62d197d-9ddb-4f2b-a3c5-13482c57edf2_0
3b9ea4c77361   torifukukaiou/pizzabackend    "dotnet backend.dll"    5 minutes ago   Up 5 minutes             k8s_pizzabackend_pizzabackend-85fd76dd68-mt2wm_default_d6baca90-ea65-4544-92c2-b1654046c4be_0

$ docker stop a937d6e26641
a937d6e26641

$ kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
pizzabackend-85fd76dd68-mt2wm   1/1     Running   0          7m6s
pizzafrontend-df9d577d5-s9thl   1/1     Running   1          6m52s
```

また復活しています。立ち上がっています。
不死身です。
不死鳥です。
すばらしい:pizza:

## [まとめ](https://docs.microsoft.com/ja-jp/learn/modules/dotnet-deploy-microservices-kubernetes/7-summary)

がんばりました:pizza:



# おわりに :tada::lgtm::lgtm::lgtm::lgtm::lgtm::tada:
<font color="purple">$\huge{MS\ Learn最高です🎉}$</font>

https://docs.microsoft.com/ja-jp/learn/modules/dotnet-deploy-microservices-kubernetes/2-what-are-orchestrators

:pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza::pizza: